]> git.proxmox.com Git - mirror_acme.sh.git/blame - dnsapi/dns_schlundtech.sh
Merge pull request #4658 from Justman10000/master
[mirror_acme.sh.git] / dnsapi / dns_schlundtech.sh
CommitLineData
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
15SCHLUNDTECH_API="https://gateway.schlundtech.de"
16
17# Arguments:
18# txtdomain
19# txt
20dns_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
61dns_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}