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/bash
# CHANGE THESE
auth_email="user@example.com"
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"
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" | 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":")[^"]*')
echo "$zone_identifier" > $id_file
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 [[ $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
@rasmusbe

This comment has been minimized.

Copy link

@rasmusbe rasmusbe commented May 12, 2015

Thanks for your code!
Since grep -P isn't available on mac I made an alternative version for mac (will probably work for linux as well)
https://gist.github.com/rasmusbe/fc2e270095f1a3b41348

@tomdavidson

This comment has been minimized.

Copy link

@tomdavidson tomdavidson commented Jul 19, 2015

If one is tired of the OSX exceptions (such as not pcre with grep), then one could fix their grep and other cmd tools:
https://gist.github.com/tomdavidson/ee37773bc9089476f92d

@b0bcarlson

This comment has been minimized.

Copy link

@b0bcarlson b0bcarlson commented Jan 11, 2016

It still appears to work but I am getting cloudflare-update-record.sh: 45: cloudflare-update-record.sh: [[: not found

@nekoyokoshima

This comment has been minimized.

Copy link

@nekoyokoshima nekoyokoshima commented Feb 9, 2016

for anyone(@123isme1) getting cloudflare-update-record.sh: 45: cloudflare-update-record.sh: [[: not found
Replace lines 45-55 with

case "$update" in
  *"\"success\":false"*)
    message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
    log "$message"
    echo -e "$message"
    exit 1;;
  *)
      message="IP changed to: $ip"
    echo "$ip" > $ip_file
    log "$message"
    echo "$message";;
esac

A dirty workaround, but hey, it works!

If you want to change to root record of the domain you'll need to set record_name="www.example.com" (Duh!!) and make sure to replace dns_records?name=$record_name with "dns_records?type=A&name=$record_name" making sure the type corresponds with either A or CNAME(cname is not suggested for sec reasons)

@Gurkengewuerz

This comment has been minimized.

Copy link

@Gurkengewuerz Gurkengewuerz commented Mar 8, 2016

Thank's for sharing!

@gstuartj

This comment has been minimized.

Copy link

@gstuartj gstuartj commented May 7, 2016

I started modifying this script for my own purposes, then ended up rewriting it. I did, however, use @benkulbertis's grep patterns for parsing the responses, so thanks for the inspiration. My script is POSIX compliant, so it can be used on embedded systems like consumer routers without BASH. I also added more error checking and some other useful actions & ease-of-use stuff. Repo: https://github.com/gstuartj/cf-ddns.sh/

@Noino

This comment has been minimized.

Copy link

@Noino Noino commented Aug 10, 2016

Felt like i had to add this starting line 25

if ! [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
    message="Fetched IP does not look valid! Quitting"
    log "$message"
    echo -e "$message"
    exit 1 
fi
@thordin9

This comment has been minimized.

Copy link

@thordin9 thordin9 commented Dec 24, 2016

very useful, thanks for sharing.

@Wohlraj

This comment has been minimized.

Copy link

@Wohlraj Wohlraj commented Dec 24, 2016

How about handling IPv6 as well? I can give it a try if not already done

@emily-curry

This comment has been minimized.

Copy link

@emily-curry emily-curry commented Jan 17, 2017

Thanks for this!

@mitchins

This comment has been minimized.

Copy link

@mitchins mitchins commented Feb 19, 2017

This worked for me, thanks a lot!

@PsychoTea

This comment has been minimized.

Copy link

@PsychoTea PsychoTea commented Feb 24, 2017

Script is working great for me, bar one small issue. Say I have the domain s.tech. I'm able to update both a.s.tech, www.s.tech, but simply setting s.tech as the record name in hopes of updating s.tech doesn't work. Any ideas?

Edit: nevermind, it appears to be working now. Not sure how that happened since I have edited anything though O.o

@tmkasun

This comment has been minimized.

Copy link

@tmkasun tmkasun commented Apr 8, 2017

Thanks it's working
If by chance anyone get an error like below:
API UPDATE FAILED. DUMPING RESULTS: {"success":false,"errors":[{"code":7001,"message":"Method PUT not available for that URI."}],"messages":[],"result":null}

Try deleting cloudflare.ids and update again 👍

@bogdanstoica35

This comment has been minimized.

Copy link

@bogdanstoica35 bogdanstoica35 commented Apr 8, 2017

Thanks for sharing. The script works just fine (I do not need it for DDNS but to change the ip address in the DNS zone with an IP address of my choice). One question though. When the script updates the A record in CF, the cloudflare CF CDN is disabled by default. I need that to be enabled all the time. Any ideea how to do that?

@jsarenik

This comment has been minimized.

Copy link

@jsarenik jsarenik commented May 8, 2017

Thank you!

@Kiendeleo

This comment has been minimized.

Copy link

@Kiendeleo Kiendeleo commented Jun 15, 2017

I am getting the following result when I run the script:
{"success":false,"errors":[{"code":7003,"message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"},{"code":7000,"message":"No route for that URI"}],"messages":[],"result":null}

I am attempting to update and A record of a subdomain on an account with multiple domains. Is anyone else getting this error?

@ghost

This comment has been minimized.

Copy link

@ghost ghost commented Sep 1, 2017

Bug what if i like to change more records than 1? For example: www smtp irc ftp and more

@sandroshu

This comment has been minimized.

Copy link

@sandroshu sandroshu commented Sep 17, 2017

@maratmkhitaryan Then why don't you update one and use CNAME for the rest?

@danieluramg

This comment has been minimized.

Copy link

@danieluramg danieluramg commented Sep 18, 2017

I'm having the same error as @Kiendeleo user above, but only when the script runs on Cron, if I run manually it updates properly.

Run on Cron:
{"success":false,"errors":[{"code":7003,"message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"},{"code":7000,"message":"No route for that URI"}],"messages":[],"result":null}

Manually executing:
{"result":{"id":"XXXXXXXXXXXXXXXX","type":"A","name":"XXX.XXX.XX","content":"177.XXX.XX.188","proxiable":true,"proxied":false,"ttl":1,"locked":false,"zone_id":"XXXXXXXXXXXXXXXXX","zone_name":"ideias.pw","modified_on":"2017-09-18T11:31:10.657205Z","created_on":"2017-09-18T11:31:10.657205Z","meta":{"auto_added":false}},"success":true,"errors":[],"messages":[]}

@beykansen

This comment has been minimized.

Copy link

@beykansen beykansen commented Nov 28, 2017

Added proxied true which is for enabling http proxy. Also updated with @nekoyokoshima answer. Final working version (for me) is below:

#!/bin/bash

# Created by benkulbertis/cloudflare-update-record.sh
# CHANGE THESE
auth_email="user@example.com"
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"
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" | 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":")[^"]*')
    echo "$zone_identifier" > $id_file
    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\",\"proxied\":true,\"name\":\"$record_name\",\"content\":\"$ip\"}")

case "$update" in
  *"\"success\":false"*)
    message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
    log "$message"
    echo -e "$message"
    exit 1;;
  *)
      message="IP changed to: $ip"
    echo "$ip" > $ip_file
    log "$message"
    echo "$message";;
esac
@ptts

This comment has been minimized.

Copy link

@ptts ptts commented Dec 2, 2017

I'm also getting the same error as @Kiendeleo and @danieluramg namely:

{
   "success":false,
   "errors":[
      {
         "code":7003,
         "message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"
      },
      {
         "code":7000,
         "message":"No route for that URI"
      }
   ],
   "messages":[

   ],
   "result":null
}

These are the files and permissions:

drwxr-xr-x 2 ptts ptts 4096 Dec  2 16:17 .
drwxr-xr-x 5 ptts ptts 4096 Dec  2 16:11 ..
-rw-r--r-- 1 ptts ptts    2 Dec  2 16:13 cloudflare.ids
-rw-r--r-- 1 ptts ptts  666 Dec  2 16:15 cloudflare.log
-rw-rw-rw- 1 ptts ptts 1928 Dec  2 16:15 cloudflare-update-record.sh

I ran the script with bash cloudflare-update-record.sh and sudo bash cloudflare-update-record.sh, both yield the same result.
Any suggestions? Thanks!

@MachineITSvcs

This comment has been minimized.

Copy link

@MachineITSvcs MachineITSvcs commented Jan 1, 2018

Hey, guys. Just published a script I wrote and used in my company to manage my clients' domains on Cloudflare. You can find it here

Contact info is availabe on the page as well for those needing assistance with use.

@clouddav

This comment has been minimized.

Copy link

@clouddav clouddav commented Jul 1, 2018

@beykansen @nekoyokoshima

your script is working fine but only for **www.**my-domain.com and it is not updating my-domain.com IP address.

@telunc

This comment has been minimized.

Copy link

@telunc telunc commented Jul 3, 2018

Any idea how to schedule this script? I'm trying to use crontab, but data isn't logging in cloudflare.log.

*/15 * * * * /path/to/cloudflare-update-record.sh
@lifehome

This comment has been minimized.

Copy link

@lifehome lifehome commented Jul 6, 2018

I have tuned the script a bit so no files will be created, also created some systemd unit for automation.

See my version at: https://gist.github.com/lifehome/eb3f7d798f9bc6720cdc7d2be1238d4f

@channprj

This comment has been minimized.

Copy link

@channprj channprj commented Aug 13, 2018

Good Idea! 👍

@4ft35t

This comment has been minimized.

Copy link

@4ft35t 4ft35t commented Sep 20, 2018

mod for openwrt, grep of busybox doesn't support -P option
https://gist.github.com/4ft35t/510897486bc6986d19cac45b3b9ca1d0

@boypt

This comment has been minimized.

Copy link

@boypt boypt commented Dec 5, 2018

I have my version of updating IPv6 address for AAAA record:
https://gist.github.com/pentie/4827058990343db9a5eede346d76ba0f

@vircloud

This comment has been minimized.

Copy link

@vircloud vircloud commented Dec 20, 2018

Line 27, will report an error on some platforms,like

[: too many arguments

change to:

if [ "$ip" == "$old_ip" ]; then

fix that.

@minhazulOO7

This comment has been minimized.

Copy link

@minhazulOO7 minhazulOO7 commented Jan 4, 2019

THANKS MAN! Was looking for this! 😃

@fire1ce

This comment has been minimized.

Copy link

@fire1ce fire1ce commented Jan 15, 2019

If you want to use the script from crontab without problems add this:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd "$(dirname "$0")"

the PATH with use the system bash's environment variables
the CD commands with change the directory to the script's. so all the commands will be executed with that folder.
This will solve the problem when executing the script with crontab so it will be able to write and read the files like:
"ip.txt"
"cloudflare.ids"
"cloudflare.log"

@fire1ce

This comment has been minimized.

Copy link

@fire1ce fire1ce commented Jan 15, 2019

if you want to use the script to update local ip, change ip variable to:
ip=$(ifconfig | grep -Eo 'inet (addr:)?([0-9].){3}[0-9]' | grep -Eo '([0-9].){3}[0-9]' | grep -v '127.0.0.1')

@minhazulOO7

This comment has been minimized.

Copy link

@minhazulOO7 minhazulOO7 commented May 6, 2019

Thanks @benkulbertis!

I edited and made this gist.

Hope it helps somebody.

@nunesgh

This comment has been minimized.

Copy link

@nunesgh nunesgh commented May 31, 2019

For those having the same issue as @ptts, @Kiendeleo, and @danieluramg, consider checking if the auth_key parameter you have set is indeed your Cloudflare API Key.

You can find your Cloudflare API Key going to My Profile, which is located under the menu at the top right of the Cloudflare Dashboard. Once there, scroll down to API Keys and locate Global API Key. Click View, enter your password, and you will have access to your API Key.

@HillLiu

This comment has been minimized.

Copy link

@HillLiu HillLiu commented Jun 19, 2019

another clue was make sure the record_name already exits in your zone, when this script purpose was update.

For those having the same issue as @ptts, @Kiendeleo, and @danieluramg, consider checking if the auth_key parameter you have set is indeed your Cloudflare API Key.

You can find your Cloudflare API Key going to My Profile, which is located under the menu at the top right of the Cloudflare Dashboard. Once there, scroll down to API Keys and locate Global API Key. Click View, enter your password, and you will have access to your API Key.

@HillLiu

This comment has been minimized.

Copy link

@HillLiu HillLiu commented Jun 19, 2019

Thanks this gist.

I also add more feature such as

  1. env file
  2. debug mode.
  3. replace grep to sed that it also work on MacOS.

if someone interested, check out my version
https://github.com/HillLiu/cloudflare-bash-util

@danfraser007

This comment has been minimized.

Copy link

@danfraser007 danfraser007 commented Jun 29, 2019

I'm also getting the same error as @Kiendeleo and @danieluramg namely:

{
   "success":false,
   "errors":[
      {
         "code":7003,
         "message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"
      },
      {
         "code":7000,
         "message":"No route for that URI"
      }
   ],
   "messages":[

   ],
   "result":null
}

These are the files and permissions:

drwxr-xr-x 2 ptts ptts 4096 Dec  2 16:17 .
drwxr-xr-x 5 ptts ptts 4096 Dec  2 16:11 ..
-rw-r--r-- 1 ptts ptts    2 Dec  2 16:13 cloudflare.ids
-rw-r--r-- 1 ptts ptts  666 Dec  2 16:15 cloudflare.log
-rw-rw-rw- 1 ptts ptts 1928 Dec  2 16:15 cloudflare-update-record.sh

I ran the script with bash cloudflare-update-record.sh and sudo bash cloudflare-update-record.sh, both yield the same result.
Any suggestions? Thanks!

@ptts, @Kiendeleo, and @danieluramg

If you are getting the error "Could not route to /zones/dns_records, perhaps your object identifier is invalid?" .....try deleting the log file filecloudflare.ids .

For some reason when I first ran the script it didnt populate the file. This may of been because I had an invalid API key. However it still created the file, but it was just empty. So the script would not run when I re-ran it. Anyway, I deleted the empty file. Re-ran the script and now it works.

To the dev, maybe its worth deleting the file once it has been used? or checking to see if the file is empty?

@DTM450

This comment has been minimized.

Copy link

@DTM450 DTM450 commented Jul 24, 2019

If you are using this on a Raspberry Pi make sure to use bash not sh and to remove the spacing at line 36 before the "fi"

@samywee

This comment has been minimized.

Copy link

@samywee samywee commented Sep 2, 2019

Thank you worked! perfectly. Make sure run under bash.

@issess

This comment has been minimized.

Copy link

@issess issess commented Oct 7, 2019

I updated API_TOKEN version like this :

#!/bin/bash

# Created by benkulbertis/cloudflare-update-record.sh
# CHANGE THESE
api_token="c2547eb745079dac9320b638f5e225cf483cc5cfdda41" # found in cloudflare account my profile - API Tokens - (Permission Zone.Zone, Zone.DNS)
zone_name="example.com"
record_name="www.example.com"
proxied="true"

# 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 ! [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
    message="Fetched IP does not look valid! Quitting"
    log "$message"
    echo -e "$message"
    exit 1 
fi

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 "Authorization: Bearer $api_token" -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 "Authorization: Bearer $api_token" -H "Content-Type: application/json"  | grep -Po '(?<="id":")[^"]*')
    echo "$zone_identifier" > $id_file
    echo "$record_identifier" >> $id_file
fi

echo "zone : $zone_identifier"
echo "record : $record_identifier"

update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "Authorization: Bearer $api_token" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"proxied\":\"$proxied\",\"name\":\"$record_name\",\"content\":\"$ip\"}")

