]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_loopia.sh
Merge pull request #4658 from Justman10000/master
[mirror_acme.sh.git] / dnsapi / dns_loopia.sh
1 #!/usr/bin/env sh
2
3 #
4 #LOOPIA_User="username"
5 #
6 #LOOPIA_Password="password"
7 #
8 #LOOPIA_Api="https://api.loopia.<TLD>/RPCSERV"
9
10 LOOPIA_Api_Default="https://api.loopia.se/RPCSERV"
11
12 ######## Public functions #####################
13
14 #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
15 dns_loopia_add() {
16 fulldomain=$1
17 txtvalue=$2
18
19 if ! _loopia_load_config; then
20 return 1
21 fi
22
23 _loopia_save_config
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
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
41
42 }
43
44 dns_loopia_rm() {
45 fulldomain=$1
46 txtvalue=$2
47
48 if ! _loopia_load_config; then
49 return 1
50 fi
51
52 _loopia_save_config
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>
77 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$_domain" "$_sub_domain")
78
79 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
80
81 if ! _contains "$response" "OK"; then
82 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
83 _err "Error could not get txt records: $err_response"
84 return 1
85 fi
86 }
87
88 #################### Private functions below ##################################
89
90 _loopia_load_config() {
91 LOOPIA_Api="${LOOPIA_Api:-$(_readaccountconf_mutable LOOPIA_Api)}"
92 LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
93 LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
94
95 if [ -z "$LOOPIA_Api" ]; then
96 LOOPIA_Api="$LOOPIA_Api_Default"
97 fi
98
99 if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
100 LOOPIA_User=""
101 LOOPIA_Password=""
102
103 _err "A valid Loopia API user and password not provided."
104 _err "Please provide a valid API user and try again."
105
106 return 1
107 fi
108
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")
115 return 0
116 }
117
118 _loopia_save_config() {
119 if [ "$LOOPIA_Api" != "$LOOPIA_Api_Default" ]; then
120 _saveaccountconf_mutable LOOPIA_Api "$LOOPIA_Api"
121 fi
122 _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
123 _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
124 }
125
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>
147 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
148
149 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
150 if ! _contains "$response" "<array>"; then
151 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
152 _err "Error: $err_response"
153 return 1
154 fi
155 return 0
156 }
157
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>
177 </methodCall>' "$LOOPIA_User" "$Encoded_Password")
178
179 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
180 while true; do
181 h=$(echo "$domain" | cut -d . -f $i-100)
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
199 _loopia_add_record() {
200 domain=$1
201 sub_domain=$2
202 txtval=$3
203
204 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
205 <methodCall>
206 <methodName>addZoneRecord</methodName>
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>
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>
241 </param>
242 </params>
243 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain" "$txtval")
244
245 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
246
247 if ! _contains "$response" "OK"; then
248 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
249 _err "Error: $err_response"
250 return 1
251 fi
252 return 0
253 }
254
255 _sub_domain_exists() {
256 domain=$1
257 sub_domain=$2
258
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>
273 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain")
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
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>
308 </methodCall>' "$LOOPIA_User" "$Encoded_Password" "$domain" "$sub_domain")
309
310 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
311
312 if ! _contains "$response" "OK"; then
313 err_response=$(echo "$response" | sed 's/.*<string>\(.*\)<\/string>.*/\1/')
314 _err "Error: $err_response"
315 return 1
316 fi
317 return 0
318 }
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 }