|
|
|
@ -1,4 +1,4 @@ |
|
|
|
|
##!/bin/bash |
|
|
|
|
#!/bin/bash |
|
|
|
|
## change to "bin/sh" when necessary |
|
|
|
|
|
|
|
|
|
auth_email="" # The email used to login 'https://dash.cloudflare.com' |
|
|
|
@ -11,36 +11,9 @@ proxy=false # Set the proxy to true or fa |
|
|
|
|
slacksitename="" # Title of site "Example Site" |
|
|
|
|
slackchannel="" # Slack Channel #example |
|
|
|
|
slackuri="" # URI for Slack WebHook "https://hooks.slack.com/services/xxxxx" |
|
|
|
|
config_file="" # file that is config file |
|
|
|
|
|
|
|
|
|
tolerant_is_set=0 |
|
|
|
|
|
|
|
|
|
debug_output_echo () { |
|
|
|
|
if [ ! -z $debug_mode_active ]; then |
|
|
|
|
if [ $debug_mode_active -eq 1 ]; then |
|
|
|
|
echo -e $debug_output |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
exit_code () { |
|
|
|
|
if [ -z $top_exit_code ]; then |
|
|
|
|
top_exit_code=-999 |
|
|
|
|
fi |
|
|
|
|
if [ $top_exit_code -lt $excode ]; then |
|
|
|
|
top_exit_code=$excode |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ $tolerant_is_set -eq 1 ]; then |
|
|
|
|
# Only when tolerent mode is active, it will not stop for error |
|
|
|
|
logger_output="DDNS Updater: in tolerant mode - exit [$excode]" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger $logger_output |
|
|
|
|
else |
|
|
|
|
#It strict mode it will stap instantly on error |
|
|
|
|
debug_output_echo |
|
|
|
|
exit $exit_code |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
parameter_input=("$@") |
|
|
|
|
|
|
|
|
|
cf_ddns_ip () { |
|
|
|
|
########################################### |
|
|
|
@ -48,13 +21,12 @@ cf_ddns_ip () { |
|
|
|
|
########################################### |
|
|
|
|
ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com/) |
|
|
|
|
|
|
|
|
|
if [ "${ip}" == "" ]; then |
|
|
|
|
logger_output="DDNS Updater: No public IP found" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
# excode=1; exit_code |
|
|
|
|
if [ "${ip}" == "" ]; then |
|
|
|
|
logger -s "DDNS Updater: No public IP found" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
#no point going on if can not get ip |
|
|
|
|
exit 1 |
|
|
|
|
exit_code 1 |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -67,7 +39,6 @@ cf_ddns_authheader (){ |
|
|
|
|
else |
|
|
|
|
auth_header="Authorization: Bearer" |
|
|
|
|
fi |
|
|
|
|
debug_output+="cf_ddns_authheader : "$auth_header"\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_seeka () { |
|
|
|
@ -75,28 +46,28 @@ cf_ddns_seeka () { |
|
|
|
|
## Seek for the A record |
|
|
|
|
########################################### |
|
|
|
|
|
|
|
|
|
logger_output="DDNS Updater: Check Initiated" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
logger "DDNS Updater: Check Initiated" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
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") |
|
|
|
|
debug_output+="cf_ddns_seeka : "$record"\n" |
|
|
|
|
debug_output+="cf_ddns_seeka : $record\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_checka () { |
|
|
|
|
########################################### |
|
|
|
|
## Check if the domain has an A record |
|
|
|
|
########################################### |
|
|
|
|
cf_nonexistsrecord=1 |
|
|
|
|
if [[ $record == *"\"count\":0"* ]]; then |
|
|
|
|
logger_output="DDNS Updater: Record does not exist, perhaps create one first? (${ip} for ${record_name})" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
cf_nonexistsrecord=0 |
|
|
|
|
excode=1; exit_code |
|
|
|
|
fi |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
cf_nonexistsrecord=0 |
|
|
|
|
exit_code 1 |
|
|
|
|
else |
|
|
|
|
cf_nonexistsrecord=1 |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_currentip () { |
|
|
|
@ -106,19 +77,19 @@ cf_ddns_currentip () { |
|
|
|
|
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_output="DDNS Updater: IP ($ip) for ${record_name} has not changed." |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
excode=0; exit_code |
|
|
|
|
logger_output="DDNS Updater: IP ($ip) for ${record_name} has not changed." |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
exit_code 0 |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_set_identifier () { |
|
|
|
|
########################################### |
|
|
|
|
########################################## |
|
|
|
|
## Set the record identifier from result |
|
|
|
|
########################################### |
|
|
|
|
record_identifier=$(echo "$record" | sed -E 's/.*"id":"(\w+)".*/\1/') |
|
|
|
|
debug_output+="cf_ddns_set_identifier : "$record_identifier"\n" |
|
|
|
|
debug_output+="cf_ddns_set_identifier : $record_identifier\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_update () { |
|
|
|
@ -126,11 +97,11 @@ cf_ddns_update () { |
|
|
|
|
## Change the IP@Cloudflare using the API |
|
|
|
|
########################################### |
|
|
|
|
update=$(curl -s -X PATCH "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 "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\",\"ttl\":\"$ttl\",\"proxied\":${proxy}}") |
|
|
|
|
debug_output+="cf_ddns_update : "$update"\n" |
|
|
|
|
-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}}") |
|
|
|
|
debug_output+="cf_ddns_update : $update\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns_status () { |
|
|
|
@ -140,26 +111,30 @@ cf_ddns_status () { |
|
|
|
|
case "$update" in |
|
|
|
|
*"\"success\":false"*) |
|
|
|
|
logger_output="DDNS Updater: $ip $record_name DDNS failed for $record_identifier ($ip). DUMPING RESULTS:\n$update" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
curl -L -X POST $slackuri \ |
|
|
|
|
--data-raw '{ |
|
|
|
|
"channel": "'$slackchannel'", |
|
|
|
|
"text" : "'"$slacksitename"' DDNS Update Failed: '$record_name': '$record_identifier' ('$ip')." |
|
|
|
|
}' |
|
|
|
|
excode=1; exit_code;; |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
if [[ $slackuri != "" ]]; then |
|
|
|
|
curl -L -X POST $slackuri \ |
|
|
|
|
--data-raw '{ |
|
|
|
|
"channel": "'$slackchannel'", |
|
|
|
|
"text" : "'"$slacksitename"' DDNS Update Failed: '$record_name': '$record_identifier' ('$ip')." |
|
|
|
|
}' |
|
|
|
|
fi |
|
|
|
|
exit_code 1;; |
|
|
|
|
*) |
|
|
|
|
logger_output="DDNS Updater: $ip $record_name DDNS updated." |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger $logger_output |
|
|
|
|
curl -L -X POST $slackuri \ |
|
|
|
|
--data-raw '{ |
|
|
|
|
"channel": "'$slackchannel'", |
|
|
|
|
"text" : "'"$slacksitename"' Updated: '$record_name''"'"'s'""' new IP Address is '$ip'" |
|
|
|
|
}' |
|
|
|
|
excode=0; exit_code;; |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
if [[ $slackuri != "" ]]; then |
|
|
|
|
curl -L -X POST $slackuri \ |
|
|
|
|
--data-raw '{ |
|
|
|
|
"channel": "'$slackchannel'", |
|
|
|
|
"text" : "'"$slacksitename"' Updated: '$record_name''"'"'s'""' new IP Address is '$ip'" |
|
|
|
|
}' |
|
|
|
|
fi |
|
|
|
|
exit_code 0;; |
|
|
|
|
esac |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ddns() { |
|
|
|
|
if [ ${#ip} -eq 0 ]; then |
|
|
|
@ -180,17 +155,48 @@ cf_ddns() { |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
debug_output_echo () { |
|
|
|
|
if [ -n "$debug_mode_active" ]; then |
|
|
|
|
if [ "$debug_mode_active" -eq 1 ]; then |
|
|
|
|
echo -e "$debug_output" |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
exit_code () { |
|
|
|
|
excode="$1" |
|
|
|
|
if [ -z "$top_exit_code" ]; then |
|
|
|
|
top_exit_code=-999 |
|
|
|
|
fi |
|
|
|
|
if [ $top_exit_code -lt "$excode" ]; then |
|
|
|
|
top_exit_code=$excode |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ $tolerant_is_set -eq 1 ]; then |
|
|
|
|
# Only when tolerent mode is active, it will not stop for error |
|
|
|
|
logger_output="DDNS Updater: in tolerant mode - exit [$excode]" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
else |
|
|
|
|
#If strict mode it will stop instantly on error |
|
|
|
|
debug_output_echo |
|
|
|
|
exit "$excode" |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cf_counting_sheep () { |
|
|
|
|
datestart=$(date +%Y/%m/%d\ %H:%M:%S) |
|
|
|
|
dateend=$(date --date="+$parameter_value seconds" +"%Y-%m-%d %H:%M:%S") |
|
|
|
|
logger_output="DDNS Updater: counting sheep ($parameter_value) $datestart : $dateend" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
sleep $parameter_value |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
sleep "$parameter_value" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_help () { |
|
|
|
|
echo "# crontab\n" |
|
|
|
|
echo "# crontab" |
|
|
|
|
echo "*/5 * * * * /bin/bash /home/user/cloudflare-ddns-updater/cloudflare-init.sh" |
|
|
|
|
echo '*/5 * * * * /bin/bash /home/user/cloudflare-ddns-updater/cloudflare-init.sh -tolerant mydomain.com example.com www.example.com x1.example.com' |
|
|
|
|
echo '*/5 * * * * /bin/bash /home/user/cloudflare-ddns-updater/cloudflare-init.sh -tolerant mydomain.com -sleep=10 example.com -proxy=false www.example.com -auth_ttl=10 x1.example.com' |
|
|
|
@ -203,13 +209,14 @@ cf_help () { |
|
|
|
|
echo "-auth_identifier=X it for this will change it for proceeding domains" |
|
|
|
|
echo "-auth_ttl=X it for this will change it for proceeding domains" |
|
|
|
|
echo "-auth_proxy=X it for this will change it for proceeding domains" |
|
|
|
|
echo "-purge will purge current setting for cloudflare" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_tolerant () { |
|
|
|
|
tolerant_is_set=1 |
|
|
|
|
logger_output="DDNS Updater: Been set as being tolerant" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_rsleep () { |
|
|
|
@ -217,49 +224,43 @@ cf_rsleep () { |
|
|
|
|
parameter_temp=$(( $parameter_value+1 )) |
|
|
|
|
parameter_value=$(( $RANDOM % $parameter_temp )) |
|
|
|
|
logger_output+="($parameter_value)" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
cf_counting_sheep |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_auth_email () { |
|
|
|
|
logger_output="DDNS Updater: Changed [auth_email]" |
|
|
|
|
debug_output+="$logger_output ($parameter_value)\n" |
|
|
|
|
logger $logger_output |
|
|
|
|
logger "$logger_output" |
|
|
|
|
auth_email=$parameter_value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_auth_method () { |
|
|
|
|
logger_output="DDNS Updater: Changed [auth_method]" |
|
|
|
|
if [ $parameter_value = "token" ] || [ $parameter_value = "global" ]; then |
|
|
|
|
logger_output+=" ($parameter_value)" |
|
|
|
|
auth_method=$parameter_value |
|
|
|
|
logger $logger_output |
|
|
|
|
else |
|
|
|
|
logger_output+=" ($parameter_value) is invalied option" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
fi |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger_output="DDNS Updater: Changed [auth_email]" |
|
|
|
|
debug_output+="$logger_output ($parameter_value)\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
auth_method=$parameter_value |
|
|
|
|
} |
|
|
|
|
debug |
|
|
|
|
|
|
|
|
|
cf_auth_key () { |
|
|
|
|
logger_output="DDNS Updater: Change [auth_key]" |
|
|
|
|
debug_output+="$logger_output ($parameter_value)" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_ouput+="$logger_output ($parameter_value)\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
auth_key=$parameter_value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_zone_identifier () { |
|
|
|
|
logger_output="DDNS Updater: Change [zone_identifier]" |
|
|
|
|
debug_output+="$logger_output ($parameter_value)" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_ouput+="$logger_output ($parameter_value)\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
zone_identifier=$parameter_value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ttl () { |
|
|
|
|
logger_output="DDNS Updater: Change [ttl]" |
|
|
|
|
debug_output+="$logger_output ($parameter_value)" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_ouput+="$logger_output ($parameter_value)\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
ttl=$parameter_value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -268,41 +269,64 @@ cf_proxy () { |
|
|
|
|
if [ $parameter_value = "true" ] || [ $parameter_value = "false" ]; then |
|
|
|
|
logger_output+=" ($parameter_value)" |
|
|
|
|
proxy=$parameter_value |
|
|
|
|
logger $logger_output |
|
|
|
|
logger "$logger_output" |
|
|
|
|
else |
|
|
|
|
logger_output+=" ($parameter_value) is invalied option" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_record_name () { |
|
|
|
|
record_name=$parameter_value |
|
|
|
|
cf_err_human |
|
|
|
|
if [ "$err_is_human" -eq 0 ]; then |
|
|
|
|
cf_ddns |
|
|
|
|
fi |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
#TODO ************************************************************************************************************************** |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ipset () { |
|
|
|
|
ip=$parameter_value |
|
|
|
|
logger_output="DDNS Updater: IP been set to $ip" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_output+=logger_output"\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
debug_ouput+="$logger_output\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_ipcheck () { |
|
|
|
|
ip="" |
|
|
|
|
logger_output="DDNS Updater: IP been set to do a recheck" |
|
|
|
|
logger $logger_output |
|
|
|
|
debug_output+=logger_output"\n" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
debug_ouput+="$logger_output\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_entry_point () { |
|
|
|
|
logger_output="DDNS Updater: [entrypoint] ($parameter_value)" |
|
|
|
|
logger "$logger_output" |
|
|
|
|
debug_ouput+="$logger_output\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_remark_statment () { |
|
|
|
|
debug_output+="REMark: $parameter_value\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_parameter_commands () { |
|
|
|
|
parameter_temp=${parameter_current:1} |
|
|
|
|
|
|
|
|
|
parameter_temp="${1:1}" |
|
|
|
|
parameter_command=${parameter_temp%=*} |
|
|
|
|
parameter_value=${parameter_temp##*=} |
|
|
|
|
|
|
|
|
|
case $parameter_command in |
|
|
|
|
"debug") |
|
|
|
|
debug_mode_active=1 |
|
|
|
|
#debug_mode_active=1 |
|
|
|
|
: |
|
|
|
|
;; |
|
|
|
|
"help") |
|
|
|
|
cf_help |
|
|
|
|
;; |
|
|
|
|
"tolerant") |
|
|
|
|
cf_tolerant |
|
|
|
|
#cf_tolerant |
|
|
|
|
: |
|
|
|
|
;; |
|
|
|
|
"sleep") |
|
|
|
|
cf_counting_sheep |
|
|
|
@ -328,16 +352,32 @@ cf_parameter_commands () { |
|
|
|
|
"proxy") |
|
|
|
|
cf_proxy |
|
|
|
|
;; |
|
|
|
|
"record_name") |
|
|
|
|
cf_record_name |
|
|
|
|
;; |
|
|
|
|
"ipset") |
|
|
|
|
cf_ipset |
|
|
|
|
;; |
|
|
|
|
"ipcheck" |
|
|
|
|
"ipcheck") |
|
|
|
|
cf_ipcheck |
|
|
|
|
;; |
|
|
|
|
*) |
|
|
|
|
logger_output="DDNS Updater: invalid parameter option been defined [${parameter_current}]" |
|
|
|
|
debug_output+=$logger_output"\n" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
"entrypoint") |
|
|
|
|
cf_entry_point |
|
|
|
|
;; |
|
|
|
|
"purge") |
|
|
|
|
cf_to_null |
|
|
|
|
;; |
|
|
|
|
|
|
|
|
|
"#") |
|
|
|
|
cf_remark_statment |
|
|
|
|
;; |
|
|
|
|
"config_file") |
|
|
|
|
: |
|
|
|
|
;; |
|
|
|
|
*) |
|
|
|
|
logger_output="DDNS Updater: invalid parameter option been defined [${parameter_temp}]" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
;; |
|
|
|
|
esac |
|
|
|
|
} |
|
|
|
@ -348,31 +388,61 @@ cf_err_human () { |
|
|
|
|
if [ ${#auth_email} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [auth_email] record not been defined" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ $auth_method != "token" ] && [ $auth_method != "global" ]; then |
|
|
|
|
if [ ${#auth_method} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output='DDNS Updater: ERROR [auth_method] is invaled it has to be defined "token" "global" defined' |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger_output='DDNS Updater: ERROR [auth_method] setting has not been defined' |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
else |
|
|
|
|
if [ $auth_method != "token" ] && [ $auth_method != "global" ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output='DDNS Updater: ERROR [auth_method] is invaled it has to be defined "token" "global" defined' |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#auth_key} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [auth_key] record not been defined" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#zone_identifier} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [zone_identifier] record has not been defined" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#record_name} -eq 0 ] && [ $argument_total -eq 0 ]; then |
|
|
|
|
if [ ${#record_name} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [record_name] record has not been defined" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#ttl} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [ttl] record has not been defined" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#proxy} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output='DDNS Updater: ERROR [proxy] setting has not been defined' |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
else |
|
|
|
|
if [ $proxy != "true" ] && [ $proxy != "false" ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output='DDNS Updater: ERROR [proxy] is invaled it has to be defined "true" "false" defined' |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ ${#record_name} -eq 0 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [record_name] record not has been defined" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ -z "$tolerant_is_set" ]; then |
|
|
|
@ -383,36 +453,301 @@ cf_err_human () { |
|
|
|
|
if [ $tolerant_is_set -lt 0 ] || [ $tolerant_is_set -gt 1 ]; then |
|
|
|
|
err_is_human=1 |
|
|
|
|
logger_output="DDNS Updater: ERROR [tolerant_is_set] can only by 0 or 1" |
|
|
|
|
logger -s $logger_output |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ $err_is_human -eq 1 ]; then |
|
|
|
|
#It is done if there is error detected above |
|
|
|
|
exit 1 |
|
|
|
|
exit_code 1 |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
argument_total=$# |
|
|
|
|
debug_output="" |
|
|
|
|
cf_err_human |
|
|
|
|
cf_to_null () { |
|
|
|
|
auth_email="" |
|
|
|
|
auth_method="" |
|
|
|
|
auth_key="" |
|
|
|
|
zone_identifier="" |
|
|
|
|
record_name="" |
|
|
|
|
ttl="" |
|
|
|
|
proxy="" |
|
|
|
|
#ip="" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if [ $# -ne 0 ]; then |
|
|
|
|
# If a parameter has been defined in will ignore any setting in [record_name] |
|
|
|
|
parameter=("$@") |
|
|
|
|
for (( argument_depth=0 ; argument_depth < argument_total ; argument_depth++ )); do |
|
|
|
|
parameter_current=${parameter[argument_depth]} |
|
|
|
|
first_character=${parameter_current:0:1} |
|
|
|
|
if [ $first_character = "-" ]; then |
|
|
|
|
cf_parameter_commands |
|
|
|
|
cf_setting_internal () { |
|
|
|
|
debug_output_local="cf_setting_internal:" |
|
|
|
|
cf_setting_internal_array=('-entrypoint=_settinginternal') |
|
|
|
|
|
|
|
|
|
if [[ -z $auth_email ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [auth_email]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-auth_email=$auth_email") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $auth_method ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [auth_method]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-auth_method=$auth_method") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $auth_key ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [auth_key]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-auth_key=${auth_key}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $zone_identifier ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [zone_identifier]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-zone_identifier=${zone_identifier}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $ttl ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [ttl]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-ttl=${ttl}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $proxy ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [proxy]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-proxy=${proxy}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $slacksitename ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [slacksitename]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-slacksitename=${slacksitename}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $slackchannel ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [slackchannel]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-slackchannel=${slackchannel}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $slackuri ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [slackuri]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-slackuri=${slackuri}") |
|
|
|
|
fi |
|
|
|
|
if [[ -z $config_file ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [config_file]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-config_file=${config_file}") |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
## This has to called last as it do process of conatcting CF and the seting have to be already set |
|
|
|
|
if [[ -z $record_name ]]; then |
|
|
|
|
debug_output+="$debug_output_local undefined [record_name]\n" |
|
|
|
|
else |
|
|
|
|
cf_setting_internal_array+=("-record_name=${record_name}") |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
for (( item=0; item < ${#cf_setting_internal_array[@]}; item++ )); do |
|
|
|
|
debug_output+="$debug_output_local declared ${cf_setting_internal_array[item]}\n" |
|
|
|
|
done |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_setting_parameter () { |
|
|
|
|
debug_output_local="cf_setting_parameter:" |
|
|
|
|
argument_total=${#parameter_input[@]} |
|
|
|
|
|
|
|
|
|
if [ "$argument_total" -gt 0 ] ; then |
|
|
|
|
cf_setting_parameter_array=('-entrypoint=_settingparameter') |
|
|
|
|
for (( argument_depth=0 ; argument_depth < argument_total ; argument_depth++ )); do |
|
|
|
|
parameter_current=${parameter_input[argument_depth]} |
|
|
|
|
first_character=${parameter_current:0:1} |
|
|
|
|
# $'\055') # Hyphen - |
|
|
|
|
if [[ $first_character = $'\055' ]]; then |
|
|
|
|
retain_setting_to_check="$parameter_current" |
|
|
|
|
retain_setting |
|
|
|
|
activate_instantly_settings |
|
|
|
|
cf_setting_parameter_array+=("${retain_setting_output}") |
|
|
|
|
else |
|
|
|
|
cf_setting_parameter_array+=('-record_name='"${parameter_current}") |
|
|
|
|
fi |
|
|
|
|
done |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
for (( item=0; item < ${#cf_setting_parameter_array[@]}; item++ )); do |
|
|
|
|
debug_output+="$debug_output_local declared ${cf_setting_parameter_array[item]}\n" |
|
|
|
|
done |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_setting_file () { |
|
|
|
|
#i: config_file |
|
|
|
|
#i: line_to_check |
|
|
|
|
#i: string_exit |
|
|
|
|
#i: string_filename |
|
|
|
|
#io: string_exit |
|
|
|
|
#io: string_y_pos |
|
|
|
|
#io: string_x_pos |
|
|
|
|
#o: string_character |
|
|
|
|
|
|
|
|
|
string_y_pos=0 |
|
|
|
|
debug_output_local="cf_setting_file:" |
|
|
|
|
if [ -f $config_file ] && [ $config_file ]; then |
|
|
|
|
cf_setting_file_array=('-entrypoint=_settingfile') |
|
|
|
|
while IFS= read -r string_text |
|
|
|
|
do |
|
|
|
|
((string_y_pos++)) |
|
|
|
|
string_reset_whitespace |
|
|
|
|
# It will process only the line set as in $line_to_check |
|
|
|
|
# It will process everyline if $line_to_check == 0 or null |
|
|
|
|
if [[ $line_to_check == "$string_y_pos" ]] || [[ $line_to_check == 0 ]] || [[ -z $line_to_check ]]; then |
|
|
|
|
until (( $string_exit )); do |
|
|
|
|
string_character=${string_text:string_x_pos:1} |
|
|
|
|
string_check_whitspace |
|
|
|
|
((string_x_pos++)) |
|
|
|
|
string_length_check |
|
|
|
|
done |
|
|
|
|
if [[ $string_removed_whitespace ]]; then |
|
|
|
|
first_character=${string_removed_whitespace:0:1} |
|
|
|
|
# $'\055') # Hyphen - |
|
|
|
|
if [[ $first_character = $'\055' ]]; then |
|
|
|
|
retain_setting_to_check="$string_removed_whitespace" |
|
|
|
|
retain_setting |
|
|
|
|
activate_instantly_settings |
|
|
|
|
else |
|
|
|
|
retain_setting_output=("-record_name=${string_removed_whitespace}") |
|
|
|
|
fi |
|
|
|
|
cf_setting_file_array+=("${retain_setting_output}") |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
done < "$config_file" |
|
|
|
|
else |
|
|
|
|
if [[ $config_file ]]; then |
|
|
|
|
logger_output="DDNS Updater: ${debug_output_local}file not found [${config_file}]" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
for (( item=0; item < ${#cf_setting_file_array[@]}; item++ )); do |
|
|
|
|
debug_output+="$debug_output_local declared ${cf_setting_file_array[item]}\n" |
|
|
|
|
done |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
string_reset_whitespace () { |
|
|
|
|
#i: string_text |
|
|
|
|
#o: string_exit |
|
|
|
|
#o: string_x_pos |
|
|
|
|
#o: within_quatation_mark |
|
|
|
|
#o: string_remove_whitspace |
|
|
|
|
#o: string_length |
|
|
|
|
|
|
|
|
|
string_exit=0 |
|
|
|
|
string_x_pos=0 |
|
|
|
|
string_where_equal_sign=0 |
|
|
|
|
within_quatation_mark=0 |
|
|
|
|
string_removed_whitespace="" |
|
|
|
|
string_length=${#string_text} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
string_check_whitspace () { |
|
|
|
|
#i: string_character |
|
|
|
|
#i: string_x_pos |
|
|
|
|
#i: string_y_pos |
|
|
|
|
#io: string_removed_whitespace |
|
|
|
|
#io: within_quatation_mark |
|
|
|
|
#io: string_where_equal_sign |
|
|
|
|
|
|
|
|
|
# \011 = Tab (Tab vertical) || \040 = Space |
|
|
|
|
if [[ $string_character == $'\011' ]] || [[ $string_character == $'\040' ]]; then |
|
|
|
|
if (( $within_quatation_mark )); then |
|
|
|
|
string_removed_whitespace+=$string_character |
|
|
|
|
fi |
|
|
|
|
else |
|
|
|
|
string_non_whitespace |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
string_length_check () { |
|
|
|
|
#i: string_length |
|
|
|
|
#i: string_x_pos |
|
|
|
|
#o: string_exit |
|
|
|
|
if [ "$string_length" -eq $string_x_pos ]; then |
|
|
|
|
string_exit=1 |
|
|
|
|
fi |
|
|
|
|
# $string_length = 0 is for line that have nothing |
|
|
|
|
if [ "$string_length" -eq 0 ]; then |
|
|
|
|
string_exit=1 |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
string_non_whitespace (){ |
|
|
|
|
# \042 Quatation mark |
|
|
|
|
if [[ $string_character == $'\042' ]]; then |
|
|
|
|
within_quatation_mark=$(( ! $within_quatation_mark )) |
|
|
|
|
else |
|
|
|
|
#doing after else will remove remove Quatation Mark, otherwise if want it remove else place after fi |
|
|
|
|
string_removed_whitespace+=$string_character |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
# \075 Equal Sign |
|
|
|
|
# it only valied if not already been set and quatation mark is false |
|
|
|
|
if [[ $string_character == $'\075' ]] && (( ! $within_quatation_mark )); then |
|
|
|
|
if [[ $string_where_equal_sign == 0 ]]; then |
|
|
|
|
string_where_equal_sign=${#string_removed_whitespace} |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
retain_setting () { |
|
|
|
|
# The first time it declared it vaild, anthing else is not vaild. |
|
|
|
|
retain_setting_output=$retain_setting_to_check |
|
|
|
|
if [ "${retain_setting_to_check:0:13}" == "-config_file=" ]; then |
|
|
|
|
if [ $config_file ]; then |
|
|
|
|
logger_output="DDNS Updater: ${debug_output_local} [-config_file] already defened as [${config_file}] not changed to [${retain_setting_to_check:13}]" |
|
|
|
|
debug_output+="$logger_output\n" |
|
|
|
|
logger -s "$logger_output" |
|
|
|
|
# This is done so file name is rem out |
|
|
|
|
retain_setting_output="-#=$retain_setting_to_check" |
|
|
|
|
else |
|
|
|
|
record_name=${parameter_current} |
|
|
|
|
cf_ddns |
|
|
|
|
config_file=${retain_setting_to_check:13} |
|
|
|
|
retain_setting_output=$config_file |
|
|
|
|
fi |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
activate_instantly_settings () { |
|
|
|
|
if [ "${retain_setting_to_check:0:6}" == "-debug" ]; then |
|
|
|
|
debug_mode_active=1 |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if [ "${retain_setting_to_check:0:9}" == "-tolerant" ]; then |
|
|
|
|
cf_tolerant |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_exec () { |
|
|
|
|
for (( item=0; item < ${#cf_setting_internal_array[@]}; item++ )); do |
|
|
|
|
cf_parameter_commands "${cf_setting_internal_array[item]}" |
|
|
|
|
done |
|
|
|
|
else |
|
|
|
|
# If no parameter been used it will use one above [record_name] |
|
|
|
|
cf_ddns |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
debug_output_echo |
|
|
|
|
exit $err_is_human |
|
|
|
|
for (( item=0; item < ${#cf_setting_parameter_array[@]}; item++ )); do |
|
|
|
|
cf_parameter_commands "${cf_setting_parameter_array[item]}" |
|
|
|
|
done |
|
|
|
|
|
|
|
|
|
for (( item=0; item < ${#cf_setting_file_array[@]}; item++ )); do |
|
|
|
|
cf_parameter_commands "${cf_setting_file_array[item]}" |
|
|
|
|
done |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cf_kickstart () { |
|
|
|
|
cf_setting_internal |
|
|
|
|
cf_setting_parameter |
|
|
|
|
cf_setting_file |
|
|
|
|
cf_to_null |
|
|
|
|
cf_exec |
|
|
|
|
debug_output_echo |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cf_kickstart |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#echo -e "$debug_output" |
|
|
|
|
|
|
|
|
|
#echo "intrenal :${cf_setting_internal_array[*]}" |
|
|
|
|
#echo "paramter :${cf_setting_parameter_array[*]}" |
|
|
|
|
#echo "file :${cf_setting_file_array[*]}" |
|
|
|
|
#exit |
|
|
|
|
|
|
|
|
|