case "$update" in
  *"\"success\":false"*)
    message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
    log "$message"
    echo -e "$message"
    exit 1;;
  *)
      message="IP changed to: $ip"
    echo "$ip" > $ip_file
    log "$message"
    echo "$message";;
esac
@DaveSanders

This comment has been minimized.

Copy link

@DaveSanders DaveSanders commented Nov 8, 2019

I had to change the "update" line to remove the quotes around "$proxied". Cloudflare expects that json value to be a boolean:

update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "Authorization: Bearer $api_token" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"proxied\":$proxied,\"name\":\"$record_name\",\"content\":\"$ip\"}")

@pedrof1gueiredo

This comment has been minimized.

Copy link

@pedrof1gueiredo pedrof1gueiredo commented Feb 29, 2020

I am getting the following result when I run the script:
{"success":false,"errors":[{"code":7003,"message":"Could not route to \/zones\/dns_records, perhaps your object identifier is invalid?"},{"code":7000,"message":"No route for that URI"}],"messages":[],"result":null}

I am attempting to update and A record of a subdomain on an account with multiple domains. Is anyone else getting this error?

I have the same issue, also in an account with multiple domains. No solution on this thread worked so far.

@ray-moncada

This comment has been minimized.

Copy link

@ray-moncada ray-moncada commented Mar 11, 2020

