Skip to content

Instantly share code, notes, and snippets.

@4ft35t
Forked from benkulbertis/cloudflare-update-record.sh
Last active December 4, 2022 15:55
Show Gist options
  • Save 4ft35t/510897486bc6986d19cac45b3b9ca1d0 to your computer and use it in GitHub Desktop.
Save 4ft35t/510897486bc6986d19cac45b3b9ca1d0 to your computer and use it in GitHub Desktop.
Cloudflare API v4 Dynamic DNS Update in Bash
#!/bin/bash
# CHANGE THESE
auth_email="[email protected]"
auth_key="c2547eb745079dac9320b638f5e225cf483cc5cfdda41" # found in cloudflare account settings
zone_name="example.com"
record_name="www.example.com"
# MAYBE CHANGE THESE
ip=$(curl -s http://ipv4.icanhazip.com)
ip_file="ip.txt"
log_file="cloudflare.log"
# LOGGER
log() {
if [ "$1" ]; then
echo "[$(date)] - $1" >> $log_file
fi
}
# SCRIPT START
log "Check Initiated"
if [ -f $ip_file ]; then
old_ip=$(cat $ip_file)
if [ $ip == $old_ip ]; then
echo "IP has not changed."
exit 0
fi
fi
zone_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 )
record_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*')
update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\"}")
if [[ $update == *"\"success\":false"* ]]; then
log "API UPDATE FAILED. DUMPING RESULTS:"
log "$update"
echo "API UPDATE FAILED. DUMPING RESULTS:"
echo "$update"
exit 1
else
echo "$ip" > $ip_file
log "IP changed to: $ip"
echo "IP changed to: $ip"
fi
@yanwen
Copy link

yanwen commented Jul 14, 2019

When I run it in busybox under router. Some errors happen below:

API UPDATE FAILED. DUMPING RESULTS:

@4ft35t
Copy link
Author

4ft35t commented Jul 16, 2019

When I run it in busybox under router. Some errors happen below:

API UPDATE FAILED. DUMPING RESULTS:

paste cloudflare.log content here

@yanwen
Copy link

yanwen commented Jul 16, 2019

[Mon Jul 15 02:04:25 CST 2019] - Check Initiated
[Mon Jul 15 02:04:26 CST 2019] - API UPDATE FAILED. DUMPING RESULTS:

[Mon Jul 15 02:11:10 CST 2019] - Check Initiated
[Mon Jul 15 02:11:11 CST 2019] - API UPDATE FAILED. DUMPING RESULTS:

[Mon Jul 15 02:22:20 CST 2019] - Check Initiated
[Mon Jul 15 02:22:22 CST 2019] - API UPDATE FAILED. DUMPING RESULTS:

@4ft35t
Copy link
Author

4ft35t commented Jul 18, 2019

rm cloudflare.ids, and replace 4-7 line to your own info.

@deeco
Copy link

deeco commented Jul 26, 2019

How to run this correctly ? Im getting API UPDATE FAILED. DUMPING RESULTS:
{"success":false,"errors":[{"code":7001,"message":"Method PUT not available for that URI."}],"messages":[],"result":null}

command trying is ./cloudflare-update-record.sh and ./cloudflare-update-record.sh -ip=192.168.1.1

@4ft35t
Copy link
Author

4ft35t commented Jul 29, 2019

How to run this correctly ? Im getting API UPDATE FAILED. DUMPING RESULTS:
{"success":false,"errors":[{"code":7001,"message":"Method PUT not available for that URI."}],"messages":[],"result":null}

command trying is ./cloudflare-update-record.sh and ./cloudflare-update-record.sh -ip=192.168.1.1

./cloudflare-update-record.sh works for me. And this scripts run without any args.
To debug it, run with
bash -x cloudflare-update-record.sh

@chantroiviet
Copy link

Please update. I update for https://ctviet.com but error alert: API UPDATE FAILED. DUMPING RESULTS

@4ft35t
Copy link
Author

4ft35t commented Apr 14, 2020

Please update. I update for https://ctviet.com but error alert: API UPDATE FAILED. DUMPING RESULTS

Works for me. Please paste the next line after API UPDATE FAILED. DUMPING RESULTS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment