Auto-IP-Updater/auto_ip_updater.py
2024-08-15 10:10:30 +02:00

124 lines
3.8 KiB
Python

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()