Python: Cloudflare DNS-A-Record erstellen oder aktualisieren – Beispiel

English Deutsch

Dies basiert auf unserem vorherigen Beitrag Python Cloudflare DNS A record update example erstellt den Record aber auch, wenn er nicht existiert.

cloudflare_update.py
#!/usr/bin/env python3
import CloudFlare
import argparse
import sys

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--email", required=True, help="Die Cloudflare-Login-E-Mail, die verwendet werden soll")
    parser.add_argument("-n", "--hostname", required=True, help="Der Hostname, der aktualisiert werden soll, z.B. mydyndns.mydomain.com")
    parser.add_argument("-k", "--api-key", required=True, help="Der Cloudflare globaler API-Key, der verwendet werden soll. HINWEIS: Domänenspezifische API-Tokens funktionieren NICHT!")
    parser.add_argument("-i", "--ip-address", required=True, help="Auf welche IP-Adresse der Record aktualisiert werden soll")
    parser.add_argument("-t", "--ttl", default=60, type=int, help="Die TTL der Records in Sekunden (oder 1 für auto)")
    args = parser.parse_args()

    # Cloudflare API-Client initialisieren
    cf = CloudFlare.CloudFlare(
        email=args.email,
        token=args.api_key
    )
    # Zone-ID abrufen (für die Domäne). Deshalb benötigen wir den API-Key und der Domänen-API-Token reicht nicht aus
    zone = ".".join(args.hostname.split(".")[-2:]) # domain = test.mydomain.com => zone = mydomain.com
    zones = cf.zones.get(params={"name": zone})
    if len(zones) == 0:
        print(f"Could not find CloudFlare zone {zone}, please check domain {args.hostname}")
        sys.exit(2)
    zone_id = zones[0]["id"]

    # Bestehenden A-Record abrufen
    a_records = cf.zones.dns_records.get(zone_id, params={"name": args.hostname, "type": "A"})
    if len(a_records): # Bestehenden Record gefunden
        print("Bestehenden Record gefunden, wird aktualisiert...")
        a_record = a_records[0]
        # Record aktualisieren & in Cloudflare speichern
        a_record["content"] = args.ip_address
        cf.zones.dns_records.put(zone_id, a_record["id"], data=a_record)
    else: # Kein bestehender Record. Erstellen!
        print("Record existiert nicht, neuer Record wird erstellt...")
        a_record = {}
        a_record["type"] = "A"
        a_record["name"] = args.hostname
        a_record["ttl"] = args.ttl # 1 == auto
        a_record["content"] = args.ip_address
        cf.zones.dns_records.post(zone_id, data=a_record)

Verwendungsbeispiel:

cloudflare_update_usage.sh
./update-dns.py --api-key ... --email [email protected] --ttl 300 --ip 1.2.3.4 --hostname mysubdomain.domain.com

Check out similar posts by category: Networking, Python