diff --git a/site/dashboard.html b/site/dashboard.html index 04ed80d..76c2a80 100644 --- a/site/dashboard.html +++ b/site/dashboard.html @@ -580,10 +580,11 @@ body {
-
+
Local Services
Give localhost apps clean .numa URLs. Persistent, with HTTP proxy.
+
@@ -874,6 +875,22 @@ async function refresh() { document.getElementById('uptime').textContent = formatUptime(stats.uptime_secs); document.getElementById('uptimeSub').textContent = formatUptimeSub(stats.uptime_secs); document.getElementById('footerUpstream').textContent = stats.upstream || ''; + + // LAN status indicator + const lanEl = document.getElementById('lanToggle'); + if (stats.lan) { + if (!stats.lan.enabled) { + lanEl.style.color = 'var(--text-dim)'; + lanEl.textContent = 'LAN off'; + lanEl.title = 'Enable with: numa lan on'; + } else { + const pc = stats.lan.peers || 0; + lanEl.style.color = pc > 0 ? 'var(--emerald)' : 'var(--teal)'; + lanEl.textContent = `LAN on ยท ${pc} peer${pc !== 1 ? 's' : ''}`; + lanEl.title = 'mDNS discovery active (_numa._tcp.local)'; + } + } + document.getElementById('overrideCount').textContent = stats.overrides.active; document.getElementById('blockedCount').textContent = formatNumber(q.blocked); const bl = stats.blocking; diff --git a/src/api.rs b/src/api.rs index 5696d70..4962bef 100644 --- a/src/api.rs +++ b/src/api.rs @@ -134,6 +134,13 @@ struct StatsResponse { cache: CacheStats, overrides: OverrideStats, blocking: BlockingStatsResponse, + lan: LanStatsResponse, +} + +#[derive(Serialize)] +struct LanStatsResponse { + enabled: bool, + peers: usize, } #[derive(Serialize)] @@ -466,6 +473,10 @@ async fn stats(State(ctx): State>) -> Json { domains_loaded: bl_stats.domains_loaded, allowlist_size: bl_stats.allowlist_size, }, + lan: LanStatsResponse { + enabled: ctx.lan_enabled, + peers: ctx.lan_peers.lock().unwrap().list().len(), + }, }) } diff --git a/src/ctx.rs b/src/ctx.rs index 6892a56..b5d896a 100644 --- a/src/ctx.rs +++ b/src/ctx.rs @@ -39,6 +39,7 @@ pub struct ServerCtx { pub timeout: Duration, pub proxy_tld: String, pub proxy_tld_suffix: String, // pre-computed ".{tld}" to avoid per-query allocation + pub lan_enabled: bool, } pub async fn handle_query( diff --git a/src/main.rs b/src/main.rs index 7f60419..6e09442 100644 --- a/src/main.rs +++ b/src/main.rs @@ -159,6 +159,7 @@ async fn main() -> numa::Result<()> { format!(".{}", config.proxy.tld) }, proxy_tld: config.proxy.tld.clone(), + lan_enabled: config.lan.enabled, }); let zone_count: usize = ctx.zone_map.values().map(|m| m.len()).sum();