Files
felhom.eu/documentation/audits/night-2026-09-24/tools/liveA1c.py
T
2026-09-24 13:05:29 +02:00

34 lines
2.2 KiB
Python

import json, sys, time
sys.path.insert(0, ".")
import walk as w, fixtures as fx, ncfiles as nf
F, SUB, APP = fx.Nextcloud(), "cloud-a1", "nextcloud"
S = json.load(open(f"{w.SC}/a1-secret-state.json"))
A, files = S["A"], S["files"]
names = sorted(files)
w.login()
out = {}
c, d = w.ctl("GET", "/api/backup/restore-status")
out["restore_status"] = d
w.say("restore-status: " + json.dumps(d, ensure_ascii=False)[:600])
out["log"] = w.guest("docker logs --since 2026-09-24T10:24:55Z felhom-controller 2>&1 | grep -iE 'whole restore|WHOLE restore|Tier-2 whole|Restore-from-unit completed|hold .*CLEARED|Restoring Docker volume' | cut -c1-330 | tail -10")
w.say("log:\n" + out["log"])
w.wait_app(SUB, "/status.php", want=("200",), tries=60, delay=5)
out["account"] = bool(F.verify(w, SUB, A, w.say))
# file 0 was DELETED after the copy (must come back); file 1 was EDITED after the copy (newer — must stay edited)
c0, b0 = nf.get(w, SUB, A, names[0]); c1, b1 = nf.get(w, SUB, A, names[1]); c2, b2 = nf.get(w, SUB, A, names[2])
out["file0_back"] = (c0 == "200" and b0 == files[names[0]])
out["file1_kept_edit"] = (c1 == "200" and b1.startswith("edited by the household"))
out["file2_unchanged"] = (c2 == "200" and b2 == files[names[2]])
w.say(f"file0 (deleted after the copy) back={out['file0_back']} ({c0}); file1 (edited after the copy) kept the edit={out['file1_kept_edit']}; file2 unchanged={out['file2_unchanged']}")
out["occ_scan"] = w.guest(f"docker exec -u www-data nextcloud php occ files:scan {A['uid']} 2>&1 | tail -4")
w.say("occ files:scan (the app sees its files): " + out["occ_scan"])
c0b, b0b = nf.get(w, SUB, A, names[0])
out["file0_back_after_scan"] = (c0b == "200" and b0b == files[names[0]])
w.say(f"file0 after occ scan: {c0b} {out['file0_back_after_scan']}")
out["kept_beside"] = w.guest("find /mnt/felhom-drives/scratch_hdd/userdata/nextcloud -name '*.felhom-*' | sed 's|.*/||'")
st = w.stack(APP)
out["final"] = {k: st.get(k) for k in ("state", "hold_reason", "update_phase")}
w.say("final " + json.dumps(out["final"], ensure_ascii=False) + " | kept beside: " + repr(out["kept_beside"]))
json.dump(out, open("../A1/21-readback.json", "w"), indent=2, ensure_ascii=False, default=str)
open("../A1/21-readback.log", "w").write("\n".join(w.LOG) + "\n")