#!/usr/bin/env python3
"""Roskompozor local network diagnostics. Python 3.11+, standard library only."""
import argparse, http.client, json, socket, ssl, sys, time, urllib.parse, urllib.request

UA="RoskompozorLocalCheck/1.0"
def timed(fn):
    start=time.perf_counter()
    try:return True,fn(),round((time.perf_counter()-start)*1000)
    except Exception as exc:return False,f"{type(exc).__name__}: {exc}",round((time.perf_counter()-start)*1000)
def target_host(raw):
    value=raw if "://" in raw else "https://"+raw
    p=urllib.parse.urlsplit(value)
    if p.scheme not in ("http","https") or not p.hostname:return None,None
    return p.hostname.encode("idna").decode(),value
def main():
    ap=argparse.ArgumentParser(description="DNS/TCP/TLS/HTTP diagnostics through your current connection")
    ap.add_argument("target");args=ap.parse_args()
    host,url=target_host(args.target)
    if not host:sys.exit("Invalid target")
    checks={}
    ok,answer,ms=timed(lambda: sorted({x[4][0] for x in socket.getaddrinfo(host,None,type=socket.SOCK_STREAM)}))
    checks["dns"]={"ok":ok,"detail":", ".join(answer) if ok else answer,"ms":ms}
    for port,key in ((80,"tcp80"),(443,"tcp443")):
        def connect(port=port):
            with socket.create_connection((host,port),timeout=5):return "connected"
        good,detail,elapsed=timed(connect);checks[key]={"ok":good,"detail":str(detail),"ms":elapsed}
    def tls():
        ctx=ssl.create_default_context()
        with socket.create_connection((host,443),timeout=5) as raw:
            with ctx.wrap_socket(raw,server_hostname=host) as s:
                cert=s.getpeercert();return f"{s.version()}; expires {cert.get('notAfter','unknown')}"
    good,detail,elapsed=timed(tls);checks["tls"]={"ok":good,"detail":str(detail),"ms":elapsed}
    for scheme in ("http","https"):
        test=urllib.parse.urlunsplit((scheme,host,"/","",""))
        def request(test=test):
            req=urllib.request.Request(test,headers={"User-Agent":UA})
            with urllib.request.urlopen(req,timeout=7) as r:
                r.read(65536);return f"HTTP {r.status}; {r.geturl()}"
        good,detail,elapsed=timed(request);checks[scheme]={"ok":good,"detail":str(detail),"ms":elapsed}
    output={"version":1,"target":host,"checks":checks}
    print(json.dumps(output,ensure_ascii=False,indent=2))
if __name__=="__main__":main()
