import sys, time, re, html as H, json sys.path.insert(0, ".") import walk as w w.login() w.deploy("actualbudget", "budget-c660b") w.wait_app("budget-c660b", "/", tries=40, delay=3) t0 = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) w.say("out-of-band stop: " + w.guest("docker stop actualbudget 2>&1").strip()) seen = [] for i in range(20): time.sleep(5) h = H.unescape(w.page("/")) txt = re.sub(r"\s+", " ", re.sub("<[^>]+>", " ", h)) for name in ("actualbudget", "Actual", "nextcloud", "Nextcloud", "gokapi", "Gokapi"): pass m = re.findall(r"(nem fut[^.]{0,200})", txt) c, d = w.ctl("GET", "/api/debug/logs?level=DEBUG&lines=6000") ents = ((d.get("data") or {}).get("entries") or []) ev = [e["timestamp"] + " " + e["message"] for e in ents if e.get("timestamp", "") >= t0 and "app_start_failed" in e["message"]] if m or ev: seen.append({"t": i * 5, "banner": m[:3], "events": ev}) w.say(f"+{i*5}s banner={m[:3]} events={len(ev)}") if ev and m: break json.dump(seen, open("../partB/06-r660-control-banner.json", "w"), indent=2, ensure_ascii=False) w.remove("actualbudget")