fix: unbundled first-boot, fast VPN status, kiosk relay dedup
All checks were successful
Build Archipelago ISO (dev) / build-iso (push) Successful in 32m38s
All checks were successful
Build Archipelago ISO (dev) / build-iso (push) Successful in 32m38s
- Unbundled ISO: first-boot only creates FileBrowser (marker file .unbundled) Users install apps from Marketplace — no more bitcoin/mempool on clean install - VPN status: read tunnel IP from config file (instant) instead of nvpn status (22s) - Kiosk: App.vue skips remote relay on /kiosk path (prevents duplicate input) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -322,46 +322,26 @@ async fn get_nostr_vpn_status() -> Result<VpnStatus> {
|
||||
anyhow::bail!("nostr-vpn service not running");
|
||||
}
|
||||
|
||||
// Get tunnel IP: try nvpn status first, fall back to config, then interface
|
||||
// Get tunnel IP: config file first (instant), fall back to interface
|
||||
// NOTE: Do NOT call `nvpn status` — it blocks for 20+ seconds connecting to relays
|
||||
let ip = {
|
||||
// Method 1: nvpn status (most accurate)
|
||||
let status_ip = tokio::process::Command::new("nvpn")
|
||||
.args(["status"])
|
||||
.env("HOME", "/var/lib/archipelago/nostr-vpn")
|
||||
.env("XDG_CONFIG_HOME", "/var/lib/archipelago/nostr-vpn/.config")
|
||||
.output()
|
||||
.await
|
||||
.ok()
|
||||
.and_then(|o| {
|
||||
let out = String::from_utf8_lossy(&o.stdout).to_string();
|
||||
out.lines()
|
||||
.find(|l| l.starts_with("tunnel_ip:"))
|
||||
.map(|l| l.split(':').nth(1).unwrap_or("").trim().to_string())
|
||||
})
|
||||
.filter(|s| !s.is_empty());
|
||||
|
||||
if status_ip.is_some() {
|
||||
status_ip
|
||||
let cfg_ip = read_nvpn_config_value("node", "tunnel_ip").await;
|
||||
if cfg_ip.is_some() {
|
||||
cfg_ip
|
||||
} else {
|
||||
// Method 2: config file
|
||||
let cfg_ip = read_nvpn_config_value("node", "tunnel_ip").await;
|
||||
if cfg_ip.is_some() {
|
||||
cfg_ip
|
||||
} else {
|
||||
// Method 3: interface IP
|
||||
tokio::process::Command::new("ip")
|
||||
.args(["-4", "addr", "show", "nvpn0"])
|
||||
.output()
|
||||
.await
|
||||
.ok()
|
||||
.and_then(|o| {
|
||||
let out = String::from_utf8_lossy(&o.stdout).to_string();
|
||||
out.lines()
|
||||
.find(|l| l.contains("inet "))
|
||||
.and_then(|l| l.split_whitespace().nth(1))
|
||||
.map(|s| s.to_string())
|
||||
})
|
||||
}
|
||||
// Fallback: read from network interface
|
||||
tokio::process::Command::new("ip")
|
||||
.args(["-4", "addr", "show", "nvpn0"])
|
||||
.output()
|
||||
.await
|
||||
.ok()
|
||||
.and_then(|o| {
|
||||
let out = String::from_utf8_lossy(&o.stdout).to_string();
|
||||
out.lines()
|
||||
.find(|l| l.contains("inet "))
|
||||
.and_then(|l| l.split_whitespace().nth(1))
|
||||
.map(|s| s.to_string())
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user