]>
Commit | Line | Data |
---|---|---|
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 | 10 | LOOPIA_Api_Default="https://api.loopia.se/RPCSERV" |
cac3b3ea IL |
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 | ||
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 | ||
44 | dns_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/&/\&/') | |
323 | encoded_string=$(echo "$encoded_string" | sed 's/</\</') | |
324 | encoded_string=$(echo "$encoded_string" | sed 's/>/\>/') | |
325 | printf "%s" "$encoded_string" | |
326 | } |