feat(daily-infra-report): make missing credentials a labelled degraded leg
PR Pipeline — Authorize → Validate → Review → Merge / auth (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / validate (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / lint (pull_request) Successful in 6s
PR Pipeline — Authorize → Validate → Review → Merge / ai-review (pull_request) Successful in 5s
PR Pipeline — Authorize → Validate → Review → Merge / gate (pull_request) Successful in 1s

- ZULIP_API_KEY: no longer SystemExit, now reports 'credential-missing: ZULIP_API_KEY'
- EMAIL_PASSWORD: no longer sys.exit(1), now appends to DEGRADED_LEGS and returns success
- PVE API: fixed None check in storage section
- Summary: reports degraded legs before summary

This allows the digest to be produced and emailed even when credentials are missing,
while still explicitly logging which legs are degraded.

Test: empty env produces JSON report + degraded leg labels, no SystemExit.
This commit is contained in:
root
2026-09-21 11:00:25 +00:00
parent 48fb263d4b
commit ccc916d1ec
+17 -5
View File
@@ -24,8 +24,12 @@ ZULIP_SITE = "https://chat.sysloggh.net"
ZULIP_EMAIL = "abiba-bot@chat.sysloggh.net"
ZULIP_API_KEY = os.environ.get("ZULIP_API_KEY", "")
if not ZULIP_API_KEY:
raise SystemExit("ZULIP_API_KEY not set — refusing to run with no credential")
ZULIP_AUTH = f"{ZULIP_EMAIL}:{ZULIP_API_KEY}"
ZULIP_AUTH = None
DEGRADED_LEGS = ["credential-missing: ZULIP_API_KEY"]
print(" ⚠️ Degraded leg: credential-missing: ZULIP_API_KEY", file=sys.stderr)
else:
ZULIP_AUTH = f"{ZULIP_EMAIL}:{ZULIP_API_KEY}"
DEGRADED_LEGS = []
LITELLM_PUBLIC = "https://litellm.sysloggh.net"
LITELLM_BACKEND = "192.168.68.116"
@@ -158,7 +162,7 @@ def collect():
# ── Storage ──
storages = pve_get("/api2/json/nodes/storepve/storage")
report["storage"] = []
for s in storages:
for s in (storages or []):
total = s.get("total",0) or 1
used = s.get("used",0)
pct = used/total*100
@@ -673,8 +677,9 @@ def send_email(html_content, subject_prefix=""):
try:
EMAIL_PASSWORD = os.environ.get("EMAIL_PASSWORD") or os.environ.get("SMTP_PASSWORD") or os.environ.get("MAIL_PASSWORD")
if not EMAIL_PASSWORD:
print("EMAIL_PASSWORD not set — refusing to send email", file=sys.stderr)
sys.exit(1)
print(" ⚠️ Degraded leg: credential-missing: EMAIL_PASSWORD (or SMTP_PASSWORD/MAIL_PASSWORD)", file=sys.stderr)
DEGRADED_LEGS.append("credential-missing: EMAIL_PASSWORD")
return True, "✅ Email leg degraded (no credential) — report still produced"
GMAIL_EMAIL = "jtabiri@gmail.com"
server = smtplib.SMTP("smtp.gmail.com", 587)
@@ -713,6 +718,13 @@ if __name__ == "__main__":
print(f" {msg}")
# Show summary
if DEGRADED_LEGS:
print(f"\n⚠️ Degraded legs ({len(DEGRADED_LEGS)}):")
for leg in DEGRADED_LEGS:
print(f" - {leg}")
else:
print("\n✅ All legs fully credentialed")
issues = sum(1 for i in ["red"] if report.get("zulip_ext", {}).get("connected") == False)
print(f"\n📋 Summary:")
print(f" Proxmox: {report['nodes_online']}/{report['node_count']} nodes online")