diff --git a/ddns/update.sh b/ddns/update.sh new file mode 100644 index 0000000..50f96fd --- /dev/null +++ b/ddns/update.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +INTERVAL=60 + +dnsrecord="$DNS_RECORD" +zone="$DNS_ZONE" + +cloudflare_token="$CLOUDFLARE_API_TOKEN" + +# get the zone id for the requested zone +zoneid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone&status=active" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" | jq -r '{"result"}[] | .[0] | .id') + +if [ "$zoneid" == "null" ]; then + echo "Zone not found, is your CloudFlare API key correct?" + exit 1 +fi + +while true +do + +wan_ip4=`dig @resolver4.opendns.com A myip.opendns.com +short -4` +wan_ip6=`dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6` + +# update IPV4 record +published_ip4=`dig $dnsrecord A +short` +published_ip6=`dig $dnsrecord AAAA +short` + +if [ "$published_ip4" != "$wan_ip4" ]; then + echo "Updating $dnsrecord (zone $zoneid) A record from [$published_ip4] to [$wan_ip4]..." + dnsrecordid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=A&name=$dnsrecord" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" | jq -r '{"result"}[] | .[0] | .id') + if [ "$dnsrecordid" == "null" ]; then + curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" \ + --data "{\"type\":\"A\",\"name\":\"$dnsrecord\",\"content\":\"$wan_ip4\",\"ttl\":1,\"proxied\":false}" | jq + else + curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecordid" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" \ + --data "{\"type\":\"A\",\"name\":\"$dnsrecord\",\"content\":\"$wan_ip4\",\"ttl\":1,\"proxied\":false}" | jq + fi +fi + +if [ "$published_ip6" != "$wan_ip6" ]; then + echo "Updating $dnsrecord (zone $zoneid) AAAA record from [$published_ip6] to [$wan_ip6]..." + dnsrecordid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=AAAA&name=$dnsrecord" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" | jq -r '{"result"}[] | .[0] | .id') + if [ "$dnsrecordid" == "null" ]; then + curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" \ + --data "{\"type\":\"AAAA\",\"name\":\"$dnsrecord\",\"content\":\"$wan_ip6\",\"ttl\":1,\"proxied\":false}" | jq + else + curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecordid" \ + -H "Authorization: Bearer $cloudflare_token" \ + -H "Content-Type: application/json" \ + --data "{\"type\":\"AAAA\",\"name\":\"$dnsrecord\",\"content\":\"$wan_ip6\",\"ttl\":1,\"proxied\":false}" | jq + fi +fi + +sleep $INTERVAL +done