3 Ali_API
="https://alidns.aliyuncs.com/"
5 #Ali_Key="LTqIA87hOKdjevsf5"
6 #Ali_Secret="0p5EYueFNq501xnCPzKNbx6K51qPH2"
8 #Usage: dns_ali_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
13 Ali_Key
="${Ali_Key:-$(_readaccountconf_mutable Ali_Key)}"
14 Ali_Secret
="${Ali_Secret:-$(_readaccountconf_mutable Ali_Secret)}"
15 if [ -z "$Ali_Key" ] ||
[ -z "$Ali_Secret" ]; then
18 _err
"You don't specify aliyun api key and secret yet."
22 #save the api key and secret to the account conf file.
23 _saveaccountconf_mutable Ali_Key
"$Ali_Key"
24 _saveaccountconf_mutable Ali_Secret
"$Ali_Secret"
26 _debug
"First detect the root zone"
27 if ! _get_root
"$fulldomain"; then
32 _add_record_query
"$_domain" "$_sub_domain" "$txtvalue" && _ali_rest
"Add record"
38 Ali_Key
="${Ali_Key:-$(_readaccountconf_mutable Ali_Key)}"
39 Ali_Secret
="${Ali_Secret:-$(_readaccountconf_mutable Ali_Secret)}"
41 _debug
"First detect the root zone"
42 if ! _get_root
"$fulldomain"; then
49 #################### Private functions below ##################################
56 h
=$
(printf "%s" "$domain" | cut
-d .
-f $i-100)
62 _describe_records_query
"$h"
63 if ! _ali_rest
"Get root" "ignore"; then
67 if _contains
"$response" "PageNumber"; then
68 _sub_domain
=$
(printf "%s" "$domain" | cut
-d .
-f 1-$p)
69 _debug _sub_domain
"$_sub_domain"
71 _debug _domain
"$_domain"
81 signature
=$
(printf "%s" "GET&%2F&$(_ali_urlencode "$query")" | _hmac
"sha1" "$(printf "%s
" "$Ali_Secret&" | _hex_dump | tr -d " ")" | _base64
)
82 signature
=$
(_ali_urlencode
"$signature")
83 url
="$Ali_API?$query&Signature=$signature"
85 if ! response
="$(_get "$url")"; then
90 _debug2 response
"$response"
92 message
="$(echo "$response" | _egrep_o "\"Message
\":\"[^
\"]*\"" | cut -d : -f 2 | tr -d \")"
93 if [ "$message" ]; then
104 while [ "$_u_i" -le "$_str_len" ]; do
105 _str_c
="$(printf "%s
" "$_str" | cut -c "$_u_i")"
106 case $_str_c in [a-zA-Z0-9.~_-
])
107 printf "%s" "$_str_c"
110 printf "%%%02X" "'$_str_c"
113 _u_i
="$(_math "$_u_i" + 1)"
118 #_head_n 1 </dev/urandom | _digest "sha256" hex | cut -c 1-31
123 _check_exist_query
() {
127 query
=$query'AccessKeyId='$Ali_Key
128 query
=$query'&Action=DescribeDomainRecords'
129 query
=$query'&DomainName='$_qdomain
130 query
=$query'&Format=json'
131 query
=$query'&RRKeyWord='$_qsubdomain
132 query
=$query'&SignatureMethod=HMAC-SHA1'
133 query
=$query"&SignatureNonce=$(_ali_nonce)"
134 query
=$query'&SignatureVersion=1.0'
135 query
=$query'&Timestamp='$
(_timestamp
)
136 query
=$query'&TypeKeyWord=TXT'
137 query
=$query'&Version=2015-01-09'
140 _add_record_query
() {
142 query
=$query'AccessKeyId='$Ali_Key
143 query
=$query'&Action=AddDomainRecord'
144 query
=$query'&DomainName='$1
145 query
=$query'&Format=json'
147 query
=$query'&SignatureMethod=HMAC-SHA1'
148 query
=$query"&SignatureNonce=$(_ali_nonce)"
149 query
=$query'&SignatureVersion=1.0'
150 query
=$query'&Timestamp='$
(_timestamp
)
151 query
=$query'&Type=TXT'
152 query
=$query'&Value='$3
153 query
=$query'&Version=2015-01-09'
156 _delete_record_query
() {
158 query
=$query'AccessKeyId='$Ali_Key
159 query
=$query'&Action=DeleteDomainRecord'
160 query
=$query'&Format=json'
161 query
=$query'&RecordId='$1
162 query
=$query'&SignatureMethod=HMAC-SHA1'
163 query
=$query"&SignatureNonce=$(_ali_nonce)"
164 query
=$query'&SignatureVersion=1.0'
165 query
=$query'&Timestamp='$
(_timestamp
)
166 query
=$query'&Version=2015-01-09'
169 _describe_records_query
() {
171 query
=$query'AccessKeyId='$Ali_Key
172 query
=$query'&Action=DescribeDomainRecords'
173 query
=$query'&DomainName='$1
174 query
=$query'&Format=json'
175 query
=$query'&SignatureMethod=HMAC-SHA1'
176 query
=$query"&SignatureNonce=$(_ali_nonce)"
177 query
=$query'&SignatureVersion=1.0'
178 query
=$query'&Timestamp='$
(_timestamp
)
179 query
=$query'&Version=2015-01-09'
183 _check_exist_query
"$_domain" "$_sub_domain"
184 # do not correct grammar here
185 if ! _ali_rest
"Check exist records" "ignore"; then
189 record_id
="$(echo "$response" | tr '{' "\n" | grep "$_sub_domain" | grep -- "$txtvalue" | tr "," "\n" | grep RecordId | cut -d '"' -f 4)"
190 _debug2 record_id "$record_id"
192 if [ -z "$record_id" ]; then
193 _debug "record not found, skip"
195 _delete_record_query "$record_id"
196 _ali_rest "Delete record $record_id" "ignore"
202 date -u +"%Y-%m-%dT%H%%3A%M%%3A%SZ"