Instead of creating a log file. This change leverages the syslog. This allows us to not have to manually rotate logs, or worry about the log file filling up the file system. This also give us timestamps of the logging without having to create the timestamps ourselves. Messages are logged to /var/log/messages by default.
81 lines
3.1 KiB
Bash
81 lines
3.1 KiB
Bash
#!/bin/bash
|
|
|
|
auth_email="" # The email used to login 'https://dash.cloudflare.com'
|
|
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
|
|
zone_identifier="" # Can be found in the "Overview" tab of your domain
|
|
record_name="" # Which record you want to be synced
|
|
proxy=false # Set the proxy to true or false
|
|
|
|
|
|
|
|
###########################################
|
|
## Check if we have a public IP
|
|
###########################################
|
|
ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com/)
|
|
|
|
if [ "${ip}" == "" ]; then
|
|
logger "DDNS Updater: No public IP found"
|
|
exit 1
|
|
fi
|
|
|
|
###########################################
|
|
## Check and set the proper auth header
|
|
###########################################
|
|
if [ "${auth_method}" == "global" ]; then
|
|
auth_header="X-Auth-Key:"
|
|
else
|
|
auth_header="Authorization: Bearer"
|
|
fi
|
|
|
|
###########################################
|
|
## Seek for the A record
|
|
###########################################
|
|
|
|
logger "DDNS Updater: Check Initiated"
|
|
record=$(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 "$auth_header $auth_key" -H "Content-Type: application/json")
|
|
|
|
###########################################
|
|
## Check if the domain has an A record
|
|
###########################################
|
|
if [[ $record == *"\"count\":0"* ]]; then
|
|
logger "DDNS Updater: Record does not exist, perhaps create one first? (${ip} for ${record_name})"
|
|
exit 1
|
|
fi
|
|
|
|
###########################################
|
|
## Get existing IP
|
|
###########################################
|
|
old_ip=$(echo "$record" | grep -Po '(?<="content":")[^"]*' | head -1)
|
|
# Compare if they're the same
|
|
if [[ $ip == $old_ip ]]; then
|
|
logger "DDNS Updater: IP ($ip) for ${record_name} has not changed."
|
|
exit 0
|
|
fi
|
|
|
|
###########################################
|
|
## Set the record identifier from result
|
|
###########################################
|
|
record_identifier=$(echo "$record" | grep -Po '(?<="id":")[^"]*' | head -1)
|
|
|
|
###########################################
|
|
## Change the IP@Cloudflare using the API
|
|
###########################################
|
|
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 "$auth_header $auth_key" \
|
|
-H "Content-Type: application/json" \
|
|
--data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"proxied\":${proxy},\"name\":\"$record_name\",\"content\":\"$ip\"}")
|
|
|
|
###########################################
|
|
## Report the status
|
|
###########################################
|
|
case "$update" in
|
|
*"\"success\":false"*)
|
|
logger "DDNS Updater: $ip $record_name DDNS failed for $record_identifier ($ip). DUMPING RESULTS:\n$update"
|
|
exit 1;;
|
|
*)
|
|
logger "DDNS Updater: $ip $record_name DDNS updated."
|
|
exit 0;;
|
|
esac
|