import os import requests from datetime import datetime # ---------------------------- # Config da .env # ---------------------------- CF_API_TOKEN = os.getenv("CF_UI_API_TOKEN") CF_ZONE = os.getenv("CF_ZONE") CF_SUBDOMAINS = os.getenv("CF_UI_SUBDOMAINS", "").split(",") PUBLIC_IP_API = os.getenv("PUBLIC_IP_API", "https://api.ipify.org") # opzionale HEADERS = { "Authorization": f"Bearer {CF_API_TOKEN}", "Content-Type": "application/json" } # ---------------------------- # Funzioni # ---------------------------- def get_public_ip(): """Recupera l'IP pubblico""" try: ip = requests.get(PUBLIC_IP_API, timeout=5).text.strip() return ip except Exception: return "N/A" def get_zone_id(): """Recupera l'ID della zona Cloudflare""" try: resp = requests.get( "https://api.cloudflare.com/client/v4/zones", headers=HEADERS, params={"name": CF_ZONE} ).json() if resp["success"] and resp["result"]: return resp["result"][0]["id"] else: raise Exception(f"Zona '{CF_ZONE}' non trovata o errore API.") except Exception as e: print(f"[ERROR] get_zone_id: {e}") return None def get_dns_records(): """Recupera i record DNS dei sottodomini""" zone_id = get_zone_id() if not zone_id: return [] public_ip = get_public_ip() records = [] for sub in CF_SUBDOMAINS: fqdn = f"{sub}.{CF_ZONE}" try: resp = requests.get( f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records", headers=HEADERS, params={"name": fqdn} ).json() if not resp["success"] or not resp["result"]: # Record non trovato records.append({ "name": fqdn, "dns_ip": "N/A", "public_ip": public_ip, "proxied": False, "status": "MISSING", "last_updated": datetime.utcnow().isoformat() }) continue dns = resp["result"][0] records.append({ "name": fqdn, "dns_ip": dns["content"], "public_ip": public_ip, "proxied": dns["proxied"], "status": "OK" if dns["content"] == public_ip else "MISMATCH", "last_updated": dns.get("modified_on", datetime.utcnow().isoformat()) }) except Exception as e: print(f"[ERROR] get_dns_records ({fqdn}): {e}") records.append({ "name": fqdn, "dns_ip": "ERROR", "public_ip": public_ip, "proxied": False, "status": "ERROR", "last_updated": datetime.utcnow().isoformat() }) return records # ---------------------------- # Test rapido # ---------------------------- if __name__ == "__main__": from pprint import pprint pprint(get_dns_records())