@ -17,20 +17,29 @@ discorduri="" # URI for Discord WebHook "h
###########################################
## Check if we have a public IP
###########################################
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])'
ip = $( curl -s -4 https://cloudflare.com/cdn-cgi/trace | grep -E '^ip' ) ; ret = $?
if [ [ ! $ret = = 0 ] ] ; then # In the case that cloudflare failed to return an ip.
# Attempt to get the ip from other websites.
ip = $( curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com)
else
# Extract just the ip from the ip line from cloudflare.
ip = $( echo $ip | sed -E " s/^ip=( $ipv4_regex ) $/\1/ " )
fi
REGEX_IPV4 = " ^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5])) $"
IP_SERVICES = (
"https://api.ipify.org"
"https://ipv4.icanhazip.com"
"https://ipinfo.io/ip"
)
# Try all the ip services for a valid IPv4 address
for service in ${ IP_SERVICES [@] } ; do
RAW_IP = $( curl -s $service )
if [ [ $RAW_IP = ~ $REGEX_IPV4 ] ] ; then
CURRENT_IP = $BASH_REMATCH
logger -s " DDNS Updater: Fetched IP $CURRENT_IP "
break
else
logger -s " DDNS Updater: IP service $service failed. "
fi
done
# Use regex to check for proper IPv4 format.
if [ [ ! $ip = ~ ^$ipv4_regex $ ] ] ; then
logger -s "DDNS Updater: Failed to find a valid IP."
exit 2
# Exit if IP fetching failed
if [ [ -z " $CURRENT_IP " ] ] ; then
logger -s "DDNS Updater: Failed to find a valid IP."
exit 2
fi
###########################################
@ -56,7 +65,7 @@ record=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identi
## Check if the domain has an A record
###########################################
if [ [ $record = = *"\"count\":0" * ] ] ; then
logger -s " DDNS Updater: Record does not exist, perhaps create one first? ( ${ ip } for ${ record_name } ) "
logger -s " DDNS Updater: Record does not exist, perhaps create one first? ( ${ CURRENT_IP } for ${ record_name } ) "
exit 1
fi
@ -65,8 +74,8 @@ fi
###########################################
old_ip = $( echo " $record " | sed -E 's/.*"content":"(([0-9]{1,3}\.){3}[0-9]{1,3})".*/\1/' )
# Compare if they're the same
if [ [ $ip = = $old_ip ] ] ; then
logger " DDNS Updater: IP ( $ip ) for ${ record_name } has not changed. "
if [ [ $CURRENT_IP = = $old_ip ] ] ; then
logger " DDNS Updater: IP ( $CURRENT_IP ) for ${ record_name } has not changed. "
exit 0
fi
@ -82,41 +91,41 @@ update=$(curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_iden
-H " X-Auth-Email: $auth_email " \
-H " $auth_header $auth_key " \
-H "Content-Type: application/json" \
--data " {\"type\":\"A\",\"name\":\" $record_name \",\"content\":\" $ip \",\"ttl\": $ttl ,\"proxied\": ${ proxy } } " )
--data " {\"type\":\"A\",\"name\":\" $record_name \",\"content\":\" $CURRENT_IP \",\"ttl\": $ttl ,\"proxied\": ${ proxy } } " )
###########################################
## Report the status
###########################################
case " $update " in
*"\"success\":false" *)
echo -e " DDNS Updater: $ip $record_name DDNS failed for $record_identifier ( $ip ). DUMPING RESULTS:\n $update " | logger -s
echo -e " DDNS Updater: $CURRENT_IP $record_name DDNS failed for $record_identifier ( $CURRENT_IP ). DUMPING RESULTS:\n $update " | logger -s
if [ [ $slackuri != "" ] ] ; then
curl -L -X POST $slackuri \
--data-raw ' {
"channel" : " ' $slackchannel ' " ,
"text" : "'" $sitename " ' DDNS Update Failed: ' $record_name ': ' $record_identifier ' (' $ip '). "
"text" : "'" $sitename " ' DDNS Update Failed: ' $record_name ': ' $record_identifier ' (' $CURRENT_IP '). "
} '
fi
if [ [ $discorduri != "" ] ] ; then
curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST \
--data-raw ' {
"content" : "'" $sitename " ' DDNS Update Failed: ' $record_name ': ' $record_identifier ' (' $ip '). "
"content" : "'" $sitename " ' DDNS Update Failed: ' $record_name ': ' $record_identifier ' (' $CURRENT_IP '). "
} ' $discorduri
fi
exit 1; ;
*)
logger " DDNS Updater: $ip $record_name DDNS updated. "
logger " DDNS Updater: $CURRENT_IP $record_name DDNS updated. "
if [ [ $slackuri != "" ] ] ; then
curl -L -X POST $slackuri \
--data-raw ' {
"channel" : " ' $slackchannel ' " ,
"text" : "'" $sitename " ' Updated: ' $record_name '' " '"' s'""' new IP Address is '$ip ' "
"text" : "'" $sitename " ' Updated: ' $record_name '' " '"' s'""' new IP Address is '$CURRENT_IP ' "
} '
fi
if [ [ $discorduri != "" ] ] ; then
curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST \
--data-raw ' {
"content" : "'" $sitename " ' Updated: ' $record_name '' " '"' s'""' new IP Address is '$ip ' "
"content" : "'" $sitename " ' Updated: ' $record_name '' " '"' s'""' new IP Address is '$CURRENT_IP ' "
} ' $discorduri
fi
exit 0; ;