2021-08-21 06:42:18 +00:00
#!/bin/bash
## change to "bin/sh" when necessary
2020-11-09 12:54:09 +00:00
auth_email = "" # The email used to login 'https://dash.cloudflare.com'
2021-07-19 04:58:07 +00:00
auth_method = "token" # Set to "global" for Global API Key or "token" for Scoped API Token
auth_key = "" # Your API Token or Global API Key
2020-11-09 12:54:09 +00:00
zone_identifier = "" # Can be found in the "Overview" tab of your domain
record_name = "" # Which record you want to be synced
2021-10-20 17:38:10 +00:00
ttl = "3600" # Set the DNS TTL (seconds)
2022-02-13 16:11:22 +00:00
proxy = "false" # Set the proxy to true or false
2021-10-25 20:43:20 +00:00
slacksitename = "" # Title of site "Example Site"
slackchannel = "" # Slack Channel #example
slackuri = "" # URI for Slack WebHook "https://hooks.slack.com/services/xxxxx"
2021-07-19 04:58:07 +00:00
2020-11-09 12:54:09 +00:00
2021-07-19 00:49:53 +00:00
2020-11-09 12:54:09 +00:00
###########################################
2021-07-19 04:58:07 +00:00
## Check if we have a public IP
2020-11-09 12:54:09 +00:00
###########################################
2022-02-26 10:10:26 +00:00
# Use curl if curl is installed on the system.
2022-02-25 11:24:17 +00:00
if [ [ $( command -v curl & > /dev/null; echo $? ) ] ] ; then
2022-02-26 11:09:26 +00:00
ip = $( curl -s https://cloudflare.com/cdn-cgi/trace | grep -E '^ip' | sed -E 's/^ip=([0-9\.]*)$/\1/' || curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com/)
2022-02-26 10:10:26 +00:00
else
logger -s "Error: 'curl' was not found on your system. Install it with 'sudo apt install curl' in order to use this script"
exit 1
2022-02-13 16:11:22 +00:00
fi
2021-07-19 12:57:52 +00:00
2022-02-26 10:10:26 +00:00
# Use regex to check for proper IPv4 format. Try using 'dig' if curl requests failed.
ipv4_regex = '^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$'
if [ [ ! $ip = ~ $ipv4_regex ] ] ; then
2022-02-26 11:09:26 +00:00
logger -s "Warning: Neither 'cloudflare.com', 'api.ipify.org' nor 'ipv4.icanhazip.com' were able to obtain your ip-address. Trying to use less secure DNS lookup on 'myip.opendns.com' through 'dig' instead."
2022-02-26 10:10:26 +00:00
if [ [ $( command -v dig & > /dev/null; echo $? ) ] ] ; then
ip = $( dig +short myip.opendns.com @resolver1.opendns.com)
fi
# Also sanitize the 'dig' output through the same regex as before.
if [ [ ! $ip = ~ $ipv4_regex ] ] ; then
logger -s "DDNS Updater: Failed to find a valid IP."
exit 2
fi
2020-11-09 12:54:09 +00:00
fi
2021-07-19 04:58:07 +00:00
###########################################
## Check and set the proper auth header
###########################################
2022-02-13 16:11:22 +00:00
if [ [ " ${ auth_method } " = = "global" ] ] ; then
2021-07-19 12:18:24 +00:00
auth_header = "X-Auth-Key:"
2021-07-19 04:58:07 +00:00
else
auth_header = "Authorization: Bearer"
fi
2020-11-09 12:54:09 +00:00
###########################################
## Seek for the A record
###########################################
2021-07-19 04:58:07 +00:00
2021-07-19 20:26:13 +00:00
logger "DDNS Updater: Check Initiated"
2021-10-20 17:38:10 +00:00
record = $( curl -s -X GET " https://api.cloudflare.com/client/v4/zones/ $zone_identifier /dns_records?type=A&name= $record_name " \
-H " X-Auth-Email: $auth_email " \
-H " $auth_header $auth_key " \
-H "Content-Type: application/json" )
2020-11-09 12:54:09 +00:00
###########################################
2021-07-19 04:58:07 +00:00
## Check if the domain has an A record
2020-11-09 12:54:09 +00:00
###########################################
if [ [ $record = = *"\"count\":0" * ] ] ; then
2021-07-21 13:51:41 +00:00
logger -s " DDNS Updater: Record does not exist, perhaps create one first? ( ${ ip } for ${ record_name } ) "
2020-11-09 12:54:09 +00:00
exit 1
fi
###########################################
2021-07-19 04:58:07 +00:00
## Get existing IP
2020-11-09 12:54:09 +00:00
###########################################
2021-08-12 12:26:15 +00:00
old_ip = $( echo " $record " | sed -E 's/.*"content":"(([0-9]{1,3}\.){3}[0-9]{1,3})".*/\1/' )
2020-11-09 12:54:09 +00:00
# Compare if they're the same
if [ [ $ip = = $old_ip ] ] ; then
2021-07-19 20:26:13 +00:00
logger " DDNS Updater: IP ( $ip ) for ${ record_name } has not changed. "
2020-11-09 12:54:09 +00:00
exit 0
fi
###########################################
## Set the record identifier from result
###########################################
2021-08-12 12:26:15 +00:00
record_identifier = $( echo " $record " | sed -E 's/.*"id":"(\w+)".*/\1/' )
2020-11-09 12:54:09 +00:00
###########################################
## Change the IP@Cloudflare using the API
###########################################
2021-10-20 17:38:10 +00:00
update = $( curl -s -X PATCH " https://api.cloudflare.com/client/v4/zones/ $zone_identifier /dns_records/ $record_identifier " \
2020-11-09 12:54:09 +00:00
-H " X-Auth-Email: $auth_email " \
2021-07-19 04:58:07 +00:00
-H " $auth_header $auth_key " \
2020-11-09 12:54:09 +00:00
-H "Content-Type: application/json" \
2022-02-26 10:10:26 +00:00
--data " {\"type\":\"A\",\"name\":\" $record_name \",\"content\":\" $ip \",\"ttl\":\" $ttl \",\"proxied\": ${ proxy } } " )
2020-11-09 12:54:09 +00:00
###########################################
## Report the status
###########################################
case " $update " in
*"\"success\":false" *)
2022-02-13 16:11:22 +00:00
echo -e " DDNS Updater: $ip $record_name DDNS failed for $record_identifier ( $ip ). DUMPING RESULTS:\n $update " | logger -s
2021-11-06 09:41:41 +00:00
if [ [ $slackuri != "" ] ] ; then
curl -L -X POST $slackuri \
--data-raw ' {
"channel" : " ' $slackchannel ' " ,
"text" : "'" $slacksitename " ' DDNS Update Failed: ' $record_name ': ' $record_identifier ' (' $ip '). "
} '
fi
2020-11-09 12:54:09 +00:00
exit 1; ;
*)
2021-07-19 20:26:13 +00:00
logger " DDNS Updater: $ip $record_name DDNS updated. "
2021-11-06 09:41:41 +00:00
if [ [ $slackuri != "" ] ] ; then
curl -L -X POST $slackuri \
--data-raw ' {
"channel" : " ' $slackchannel ' " ,
"text" : "'" $slacksitename " ' Updated: ' $record_name '' " '"' s'""' new IP Address is '$ip' "
} '
fi
2020-11-09 12:54:09 +00:00
exit 0; ;
2021-07-19 04:58:07 +00:00
esac