"
f'{_esc(r.get("stack"))} · '
f'{_esc(r.get("label"))}{host_bit}'
f' ({_esc(_label(light))})'
f"{cmd}"
"
"
)
groups.append(
f'
'
f'
'
f'{_esc(_label(light))} · {len(items)}
'
f'
{"".join(lis)}
'
)
title = "all probes by colour"
if show_cmd:
title += " · with command"
return (
f''
f"
{_esc(title)} ({len(rows)})
"
f'{"".join(groups)}'
f""
)
def _agg_text(st: dict) -> str:
bd = st.get("breakdown") if isinstance(st.get("breakdown"), dict) else {}
by = bd.get("by_light") if isinstance(bd.get("by_light"), dict) else {}
if not by:
# fallback from members
by = {}
for m in st.get("members") or []:
if (m.get("reason") or "") in getattr(L, "_AGG_SKIP_REASONS", ()):
continue
Lgt = str(m.get("light") or "black")
by[Lgt] = by.get(Lgt, 0) + 1
if not by:
return ""
order = ("green", "blue", "yellow", "orange", "red", "black")
parts = []
for k in order:
n = int(by.get(k) or 0)
if n:
parts.append(f"{n}× {_label(k)}")
worst = st.get("light") or bd.get("worst") or ""
if not parts:
return ""
return f"{', '.join(parts)} → {_label(worst)}"
def _software_items(st: dict) -> list[dict]:
raw = st.get("software") if isinstance(st.get("software"), list) else []
if raw:
return [x for x in raw if isinstance(x, dict) and x.get("package")]
# Fallback: vulns.servers only
vulns = st.get("vulns") if isinstance(st.get("vulns"), dict) else {}
out = []
for srv in vulns.get("servers") or []:
p = str((srv or {}).get("package") or "")
if not p:
continue
out.append(
{
"package": p,
"version": (srv or {}).get("version") or "",
"host": (srv or {}).get("host") or "",
"light": "green",
}
)
return out
def _render_software_row(st: dict) -> str:
items = _software_items(st)
if not items:
return ""
# Collapse identical package+version (multi-host) into one chip.
merged: dict[str, dict] = {}
for it in items:
pkg = str(it.get("package") or "")
ver = str(it.get("version") or "")
key = f"{pkg}|{ver}"
if key not in merged:
merged[key] = {
"package": pkg,
"version": ver,
"label": it.get("label") or pkg,
"light": it.get("light") or "green",
"hosts": [],
"source": it.get("source") or "",
"currency_status": it.get("currency_status") or "",
"behind": it.get("behind") or "",
"published_upstream": it.get("published_upstream") or "",
"delta": it.get("delta"),
}
h = str(it.get("host") or "")
if h and h not in merged[key]["hosts"]:
merged[key]["hosts"].append(h)
# keep worst light
Lgt = str(it.get("light") or "green")
cur = str(merged[key]["light"] or "green")
if L.SEVERITY.get(Lgt, 0) > L.SEVERITY.get(cur, 0):
merged[key]["light"] = Lgt
if it.get("currency_status") == "behind":
merged[key]["currency_status"] = "behind"
merged[key]["behind"] = it.get("behind") or merged[key].get("behind")
merged[key]["published_upstream"] = (
it.get("published_upstream") or merged[key].get("published_upstream")
)
if it.get("delta") is not None:
merged[key]["delta"] = it.get("delta")
chips = []
for it in list(merged.values())[:8]:
pkg = str(it.get("package") or "")
ver = str(it.get("version") or "")
light = str(it.get("light") or "green")
hosts = it.get("hosts") or []
label = str(it.get("label") or pkg)
logo_fn = _LOGO_SVG.get(pkg)
logo = logo_fn() if callable(logo_fn) else _logo_svg(pkg, fill="#445566", text=(pkg[:3] or "?"), size="14")
cur = str(it.get("currency_status") or "")
behind = str(it.get("behind") or it.get("published_upstream") or "")
delta = it.get("delta")
ver_txt = ver or "?"
if cur == "behind" and behind:
lag = f" −{delta}" if isinstance(delta, int) and delta > 0 else ""
ver_txt = f"{ver_txt} → {behind}{lag}"
elif cur == "current" and ver:
ver_txt = f"{ver_txt} ✓"
tip = " · ".join(
x
for x in (
label,
ver,
f"pub {behind}" if behind else "",
cur,
", ".join(hosts[:4]),
it.get("source") or "",
)
if x
)
chips.append(
f''
f"{logo}"
f'{_esc(ver_txt)}'
f""
)
return f'
{"".join(chips)}
'
def _card_dialog_payload(st: dict) -> dict:
"""JSON-serializable detail for the open dialog."""
members = []
for m in st.get("members") or []:
reason = m.get("reason") or ""
es = m.get("endpoints_summary") if isinstance(m.get("endpoints_summary"), dict) else {}
# If endpoints pulled the light up, surface worst endpoint id/reason.
if es and (m.get("light") or "") not in ("green", "blue", None, ""):
bad = []
for ep in m.get("endpoints") or []:
if ep.get("skipped"):
continue
el = ep.get("light") or "green"
if el in ("yellow", "orange", "red", "black"):
bad.append(f"{ep.get('id') or ep.get('path')}:{ep.get('reason') or el}")
if bad and reason in ("ok", "", None):
reason = ", ".join(bad[:4])
elif bad:
reason = f"{reason} · " + ", ".join(bad[:3])
members.append(
{
"role": m.get("role"),
"host": m.get("host"),
"light": m.get("light"),
"label": _label(m.get("light")),
"reason": reason,
"code": m.get("code"),
}
)
hits = []
vulns = st.get("vulns") if isinstance(st.get("vulns"), dict) else {}
for h in vulns.get("hits") or []:
hits.append(
{
"id": h.get("id"),
"severity": h.get("severity"),
"package": h.get("package"),
"version": h.get("version"),
"host": h.get("host"),
"summary": h.get("summary") or "",
"url": _osv_url(str(h.get("id") or "")),
}
)
tls = st.get("tls") if isinstance(st.get("tls"), dict) else {}
ports = st.get("ports") if isinstance(st.get("ports"), dict) else {}
software = []
for it in _software_items(st)[:12]:
software.append(
{
"package": it.get("package"),
"label": it.get("label") or it.get("package"),
"version": it.get("version") or "",
"host": it.get("host") or "",
"light": it.get("light") or "green",
"source": it.get("source") or "",
"currency_status": it.get("currency_status") or "",
"published": it.get("published") or "",
"behind": it.get("behind") or "",
"delta": it.get("delta"),
}
)
return {
"id": st.get("id"),
"light": st.get("light"),
"label": _label(st.get("light")),
"agg": _agg_text(st),
"members": members,
"hits": hits,
"tls": tls,
"ports": ports.get("suspicious") or [],
"software": software,
"deliverability": st.get("deliverability")
if isinstance(st.get("deliverability"), dict)
else {},
"kind": st.get("kind"),
"label_soft": st.get("service_label") or "",
}
def _render_card(st: dict, *, section: str = "stack") -> str:
light = st.get("light") or "black"
intensity = st.get("intensity") or "muted"
klass = f"card {intensity}-{light}"
cur = st.get("currency") or ""
ci = st.get("currency_info") if isinstance(st.get("currency_info"), dict) else {}
symbol = ci.get("symbol") or ""
backend = st.get("bank_backend") or ""
service_label = st.get("service_label") or ""
bits = [x for x in (service_label, cur, symbol if symbol != cur else "", _label(light)) if x]
if backend == "ebics":
bits.insert(-1 if bits else 0, "IBAN")
elif backend == "x-taler-bank":
bits.insert(-1 if bits else 0, "x-taler-bank")
net = st.get("network") if isinstance(st.get("network"), dict) else {}
ssh = net.get("ssh") if isinstance(net.get("ssh"), dict) else {}
sub_extra = []
if net.get("zone"):
sub_extra.append(_esc(str(net.get("zone"))))
if ssh.get("expected"):
if ssh.get("ok") is True:
sub_extra.append('ssh')
elif ssh.get("ok") is False:
sub_extra.append('ssh!')
vulns = st.get("vulns") if isinstance(st.get("vulns"), dict) else {}
hits = vulns.get("hits") or []
if hits:
top = hits[0]
cls = "crit" if (vulns.get("worst") or "") == "CRITICAL" else "bad"
sub_extra.append(
f'cve'
)
why = _agg_text(st)
why_html = f'
{_esc(why)}
' if why else ""
rows = []
for m in st.get("members") or []:
role = m.get("role") or ""
if role == "cve":
continue
host = m.get("host") or ""
if not host and (m.get("reason") or "") in ("ebics_iban", "ebics_no_bank"):
host = "IBAN"
ml = m.get("light") or "black"
tip = m.get("reason") or _label(ml)
rows.append(
"
"
)
tags = []
if st.get("commercial_prod"):
tags.append('prod')
if backend:
tags.append(f'{_esc(backend)}')
if net.get("zone"):
tags.append(f'{_esc(net.get("zone"))}')
if ssh.get("expected"):
if ssh.get("ok") is True:
tags.append('ssh')
elif ssh.get("ok") is False:
tags.append('ssh')
tls = st.get("tls") if isinstance(st.get("tls"), dict) else {}
if tls.get("days_left") is not None:
try:
days = int(tls["days_left"])
except (TypeError, ValueError):
days = None
if days is not None:
if days < 14:
tags.append(f'cert {days}d')
elif days < 30:
tags.append(f'cert {days}d')
else:
tags.append(f'cert')
if st.get("orphan"):
tags.append('orphan?')
deliver = st.get("deliverability") if isinstance(st.get("deliverability"), dict) else {}
if deliver:
dl = str(deliver.get("light") or "yellow")
reason = str(deliver.get("reason") or "deliver")
age = deliver.get("age_s")
age_s = ""
try:
if age is not None:
a = float(age)
age_s = f"{int(a // 3600)}h" if a >= 3600 else f"{int(a // 60)}m"
except (TypeError, ValueError):
age_s = ""
tip = " · ".join(x for x in (reason, deliver.get("rcpt") or "", age_s) if x)
cls = "tag"
if dl in ("orange", "red"):
cls = "tag warn" if dl == "orange" else "tag crit"
elif dl == "yellow" or deliver.get("stale"):
cls = "tag warn"
tags.append(f'deliver')
ports = st.get("ports") if isinstance(st.get("ports"), dict) else {}
n_sus = int(ports.get("n_suspicious") or 0)
if n_sus:
tip = ", ".join(
f"{s.get('label') or s.get('port')}"
+ (f"@{s.get('host')}" if s.get("host") else "")
for s in (ports.get("suspicious") or [])[:8]
)
tags.append(
f'ports:{n_sus}'
)
for h in hits[:3]:
cid = str(h.get("id") or "cve")
cls = "tag crit" if (h.get("severity") or "") == "CRITICAL" else "tag warn"
tip = " · ".join(
x
for x in (
h.get("severity") or "",
f"{h.get('package')}/{h.get('version')}" if h.get("package") else "",
(h.get("summary") or "")[:80],
)
if x
)
tags.append(
f'{_esc(cid)}'
)
stats = st.get("stats") if isinstance(st.get("stats"), dict) else {}
if stats.get("present"):
tags.append('stats')
denoms = (ci.get("denoms") or [])[:6]
if denoms:
tags.append(
f'denoms'
)
payload = _esc(json.dumps(_card_dialog_payload(st), ensure_ascii=False))
title = st.get("id") or "?"
sw_html = _render_software_row(st)
return (
f''
f"
';
}
body.innerHTML = html;
if (typeof dlg.showModal === 'function') dlg.showModal();
else dlg.setAttribute('open', '');
}
function escapeHtml(s) {
return String(s == null ? '' : s)
.replace(/&/g,'&').replace(//g,'>')
.replace(/"/g,'"');
}
"""
def render_html(doc: dict) -> str:
stacks = doc.get("stacks") or []
services = doc.get("services") or []
mail = doc.get("mail") or []
orphans = doc.get("orphans") or []
ports_doc = doc.get("ports") if isinstance(doc.get("ports"), dict) else {}
published = doc.get("published") if isinstance(doc.get("published"), dict) else {}
ts = doc.get("ts")
age = None
try:
age = time.time() - float(ts)
except (TypeError, ValueError):
pass
stale = age is not None and age > 3 * float(doc.get("acute_down_s") or L.ACUTE_DOWN_S)
if age is None:
updated = "?"
elif age < 120:
updated = f"{int(age)}s"
elif age < 3600:
updated = f"{int(age // 60)}m"
else:
updated = f"{age / 3600:.1f}h"
try:
updated += " · " + time.strftime("%H:%M", time.localtime(float(ts)))
except (TypeError, ValueError, OSError):
pass
stack_cards = [_render_card(st, section="stack") for st in stacks]
# Firefly-plane (git / Mattermost / buildbot / gnunet) near mail; VeciGate edge; rest = company
def _zone(st: dict) -> str:
return str((st.get("network") or {}).get("zone") or st.get("zone") or "").lower()
firefly_services = [st for st in services if _zone(st) == "firefly"]
vecigate_services = [st for st in services if _zone(st) == "vecigate"]
other_services = [
st for st in services if _zone(st) not in ("firefly", "vecigate")
]
service_cards = [_render_card(st, section="service") for st in other_services]
firefly_cards = [_render_card(st, section="service") for st in firefly_services]
vecigate_cards = [_render_card(st, section="service") for st in vecigate_services]
mail_cards = [_render_card(st, section="mail") for st in mail]
score = doc.get("score") if isinstance(doc.get("score"), dict) else None
if not score:
score = L.compute_total_score(stacks, services, mail)
s_light = str(score.get("light") or "white")
s_green = int(score.get("green") or 0)
s_total = int(score.get("total") or 0)
s_pct = int(score.get("pct") or 0)
score_html = (
f'
"
)
orphan_html = ""
if orphans:
items = "".join(
f'
{_esc(o.get("host"))} · {_esc(o.get("reason") or "orphan")}
'
for o in orphans[:40]
)
orphan_html = f'
orphans
{items}
'
ports_html = ""
sus_all = ports_doc.get("suspicious") or []
if ports_doc.get("enabled") and sus_all:
n_hard = int(ports_doc.get("n_hard") or 0)
items = "".join(
f'
'
f'{_esc(s.get("label") or s.get("port"))}'
f'{(" @ " + _esc(s.get("host"))) if s.get("host") else ""}'
f' · {_esc(s.get("severity") or "soft")}
'
sections.append(f'{"".join(stack_cards) if stack_cards else empty}')
if service_cards:
sections.append('
company / services
')
sections.append(f'{"".join(service_cards)}')
if firefly_cards or mail_cards:
sections.append('
firefly plane · git / Mattermost / buildbot / mail
')
if firefly_cards:
sections.append(f'{"".join(firefly_cards)}')
if mail_cards:
sections.append(f'{"".join(mail_cards)}')
if vecigate_cards:
sections.append('
VeciGate edge · WAN / tortuna companion ports
')
sections.append(f'{"".join(vecigate_cards)}')
apps = published.get("apps") or []
apps_html = ""
if apps:
chips = []
for app in apps[:12]:
if not isinstance(app, dict):
continue
logo_key = str(app.get("logo") or app.get("kind") or "webui")
logo_fn = _LOGO_SVG.get(logo_key) or _LOGO_SVG.get("webui")
logo = logo_fn() if callable(logo_fn) else _logo_svg(logo_key, fill="#0d9488", text="app", size="14")
pub = str(app.get("published_upstream") or app.get("published") or "?")
light = str(app.get("light") or "green")
tip = " · ".join(
x
for x in (
app.get("label") or app.get("package"),
app.get("package"),
app.get("published"),
published.get("suite") or "",
app.get("source") or "deb.taler.net",
)
if x
)
name = str(app.get("label") or app.get("package") or "app")
chips.append(
f''
f"{logo}"
f'{_esc(name)} {_esc(pub)}'
f""
)
suite = published.get("suite") or ""
apps_html = (
f'
published apps / SPAs'
f'{(" · " + _esc(suite)) if suite else ""} · deb.taler.net
'
f'
{"".join(chips)}
'
)
if apps_html:
sections.append(apps_html)
if ports_html:
sections.append(ports_html)
if orphan_html:
sections.append(orphan_html)
result_index_html = _render_result_index(doc)
return f"""
LLM Lightweight Monitoring · stacks
LLM · stacks
{score_html}
updated {_esc(updated)} · Lightweight Monitoring
{''.join(sections)}
{result_index_html}
"""
def main() -> int:
ap = argparse.ArgumentParser(description="Render stack status HTML from JSON")
ap.add_argument("--status", type=Path, default=None)
ap.add_argument("--out", type=Path, required=True)
args = ap.parse_args()
if L.load_monitoring_env():
L.refresh_runtime_flags_from_env()
doc = L.read_status(args.status)
if not doc:
doc = {"schema": L.SCHEMA, "ts": time.time(), "stacks": [], "legend": L.LEGEND}
html_text = render_html(doc)
args.out.parent.mkdir(parents=True, exist_ok=True)
tmp = args.out.with_name(f".{args.out.name}.tmp.{os.getpid()}")
try:
tmp.write_text(html_text, encoding="utf-8")
os.replace(tmp, args.out)
finally:
if tmp.exists():
try:
tmp.unlink()
except OSError:
pass
print(args.out)
return 0
if __name__ == "__main__":
raise SystemExit(main())