65 lines
2.0 KiB
Python
Executable File
65 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import datetime
|
|
import json
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
BASE = ROOT / "runtime"
|
|
STATE_PATH = BASE / "state.json"
|
|
DOD_PATH = BASE / "evidence" / "dod-status.json"
|
|
OUTPUT_PATH = BASE / "evidence" / "dod-eval.json"
|
|
now = datetime.datetime.now(datetime.timezone.utc)
|
|
res = {"ts": now.isoformat(), "status": "fail", "reason": "init", "checks": {}}
|
|
|
|
def load(p):
|
|
with open(p, "r", encoding="utf-8") as f:
|
|
return json.load(f)
|
|
|
|
try:
|
|
state = load(STATE_PATH)
|
|
dod = load(DOD_PATH)
|
|
res["checks"]["state_exists"] = True
|
|
res["checks"]["dod_exists"] = True
|
|
missing = []
|
|
for k in ["updatedAt", "status"]:
|
|
if k not in state:
|
|
missing.append(k)
|
|
res["checks"]["state_fields_ok"] = len(missing) == 0
|
|
res["checks"]["state_missing_fields"] = missing
|
|
|
|
fresh = False
|
|
try:
|
|
t = datetime.datetime.fromisoformat(str(state.get("updatedAt")).replace("Z", "+00:00"))
|
|
fresh = (now - t).total_seconds() <= 1200
|
|
except Exception:
|
|
fresh = False
|
|
res["checks"]["fresh_20m"] = fresh
|
|
|
|
text = json.dumps(dod, ensure_ascii=False)
|
|
done_all = "A1" in text and "E8" in text and (
|
|
"all_pass" in text or "allPassed" in text or "全达标" in text
|
|
)
|
|
res["checks"]["dod_all_pass_hint"] = done_all
|
|
|
|
st = str(state.get("status", "")).upper()
|
|
if st in ["ALERT", "FAIL", "STALE"]:
|
|
res["status"] = "alert"
|
|
res["reason"] = f"state_status={st}"
|
|
elif not fresh:
|
|
res["status"] = "alert"
|
|
res["reason"] = "state_stale"
|
|
else:
|
|
res["status"] = "ok"
|
|
res["reason"] = "healthy"
|
|
except FileNotFoundError as e:
|
|
res["status"] = "fail"
|
|
res["reason"] = f"missing_file:{e.filename}"
|
|
except Exception as e:
|
|
res["status"] = "fail"
|
|
res["reason"] = f"exception:{e}"
|
|
|
|
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
with open(OUTPUT_PATH, "w", encoding="utf-8") as f:
|
|
json.dump(res, f, ensure_ascii=False, indent=2)
|
|
print(json.dumps(res, ensure_ascii=False))
|