Merge pull request #878 from jow-/lxc-autoconf-fix
[feed/packages.git] / net / ddns-scripts / files / update_CloudFlare.sh
1 #
2 #.Distributed under the terms of the GNU General Public License (GPL) version 2.0
3 #
4 # script for sending updates to cloudflare.com
5 #.2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
6 # many thanks to Paul for testing and feedback during development
7 #
8 # This script is parsed by dynamic_dns_functions.sh inside send_update() function
9 #
10 # using following options from /etc/config/ddns
11 # option username - your cloudflare e-mail
12 # option password - cloudflare api key, you can get it from cloudflare.com/my-account/
13 # option domain - your full hostname to update, in cloudflare its subdomain.domain
14 # i.e. myhost.example.com where myhost is the subdomain and example.com is your domain
15 #
16 # variable __IP already defined with the ip-address to use for update
17 #
18 [ $use_https -eq 0 ] && write_log 14 "Cloudflare only support updates via Secure HTTP (HTTPS). Please correct configuration!"
19 [ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing 'username'"
20 [ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing 'password'"
21
22 local __RECID __URL __KEY __KEYS __FOUND __SUBDOM __DOMAIN __TLD
23
24 # split given Host/Domain into TLD, registrable domain, and subdomain
25 split_FQDN $domain __TLD __DOMAIN __SUBDOM
26 [ $? -ne 0 -o -z "$__DOMAIN" ] && \
27 write_log 14 "Wrong Host/Domain configuration ($domain). Please correct configuration!"
28
29 # put together what we need
30 __DOMAIN="$__DOMAIN.$__TLD"
31
32 # parse OpenWrt script with
33 # functions for parsing and generating json
34 . /usr/share/libubox/jshn.sh
35
36 # function copied from /usr/share/libubox/jshn.sh
37 # from BB14.09 for backward compatibility to AA12.09
38 grep -i "json_get_keys" /usr/share/libubox/jshn.sh >/dev/null 2>&1 || json_get_keys() {
39 local __dest="$1"
40 local _tbl_cur
41
42 if [ -n "$2" ]; then
43 json_get_var _tbl_cur "$2"
44 else
45 _json_get_var _tbl_cur JSON_CUR
46 fi
47 local __var="${JSON_PREFIX}KEYS_${_tbl_cur}"
48 eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
49 }
50
51 # function to "sed" unwanted string parts from DATFILE
52 cleanup() {
53 # based on the sample output on cloudflare.com homepage we need to do some cleanup
54 sed -i 's/^[ \t]*//;s/[ \t]*$//' $DATFILE # remove invisible chars at beginning and end of lines
55 sed -i '/^-$/d' $DATFILE # remove lines with "-" (dash)
56 sed -i '/^$/d' $DATFILE # remove empty lines
57 sed -i "#'##g" $DATFILE # remove "'" (single quote)
58 }
59
60 # build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html
61 # to "rec_load_all" to detect rec_id needed for update
62 __URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html
63 __URL="${__URL}?a=rec_load_all" # -d 'a=rec_load_all'
64 __URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25'
65 __URL="${__URL}&email=$username" # -d 'email=sample@example.com'
66 __URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com'
67
68 # lets request the data
69 do_transfer "$__URL" || return 1
70
71 cleanup # cleanup dat file
72 json_load "$(cat $DATFILE)" # lets extract data
73 __FOUND=0 # found record indicator
74 json_get_var __RES "result" # cloudflare result of last request
75 json_get_var __MSG "msg" # cloudflare error message
76 [ "$__RES" != "success" ] && {
77 write_log 4 "'rec_load_all' failed with error: \n$__MSG"
78 return 1
79 }
80
81 json_select "response"
82 json_select "recs"
83 json_select "objs"
84 json_get_keys __KEYS
85 for __KEY in $__KEYS; do
86 local __ZONE __DISPLAY __NAME __TYPE
87 json_select "$__KEY"
88 # json_get_var __ZONE "zone_name" # for debugging
89 # json_get_var __DISPLAY "display_name" # for debugging
90 json_get_var __NAME "name"
91 json_get_var __TYPE "type"
92 if [ "$__NAME" = "$domain" ]; then
93 # we must verify IPv4 and IPv6 because there might be both for the same host
94 [ \( $use_ipv6 -eq 0 -a "$__TYPE" = "A" \) -o \( $use_ipv6 -eq 1 -a "$__TYPE" = "AAAA" \) ] && {
95 __FOUND=1 # mark found
96 break # found leave for loop
97 }
98 fi
99 json_select ..
100 done
101 [ $__FOUND -eq 0 ] && {
102 # we don't need to continue trying to update cloudflare because record to update does not exist
103 # user has to setup record first outside ddns-scripts
104 write_log 14 "No valid record found at Cloudflare setup. Please create first!"
105 }
106 json_get_var __RECID "rec_id" # last thing to do get rec_id
107 json_cleanup # cleanup
108 write_log 7 "rec_id '$__RECID' detected for host/domain '$domain'"
109
110 # build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html
111 # for "rec_edit" to update IP address
112 __URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html
113 __URL="${__URL}?a=rec_edit" # -d 'a=rec_edit'
114 __URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25'
115 __URL="${__URL}&id=$__RECID" # -d 'id=9001'
116 __URL="${__URL}&email=$username" # -d 'email=sample@example.com'
117 __URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com'
118
119 [ $use_ipv6 -eq 0 ] && __URL="${__URL}&type=A" # -d 'type=A' (IPv4)
120 [ $use_ipv6 -eq 1 ] && __URL="${__URL}&type=AAAA" # -d 'type=AAAA' (IPv6)
121
122 # handle subdomain or domain record
123 [ -n "$__SUBDOM" ] && __URL="${__URL}&name=$__SUBDOM" # -d 'name=sub' (HOST/SUBDOMAIN)
124 [ -z "$__SUBDOM" ] && __URL="${__URL}&name=$__DOMAIN" # -d 'name=example.com'(DOMAIN)
125
126 __URL="${__URL}&content=$__IP" # -d 'content=1.2.3.4'
127 __URL="${__URL}&service_mode=0" # -d 'service_mode=0'
128 __URL="${__URL}&ttl=1" # -d 'ttl=1'
129
130 # lets do the update
131 do_transfer "$__URL" || return 1
132
133 cleanup # cleanup tmp file
134 json_load "$(cat $DATFILE)" # lets extract data
135 json_get_var __RES "result" # cloudflare result of last request
136 json_get_var __MSG "msg" # cloudflare error message
137 [ "$__RES" != "success" ] && {
138 write_log 4 "'rec_edit' failed with error:\n$__MSG"
139 return 1
140 }
141 write_log 7 "Update of rec_id '$__RECID' successful"
142 return 0