]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_easydns.sh
Merge pull request #2797 from EAliakbar/arvandns
[mirror_acme.sh.git] / dnsapi / dns_easydns.sh
1 #!/usr/bin/env sh
2
3 #######################################################
4 #
5 # easyDNS REST API for acme.sh by Neilpang based on dns_cf.sh
6 #
7 # Please note: # API is currently beta and subject to constant change
8 # http://sandbox.rest.easydns.net:3000/
9 #
10 # Author: wurzelpanzer [wurzelpanzer@maximolider.net]
11 # Report Bugs here: https://github.com/acmesh-official/acme.sh/issues/2647
12 #
13 #################### Public functions #################
14
15 #EASYDNS_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
16 #EASYDNS_Token="xxxxxxxxxxxxxxxxxxxxxxxx"
17 EASYDNS_Api="https://rest.easydns.net"
18
19 #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
20 dns_easydns_add() {
21 fulldomain=$1
22 txtvalue=$2
23
24 EASYDNS_Token="${EASYDNS_Token:-$(_readaccountconf_mutable EASYDNS_Token)}"
25 EASYDNS_Key="${EASYDNS_Key:-$(_readaccountconf_mutable EASYDNS_Key)}"
26
27 if [ -z "$EASYDNS_Token" ] || [ -z "$EASYDNS_Key" ]; then
28 _err "You didn't specify an easydns.net token or api key. Please sign up at http://docs.sandbox.rest.easydns.net/beta_signup.php"
29 return 1
30 else
31 _saveaccountconf_mutable EASYDNS_Token "$EASYDNS_Token"
32 _saveaccountconf_mutable EASYDNS_Key "$EASYDNS_Key"
33 fi
34
35 _debug "First detect the root zone"
36 if ! _get_root "$fulldomain"; then
37 _err "invalid domain"
38 return 1
39 fi
40 _debug _sub_domain "$_sub_domain"
41 _debug _domain "$_domain"
42
43 _debug "Getting txt records"
44 _EASYDNS_rest GET "zones/records/all/${_domain}/search/${_sub_domain}"
45
46 if ! printf "%s" "$response" | grep \"status\":200 >/dev/null; then
47 _err "Error"
48 return 1
49 fi
50
51 _info "Adding record"
52 if _EASYDNS_rest PUT "zones/records/add/$_domain/TXT" "{\"host\":\"$_sub_domain\",\"rdata\":\"$txtvalue\"}"; then
53 if _contains "$response" "\"status\":201"; then
54 _info "Added, OK"
55 return 0
56 elif _contains "$response" "Record already exists"; then
57 _info "Already exists, OK"
58 return 0
59 else
60 _err "Add txt record error."
61 return 1
62 fi
63 fi
64 _err "Add txt record error."
65 return 1
66
67 }
68
69 dns_easydns_rm() {
70 fulldomain=$1
71 txtvalue=$2
72
73 EASYDNS_Token="${EASYDNS_Token:-$(_readaccountconf_mutable EASYDNS_Token)}"
74 EASYDNS_Key="${EASYDNS_Key:-$(_readaccountconf_mutable EASYDNS_Key)}"
75
76 _debug "First detect the root zone"
77 if ! _get_root "$fulldomain"; then
78 _err "invalid domain"
79 return 1
80 fi
81 _debug _sub_domain "$_sub_domain"
82 _debug _domain "$_domain"
83
84 _debug "Getting txt records"
85 _EASYDNS_rest GET "zones/records/all/${_domain}/search/${_sub_domain}"
86
87 if ! printf "%s" "$response" | grep \"status\":200 >/dev/null; then
88 _err "Error"
89 return 1
90 fi
91
92 count=$(printf "%s\n" "$response" | _egrep_o "\"count\":[^,]*" | cut -d : -f 2)
93 _debug count "$count"
94 if [ "$count" = "0" ]; then
95 _info "Don't need to remove."
96 else
97 record_id=$(printf "%s\n" "$response" | _egrep_o "\"id\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \" | head -n 1)
98 _debug "record_id" "$record_id"
99 if [ -z "$record_id" ]; then
100 _err "Can not get record id to remove."
101 return 1
102 fi
103 if ! _EASYDNS_rest DELETE "zones/records/$_domain/$record_id"; then
104 _err "Delete record error."
105 return 1
106 fi
107 _contains "$response" "\"status\":200"
108 fi
109
110 }
111
112 #################### Private functions below ##################################
113 #_acme-challenge.www.domain.com
114 #returns
115 # _sub_domain=_acme-challenge.www
116 # _domain=domain.com
117 _get_root() {
118 domain=$1
119 i=1
120 p=1
121 while true; do
122 h=$(printf "%s" "$domain" | cut -d . -f $i-100)
123 _debug h "$h"
124 if [ -z "$h" ]; then
125 #not valid
126 return 1
127 fi
128
129 if ! _EASYDNS_rest GET "zones/records/all/$h"; then
130 return 1
131 fi
132
133 if _contains "$response" "\"status\":200"; then
134 _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
135 _domain=$h
136 return 0
137 fi
138
139 p=$i
140 i=$(_math "$i" + 1)
141 done
142 return 1
143 }
144
145 _EASYDNS_rest() {
146 m=$1
147 ep="$2"
148 data="$3"
149 _debug "$ep"
150
151 basicauth=$(printf "%s" "$EASYDNS_Token":"$EASYDNS_Key" | _base64)
152
153 export _H1="accept: application/json"
154 if [ "$basicauth" ]; then
155 export _H2="Authorization: Basic $basicauth"
156 fi
157
158 if [ "$m" != "GET" ]; then
159 export _H3="Content-Type: application/json"
160 _debug data "$data"
161 response="$(_post "$data" "$EASYDNS_Api/$ep" "" "$m")"
162 else
163 response="$(_get "$EASYDNS_Api/$ep")"
164 fi
165
166 if [ "$?" != "0" ]; then
167 _err "error $ep"
168 return 1
169 fi
170 _debug2 response "$response"
171 return 0
172 }