Before, I had written about a CloudFlare auto-ip-updating script, but it required a lot of user input and a lot of user effort. Luckily, or not, I crashed my OMV server, and I think an error ate up my PiVPN sd card. So I had to start all over!
This time, I updated the CloudFlare script to be auto-updating.
This bash script requires the following inputs in this order (INFO example):
- FULLDOMAIN cloudflare.com
- SUBDOMAIN web.cloudflare.com
- EMAIL [email protected]
- KEY 9a7806061c88ada191ed06f989cc3dac
- FILEPATH /home/path
If you organize your inputs in this order, it is very easy to copy once and paste to get your results.
Create and Run Script
Create a script and paste the following code in:
sudo nano cf_ip_updater_creater.sh
sudo chmod +x cf_ip_updater_creater.sh
./cf_ip_updater_creater.sh
Script Code
#!/bin/sh #Get User Data echo -n "Enter your FULL-DOMAIN (e.g. cloudflare.com) and press [ENTER]: " read FULLDOMAIN echo -n "Enter your SUB-DOMAIN (e.g. web.cloudflare.com) and press [ENTER]: " read SUBDOMAIN echo -n "Enter your Cloudflare Email (e.g. [email protected]) and press [ENTER]: " read EMAIL echo -n "Enter your Cloudflare API Key (e.g. 9a7806061c88ada191ed06f989cc3dac) and press [ENTER]: " read KEY echo -n "Enter path to create cf_ip_updater.sh script (e.g. /home/path) and press [ENTER]: " read FILEPATH #Get Zone and Record IDS ZONEID=$(curl -X GET "https://api.cloudflare.com/client/v4/zones?name=$FULLDOMAIN" \ -H "X-Auth-Email: $EMAIL" \ -H "X-Auth-Key: $KEY" \ -H "Content-Type: application/json" | jq . | grep id | head -1 | cut -d '"' -f4) RECORDID=$(curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONEID/dns_records?name=$SUBDOMAIN" \ -H "X-Auth-Email: $EMAIL" \ -H "X-Auth-Key: $KEY" \ -H "Content-Type: application/json" | jq . | grep id | head -1 | cut -d '"' -f4) #Print IDS echo "Your Zone ID: $ZONEID" echo "Your Record ID: $RECORDID" #Create script FILE="$FILEPATH/cf_ip_updater.sh" echo "Your script name: $FILE" cat <>$FILE #!/bin/sh [ ! -f /var/tmp/current_ip.txt ] && touch /var/tmp/currentip.txt NEWIP=\$(dig +short myip.opendns.com @resolver1.opendns.com) CURRENTIP=\$(cat /var/tmp/currentip.txt) if [ "\$NEWIP" = "\$CURRENTIP" ] then echo "IP address unchanged" else curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONEID/dns_records/$RECORDID" \ -H "X-Auth-Email: $EMAIL" \ -H "X-Auth-Key: $KEY" \ -H "Content-Type: application/json" \ --data "{\"type\":\"A\",\"name\":\"$SUBDOMAIN\",\"content\":\"\$NEWIP\"}" echo \$NEWIP > /var/tmp/currentip.txt fi EOM chmod +x $FILE
Limitations
If you run this file more than once, it appends to the bottom of the previous run for cf_ip_updater.sh
. Otherwise, I guess it’s OK.
Resources and References
- http://unix.stackexchange.com/questions/45781/shell-script-fails-syntax-error-unexpected
- http://askubuntu.com/questions/186808/every-command-fails-with-command-not-found-after-changing-bash-profile
- http://unix.stackexchange.com/questions/48392/understanding-backtick
- http://stackoverflow.com/questions/11710552/useless-use-of-cat
- http://stackoverflow.com/questions/7549404/bash-script-to-pass-variables-without-substitution-into-new-script
- http://unix.stackexchange.com/questions/238881/how-do-i-append-multiple-lines-involving-variables-to-the-end-of-a-bash-script
- http://unix.stackexchange.com/questions/331068/append-multiple-lines-specified-as-verbatim-bash-variable-after-a-matched-line
- http://unix.stackexchange.com/questions/147082/how-to-append-multiple-lines-to-a-file-with-bash-with-in-front-of-string
- http://stackoverflow.com/questions/7875540/how-do-you-write-multiple-line-configuration-file-using-bash-and-use-variables
- http://unix.stackexchange.com/questions/77277/how-to-append-multiple-lines-to-a-file-with-bash
- http://stackoverflow.com/questions/4181703/how-can-i-concatenate-string-variables-in-bash
- http://unix.stackexchange.com/questions/94664/how-to-echo-variables-using-cat-into-file
- http://www.tldp.org/LDP/abs/html/here-docs.html#HERELIT
- http://stackoverflow.com/questions/11162406/open-and-write-data-on-text-file-by-bash-shell-scripting
- http://stackoverflow.com/questions/4662938/create-text-file-and-fill-it-using-bash
- http://stackoverflow.com/questions/8737638/assign-curl-output-to-variable-in-bash
- http://stackoverflow.com/questions/25320928/how-to-capture-the-output-of-curl-to-variable-in-bash
- http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-5.html
- http://stackoverflow.com/questions/840536/how-to-use-environment-variable-inside-a-quoted-string-in-bash-script
- http://unix.stackexchange.com/questions/148285/extract-value-between-double-quotes
- http://unix.stackexchange.com/questions/166359/how-to-grep-the-output-of-curl