Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Cloudflare API v4 Dynamic DNS Update in Bash
#!/bin/sh
# CHANGE THESE
auth_email="user@example.com"
auth_key="c2547eb745079dac9320b638f5e225cf483cc5cfdda41" # found in cloudflare "profile" - "api-tokens" - "Global API Key"
zone_name="example.com"
record_name="www.example.com" # must add on cloudflare websit before run this script. Or you will get error `Method PUT not available for that URI`
# MAYBE CHANGE THESE
ip=$(curl -s http://ipv4.icanhazip.com)
ip_file="ip.txt"
id_file="cloudflare.ids"
log_file="cloudflare.log"
# LOGGER
log() {
if [ "$1" ]; then
echo -e "[$(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
if [ -f $id_file ] && [ $(wc -l $id_file | cut -d " " -f 1) == 2 ]; then
zone_identifier=$(head -1 $id_file)
record_identifier=$(tail -1 $id_file)
else
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" | sed 's/,/\n/g' | awk -F'"' '/id/{print $6}' | 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" | sed 's/,/\n/g' | awk -F'"' '/id/{print $6}' | head -1)
[ ! -z ${zone_identifier} ] && echo "$zone_identifier" > $id_file
[ ! -z ${record_identifier} ] && echo "$record_identifier" >> $id_file
fi
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 [[ -z ${update##*'"success":false'*} ]]; then
message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
log "$message"
echo -e "$message"
exit 1
else
message="IP changed to: $ip"
echo "$ip" > $ip_file
log "$message"
echo "$message"
fi
@yanwen

This comment has been minimized.

Copy link

@yanwen yanwen commented Jul 14, 2019

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

API UPDATE FAILED. DUMPING RESULTS:

@4ft35t

This comment has been minimized.

Copy link
Owner Author

@4ft35t 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

This comment has been minimized.

Copy link

@yanwen 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

This comment has been minimized.

Copy link
Owner Author

@4ft35t 4ft35t commented Jul 18, 2019

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

@deeco

This comment has been minimized.

Copy link

@deeco 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

This comment has been minimized.

Copy link
Owner Author

@4ft35t 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

This comment has been minimized.

Copy link

@chantroiviet chantroiviet commented Apr 13, 2020

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

@4ft35t

This comment has been minimized.

Copy link
Owner Author

@4ft35t 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
You can’t perform that action at this time.