Files
ceres-skripte/cloudflare-ddns.sh
2025-11-05 14:59:56 +01:00

124 lines
4.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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