import type { Client } from 'ssh2' import { execCommand } from './common.js' export async function collectNetworkMetrics( client: Client, ): Promise<{ interfaces: Array<{ name: string; ip: string; state: string }> }> { const interfaces: Array<{ name: string; ip: string; state: string }> = [] try { const [addrOut, linkOut] = await Promise.all([ execCommand(client, "ip -o addr show | awk '{print $2,$4}' | grep -v '^lo'"), execCommand(client, "ip -o link show | awk '{gsub(/:/,\"\",$2); print $2,$9}'"), ]) const ipByIface = new Map() for (const line of addrOut.stdout.split('\n')) { const [iface, addr] = line.trim().split(/\s+/) if (iface && addr) ipByIface.set(iface, addr) } const stateByIface = new Map() for (const line of linkOut.stdout.split('\n')) { const [iface, state] = line.trim().split(/\s+/) if (iface) stateByIface.set(iface, state ?? 'UNKNOWN') } const names = new Set([...ipByIface.keys(), ...stateByIface.keys()]) for (const name of names) { if (name === 'lo' || !name) continue interfaces.push({ name, ip: ipByIface.get(name) ?? '', state: stateByIface.get(name) ?? 'UNKNOWN', }) } } catch { // best-effort } return { interfaces } }