]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_schlundtech.sh
Merge branch 'acmesh-official:dev' into dev
[mirror_acme.sh.git] / dnsapi / dns_schlundtech.sh
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 }