diff --git a/applications/luci-app-tailscale-community/root/usr/share/rpcd/ucode/tailscale.uc b/applications/luci-app-tailscale-community/root/usr/share/rpcd/ucode/tailscale.uc index b7bf94b0ba..ca00d44708 100755 --- a/applications/luci-app-tailscale-community/root/usr/share/rpcd/ucode/tailscale.uc +++ b/applications/luci-app-tailscale-community/root/usr/share/rpcd/ucode/tailscale.uc @@ -40,12 +40,12 @@ methods.get_status = { let data = { status: '', version: '', - TUNMode: '', + TUNMode: false, health: '', ipv4: "Not running", - ipv6: null, + ipv6: "", domain_name: '', - peers: [] + peers: {} }; if (access('/usr/sbin/tailscale')==true || access('/usr/bin/tailscale')==true){ }else{ data.status = 'not_installed'; @@ -56,32 +56,34 @@ methods.get_status = { let peer_map = {}; if (status_json_output.code == 0 && length(status_json_output.stdout) > 0) { try { - let status_data = json(join('',status_json_output.stdout)); + let status_data = json(join('', status_json_output.stdout)); data.version = status_data?.Version || 'Unknown'; - data.health = status_data?.Health || ''; - data.TUNMode = status_data?.TUN || 'true'; + data.health = (status_data?.Health && length(status_data.Health) > 0) ? status_data.Health[0] : ''; + data.TUNMode = (status_data?.TUN == true); if (status_data?.BackendState == 'Running') { data.status = 'running'; } if (status_data?.BackendState == 'NeedsLogin') { data.status = 'logout'; } data.ipv4 = status_data?.Self?.TailscaleIPs?.[0] || 'No IP assigned'; - data.ipv6 = status_data?.Self?.TailscaleIPs?.[1] || null; + data.ipv6 = status_data?.Self?.TailscaleIPs?.[1] || ''; data.domain_name = status_data?.CurrentTailnet?.Name || ''; // peers list - for (let p in status_data?.Peer) { - p = status_data.Peer[p]; - peer_map[p.ID] = { - ip: join('
', p?.TailscaleIPs) || '', - hostname: split(p?.DNSName || '','.')[0] || '', - ostype: p?.OS, - online: p?.Online, - linkadress: (!p?.CurAddr) ? p?.Relay : p?.CurAddr, - lastseen: p?.LastSeen, - exit_node: !!p?.ExitNode, - exit_node_option: !!p?.ExitNodeOption, - tx: p?.TxBytes || '', - rx: p?.RxBytes || '' - }; + if (status_data?.Peer) { + for (let p in status_data.Peer) { + let peer = status_data.Peer[p]; + peer_map[peer.ID] = { + ip: join('
', peer?.TailscaleIPs || []), + hostname: split(peer?.DNSName || '', '.')[0] || peer?.HostName || '', + ostype: peer?.OS || '', + online: !!peer?.Online, + linkadress: (!peer?.CurAddr) ? (peer?.Relay || '') : peer?.CurAddr, + lastseen: peer?.LastSeen || '', + exit_node: !!peer?.ExitNode, + exit_node_option: !!peer?.ExitNodeOption, + tx: peer?.TxBytes || 0, + rx: peer?.RxBytes || 0 + }; + } } } catch (e) { /* ignore */ } }