Thank you for the script saved me lots of time. Tweaked to add DNS Record instead of updating. I did not add a check to see if the record already exist.

...

if [ -f $id_file ] && [ $(wc -l $id_file | cut -d " " -f 1) == 2 ]; then
zone_identifier=$(head -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" | grep -Po '(?<="id":")[^"]*' | head -1 )
echo "$zone_identifier" > $id_file
fi

addDns=$(curl -X POST "https://api.cloudflare.com/client/v4/zones/${zone_identifier}/dns_records" -H "X-Auth-Email: ${auth_email}" -H "X-Auth-Key: ${auth_key}" -H "Content-Type: application/json" --data '{"type":"A","name":"'${record_name}'","content":"'${ip}'","ttl":120,"priority":10,"proxied":true}')

if [[ $addDns == ""success":false" ]]; then
message="API UPDATE FAILED. DUMPING RESULTS:\n$addDns"
log "$message"
echo -e "$message"
exit 1
else
message="IP changed to: $ip"
echo "$ip" > $ip_file
log "$message"
echo "$message"
fi

@MrWhizzy

This comment has been minimized.

Copy link

@MrWhizzy MrWhizzy commented Apr 29, 2020

just a heads up everyone, apparently Cloudflare made a few changes to their API and I found out the hards way today (bit of a downtime). All you need to do is to add a space character ( ) in every regex when parsing a field.

specifically:
if [[ $record == *"\"count\":0"* ]]; then
needs to become
if [[ $record == *"\"count\": 0"* ]]; then

old_ip=$(echo "$record" | grep -Po '(?<="content":")[^"]*' | head -1)
to
old_ip=$(echo "$record" | grep -Po '(?<="content": ")[^"]*' | head -1)

*"\"success\":false"*)
has to become
*"\"success\": false"*)

