"""Networkd state collector.""" from typing import Any from lib import schema from lib.common import compute_pending, run, strip_apply_meta from lib.network import get_config, parse_networkctl_status from lib.state import _now_iso, register_collector, register_volatile def _collect_networkd() -> schema.NetworkdState: """Collect networkd interface state from networkctl. Returns: Dict with interface runtime state parsed from networkctl output, config, and pending changes status. """ # Load config try: net_cfg = get_config() except Exception: net_cfg = {} pending_changes, net_pending_diff = compute_pending(net_cfg) result: dict[str, dict[str, Any]] = {} safe_net_cfg = strip_apply_meta(net_cfg) net_status: dict[str, Any] = { "pending_changes": pending_changes, "pending_diff": net_pending_diff, } try: raw = run(["networkctl", "status", "--json=short", "--all"], sudo=True) result = parse_networkctl_status(raw) if not result: return { "interfaces": {}, "config": safe_net_cfg, "status": net_status, "timestamp": _now_iso(), } except Exception: return { "interfaces": {}, "config": safe_net_cfg, "status": net_status, "timestamp": _now_iso(), } return { "interfaces": result, "config": safe_net_cfg, "status": net_status, "timestamp": _now_iso(), } register_collector("networkd", _collect_networkd) register_volatile( "networkd", frozenset( { "interfaces[].addresses", } ), )