-
-
Save markbellingham/d5dbd76f907b8a3f2da5ae421f42402d to your computer and use it in GitHub Desktop.
CloudFlare as Dynamic DNS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # CloudFlare as Dynamic DNS | |
| # From: https://letswp.io/cloudflare-as-dynamic-dns-raspberry-pi/ | |
| # Based on: https://gist.github.com/benkulbertis/fff10759c2391b6618dd/ | |
| # Original non-RPi article: https://phillymesh.net/2016/02/23/setting-up-dynamic-dns-for-your-registered-domain-through-cloudflare/ | |
| # Update these with real values | |
| auth_email="[email protected]" | |
| auth_key="global_api_key_goes_here" | |
| zone_name="example.com" | |
| record_name="home.example.com" | |
| proxied=true | |
| # Don't touch these | |
| ip=$(curl -s http://ipv4.icanhazip.com) | |
| ip_file="ip.txt" | |
| id_file="cloudflare.ids" | |
| log_file="cloudflare.log" | |
| # Keep files in the same folder when run from cron | |
| current="$(pwd)" | |
| cd "$(dirname "$(readlink -f "$0")")" | |
| log() { | |
| if [ "$1" ]; then | |
| echo -e "[$(date)] - $1" >> $log_file | |
| fi | |
| } | |
| log "Check Initiated" | |
| if [ -f $ip_file ]; then | |
| old_ip=$(cat $ip_file) | |
| if [ $ip == $old_ip ]; then | |
| log "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\",\"proxied\":proxied}") | |
| 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment