45 lines
1.6 KiB
Bash
45 lines
1.6 KiB
Bash
#!/bin/bash
|
|
|
|
# Cloudflare zone is the zone which holds the record
|
|
zone=example.com
|
|
# dnsrecord is the A record which will be updated
|
|
dnsrecord=ddns.example.com
|
|
|
|
## Cloudflare authentication details
|
|
## keep these private
|
|
cloudflare_auth_email=mail@example.com
|
|
cloudflare_auth_key=s3rys3cr3tcl0udfl4ret0ken
|
|
|
|
# Get the current external IP address
|
|
ip=$(curl -s -X GET https://ifconfig.me)
|
|
|
|
echo "Current IP is $ip"
|
|
|
|
if host $dnsrecord 1.1.1.1 | grep "has address" | grep "$ip"; then
|
|
echo "$dnsrecord is currently set to $ip; no changes needed"
|
|
exit
|
|
fi
|
|
|
|
# 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 "X-Auth-Email: $cloudflare_auth_email" \
|
|
-H "X-Auth-Key: $cloudflare_auth_key" \
|
|
-H "Content-Type: application/json" | jq -r '{"result"}[] | .[0] | .id')
|
|
|
|
echo "Zoneid for $zone is $zoneid"
|
|
|
|
# get the dns record id
|
|
dnsrecordid=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records?type=A&name=$dnsrecord" \
|
|
-H "X-Auth-Email: $cloudflare_auth_email" \
|
|
-H "X-Auth-Key: $cloudflare_auth_key" \
|
|
-H "Content-Type: application/json" | jq -r '{"result"}[] | .[0] | .id')
|
|
|
|
echo "DNSrecordid for $dnsrecord is $dnsrecordid"
|
|
|
|
# update the record
|
|
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zoneid/dns_records/$dnsrecordid" \
|
|
-H "X-Auth-Email: $cloudflare_auth_email" \
|
|
-H "X-Auth-Key: $cloudflare_auth_key" \
|
|
-H "Content-Type: application/json" \
|
|
--data "{\"type\":\"A\",\"name\":\"$dnsrecord\",\"content\":\"$ip\",\"ttl\":1,\"proxied\":false}" | jq
|