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