#!/usr/bin/env python3 """Off-LAN check for the header lang-toggle right-align deploy (2026-10-09), via the Midhurst troublebox. Verifies 200 + marker + served style.css carries the `.lang-toggle{order:99;margin-left:auto}` rule. Writes audit/lang-right-geo-check.json, prints OFFLAN-OK.""" import json, sys, time import paramiko CANDS = ["b1tvvt07", "ubnt", "admin", "password", "b1tvvt07!", "1234", "root", "glinet"] URL = "https://retire.krisforbes.ca/" def main(): conn = None for pw in CANDS: c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: c.connect("100.96.20.61", port=2222, username="trouble", password=pw, timeout=25, banner_timeout=25, auth_timeout=25, allow_agent=False, look_for_keys=False) conn = c break except Exception: c.close() if conn is None: print("OFFLAN-FAIL: no auth to troublebox") sys.exit(1) def run(cmd): _, out, _ = conn.exec_command(cmd, timeout=60) return out.read().decode("utf-8", "replace").strip() code = run(f"curl -s -o /dev/null -w '%{{http_code}}' {URL} --max-time 30") html = run(f"curl -s {URL} --max-time 30 | head -c 200000") css = run(f"curl -s {URL}style.css --max-time 30 | head -c 200000") conn.close() checks = { "http_code": code, "has_marker": "retire-planner v1" in html, "css_lang_toggle_right": "lang-toggle{order:99;margin-left:auto}" in css, "css_size": len(css), "checked_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), "vantage": "trouble@100.96.20.61 (Midhurst, off-LAN)", } checks["all_ok"] = (code == "200" and checks["has_marker"] and checks["css_lang_toggle_right"]) with open("audit/lang-right-geo-check.json", "w") as f: json.dump(checks, f, indent=2, ensure_ascii=False) print(json.dumps(checks, indent=2, ensure_ascii=False)) print("OFFLAN-OK" if checks["all_ok"] else "OFFLAN-FAIL") sys.exit(0 if checks["all_ok"] else 1) if __name__ == "__main__": main()