]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_loopia.sh
1316a274132e7c1e0e10f09df5fc2ae324361198
[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 _loopia_add_sub_domain "$_domain" "$_sub_domain"
36 _loopia_add_record "$_domain" "$_sub_domain" "$txtvalue"
37
38 }
39
40 dns_loopia_rm() {
41 fulldomain=$1
42 txtvalue=$2
43
44 if ! _loopia_load_config; then
45 return 1
46 fi
47
48 _loopia_save_config
49
50 _debug "First detect the root zone"
51 if ! _get_root "$fulldomain"; then
52 _err "invalid domain"
53 return 1
54 fi
55
56 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
57 <methodCall>
58 <methodName>removeSubdomain</methodName>
59 <params>
60 <param>
61 <value><string>%s</string></value>
62 </param>
63 <param>
64 <value><string>%s</string></value>
65 </param>
66 <param>
67 <value><string>%s</string></value>
68 </param>
69 <param>
70 <value><string>%s</string></value>
71 </param>
72 </params>
73 </methodCall>' "$LOOPIA_User" "$LOOPIA_Password" "$_domain" "$_sub_domain")
74
75 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
76
77 if ! _contains "$response" "OK"; then
78 _err "Error could not get txt records"
79 return 1
80 fi
81 }
82
83 #################### Private functions below ##################################
84
85 _loopia_load_config() {
86 LOOPIA_Api="${LOOPIA_Api:-$(_readaccountconf_mutable LOOPIA_Api)}"
87 LOOPIA_User="${LOOPIA_User:-$(_readaccountconf_mutable LOOPIA_User)}"
88 LOOPIA_Password="${LOOPIA_Password:-$(_readaccountconf_mutable LOOPIA_Password)}"
89
90 if [ -z "$LOOPIA_Api" ]; then
91 LOOPIA_Api="$LOOPIA_Api_Default"
92 fi
93
94 if [ -z "$LOOPIA_User" ] || [ -z "$LOOPIA_Password" ]; then
95 LOOPIA_User=""
96 LOOPIA_Password=""
97
98 _err "A valid Loopia API user and password not provided."
99 _err "Please provide a valid API user and try again."
100
101 return 1
102 fi
103
104 return 0
105 }
106
107 _loopia_save_config() {
108 if [ "$LOOPIA_Api" != "$LOOPIA_Api_Default" ]; then
109 _saveaccountconf_mutable LOOPIA_Api "$LOOPIA_Api"
110 fi
111 _saveaccountconf_mutable LOOPIA_User "$LOOPIA_User"
112 _saveaccountconf_mutable LOOPIA_Password "$LOOPIA_Password"
113 }
114
115 _loopia_get_records() {
116 domain=$1
117 sub_domain=$2
118
119 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
120 <methodCall>
121 <methodName>getZoneRecords</methodName>
122 <params>
123 <param>
124 <value><string>%s</string></value>
125 </param>
126 <param>
127 <value><string>%s</string></value>
128 </param>
129 <param>
130 <value><string>%s</string></value>
131 </param>
132 <param>
133 <value><string>%s</string></value>
134 </param>
135 </params>
136 </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain" "$sub_domain")
137
138 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
139 if ! _contains "$response" "<array>"; then
140 _err "Error"
141 return 1
142 fi
143 return 0
144 }
145
146 _get_root() {
147 domain=$1
148 _debug "get root"
149
150 domain=$1
151 i=2
152 p=1
153
154 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
155 <methodCall>
156 <methodName>getDomains</methodName>
157 <params>
158 <param>
159 <value><string>%s</string></value>
160 </param>
161 <param>
162 <value><string>%s</string></value>
163 </param>
164 </params>
165 </methodCall>' $LOOPIA_User $LOOPIA_Password)
166
167 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
168 while true; do
169 h=$(echo "$domain" | cut -d . -f $i-100)
170 if [ -z "$h" ]; then
171 #not valid
172 return 1
173 fi
174
175 if _contains "$response" "$h"; then
176 _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
177 _domain="$h"
178 return 0
179 fi
180 p=$i
181 i=$(_math "$i" + 1)
182 done
183 return 1
184
185 }
186
187 _loopia_add_record() {
188 domain=$1
189 sub_domain=$2
190 txtval=$3
191
192 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
193 <methodCall>
194 <methodName>addZoneRecord</methodName>
195 <params>
196 <param>
197 <value><string>%s</string></value>
198 </param>
199 <param>
200 <value><string>%s</string></value>
201 </param>
202 <param>
203 <value><string>%s</string></value>
204 </param>
205 <param>
206 <value><string>%s</string></value>
207 </param>
208 <param>
209 <struct>
210 <member>
211 <name>type</name>
212 <value><string>TXT</string></value>
213 </member>
214 <member>
215 <name>priority</name>
216 <value><int>0</int></value>
217 </member>
218 <member>
219 <name>ttl</name>
220 <value><int>60</int></value>
221 </member>
222 <member>
223 <name>rdata</name>
224 <value><string>%s</string></value>
225 </member>
226 </struct>
227 </param>
228 </params>
229 </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain" "$sub_domain" "$txtval")
230
231 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
232
233 if ! _contains "$response" "OK"; then
234 _err "Error"
235 return 1
236 fi
237 return 0
238 }
239
240 _sub_domain_exists() {
241 domain=$1
242 sub_domain=$2
243
244 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
245 <methodCall>
246 <methodName>getSubdomains</methodName>
247 <params>
248 <param>
249 <value><string>%s</string></value>
250 </param>
251 <param>
252 <value><string>%s</string></value>
253 </param>
254 <param>
255 <value><string>%s</string></value>
256 </param>
257 </params>
258 </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain")
259
260 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
261
262 if _contains "$response" "$sub_domain"; then
263 return 0
264 fi
265 return 1
266 }
267
268 _loopia_add_sub_domain() {
269 domain=$1
270 sub_domain=$2
271
272 if _sub_domain_exists "$domain" "$sub_domain"; then
273 return 0
274 fi
275
276 xml_content=$(printf '<?xml version="1.0" encoding="UTF-8"?>
277 <methodCall>
278 <methodName>addSubdomain</methodName>
279 <params>
280 <param>
281 <value><string>%s</string></value>
282 </param>
283 <param>
284 <value><string>%s</string></value>
285 </param>
286 <param>
287 <value><string>%s</string></value>
288 </param>
289 <param>
290 <value><string>%s</string></value>
291 </param>
292 </params>
293 </methodCall>' $LOOPIA_User $LOOPIA_Password "$domain" "$sub_domain")
294
295 response="$(_post "$xml_content" "$LOOPIA_Api" "" "POST")"
296
297 if ! _contains "$response" "OK"; then
298 _err "Error"
299 return 1
300 fi
301 return 0
302 }