forked from openwrt/packages
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ddns-scripts: allow setting CloudFlare 'rec_id' in the config
This is necessary when there are multiple records for the same domain, otherwise the script will overwrite the first one returned by the API. It has the secondary benefit of allowing faster updates by performing only one API call instead of two. In case 'rec_id' is not set the script behaves exactly as before. Signed-off-by: Leonardo Brondani Schenkel <[email protected]>
- Loading branch information
1 parent
1794ba1
commit b740a68
Showing
1 changed file
with
50 additions
and
48 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -57,55 +57,57 @@ cleanup() { | |
sed -i "#'##g" $DATFILE # remove "'" (single quote) | ||
} | ||
|
||
# build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html | ||
# to "rec_load_all" to detect rec_id needed for update | ||
__URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html | ||
__URL="${__URL}?a=rec_load_all" # -d 'a=rec_load_all' | ||
__URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' | ||
__URL="${__URL}&email=$username" # -d '[email protected]' | ||
__URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com' | ||
|
||
# lets request the data | ||
do_transfer "$__URL" || return 1 | ||
|
||
cleanup # cleanup dat file | ||
json_load "$(cat $DATFILE)" # lets extract data | ||
__FOUND=0 # found record indicator | ||
json_get_var __RES "result" # cloudflare result of last request | ||
json_get_var __MSG "msg" # cloudflare error message | ||
[ "$__RES" != "success" ] && { | ||
write_log 4 "'rec_load_all' failed with error: \n$__MSG" | ||
return 1 | ||
} | ||
|
||
json_select "response" | ||
json_select "recs" | ||
json_select "objs" | ||
json_get_keys __KEYS | ||
for __KEY in $__KEYS; do | ||
local __ZONE __DISPLAY __NAME __TYPE | ||
json_select "$__KEY" | ||
# json_get_var __ZONE "zone_name" # for debugging | ||
# json_get_var __DISPLAY "display_name" # for debugging | ||
json_get_var __NAME "name" | ||
json_get_var __TYPE "type" | ||
if [ "$__NAME" = "$domain" ]; then | ||
# we must verify IPv4 and IPv6 because there might be both for the same host | ||
[ \( $use_ipv6 -eq 0 -a "$__TYPE" = "A" \) -o \( $use_ipv6 -eq 1 -a "$__TYPE" = "AAAA" \) ] && { | ||
__FOUND=1 # mark found | ||
break # found leave for loop | ||
} | ||
fi | ||
json_select .. | ||
done | ||
[ $__FOUND -eq 0 ] && { | ||
# we don't need to continue trying to update cloudflare because record to update does not exist | ||
# user has to setup record first outside ddns-scripts | ||
write_log 14 "No valid record found at Cloudflare setup. Please create first!" | ||
[ -n "$rec_id" ] && __RECID="$rec_id" || { | ||
# build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html | ||
# to "rec_load_all" to detect rec_id needed for update | ||
__URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html | ||
__URL="${__URL}?a=rec_load_all" # -d 'a=rec_load_all' | ||
__URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' | ||
__URL="${__URL}&email=$username" # -d '[email protected]' | ||
__URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com' | ||
|
||
# lets request the data | ||
do_transfer "$__URL" || return 1 | ||
|
||
cleanup # cleanup dat file | ||
json_load "$(cat $DATFILE)" # lets extract data | ||
__FOUND=0 # found record indicator | ||
json_get_var __RES "result" # cloudflare result of last request | ||
json_get_var __MSG "msg" # cloudflare error message | ||
[ "$__RES" != "success" ] && { | ||
write_log 4 "'rec_load_all' failed with error: \n$__MSG" | ||
return 1 | ||
} | ||
|
||
json_select "response" | ||
json_select "recs" | ||
json_select "objs" | ||
json_get_keys __KEYS | ||
for __KEY in $__KEYS; do | ||
local __ZONE __DISPLAY __NAME __TYPE | ||
json_select "$__KEY" | ||
# json_get_var __ZONE "zone_name" # for debugging | ||
# json_get_var __DISPLAY "display_name" # for debugging | ||
json_get_var __NAME "name" | ||
json_get_var __TYPE "type" | ||
if [ "$__NAME" = "$domain" ]; then | ||
# we must verify IPv4 and IPv6 because there might be both for the same host | ||
[ \( $use_ipv6 -eq 0 -a "$__TYPE" = "A" \) -o \( $use_ipv6 -eq 1 -a "$__TYPE" = "AAAA" \) ] && { | ||
__FOUND=1 # mark found | ||
break # found leave for loop | ||
} | ||
fi | ||
json_select .. | ||
done | ||
[ $__FOUND -eq 0 ] && { | ||
# we don't need to continue trying to update cloudflare because record to update does not exist | ||
# user has to setup record first outside ddns-scripts | ||
write_log 14 "No valid record found at Cloudflare setup. Please create first!" | ||
} | ||
json_get_var __RECID "rec_id" # last thing to do get rec_id | ||
json_cleanup # cleanup | ||
write_log 7 "rec_id '$__RECID' detected for host/domain '$domain'" | ||
} | ||
json_get_var __RECID "rec_id" # last thing to do get rec_id | ||
json_cleanup # cleanup | ||
write_log 7 "rec_id '$__RECID' detected for host/domain '$domain'" | ||
|
||
# build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html | ||
# for "rec_edit" to update IP address | ||
|