]> git.proxmox.com Git - mirror_acme.sh.git/blame - dnsapi/dns_loopia.sh
Merge pull request #4542 from alexleigh/master
[mirror_acme.sh.git] / dnsapi / dns_loopia.sh
CommitLineData
cac3b3ea
IL
1#!/usr/bin/env sh
2
3#
4#LOOPIA_User="username"
5#
6#LOOPIA_Password="password"
0daa225e
MT
7#
8#LOOPIA_Api="https://api.loopia.<TLD>/RPCSERV"
cac3b3ea 9
0daa225e 10LOOPIA_Api_Default="https://api.loopia.se/RPCSERV"
cac3b3ea
IL
11
12######## Public functions #####################
13
14#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
15dns_loopia_add() {
16 fulldomain=$1
17 txtvalue=$2
18
978ec911 19 if ! _loopia_load_config; then
cac3b3ea
IL
20 return 1
21 fi
22
a7d61461 23 _loopia_save_config
cac3b3ea
IL
24
25 _debug "First detect the root zone"
26 if ! _get_root "$fulldomain"; then
27 _err "invalid domain"
28 return 1
29 fi
30 _debug _sub_domain "$_sub_domain"
31 _debug _domain "$_domain"
32
33 _info "Adding record"
34
6ead0198
GT
35 if ! _loopia_add_sub_domain "$_domain" "$_sub_domain"; then
36 return 1
37 fi
38 if ! _loopia_add_record "$_domain" "$_sub_domain" "$txtvalue"; then
39 return 1
40 fi
cac3b3ea
IL
41
42}
43
44dns_loopia_rm() {
45 fulldomain=$1
46 txtvalue=$2
47
978ec911 48 if ! _loopia_load_config; then
cac3b3ea
IL
49 return 1
50 fi
51
a7d61461 52 _loopia_save_config
cac3b3ea
IL
53
54 _debug "First detect the root zone"
55 if ! _get_root "$fulldomain"; then
56 _err "invalid domain"
57 return 1
58 fi
59
60 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
61 <methodCall>
62 <methodName>removeSubdomain</methodName>
63 <params>
64 <param>
65 <value><string>%s</string></value>
66 </param>
67 <param>
68 <value><string>%s</string></value>
69 </param>
70 <param>
71 <value><string>%s</string></value>
72 </param>
73 <param>
74 <value><string>%s</string></value>
75 </param>
76 </params>
6ead0198 77 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$_domain" "$_sub_domain")
cac3b3ea
IL
78
79 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
80
81 if ! _contains "$response" "OK"; then
03c83097 82 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
6ead0198 83 _err "Error could not get txt records: $err_response"
cac3b3ea
IL
84 return 1
85 fi
86}
87
88#################### Private functions below ##################################
89
978ec911 90_loopia_load_config() {
0daa225e 91 LOOPIA_Api="${LOOPIA_Api:-$(_readaccountconf_mutable LOOPIA_Api)}"
978ec911
MT
92 LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
93 LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
94
0daa225e
MT
95 if [ -z "$LOOPIA_Api" ]; then
96 LOOPIA_Api="$LOOPIA_Api_Default"
97 fi
98
978ec911
MT
99 if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
100 LOOPIA_User=""
101 LOOPIA_Password=""
102
85be2b85
MT
103 _err "A valid Loopia API user and password not provided."
104 _err "Please provide a valid API user and try again."
978ec911
MT
105
106 return 1
107 fi
108
6ead0198
GT
109 if _contains "$LOOPIA_Password" "'" || _contains "$LOOPIA_Password" '"'; then
110 _err "Password contains quoute or double quoute and this is not supported by dns_loopia.sh"
111 return 1
112 fi
113
114 Encoded_Password=$(_xml_encode "$LOOPIA_Password")
978ec911
MT
115 return 0
116}
117
a7d61461 118_loopia_save_config() {
0daa225e
MT
119 if [ "$LOOPIA_Api" != "$LOOPIA_Api_Default" ]; then
120 _saveaccountconf_mutable LOOPIA_Api "$LOOPIA_Api"
121 fi
a7d61461
MT
122 _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
123 _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
124}
125
40f0238b
MS
126_loopia_get_records() {
127 domain=$1
128 sub_domain=$2
129
130 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
131 <methodCall>
132 <methodName>getZoneRecords</methodName>
133 <params>
134 <param>
135 <value><string>%s</string></value>
136 </param>
137 <param>
138 <value><string>%s</string></value>
139 </param>
140 <param>
141 <value><string>%s</string></value>
142 </param>
143 <param>
144 <value><string>%s</string></value>
145 </param>
146 </params>
6ead0198 147 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
40f0238b
MS
148
149 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
150 if ! _contains "$response" "<array>"; then
03c83097 151 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
6ead0198 152 _err "Error: $err_response"
40f0238b
MS
153 return 1
154 fi
155 return 0
156}
157
cac3b3ea
IL
158_get_root() {
159 domain=$1
160 _debug "get root"
161
162 domain=$1
163 i=2
164 p=1
165
166 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
167 <methodCall>
168 <methodName>getDomains</methodName>
169 <params>
170 <param>
171 <value><string>%s</string></value>
172 </param>
173 <param>
174 <value><string>%s</string></value>
175 </param>
176 </params>
6ead0198 177 </methodCall>' "$LOOPIA_User" "$Encoded_Password")
cac3b3ea
IL
178
179 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
180 while true; do
413f0718 181 h=$(echo "$domain" | cut -d . -f $i-100)
cac3b3ea
IL
182 if [ -z "$h" ]; then
183 #not valid
184 return 1
185 fi
186
187 if _contains "$response" "$h"; then
188 _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
189 _domain="$h"
190 return 0
191 fi
192 p=$i
193 i=$(_math "$i" + 1)
194 done
195 return 1
196
197}
198
40f0238b 199_loopia_add_record() {
cac3b3ea
IL
200 domain=$1
201 sub_domain=$2
202 txtval=$3
203
204 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
205 <methodCall>
40f0238b 206 <methodName>addZoneRecord</methodName>
cac3b3ea
IL
207 <params>
208 <param>
209 <value><string>%s</string></value>
210 </param>
211 <param>
212 <value><string>%s</string></value>
213 </param>
214 <param>
215 <value><string>%s</string></value>
216 </param>
217 <param>
218 <value><string>%s</string></value>
219 </param>
220 <param>
0ed4fc6a
GT
221 <value>
222 <struct>
223 <member>
224 <name>type</name>
225 <value><string>TXT</string></value>
226 </member>
227 <member>
228 <name>priority</name>
229 <value><int>0</int></value>
230 </member>
231 <member>
232 <name>ttl</name>
233 <value><int>300</int></value>
234 </member>
235 <member>
236 <name>rdata</name>
237 <value><string>%s</string></value>
238 </member>
239 </struct>
240 </value>
cac3b3ea
IL
241 </param>
242 </params>
6ead0198 243 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain" "$txtval")
cac3b3ea
IL
244
245 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
246
8995d343 247 if ! _contains "$response" "OK"; then
03c83097 248 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
6ead0198 249 _err "Error: $err_response"
cac3b3ea
IL
250 return 1
251 fi
252 return 0
253}
254
40f0238b 255_sub_domain_exists() {
cac3b3ea
IL
256 domain=$1
257 sub_domain=$2
258
40f0238b
MS
259 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
260 <methodCall>
261 <methodName>getSubdomains</methodName>
262 <params>
263 <param>
264 <value><string>%s</string></value>
265 </param>
266 <param>
267 <value><string>%s</string></value>
268 </param>
269 <param>
270 <value><string>%s</string></value>
271 </param>
272 </params>
6ead0198 273 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain")
40f0238b
MS
274
275 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
276
277 if _contains "$response" "$sub_domain"; then
278 return 0
279 fi
280 return 1
281}
282
283_loopia_add_sub_domain() {
284 domain=$1
285 sub_domain=$2
286
287 if _sub_domain_exists "$domain" "$sub_domain"; then
288 return 0
289 fi
290
cac3b3ea
IL
291 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
292 <methodCall>
293 <methodName>addSubdomain</methodName>
294 <params>
295 <param>
296 <value><string>%s</string></value>
297 </param>
298 <param>
299 <value><string>%s</string></value>
300 </param>
301 <param>
302 <value><string>%s</string></value>
303 </param>
304 <param>
305 <value><string>%s</string></value>
306 </param>
307 </params>
6ead0198 308 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
cac3b3ea
IL
309
310 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
311
8995d343 312 if ! _contains "$response" "OK"; then
03c83097 313 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
6ead0198 314 _err "Error: $err_response"
cac3b3ea
IL
315 return 1
316 fi
317 return 0
318}
6ead0198
GT
319
320_xml_encode() {
321 encoded_string=$1
322 encoded_string=$(echo "$encoded_string" | sed 's/&/\&amp;/')
323 encoded_string=$(echo "$encoded_string" | sed 's/</\&lt;/')
324 encoded_string=$(echo "$encoded_string" | sed 's/>/\&gt;/')
325 printf "%s" "$encoded_string"
326}