]>
Commit | Line | Data |
---|---|---|
096ce1a2 | 1 | #!/usr/bin/env sh |
2 | # -*- mode: sh; tab-width: 2; indent-tabs-mode: s; coding: utf-8 -*- | |
3 | ||
4 | # Schlundtech DNS API | |
5 | # Author: mod242 | |
6 | # Created: 2019-40-29 | |
7 | # Completly based on the autoDNS xml api wrapper by auerswald@gmail.com | |
8 | # | |
9 | # export SCHLUNDTECH_USER="username" | |
10 | # export SCHLUNDTECH_PASSWORD="password" | |
11 | # | |
12 | # Usage: | |
13 | # acme.sh --issue --dns dns_schlundtech -d example.com | |
14 | ||
15 | SCHLUNDTECH_API="https://gateway.schlundtech.de" | |
16 | ||
17 | # Arguments: | |
18 | # txtdomain | |
19 | # txt | |
20 | dns_schlundtech_add() { | |
21 | fulldomain="$1" | |
22 | txtvalue="$2" | |
23 | ||
24 | SCHLUNDTECH_USER="${SCHLUNDTECH_USER:-$(_readaccountconf_mutable SCHLUNDTECH_USER)}" | |
25 | SCHLUNDTECH_PASSWORD="${SCHLUNDTECH_PASSWORD:-$(_readaccountconf_mutable SCHLUNDTECH_PASSWORD)}" | |
26 | ||
27 | if [ -z "$SCHLUNDTECH_USER" ] || [ -z "$SCHLUNDTECH_PASSWORD" ]; then | |
28 | _err "You didn't specify schlundtech user and password." | |
29 | return 1 | |
30 | fi | |
31 | ||
32 | _saveaccountconf_mutable SCHLUNDTECH_USER "$SCHLUNDTECH_USER" | |
33 | _saveaccountconf_mutable SCHLUNDTECH_PASSWORD "$SCHLUNDTECH_PASSWORD" | |
34 | ||
35 | _debug "First detect the root zone" | |
36 | ||
37 | if ! _get_autodns_zone "$fulldomain"; then | |
38 | _err "invalid domain" | |
39 | return 1 | |
40 | fi | |
41 | ||
42 | _debug _sub_domain "$_sub_domain" | |
43 | _debug _zone "$_zone" | |
44 | _debug _system_ns "$_system_ns" | |
45 | ||
46 | _info "Adding TXT record" | |
47 | ||
48 | autodns_response="$(_autodns_zone_update "$_zone" "$_sub_domain" "$txtvalue" "$_system_ns")" | |
49 | ||
50 | if [ "$?" -eq "0" ]; then | |
51 | _info "Added, OK" | |
52 | return 0 | |
53 | fi | |
54 | ||
55 | return 1 | |
56 | } | |
57 | ||
58 | # Arguments: | |
59 | # txtdomain | |
60 | # txt | |
61 | dns_schlundtech_rm() { | |
62 | fulldomain="$1" | |
63 | txtvalue="$2" | |
64 | ||
65 | SCHLUNDTECH_USER="${SCHLUNDTECH_USER:-$(_readaccountconf_mutable SCHLUNDTECH_USER)}" | |
66 | SCHLUNDTECH_PASSWORD="${SCHLUNDTECH_PASSWORD:-$(_readaccountconf_mutable SCHLUNDTECH_PASSWORD)}" | |
67 | ||
68 | if [ -z "$SCHLUNDTECH_USER" ] || [ -z "$SCHLUNDTECH_PASSWORD" ]; then | |
69 | _err "You didn't specify schlundtech user and password." | |
70 | return 1 | |
71 | fi | |
72 | ||
73 | _debug "First detect the root zone" | |
74 | ||
75 | if ! _get_autodns_zone "$fulldomain"; then | |
76 | _err "zone not found" | |
77 | return 1 | |
78 | fi | |
79 | ||
80 | _debug _sub_domain "$_sub_domain" | |
81 | _debug _zone "$_zone" | |
82 | _debug _system_ns "$_system_ns" | |
83 | ||
84 | _info "Delete TXT record" | |
85 | ||
86 | autodns_response="$(_autodns_zone_cleanup "$_zone" "$_sub_domain" "$txtvalue" "$_system_ns")" | |
87 | ||
88 | if [ "$?" -eq "0" ]; then | |
89 | _info "Deleted, OK" | |
90 | return 0 | |
91 | fi | |
92 | ||
93 | return 1 | |
94 | } | |
95 | ||
96 | #################### Private functions below ################################## | |
97 | ||
98 | # Arguments: | |
99 | # fulldomain | |
100 | # Returns: | |
101 | # _sub_domain=_acme-challenge.www | |
102 | # _zone=domain.com | |
103 | # _system_ns | |
104 | _get_autodns_zone() { | |
105 | domain="$1" | |
106 | ||
107 | i=2 | |
108 | p=1 | |
109 | ||
110 | while true; do | |
111 | h=$(printf "%s" "$domain" | cut -d . -f $i-100) | |
112 | _debug h "$h" | |
113 | ||
114 | if [ -z "$h" ]; then | |
115 | # not valid | |
116 | return 1 | |
117 | fi | |
118 | ||
119 | autodns_response="$(_autodns_zone_inquire "$h")" | |
120 | ||
121 | if [ "$?" -ne "0" ]; then | |
122 | _err "invalid domain" | |
123 | return 1 | |
124 | fi | |
125 | ||
126 | if _contains "$autodns_response" "<summary>1</summary>" >/dev/null; then | |
127 | _zone="$(echo "$autodns_response" | _egrep_o '<name>[^<]*</name>' | cut -d '>' -f 2 | cut -d '<' -f 1)" | |
128 | _system_ns="$(echo "$autodns_response" | _egrep_o '<system_ns>[^<]*</system_ns>' | cut -d '>' -f 2 | cut -d '<' -f 1)" | |
129 | _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p) | |
130 | return 0 | |
131 | fi | |
132 | ||
133 | p=$i | |
134 | i=$(_math "$i" + 1) | |
135 | done | |
136 | ||
137 | return 1 | |
138 | } | |
139 | ||
140 | _build_request_auth_xml() { | |
141 | printf "<auth> | |
142 | <user>%s</user> | |
143 | <password>%s</password> | |
144 | <context>10</context> | |
145 | </auth>" "$SCHLUNDTECH_USER" "$SCHLUNDTECH_PASSWORD" | |
146 | } | |
147 | ||
148 | # Arguments: | |
149 | # zone | |
150 | _build_zone_inquire_xml() { | |
151 | printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?> | |
152 | <request> | |
153 | %s | |
154 | <task> | |
155 | <code>0205</code> | |
156 | <view> | |
157 | <children>1</children> | |
158 | <limit>1</limit> | |
159 | </view> | |
160 | <where> | |
161 | <key>name</key> | |
162 | <operator>eq</operator> | |
163 | <value>%s</value> | |
164 | </where> | |
165 | </task> | |
166 | </request>" "$(_build_request_auth_xml)" "$1" | |
167 | } | |
168 | ||
169 | # Arguments: | |
170 | # zone | |
171 | # subdomain | |
172 | # txtvalue | |
173 | # system_ns | |
174 | _build_zone_update_xml() { | |
175 | printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?> | |
176 | <request> | |
177 | %s | |
178 | <task> | |
179 | <code>0202001</code> | |
180 | <default> | |
181 | <rr_add> | |
182 | <name>%s</name> | |
183 | <ttl>600</ttl> | |
184 | <type>TXT</type> | |
185 | <value>%s</value> | |
186 | </rr_add> | |
187 | </default> | |
188 | <zone> | |
189 | <name>%s</name> | |
190 | <system_ns>%s</system_ns> | |
191 | </zone> | |
192 | </task> | |
193 | </request>" "$(_build_request_auth_xml)" "$2" "$3" "$1" "$4" | |
194 | } | |
195 | ||
196 | # Arguments: | |
197 | # zone | |
198 | _autodns_zone_inquire() { | |
199 | request_data="$(_build_zone_inquire_xml "$1")" | |
200 | autodns_response="$(_autodns_api_call "$request_data")" | |
201 | ret="$?" | |
202 | ||
203 | printf "%s" "$autodns_response" | |
204 | return "$ret" | |
205 | } | |
206 | ||
207 | # Arguments: | |
208 | # zone | |
209 | # subdomain | |
210 | # txtvalue | |
211 | # system_ns | |
212 | _autodns_zone_update() { | |
213 | request_data="$(_build_zone_update_xml "$1" "$2" "$3" "$4")" | |
214 | autodns_response="$(_autodns_api_call "$request_data")" | |
215 | ret="$?" | |
216 | ||
217 | printf "%s" "$autodns_response" | |
218 | return "$ret" | |
219 | } | |
220 | ||
221 | # Arguments: | |
222 | # zone | |
223 | # subdomain | |
224 | # txtvalue | |
225 | # system_ns | |
226 | _autodns_zone_cleanup() { | |
227 | request_data="$(_build_zone_update_xml "$1" "$2" "$3" "$4")" | |
228 | # replace 'rr_add>' with 'rr_rem>' in request_data | |
229 | request_data="$(printf -- "%s" "$request_data" | sed 's/rr_add>/rr_rem>/g')" | |
230 | autodns_response="$(_autodns_api_call "$request_data")" | |
231 | ret="$?" | |
232 | ||
233 | printf "%s" "$autodns_response" | |
234 | return "$ret" | |
235 | } | |
236 | ||
237 | # Arguments: | |
238 | # request_data | |
239 | _autodns_api_call() { | |
240 | request_data="$1" | |
241 | ||
242 | _debug request_data "$request_data" | |
243 | ||
244 | autodns_response="$(_post "$request_data" "$SCHLUNDTECH_API")" | |
245 | ret="$?" | |
246 | ||
247 | _debug autodns_response "$autodns_response" | |
248 | ||
249 | if [ "$ret" -ne "0" ]; then | |
250 | _err "error" | |
251 | return 1 | |
252 | fi | |
253 | ||
254 | if _contains "$autodns_response" "<type>success</type>" >/dev/null; then | |
255 | _info "success" | |
256 | printf "%s" "$autodns_response" | |
257 | return 0 | |
258 | fi | |
259 | ||
260 | return 1 | |
261 | } |