agenticverse/AgentNexa
0
1#!/usr/bin/env python32"""3DNS-over-HTTPS resolver for HF Spaces.4 5HF Spaces containers cannot resolve certain domains (e.g. api.telegram.org,6web.whatsapp.com) via the default DNS resolver. This script resolves key7domains using Cloudflare / Google DoH and writes results to a JSON file8plus /etc/hosts so both Python and Node.js processes benefit.9 10Usage: python3 dns-resolve.py [output-file]11"""12 13import json14import socket15import ssl16import sys17import urllib.request18 19DOH_ENDPOINTS = [20 "https://1.1.1.1/dns-query",21 "https://8.8.8.8/resolve",22 "https://dns.google/resolve",23]24 25DOMAINS = [26 # Telegram Bot API27 "api.telegram.org",28 # Discord gateway / API29 "discord.com",30 "gateway.discord.gg",31 "cdn.discordapp.com",32 # Slack33 "slack.com",34 "api.slack.com",35 # WhatsApp / Baileys36 "web.whatsapp.com",37 "g.whatsapp.net",38 "mmg.whatsapp.net",39 "pps.whatsapp.net",40 "static.whatsapp.net",41 "media.fmed1-1.fna.whatsapp.net",42]43 44 45def resolve_via_doh(domain: str, endpoint: str, timeout: int = 10) -> list[str]:46 url = f"{endpoint}?name={domain}&type=A"47 req = urllib.request.Request(url, headers={"Accept": "application/dns-json"})48 ctx = ssl.create_default_context()49 resp = urllib.request.urlopen(req, timeout=timeout, context=ctx)50 data = json.loads(resp.read().decode())51 return [a["data"] for a in data.get("Answer", []) if a.get("type") == 1]52 53 54def resolve_domain(domain: str) -> list[str]:55 for endpoint in DOH_ENDPOINTS:56 try:57 ips = resolve_via_doh(domain, endpoint)58 if ips:59 return ips60 except Exception:61 continue62 return []63 64 65def main() -> None:66 output_file = sys.argv[1] if len(sys.argv) > 1 else "/tmp/dns-resolved.json"67 68 # If system DNS works for the most-commonly-blocked domain, DoH isn't needed.69 try:70 socket.getaddrinfo("api.telegram.org", 443, socket.AF_INET)71 print("[dns] System DNS works for api.telegram.org — DoH not needed")72 with open(output_file, "w") as f:73 json.dump({}, f)74 return75 except (socket.gaierror, OSError) as e:76 print(f"[dns] System DNS failed ({e}) — using DoH fallback")77 78 results = {}79 for domain in DOMAINS:80 ips = resolve_domain(domain)81 if ips:82 results[domain] = ips[0]83 print(f"[dns] {domain} -> {ips[0]}")84 else:85 print(f"[dns] WARNING: could not resolve {domain}")86 87 with open(output_file, "w") as f:88 json.dump(results, f, indent=2)89 90 if results:91 try:92 with open("/etc/hosts", "a") as f:93 f.write("\n# === HermesFace DoH resolved domains ===\n")94 for domain, ip in results.items():95 f.write(f"{ip} {domain}\n")96 print(f"[dns] Wrote {len(results)} entries to /etc/hosts")97 except PermissionError:98 print("[dns] WARNING: cannot write /etc/hosts (permission denied)")99 100 print(f"[dns] Resolved {len(results)}/{len(DOMAINS)} domains -> {output_file}")101 102 103if __name__ == "__main__":104 main()105 