#!/usr/bin/env python3
"""Verifikasi HTTP status URL dari LUAR (check-host.net) — dipakai karena host ini tidak bisa
menembak situs klien (hang) dan proxy balas 522.

Usage: python3 verif_links_luar.py <url> [<url> ...]
Exit 0 kalau SEMUA url balas 200 di >=1 node.
"""
import json, sys, time, urllib.parse, urllib.request

UA = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36",
      "Accept": "application/json"}


def get(url, timeout=90):
    req = urllib.request.Request(url, headers=UA)
    with urllib.request.urlopen(req, timeout=timeout) as r:
        return json.loads(r.read().decode("utf-8", "replace"))


def check(url, nodes=4, wait=30):
    q = "https://check-host.net/check-http?host=%s&max_nodes=%d" % (urllib.parse.quote(url, safe=""), nodes)
    rid = get(q).get("request_id")
    if not rid:
        return None, []
    codes = []
    for attempt in range(4):
        time.sleep(wait)
        res = get("https://check-host.net/check-result/%s" % rid)
        codes = []
        for node, v in res.items():
            if not v:
                continue
            item = v[0] if isinstance(v, list) else v
            if isinstance(item, dict):
                codes.append(str(item.get("status_code") or item.get("error") or "?"))
        if codes:
            break
    return codes, res


if __name__ == "__main__":
    urls = sys.argv[1:]
    allok = True
    for u in urls:
        codes, _ = check(u)
        if codes is None:
            print("?? %s -> check-host gagal" % u)
            allok = False
            continue
        ok = "200" in codes
        if not ok:
            allok = False
        print("%s %s -> %s" % ("OK " if ok else "BAD", u, ", ".join(codes)))
    sys.exit(0 if allok else 1)
