82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
import os
|
|
import time
|
|
import ovh
|
|
import requests
|
|
from datetime import datetime
|
|
|
|
# --- Konfiguration ---
|
|
AK = os.getenv('OVH_APPLICATION_KEY')
|
|
AS = os.getenv('OVH_APPLICATION_SECRET')
|
|
CK = os.getenv('OVH_CONSUMER_KEY')
|
|
DOMAIN = os.getenv('DOMAIN') # Die Hauptdomain, z.B. "meine-domain.de"
|
|
INTERVAL = int(os.getenv('INTERVAL', 300))
|
|
|
|
# Subdomains auslesen und Liste erstellen
|
|
# Beispiel Input: "www, vpn, cloud, @"
|
|
raw_subs = os.getenv('SUBDOMAINS', '')
|
|
SUBDOMAINS = [s.strip() for s in raw_subs.split(',') if s.strip()]
|
|
|
|
def log(message):
|
|
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}", flush=True)
|
|
|
|
def get_public_ip():
|
|
try:
|
|
return requests.get('https://api.ipify.org', timeout=10).text
|
|
except Exception as e:
|
|
log(f"Fehler beim Abrufen der IP: {e}")
|
|
return None
|
|
|
|
def update_ovh_dns(current_ip):
|
|
client = ovh.Client(endpoint='ovh-eu', application_key=AK, application_secret=AS, consumer_key=CK)
|
|
|
|
if not SUBDOMAINS:
|
|
log("WARNUNG: Keine Subdomains in der Liste 'SUBDOMAINS' gefunden.")
|
|
return
|
|
|
|
for sub in SUBDOMAINS:
|
|
# OVH Logik: Leerer String = Root Domain. Wir nutzen '@' als Platzhalter für User-Freundlichkeit
|
|
sub_for_api = '' if sub == '@' else sub
|
|
fqdn = f"{sub}.{DOMAIN}" if sub != '@' else DOMAIN
|
|
|
|
try:
|
|
# 1. Record ID suchen
|
|
records = client.get(f'/domain/zone/{DOMAIN}/record',
|
|
fieldType='A',
|
|
subDomain=sub_for_api)
|
|
|
|
if not records:
|
|
log(f"Übersprungen: Kein A-Record für '{fqdn}' gefunden.")
|
|
continue
|
|
|
|
for record_id in records:
|
|
# 2. Details prüfen
|
|
record_details = client.get(f'/domain/zone/{DOMAIN}/record/{record_id}')
|
|
|
|
if record_details['target'] == current_ip:
|
|
log(f"OK: {fqdn} ist aktuell ({current_ip}).")
|
|
else:
|
|
# 3. Update senden
|
|
client.put(f'/domain/zone/{DOMAIN}/record/{record_id}', target=current_ip)
|
|
log(f"UPDATE: {fqdn} wurde auf {current_ip} gesetzt.")
|
|
|
|
# Refresh anstoßen (nur einmal pro Loop eigentlich nötig, aber sicher ist sicher)
|
|
client.post(f'/domain/zone/{DOMAIN}/refresh')
|
|
|
|
except Exception as e:
|
|
log(f"Fehler bei {fqdn}: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
log("OVH DynDNS Updater gestartet...")
|
|
log(f"Domain: {DOMAIN}")
|
|
log(f"Überwachte Subdomains: {SUBDOMAINS}")
|
|
|
|
if not all([AK, AS, CK, DOMAIN]):
|
|
log("CRITICAL: API Keys oder Domain fehlen.")
|
|
exit(1)
|
|
|
|
while True:
|
|
public_ip = get_public_ip()
|
|
if public_ip:
|
|
update_ovh_dns(public_ip)
|
|
|
|
time.sleep(INTERVAL) |