import logging import requests logger = logging.getLogger(__name__) BASE_URL = "https://api.cloudflare.com/client/v4" ZONE_NAME = "ezgg-ev.de" ZONE_ID = "b63cb3ea5a06fb53859fdce82a3b0d6d" with open("API_KEY.txt", "r") as f: API_KEY = f.read().strip() def get_public_ip() -> str: response = requests.get("https://api.ipify.org?format=json") return response.json()["ip"] def get_dns_record_id(prefix: str) -> str: url = f"{BASE_URL}/zones/{ZONE_ID}/dns_records" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } params = { "name": prefix + ZONE_NAME, "type": "A" } response = requests.get(url, headers=headers, params=params) response.raise_for_status() # Raise an error for bad status codes dns_records = response.json().get("result", []) if not dns_records: raise ValueError(f"DNS record {ZONE_NAME} not found.") return dns_records[0]["id"] def update_root_dns_record(ip_address: str, dns_record_id: str) -> dict: url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{dns_record_id}" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = { "type": "A", "name": ZONE_NAME, "content": ip_address, "ttl": 120, # Time to live, 120 seconds "proxied": False } response = requests.put(url, headers=headers, json=data) return response.json() def update_www_dns_record(ip_address: str, dns_record_id: str) -> dict: url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{dns_record_id}" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = { "type": "A", "name": "www." + ZONE_NAME, "content": ip_address, "ttl": 120, # Time to live, 120 seconds "proxied": False } response = requests.put(url, headers=headers, json=data) return response.json() def update_wildcard_dns_record(ip_address: str, dns_record_id: str) -> dict: url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{dns_record_id}" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = { "type": "A", "name": "*." + ZONE_NAME, "content": ip_address, "ttl": 120, # Time to live, 120 seconds "proxied": False } response = requests.put(url, headers=headers, json=data) return response.json() def main(): logging.basicConfig( level=logging.INFO, handlers=[ logging.FileHandler("auto-ip-updater.log"), logging.StreamHandler() ] ) current_ip = get_public_ip() logger.info(f"Updating DNS Record for {ZONE_NAME} to IP {current_ip}") root_dns_record_id = get_dns_record_id("") result = update_root_dns_record(current_ip, root_dns_record_id) if result["success"]: logger.info("Root DNS record updated successfully.") else: logger.error("Failed to update DNS record.") logger.error(result) www_dns_record_id = get_dns_record_id("www.") result = update_www_dns_record(current_ip, www_dns_record_id) if result["success"]: logger.info("WWW DNS record updated successfully.") else: logger.error("Failed to update DNS record.") logger.error(result) wildcard_dns_record_id = get_dns_record_id("*.") result = update_wildcard_dns_record(current_ip, wildcard_dns_record_id) if result["success"]: logger.info("Wildcard DNS record updated successfully.") else: logger.error("Failed to update DNS record.") logger.error(result) if __name__ == "__main__": main()