"""sb-builder build state, read-only over ssh. `sbb-remote stats` carries the dashboard: VM load, uptime, memory, disk, package counts, orphans, slackrepo results and overlay pulls. `jobs` adds the recent build list. Both run over one ssh connection and arrive as two JSON objects. """ import json import subprocess from ..module import Module def _run(cmd, timeout=8): try: return subprocess.run(cmd, capture_output=True, text=True, timeout=timeout).stdout except (OSError, subprocess.TimeoutExpired): return "" def make(cfg: dict) -> Module: host = cfg.get("sbbuilder", {}).get("host", "buildsystem") run = cfg.get("run", _run) def state(): try: out = run(["ssh", "-o", "BatchMode=yes", "-o", "ConnectTimeout=4", host, "sbb-remote stats; sbb-remote jobs"]).lstrip() except OSError: return {"offline": True} try: decoder = json.JSONDecoder() stats, end = decoder.raw_decode(out) jobs, _ = decoder.raw_decode(out[end:].lstrip()) except (ValueError, TypeError): return {"offline": True} return {"offline": False, "stats": stats, "jobs": jobs.get("jobs", []) if isinstance(jobs, dict) else []} return Module(name="sbbuilder", title="Build VM", state=state)