@HillLiu

This comment has been minimized.

Copy link

@HillLiu HillLiu commented Apr 30, 2020

Thanks @MrWhizzy

I also update my sed sample here.
HillLiu/cloudflare-bash-util@304d58e

just a heads up everyone, apparently Cloudflare made a few changes to their API and I found out the hards way today (bit of a downtime). All you need to do is to add a space character ( ) in every regex when parsing a field.

specifically:
if [[ $record == *"\"count\":0"* ]]; then
needs to become
if [[ $record == *"\"count\": 0"* ]]; then

old_ip=$(echo "$record" | grep -Po '(?<="content":")[^"]*' | head -1)
to
old_ip=$(echo "$record" | grep -Po '(?<="content": ")[^"]*' | head -1)

*"\"success\":false"*)
has to become
*"\"success\": false"*)

@niklasmato

This comment has been minimized.

Copy link

@niklasmato niklasmato commented Apr 30, 2020

just a heads up everyone, apparently Cloudflare made a few changes to their API and I found out the hards way today (bit of a downtime). All you need to do is to add a space character ( ) in every regex when parsing a field.

specifically:
if [[ $record == *"\"count\":0"* ]]; then
needs to become
if [[ $record == *"\"count\": 0"* ]]; then

old_ip=$(echo "$record" | grep -Po '(?<="content":")[^"]*' | head -1)
to
old_ip=$(echo "$record" | grep -Po '(?<="content": ")[^"]*' | head -1)

