|
|
@ -0,0 +1,137 @@ |
|
|
|
#!/bin/sh |
|
|
|
|
|
|
|
# Check inputs |
|
|
|
[ -z "$username" ] && write_log 14 "Configuration error! [User name] cannot be empty" |
|
|
|
[ -z "$password" ] && write_log 14 "Configuration error! [Password] cannot be empty" |
|
|
|
|
|
|
|
# Check external tools |
|
|
|
[ -n "$CURL_SSL" ] || write_log 13 "Dnspod communication require cURL with SSL support. Please install" |
|
|
|
[ -n "$CURL_PROXY" ] || write_log 13 "cURL: libcurl compiled without Proxy support" |
|
|
|
|
|
|
|
# Declare variables |
|
|
|
#local __URLBASE __HOST __DOMAIN __TYPE __CMDBASE __POST __POST1 __RECIP __RECID __TTL |
|
|
|
__URLBASE="https://dnsapi.cn" |
|
|
|
|
|
|
|
# Get host and domain from $domain |
|
|
|
[ "${domain:0:2}" = "@." ] && domain="${domain/./}" # host |
|
|
|
[ "$domain" = "${domain/@/}" ] && domain="${domain/./@}" # host with no sperator |
|
|
|
__HOST="${domain%%@*}" |
|
|
|
__DOMAIN="${domain#*@}" |
|
|
|
[ -z "$__HOST" -o "$__HOST" = "$__DOMAIN" ] && __HOST=@ |
|
|
|
|
|
|
|
# Set record type |
|
|
|
[ $use_ipv6 = 0 ] && __TYPE=A || __TYPE=AAAA |
|
|
|
|
|
|
|
# Build base command |
|
|
|
build_command() { |
|
|
|
__CMDBASE="$CURL -Ss" |
|
|
|
# bind host/IP |
|
|
|
if [ -n "$bind_network" ]; then |
|
|
|
local __DEVICE |
|
|
|
network_get_physdev __DEVICE $bind_network || write_log 13 "Can not detect local device using 'network_get_physdev $bind_network' - Error: '$?'" |
|
|
|
write_log 7 "Force communication via device '$__DEVICE'" |
|
|
|
__CMDBASE="$__CMDBASE --interface $__DEVICE" |
|
|
|
fi |
|
|
|
# Force IP version |
|
|
|
if [ $force_ipversion = 1 ]; then |
|
|
|
[ $use_ipv6 = 0 ] && __CMDBASE="$__CMDBASE -4" || __CMDBASE="$__CMDBASE -6" |
|
|
|
fi |
|
|
|
# Set CA |
|
|
|
if [ $use_https = 1 ]; then |
|
|
|
if [ "$cacert" = IGNORE ]; then |
|
|
|
__CMDBASE="$__CMDBASE --insecure" |
|
|
|
elif [ -f "$cacert" ]; then |
|
|
|
__CMDBASE="$__CMDBASE --cacert $cacert" |
|
|
|
elif [ -d "$cacert" ]; then |
|
|
|
__CMDBASE="$__CMDBASE --capath $cacert" |
|
|
|
elif [ -n "$cacert" ]; then |
|
|
|
write_log 14 "No valid certificate(s) found at '$cacert' for HTTPS communication" |
|
|
|
fi |
|
|
|
fi |
|
|
|
# Set if no proxy (might be an error with .wgetrc or env) |
|
|
|
[ -z "$proxy" ] && __CMDBASE="$__CMDBASE --noproxy '*'" |
|
|
|
__CMDBASE="$__CMDBASE -d" |
|
|
|
} |
|
|
|
|
|
|
|
# Dnspod API |
|
|
|
dnspod_transfer() { |
|
|
|
__CNT=0 |
|
|
|
case "$1" in |
|
|
|
0) __A="$__CMDBASE '$__POST' $__URLBASE/Record.List" ;; |
|
|
|
1) __A="$__CMDBASE '$__POST1' $__URLBASE/Record.Create" ;; |
|
|
|
2) __A="$__CMDBASE '$__POST1&record_id=$__RECID&ttl=$__TTL' $__URLBASE/Record.Modify" ;; |
|
|
|
esac |
|
|
|
|
|
|
|
write_log 7 "#> $__A" |
|
|
|
while ! __TMP=$(eval $__A 2>&1); do |
|
|
|
write_log 3 "[$__TMP]" |
|
|
|
if [ $VERBOSE -gt 1 ]; then |
|
|
|
write_log 4 "Transfer failed - detailed mode: $VERBOSE - Do not try again after an error" |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
__CNT=$(($__CNT + 1)) |
|
|
|
[ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && write_log 14 "Transfer failed after $retry_count retries" |
|
|
|
write_log 4 "Transfer failed - $__CNT Try again in $RETRY_SECONDS seconds" |
|
|
|
sleep $RETRY_SECONDS & |
|
|
|
PID_SLEEP=$! |
|
|
|
wait $PID_SLEEP |
|
|
|
PID_SLEEP=0 |
|
|
|
done |
|
|
|
__ERR=$(jsonfilter -s "$__TMP" -e "@.status.code") |
|
|
|
[ $__ERR = 1 ] && return 0 |
|
|
|
[ $__ERR = 10 ] && [ $1 = 0 ] && return 0 |
|
|
|
__TMP=$(jsonfilter -s "$__TMP" -e "@.status.message") |
|
|
|
local A="$(date +%H%M%S) ERROR : [$__TMP] - Terminate process" |
|
|
|
logger -p user.err -t ddns-scripts[$$] $SECTION_ID: ${A:15} |
|
|
|
printf "%s\n" " $A" >>$LOGFILE |
|
|
|
exit 1 |
|
|
|
} |
|
|
|
|
|
|
|
# Add record |
|
|
|
add_domain() { |
|
|
|
dnspod_transfer 1 |
|
|
|
printf "%s\n" " $(date +%H%M%S) : Record add successfully: [$([ "$__HOST" = @ ] || echo $__HOST.)$__DOMAIN],[IP:$__IP]" >>$LOGFILE |
|
|
|
return 0 |
|
|
|
} |
|
|
|
|
|
|
|
# Modify record |
|
|
|
update_domain() { |
|
|
|
dnspod_transfer 2 |
|
|
|
printf "%s\n" " $(date +%H%M%S) : Record modified successfully: [$([ "$__HOST" = @ ] || echo $__HOST.)$__DOMAIN],[IP:$__IP],[TTL:$__TTL]" >>$LOGFILE |
|
|
|
return 0 |
|
|
|
} |
|
|
|
|
|
|
|
# Get DNS record |
|
|
|
describe_domain() { |
|
|
|
ret=0 |
|
|
|
__POST="login_token=$username,$password&format=json&domain=$__DOMAIN&sub_domain=$__HOST" |
|
|
|
__POST1="$__POST&value=$__IP&record_type=$__TYPE&record_line_id=0" |
|
|
|
dnspod_transfer 0 |
|
|
|
__TMP=$(jsonfilter -s "$__TMP" -e "@.records[@.type='$__TYPE' && @.line_id='0']") |
|
|
|
if [ -z "$__TMP" ]; then |
|
|
|
printf "%s\n" " $(date +%H%M%S) : Record not exist: [$([ "$__HOST" = @ ] || echo $__HOST.)$__DOMAIN]" >>$LOGFILE |
|
|
|
ret=1 |
|
|
|
else |
|
|
|
__RECIP=$(jsonfilter -s "$__TMP" -e "@.value") |
|
|
|
if [ "$__RECIP" != "$__IP" ]; then |
|
|
|
__RECID=$(jsonfilter -s "$__TMP" -e "@.id") |
|
|
|
__TTL=$(jsonfilter -s "$__TMP" -e "@.ttl") |
|
|
|
printf "%s\n" " $(date +%H%M%S) : Record needs to be updated: [Record IP:$__RECIP] [Local IP:$__IP]" >>$LOGFILE |
|
|
|
ret=2 |
|
|
|
fi |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
build_command |
|
|
|
describe_domain |
|
|
|
if [ $ret = 1 ]; then |
|
|
|
sleep 3 |
|
|
|
add_domain |
|
|
|
elif [ $ret = 2 ]; then |
|
|
|
sleep 3 |
|
|
|
update_domain |
|
|
|
else |
|
|
|
printf "%s\n" " $(date +%H%M%S) : Record needs not update: [Record IP:$__RECIP] [Local IP:$__IP]" >>$LOGFILE |
|
|
|
fi |
|
|
|
|
|
|
|
return 0 |