]> git.proxmox.com Git - mirror_acme.sh.git/blame - dnsapi/dns_udr.sh
Merge pull request #4158 from lufi42/dev
[mirror_acme.sh.git] / dnsapi / dns_udr.sh
CommitLineData
a7f2d89e
AS
1#!/usr/bin/env sh
2
3# united-domains Reselling (https://www.ud-reselling.com/) DNS API
4# Author: Andreas Scherer (https://github.com/andischerer)
5# Created: 2021-02-01
6#
7# Set the environment variables as below:
8#
9# export UDR_USER="your_username_goes_here"
10# export UDR_PASS="some_password_goes_here"
11#
12
13UDR_API="https://api.domainreselling.de/api/call.cgi"
f3a0a253 14UDR_TTL="30"
a7f2d89e
AS
15
16######## Public functions #####################
17
18#Usage: add _acme-challenge.www.domain.com "some_long_string_of_characters_go_here_from_lets_encrypt"
19dns_udr_add() {
20 fulldomain=$1
21 txtvalue=$2
f3a0a253 22
a7f2d89e
AS
23 UDR_USER="${UDR_USER:-$(_readaccountconf_mutable UDR_USER)}"
24 UDR_PASS="${UDR_PASS:-$(_readaccountconf_mutable UDR_PASS)}"
25 if [ -z "$UDR_USER" ] || [ -z "$UDR_PASS" ]; then
26 UDR_USER=""
27 UDR_PASS=""
28 _err "You didn't specify an UD-Reselling username and password yet"
29 return 1
30 fi
31 # save the username and password to the account conf file.
32 _saveaccountconf_mutable UDR_USER "$UDR_USER"
33 _saveaccountconf_mutable UDR_PASS "$UDR_PASS"
34 _debug "First detect the root zone"
35 if ! _get_root "$fulldomain"; then
36 _err "invalid domain"
37 return 1
38 fi
39
40 _debug _dnszone "${_dnszone}"
41
42 _debug "Getting txt records"
43 if ! _udr_rest "QueryDNSZoneRRList" "dnszone=${_dnszone}"; then
44 return 1
45 fi
46
47 rr="${fulldomain}. ${UDR_TTL} IN TXT ${txtvalue}"
48 _debug resource_record "${rr}"
49 if _contains "$response" "$rr" >/dev/null; then
50 _err "Error, it would appear that this record already exists. Please review existing TXT records for this domain."
51 return 1
52 fi
53
54 _info "Adding record"
55 if ! _udr_rest "UpdateDNSZone" "dnszone=${_dnszone}&addrr0=${rr}"; then
56 _err "Adding the record did not succeed, please verify/check."
57 return 1
58 fi
59
60 _info "Added, OK"
61 return 0
62}
63
64dns_udr_rm() {
65 fulldomain=$1
66 txtvalue=$2
f3a0a253 67
a7f2d89e
AS
68 UDR_USER="${UDR_USER:-$(_readaccountconf_mutable UDR_USER)}"
69 UDR_PASS="${UDR_PASS:-$(_readaccountconf_mutable UDR_PASS)}"
70 if [ -z "$UDR_USER" ] || [ -z "$UDR_PASS" ]; then
71 UDR_USER=""
72 UDR_PASS=""
73 _err "You didn't specify an UD-Reselling username and password yet"
74 return 1
75 fi
76
77 _debug "First detect the root zone"
78 if ! _get_root "$fulldomain"; then
79 _err "invalid domain"
80 return 1
81 fi
82 _debug _dnszone "${_dnszone}"
83
84 _debug "Getting txt records"
85 if ! _udr_rest "QueryDNSZoneRRList" "dnszone=${_dnszone}"; then
86 return 1
87 fi
88
89 rr="${fulldomain}. ${UDR_TTL} IN TXT ${txtvalue}"
90 _debug resource_record "${rr}"
91 if _contains "$response" "$rr" >/dev/null; then
92 if ! _udr_rest "UpdateDNSZone" "dnszone=${_dnszone}&delrr0=${rr}"; then
93 _err "Deleting the record did not succeed, please verify/check."
94 return 1
95 fi
96 _info "Removed, OK"
97 return 0
98 else
99 _info "Text record is not present, will not delete anything."
100 return 0
101 fi
102}
103
104#################### Private functions below ##################################
105#_acme-challenge.www.domain.com
106#returns
107# _sub_domain=_acme-challenge.www
108# _domain=domain.com
109_get_root() {
110 domain=$1
888d91d1 111 i=1
a7f2d89e
AS
112
113 if ! _udr_rest "QueryDNSZoneList" ""; then
114 return 1
115 fi
116
117 while true; do
118 h=$(printf "%s" "$domain" | cut -d . -f $i-100)
119 _debug h "$h"
120
121 if [ -z "$h" ]; then
122 #not valid
123 return 1
124 fi
125
126 if _contains "${response}" "${h}." >/dev/null; then
127 _dnszone=$(echo "$response" | _egrep_o "${h}")
128 if [ "$_dnszone" ]; then
129 return 0
130 fi
131 return 1
132 fi
133 i=$(_math "$i" + 1)
134 done
135 return 1
136}
137
138_udr_rest() {
139 if [ -n "$2" ]; then
140 data="command=$1&$2"
141 else
142 data="command=$1"
143 fi
144
145 _debug data "${data}"
146 response="$(_post "${data}" "${UDR_API}?s_login=${UDR_USER}&s_pw=${UDR_PASS}" "" "POST")"
147
f3a0a253
AS
148 _code=$(echo "$response" | _egrep_o "code = ([0-9]+)" | _head_n 1 | cut -d = -f 2 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
149 _description=$(echo "$response" | _egrep_o "description = .*" | _head_n 1 | cut -d = -f 2 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
a7f2d89e
AS
150
151 _debug response_code "$_code"
152 _debug response_description "$_description"
153
154 if [ ! "$_code" = "200" ]; then
155 _err "DNS-API-Error: $_description"
156 return 1
157 fi
158
159 return 0
160}