124 lines
4.1 KiB
Bash
Executable File
124 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Cloudflare DDNS – Multi-Record (A), mehrere Zonen
|
||
# Pfadvorschlag: /usr/local/bin/cloudflare-ddns.sh
|
||
|
||
# curl -s -X GET "https://api.cloudflare.com/client/v4/zones/836d573a41c5dc1a0a1712332d4facb0/dns_records?type=A&name=mc3.davidt.cloud" -H "Authorization: Bearer UsC5_INInUKoanrSIITOxZQMso3uQUZPMUIMQW9t" -H "Content-Type: application/json" | jq -r '.result[0].id'
|
||
|
||
|
||
|
||
|
||
|
||
set -euo pipefail
|
||
|
||
# ── Konfiguration ──────────────────────────────────────────────────────────────
|
||
# !!! Trage hier deinen echten Token ein
|
||
CF_API_TOKEN="UsC5_INInUKoanrSIITOxZQMso3uQUZPMUIMQW9t"
|
||
|
||
# Zonen
|
||
CF_ZONE_ID_DE="3059e7e1c29c962544c82e941f60fcb6"
|
||
CF_ZONE_ID_CLOUD="836d573a41c5dc1a0a1712332d4facb0"
|
||
|
||
# DNS-Eintrag 1: nas.davidt.de
|
||
CF_RECORD_ID_1="d0cbc0b4294b6c1e76dafb8e5309893d"
|
||
CF_RECORD_NAME_1="nas.davidt.de"
|
||
CF_RECORD_ZONE_1="$CF_ZONE_ID_DE"
|
||
|
||
# DNS-Eintrag 2: vpn.davidt.de
|
||
#CF_RECORD_ID_2="430898a21e676d72b6ab90f23cda74cd"
|
||
#CF_RECORD_NAME_2="vpn.davidt.de"
|
||
#CF_RECORD_ZONE_2="$CF_ZONE_ID_DE"
|
||
|
||
# DNS-Eintrag 3: mc.davidt.cloud
|
||
CF_RECORD_ID_3="4a964d71eda3de8d1646bf1263d29cce"
|
||
CF_RECORD_NAME_3="mc.davidt.cloud"
|
||
CF_RECORD_ZONE_3="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 4: remote.davidt.cloud
|
||
CF_RECORD_ID_4="5dff7541531c24a151b00c6b7f7bd66c"
|
||
CF_RECORD_NAME_4="remote.davidt.cloud"
|
||
CF_RECORD_ZONE_4="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 5: mc2.davidt.cloud
|
||
CF_RECORD_ID_5="d0e1b3c84fe55bcaa21509f16218503b"
|
||
CF_RECORD_NAME_5="mc2.davidt.cloud"
|
||
CF_RECORD_ZONE_5="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 6: matrix.davidt.cloud
|
||
CF_RECORD_ID_6="10df7a1dd299ae2317a6719d74964453"
|
||
CF_RECORD_NAME_6="matrix.davidt.cloud"
|
||
CF_RECORD_ZONE_6="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 7: mas.davidt.cloud
|
||
CF_RECORD_ID_7="f0b8cae60639c13bb01955aee8ac9cf6"
|
||
CF_RECORD_NAME_7="mas.davidt.cloud"
|
||
CF_RECORD_ZONE_7="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 8: mc3.davidt.cloud
|
||
CF_RECORD_ID_8="e853ee1f6134503e1010cb2b64e4618c"
|
||
CF_RECORD_NAME_8="mc3.davidt.cloud"
|
||
CF_RECORD_ZONE_8="$CF_ZONE_ID_CLOUD"
|
||
|
||
# DNS-Eintrag 9: sandbox-pad.davidt.cloud
|
||
#CF_RECORD_ID_9="d93837978a456b39fcd40b17a3216b2a"
|
||
#CF_RECORD_NAME_9="sandbox-pad.davidt.cloud"
|
||
#CF_RECORD_ZONE_9="$CF_ZONE_ID_CLOUD"
|
||
|
||
# IPv6 verwenden?
|
||
USE_IPV6=false
|
||
|
||
# ── aktuelle öffentliche IP ermitteln ─────────────────────────────────────────
|
||
if [[ "$USE_IPV6" == "true" ]]; then
|
||
CURRENT_IP="$(curl -fsS --max-time 5 https://ifconfig.co/ip || true)"
|
||
else
|
||
CURRENT_IP="$(curl -fsS --max-time 5 https://ipv4.icanhazip.com || true)"
|
||
fi
|
||
CURRENT_IP="${CURRENT_IP//$'\n'/}" # trim newline
|
||
|
||
if [[ -z "$CURRENT_IP" ]]; then
|
||
echo "✗ Konnte öffentliche IP nicht ermitteln."
|
||
exit 1
|
||
fi
|
||
|
||
IP_FILE="/tmp/cf_last_ip.txt"
|
||
LAST_IP=""
|
||
[[ -f "$IP_FILE" ]] && LAST_IP="$(cat "$IP_FILE")"
|
||
|
||
# ── nur updaten, wenn sich die IP geändert hat ────────────────────────────────
|
||
if [[ "$CURRENT_IP" != "$LAST_IP" ]]; then
|
||
echo "IP hat sich geändert: ${LAST_IP:-<none>} -> $CURRENT_IP"
|
||
|
||
for i in {1..9}; do
|
||
CF_RECORD_ID_VAR="CF_RECORD_ID_${i}"
|
||
CF_RECORD_NAME_VAR="CF_RECORD_NAME_${i}"
|
||
CF_RECORD_ZONE_VAR="CF_RECORD_ZONE_${i}"
|
||
|
||
RECORD_ID="${!CF_RECORD_ID_VAR:-}"
|
||
RECORD_NAME="${!CF_RECORD_NAME_VAR:-}"
|
||
ZONE_ID="${!CF_RECORD_ZONE_VAR:-}"
|
||
|
||
[[ -z "$RECORD_ID" || -z "$RECORD_NAME" || -z "$ZONE_ID" ]] && continue
|
||
|
||
echo "→ Aktualisiere ${RECORD_NAME}"
|
||
|
||
RESPONSE="$(
|
||
curl -fsS -X PUT \
|
||
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
|
||
-H "Authorization: Bearer ${CF_API_TOKEN}" \
|
||
-H "Content-Type: application/json" \
|
||
--data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}\",\"content\":\"${CURRENT_IP}\",\"ttl\":120,\"proxied\":false}" \
|
||
|| true
|
||
)"
|
||
|
||
if grep -q '"success":true' <<<"$RESPONSE"; then
|
||
echo "✓ ${RECORD_NAME} erfolgreich aktualisiert."
|
||
else
|
||
echo "✗ Fehler bei ${RECORD_NAME}:"
|
||
echo "$RESPONSE"
|
||
fi
|
||
done
|
||
|
||
printf "%s" "$CURRENT_IP" > "$IP_FILE"
|
||
else
|
||
echo "IP unverändert. Kein Update nötig."
|
||
fi
|