"""Night 4 on 9202 — accident: a POWER CUT (pct stop, a hard stop of the guest, from the host) while romm's automatic step is in `verifying`; then pct start. The controller log is saved when the accident is ARMED (R-683).""" import sys, time, subprocess, datetime, json, os import walk as w w.login() EVD = w.EV + "/C/night4-power" os.makedirs(EVD, exist_ok=True) start = datetime.datetime.now() + datetime.timedelta(minutes=2) W = (start - datetime.timedelta(minutes=105)).strftime("%H:%M") w.say(f"night4: W={W}, leg at {start.strftime('%H:%M')}") subprocess.run(["python3", "movewin.py", W, EVD + "/window-moved.txt"], capture_output=True, text=True) since = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) t0 = time.time() out = "" while time.time() - t0 < 1800: out = w.guest(f"docker logs --since {since} felhom-controller 2>&1 | grep -F 'update romm: phase verifying' | tail -1") if out.strip(): break time.sleep(1) w.say("ARMED: " + out.strip()) open(EVD + "/controller-before-cut.log", "w").write(w.guest(f"docker logs --since {since} felhom-controller 2>&1")) r = subprocess.run(["ssh", "hp", "export LC_ALL=C; date -u +%FT%TZ; pct stop 9202; echo stop_rc=$?; sleep 5; pct start 9202; echo start_rc=$?; date -u +%FT%TZ"], capture_output=True, text=True, timeout=300) w.say("POWER CUT: " + r.stdout.replace("\n", " ")) t1 = time.time() st = "" while time.time() - t1 < 900: time.sleep(10) st = w.guest("docker inspect -f '{{.State.Status}} {{.State.Health.Status}}' felhom-controller 2>&1").strip() if "running healthy" in st: break w.say(f"controller after boot: {st} ({round(time.time()-t1)} s)") t2 = time.time() while time.time() - t2 < 900: # the resumed update must finish (done or undone) time.sleep(10) rs = w.guest("docker logs felhom-controller 2>&1 | grep -E 'update romm: (DONE|UNDONE)|update romm.*(HOLD|held)' | tail -2") if rs.strip(): break w.say("romm after resume: " + rs.strip()) after = w.guest("docker logs felhom-controller 2>&1 | grep -E 'update-leg|update romm|resum|Resum|interrupted' ") open(EVD + "/controller-after-boot.log", "w").write(after) w.login() subprocess.run(["python3", "c1_state.py", EVD + "/pages-after.json"]) subprocess.run(["python3", "applines.py", EVD + "/app-lines.txt"]) subprocess.run(["python3", "seedread.py", "read", "night4-power (after the cut and the resume)"]) open(EVD + "/runner.log", "w").write("\n".join(w.LOG) + "\n")