v1.9.1: Admin UI - Section Reseau Tailscale (statut, IP, hostname, logs)
- admin.html: nouveau card 'Reseau Tailscale' avec statut connecte/deconnecte, IP tailnet, hostname, serveur Headscale et bouton Actualiser - admin.html: bloc deroulant pour consulter les 50 dernieres lignes du log bootstrap (logs/tailscale_bootstrap.log) - launcher.php: nouvelles actions get_tailscale_info (status + IP + hostname via sudo tailscale ip/status) et get_tailscale_log (tail -n 50) Complete la v1.9.0 avec la visibilite UI necessaire pour valider/diagnostiquer la connexion Tailscale sur chaque capteur sans avoir a passer en SSH. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2050,6 +2050,69 @@ if ($type == "get_changelog") {
|
||||
}
|
||||
}
|
||||
|
||||
// Get Tailscale connection info (status, IP, hostname, login server)
|
||||
// Used by the "Réseau Tailscale" card on admin.html.
|
||||
if ($type == "get_tailscale_info") {
|
||||
$login_server = 'https://headscale.aircarto.fr';
|
||||
$tailscale_bin = '/usr/bin/tailscale';
|
||||
|
||||
if (!file_exists($tailscale_bin)) {
|
||||
echo json_encode([
|
||||
'installed' => false,
|
||||
'connected' => false,
|
||||
'ip' => '',
|
||||
'hostname' => '',
|
||||
'login_server' => $login_server,
|
||||
'message' => 'Tailscale non installé sur ce capteur (mettre à jour vers v1.9.0+).'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// tailscaled socket is root-owned, so we need sudo (NOPASSWD rule added in v1.9.0).
|
||||
$ip = trim(shell_exec("sudo $tailscale_bin ip -4 2>/dev/null") ?? '');
|
||||
$hostname = '';
|
||||
$status_raw = shell_exec("sudo $tailscale_bin status 2>/dev/null") ?? '';
|
||||
|
||||
if ($ip !== '' && $status_raw !== '') {
|
||||
foreach (explode("\n", $status_raw) as $line) {
|
||||
if (strpos($line, $ip) === 0) {
|
||||
$parts = preg_split('/\s+/', trim($line));
|
||||
$hostname = $parts[1] ?? '';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'installed' => true,
|
||||
'connected' => $ip !== '',
|
||||
'ip' => $ip,
|
||||
'hostname' => $hostname,
|
||||
'login_server' => $login_server
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get last lines of the Tailscale bootstrap log
|
||||
if ($type == "get_tailscale_log") {
|
||||
$logFile = '/var/www/nebuleair_pro_4g/logs/tailscale_bootstrap.log';
|
||||
if (!file_exists($logFile)) {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'log' => '',
|
||||
'message' => "Pas encore de log (bootstrap jamais exécuté). Le log apparaîtra au prochain update ou reboot."
|
||||
]);
|
||||
return;
|
||||
}
|
||||
// tail -n 50 equivalent
|
||||
$output = shell_exec("tail -n 50 " . escapeshellarg($logFile) . " 2>/dev/null") ?? '';
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'log' => $output
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get current CPU power mode
|
||||
if ($type == "get_cpu_power_mode") {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user