124 lines
3.8 KiB
Python
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()
|