]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_euserv.sh
initial version with Euserv.eu DNS API Support
[mirror_acme.sh.git] / dnsapi / dns_euserv.sh
1 #!/usr/bin/env sh
2
3 #This is the euserv.eu api wrapper for acme.sh
4 #
5 #Author: Michael Brueckner
6 #Report Bugs: https://www.github.com/initit/acme.sh or mbr@initit.de
7
8 #
9 #EUSERV_Username="username"
10 #
11 #EUSERV_Password="password"
12 #
13 # Dependencies:
14 # -------------
15 # - none -
16
17 EUSERV_Api="https://api.euserv.net"
18
19 ######## Public functions #####################
20
21 #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
22 dns_euserv_add() {
23 fulldomain="$(echo "$1" | _lower_case)"
24 txtvalue=$2
25
26 EUSERV_Username="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
27 EUSERV_Password="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
28 if [ -z "$EUSERV_Username" ] || [ -z "$EUSERV_Password" ]; then
29 EUSERV_Username=""
30 EUSERV_Password=""
31 _err "You don't specify euserv user and password yet."
32 _err "Please create your key and try again."
33 return 1
34 fi
35
36 #save the user and email to the account conf file.
37 _saveaccountconf_mutable EUSERV_Username "$EUSERV_Username"
38 _saveaccountconf_mutable EUSERV_Password "$EUSERV_Password"
39
40 _debug "First detect the root zone"
41 if ! _get_root "$fulldomain"; then
42 _err "invalid domain"
43 return 1
44 fi
45 _debug _sub_domain "$_sub_domain"
46 _debug _domain "$_domain"
47
48 _info "Adding record"
49 _euserv_add_record "$_domain" "$_sub_domain" "$txtvalue"
50
51 }
52
53 #fulldomain txtvalue
54 dns_euserv_rm() {
55
56 fulldomain="$(echo "$1" | _lower_case)"
57 txtvalue=$2
58
59 EUSERV_Username="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
60 EUSERV_Password="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
61 if [ -z "$EUSERV_Username" ] || [ -z "$EUSERV_Password" ]; then
62 EUSERV_Username=""
63 EUSERV_Password=""
64 _err "You don't specify euserv user and password yet."
65 _err "Please create your key and try again."
66 return 1
67 fi
68
69 #save the user and email to the account conf file.
70 _saveaccountconf_mutable EUSERV_Username "$EUSERV_Username"
71 _saveaccountconf_mutable EUSERV_Password "$EUSERV_Password"
72
73 _debug "First detect the root zone"
74 if ! _get_root "$fulldomain"; then
75 _err "invalid domain"
76 return 1
77 fi
78 _debug "_sub_domain" "$_sub_domain"
79 _debug "_domain" "$_domain"
80
81 _debug "Getting txt records"
82
83 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
84 <methodCall>
85 <methodName>domain.dns_get_active_records</methodName>
86 <params>
87 <param>
88 <value>
89 <struct>
90 <member>
91 <name>login</name>
92 <value>
93 <string>%s</string>
94 </value>
95 </member>
96 <member>
97 <name>password</name>
98 <value>
99 <string>%s</string>
100 </value>
101 </member>
102 <member>
103 <name>domain_id</name>
104 <value>
105 <int>%s</int>
106 </value>
107 </member>
108 </struct>
109 </value>
110 </param>
111 </params>
112 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id")
113
114 export _H1="Content-Type: text/xml"
115 response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
116
117 ok="$(printf '%s' "$response" | grep "<member><name>status</name><value><i4>100</i4></value></member>")"
118 if [ -z "$ok" ]; then
119 _err "Error could not get txt records"
120 _debug "xml_content" "$xml_content"
121 _debug "response" "$response"
122 return 1
123 fi
124
125 # _startLine=$(printf '%s' "$_euserv_domain_orders" | grep -n '>domain_name<.*>'"$domain"'<' | cut -d ':' -f 1 )
126 # _euserv_domain_id=$(printf '%s' "$_euserv_domain_orders" | sed -n "$_startLine"',$p' | grep '>domain_id<' | head -n 1 | sed 's/.*<i4>\([0-9]*\)<\/i4>.*/\1/' )
127
128 if ! printf "%s" "$response" | grep '>dns_record_content<.*>'"$txtvalue"'<' >/dev/null; then
129 _info "Do not need to delete record"
130 else
131 # find block where txtvalue is in. the record_id is allways prior this line!
132 _endLine=$(printf '%s' "$response" | grep -n '>dns_record_content<.*>'"$txtvalue"'<' | cut -d ':' -f 1 )
133 # record_id is the last entry with a number, identified by the postfix of </name><value><struct>
134 _record_id=$(printf '%s' "$response" | sed -n '1,'"$_endLine"'p' | grep '</name><value><struct>' | tail -n 1 | sed 's/.*<name>\([0-9]*\)<\/name>.*/\1/' )
135 _info "Deleting record"
136 _euserv_delete_record "$_record_id"
137 fi
138
139 }
140
141 #################### Private functions below ##################################
142
143 _euserv_get_domain_orders() {
144 # returns: _euserv_domain_orders
145
146 _debug "get domain_orders"
147
148 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
149 <methodCall>
150 <methodName>domain.get_domain_orders</methodName>
151 <params>
152 <param>
153 <value>
154 <struct>
155 <member>
156 <name>login</name>
157 <value><string>%s</string></value>
158 </member>
159 <member>
160 <name>password</name>
161 <value><string>%s</string></value>
162 </member>
163 </struct>
164 </value>
165 </param>
166 </params>
167 </methodCall>' "$EUSERV_Username" "$EUSERV_Password")
168
169 export _H1="Content-Type: text/xml"
170 response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
171
172 ok="$(printf '%s' "$response" | grep "<member><name>status</name><value><i4>100</i4></value></member>")"
173 if [ -z "$ok" ]; then
174 _err "Error could not get domain orders"
175 _debug "xml_content" "$xml_content"
176 _debug "response" "$response"
177 return 1
178 fi
179
180 _euserv_domain_orders="$response"
181 return 0
182 }
183
184 _euserv_get_domain_id() {
185 # returns: _euserv_domain_id
186 domain=$1
187 _debug "get domain_id"
188
189 _startLine=$(printf '%s' "$_euserv_domain_orders" | grep -n '>domain_name<.*>'"$domain"'<' | cut -d ':' -f 1 )
190 _euserv_domain_id=$(printf '%s' "$_euserv_domain_orders" | sed -n "$_startLine"',$p' | grep '>domain_id<' | head -n 1 | sed 's/.*<i4>\([0-9]*\)<\/i4>.*/\1/' )
191
192 if [ -z "$_euserv_domain_id" ] ; then
193 _err "Could not find domain_id for domain $domain"
194 _debug "_euserv_domain_orders" "$_euserv_domain_orders"
195 return 1
196 fi
197 return 0
198
199 }
200
201 _get_root() {
202 domain=$1
203 _debug "get root"
204
205 # Just to read the domain_orders once
206
207 domain=$1
208 i=2
209 p=1
210 _euserv_get_domain_orders
211 response="$_euserv_domain_orders"
212
213 while true; do
214 h=$(printf "%s" "$domain" | cut -d . -f $i-100)
215 _debug h "$h"
216 if [ -z "$h" ]; then
217 #not valid
218 return 1
219 fi
220
221 if _contains "$response" "$h"; then
222 _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
223 _domain="$h"
224 if ! _euserv_get_domain_id "$_domain"; then
225 _err "invalid domain"
226 return 1
227 fi
228 return 0
229 fi
230 p=$i
231 i=$(_math "$i" + 1)
232 done
233 return 1
234
235 }
236
237 # TODO
238 _euserv_delete_record() {
239 record_id=$1
240 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
241 <methodCall>
242 <methodName>domain.dns_delete_record</methodName>
243 <params>
244 <param>
245 <value>
246 <struct>
247 <member>
248 <name>login</name>
249 <value>
250 <string>%s</string>
251 </value>
252 </member>
253 <member>
254 <name>password</name>
255 <value>
256 <string>%s</string>
257 </value>
258 </member>
259 <member>
260 <name>dns_record_id</name>
261 <value>
262 <int>%s</int>
263 </value>
264 </member>
265 </struct>
266 </value>
267 </param>
268 </params>
269 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$record_id")
270
271 export _H1="Content-Type: text/xml"
272 response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
273
274 ok="$(printf '%s' "$response" | grep "<member><name>status</name><value><i4>100</i4></value></member>")"
275 if [ -z "$ok" ]; then
276 _err "Error deleting record"
277 _debug "xml_content" "$xml_content"
278 _debug "response" "$response"
279 return 1
280 fi
281
282 return 0
283
284 }
285
286 _euserv_add_record() {
287 domain=$1
288 sub_domain=$2
289 txtval=$3
290
291 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
292 <methodCall>
293 <methodName>domain.dns_create_record</methodName>
294 <params>
295 <param>
296 <value>
297 <struct>
298 <member>
299 <name>login</name>
300 <value>
301 <string>%s</string>
302 </value>
303 </member>
304 <member>
305 <name>password</name>
306 <value>
307 <string>%s</string></value>
308 </member>
309 <member>
310 <name>domain_id</name>
311 <value>
312 <int>%s</int>
313 </value>
314 </member>
315 <member>
316 <name>dns_record_subdomain</name>
317 <value>
318 <string>%s</string>
319 </value>
320 </member>
321 <member>
322 <name>dns_record_type</name>
323 <value>
324 <string>TXT</string>
325 </value>
326 </member>
327 <member>
328 <name>dns_record_value</name>
329 <value>
330 <string>%s</string>
331 </value>
332 </member>
333 <member>
334 <name>dns_record_ttl</name>
335 <value>
336 <int>300</int>
337 </value>
338 </member>
339 </struct>
340 </value>
341 </param>
342 </params>
343 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id" "$sub_domain" "$txtval" )
344
345 export _H1="Content-Type: text/xml"
346 response="$(_post "$xml_content" "$EUSERV_Api" "" "POST")"
347
348 ok="$(printf '%s' "$response" | grep "<member><name>status</name><value><i4>100</i4></value></member>")"
349 if [ -z "$ok" ]; then
350 _err "Error could not create record"
351 _debug "xml_content" "$xml_content"
352 _debug "response" "$response"
353 return 1
354 fi
355 # _dns_record_id="$(echo "$response" | _egrep_o "[\s\S]<name>dns_record_id<\/name>[\s]*?<value>[\s]*?<i4>(\K\d*)")"
356 # _debug "_dns_record_id" "$_dns_record_id"
357 return 0
358 }