diff --git a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Info.php b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Info.php
index e6c1f00..a1ee2ab 100644
--- a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Info.php
+++ b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Info.php
@@ -236,7 +236,7 @@ public function getPeerStatus(): array
$peer = new PeerStatus();
$peer->Name = trim($status->DNSName, ".");
- $peer->IP = implode("
", $status->TailscaleIPs);
+ $peer->IP = $status->TailscaleIPs;
$peer->LoginName = $this->status->User->{$status->UserID}->LoginName;
$peer->SharedUser = isset($status->ShareeNode);
diff --git a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/PeerStatus.php b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/PeerStatus.php
index 49d0764..38a2a0e 100644
--- a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/PeerStatus.php
+++ b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/PeerStatus.php
@@ -5,10 +5,12 @@
class PeerStatus
{
public string $Name = "";
- public string $IP = "";
public string $LoginName = "";
public bool $SharedUser = false;
+ /** @var string[] */
+ public array $IP = array();
+
public string $Address = "";
public bool $Online = false;
diff --git a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Translator.php b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Translator.php
index e80e713..29db7ad 100644
--- a/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Translator.php
+++ b/src/usr/local/emhttp/plugins/tailscale/include/Tailscale/Translator.php
@@ -13,7 +13,7 @@ public function __construct()
$dynamix = parse_ini_file('/boot/config/plugins/dynamix/dynamix.cfg', true) ?: array();
- $locale = $_SESSION['locale'] ?? ($login_locale ?? $dynamix['display']['locale']);
+ $locale = $_SESSION['locale'] ?? ($login_locale ?? ($dynamix['display']['locale'] ?? "none"));
$tailscale_locale = (array) json_decode(file_get_contents("/usr/local/emhttp/plugins/tailscale/locales/en_US.json") ?: "{}", true);
if (file_exists("/usr/local/emhttp/plugins/tailscale/locales/{$locale}.json")) {
diff --git a/src/usr/local/emhttp/plugins/tailscale/include/data/Status.php b/src/usr/local/emhttp/plugins/tailscale/include/data/Status.php
index 9f04cf4..995ac51 100644
--- a/src/usr/local/emhttp/plugins/tailscale/include/data/Status.php
+++ b/src/usr/local/emhttp/plugins/tailscale/include/data/Status.php
@@ -7,13 +7,13 @@
$tailscaleConfig = $tailscaleConfig ?? new Config();
$tr = $tr ?? new Translator();
+if ( ! $tailscaleConfig->Enable) {
+ echo("{}");
+ return;
+}
+
switch ($_POST['action']) {
case 'get':
- if ( ! $tailscaleConfig->Enable) {
- echo("{}");
- return;
- }
-
$tailscaleInfo = $tailscaleInfo ?? new Info($tr);
$rows = "";
@@ -26,11 +26,12 @@
$txBytes = $peer->Traffic ? $peer->TxBytes : "";
$rxBytes = $peer->Traffic ? $peer->RxBytes : "";
$pingHost = ($peer->SharedUser || $peer->Active || ! $peer->Online) ? "" : "";
+ $ips = implode("
", $peer->IP);
$rows .= <<
{$user} |
- {$peer->IP} |
+ {$ips} |
{$peer->LoginName} |
{$online} |
{$exitNode} |
@@ -70,10 +71,16 @@
echo json_encode($rtn);
break;
case 'ping':
- $pingHost = escapeshellarg($_POST['host']);
+ $tailscaleInfo = $tailscaleInfo ?? new Info($tr);
+ $out = "Could not find host.";
- $out = Utils::run_command("tailscale ping --c 3 {$pingHost}");
- echo implode("
", $out);
+ foreach ($tailscaleInfo->getPeerStatus() as $peer) {
+ if ($peer->Name == $_POST['host']) {
+ $out = implode("
", Utils::run_command("tailscale ping --c 3 {$peer->IP[0]}"));
+ break;
+ }
+ }
+ echo $out;
break;
}