*"\"success\":false"*)
has to become
*"\"success\": false"*)

Updated my scripts but still doesn't seem to work.
Anyone got it working again?

@flashtel

This comment has been minimized.

Copy link

@flashtel flashtel commented Apr 30, 2020

grep -Po '(?<="id":")[^"]*')

change to

grep -Po '(?<="id": ")[^"]*')

@flashtel

This comment has been minimized.

Copy link

@flashtel flashtel commented Apr 30, 2020

Why Cloudflare why do you do these things.

Thanks for the update

@AkimoA

This comment has been minimized.

Copy link

@AkimoA AkimoA commented May 2, 2020

tx guys for the update, was wondering what was going on !

@niklasmato

This comment has been minimized.

Copy link

@niklasmato niklasmato commented May 20, 2020

Did they change something again? Scripts no longer seem to work..

@MrWhizzy

This comment has been minimized.

Copy link

@MrWhizzy MrWhizzy commented May 20, 2020

@niklasmato, yes they did, I've uploaded an up-to-date version of the script on GitHub which will work a bit more reliably no matter if they have spaces after semicolons or not, plus it will also update multiple records.

@niklasmato

This comment has been minimized.

Copy link

@niklasmato niklasmato commented May 21, 2020

@niklasmato, yes they did, I've uploaded an up-to-date version of the script on GitHub which will work a bit more reliably no matter if they have spaces after semicolons or not, plus it will also update multiple records.

Thank you for this!

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.