lixonet-ee/ddns/update.sh
2023-03-21 13:07:08 -06:00

68 lines
2.8 KiB
Bash

#!/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