#!/usr/bin/env python3 """Qualify loop: runs the IG/Google gate on every unqualified healthy proxy in the bank, tagging ig_status. Eligible proxies are the only ones assigned to devices.""" import json import sqlite3 import subprocess import time DB = "/opt/android-fleet/fleet.db" def main(): con = sqlite3.connect(DB) con.row_factory = sqlite3.Row # ensure column cols = [r[1] for r in con.execute("PRAGMA table_info(proxies)").fetchall()] if "ig_status" not in cols: con.execute("ALTER TABLE proxies ADD COLUMN ig_status TEXT DEFAULT 'unqualified'") con.commit() rows = con.execute("SELECT * FROM proxies WHERE health='healthy' AND ig_status='unqualified'").fetchall() con.close() if not rows: return # qualify via the CLI (bank mode would re-check all; we drive one by one) for r in rows: spec = f"{r['host']}:{r['port']}:{r['proto']}" try: out = subprocess.run(["python3", "/opt/android-fleet/proxy_qualify.py", spec], capture_output=True, text=True, timeout=90).stdout for line in out.splitlines(): if line.startswith("{"): d = json.loads(line) con = sqlite3.connect(DB) con.execute("UPDATE proxies SET ig_status=? WHERE host=? AND port=?", (d["verdict"], r["host"], r["port"])) con.commit() con.close() print(f"{spec}: {d['verdict']} (ig={d.get('ig')}, google={d.get('google')})", flush=True) except Exception as e: print(f"{spec}: qualify err {e}", flush=True) if __name__ == "__main__": while True: try: main() except Exception as e: print("qualify loop err:", e, flush=True) time.sleep(600)