proxy qualifier: IG+Google gate, transparent-leak detection, qualify loop service
This commit is contained in:
47
proxy_qualify_loop.py
Normal file
47
proxy_qualify_loop.py
Normal file
@@ -0,0 +1,47 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user