3 #This is the euserv.eu api wrapper for acme.sh
5 #Author: Michael Brueckner
6 #Report Bugs: https://www.github.com/initit/acme.sh or mbr@initit.de
9 #EUSERV_Username="username"
11 #EUSERV_Password="password"
17 EUSERV_Api
="https://api.euserv.net"
19 ######## Public functions #####################
21 #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
23 fulldomain
="$(echo "$1" | _lower_case)"
26 EUSERV_Username
="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
27 EUSERV_Password
="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
28 if [ -z "$EUSERV_Username" ] ||
[ -z "$EUSERV_Password" ]; then
31 _err
"You don't specify euserv user and password yet."
32 _err
"Please create your key and try again."
36 #save the user and email to the account conf file.
37 _saveaccountconf_mutable EUSERV_Username
"$EUSERV_Username"
38 _saveaccountconf_mutable EUSERV_Password
"$EUSERV_Password"
40 _debug
"First detect the root zone"
41 if ! _get_root
"$fulldomain"; then
45 _debug _sub_domain
"$_sub_domain"
46 _debug _domain
"$_domain"
49 _euserv_add_record
"$_domain" "$_sub_domain" "$txtvalue"
56 fulldomain
="$(echo "$1" | _lower_case)"
59 EUSERV_Username
="${EUSERV_Username:-$(_readaccountconf_mutable EUSERV_Username)}"
60 EUSERV_Password
="${EUSERV_Password:-$(_readaccountconf_mutable EUSERV_Password)}"
61 if [ -z "$EUSERV_Username" ] ||
[ -z "$EUSERV_Password" ]; then
64 _err
"You don't specify euserv user and password yet."
65 _err
"Please create your key and try again."
69 #save the user and email to the account conf file.
70 _saveaccountconf_mutable EUSERV_Username
"$EUSERV_Username"
71 _saveaccountconf_mutable EUSERV_Password
"$EUSERV_Password"
73 _debug
"First detect the root zone"
74 if ! _get_root
"$fulldomain"; then
78 _debug
"_sub_domain" "$_sub_domain"
79 _debug
"_domain" "$_domain"
81 _debug
"Getting txt records"
83 xml_content
=$
(printf '<?xml version="1.0" encoding="UTF-8"?>
85 <methodName>domain.dns_get_active_records</methodName>
103 <name>domain_id</name>
112 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id")
114 export _H1
="Content-Type: text/xml"
115 response
="$(_post "$xml_content" "$EUSERV_Api" "" "POST
")"
117 ok
="$(printf '%s' "$response" | grep "<member
><name
>status
</name
><value
><i4
>100</i4
></value
></member
>")"
118 if [ -z "$ok" ]; then
119 _err
"Error could not get txt records"
120 _debug
"xml_content" "$xml_content"
121 _debug
"response" "$response"
125 # _startLine=$(printf '%s' "$_euserv_domain_orders" | grep -n '>domain_name<.*>'"$domain"'<' | cut -d ':' -f 1 )
126 # _euserv_domain_id=$(printf '%s' "$_euserv_domain_orders" | sed -n "$_startLine"',$p' | grep '>domain_id<' | head -n 1 | sed 's/.*<i4>\([0-9]*\)<\/i4>.*/\1/' )
128 if ! printf "%s" "$response" |
grep '>dns_record_content<.*>'"$txtvalue"'<' >/dev
/null
; then
129 _info
"Do not need to delete record"
131 # find block where txtvalue is in. the record_id is allways prior this line!
132 _endLine
=$
(printf '%s' "$response" |
grep -n '>dns_record_content<.*>'"$txtvalue"'<' | cut
-d ':' -f 1 )
133 # record_id is the last entry with a number, identified by the postfix of </name><value><struct>
134 _record_id
=$
(printf '%s' "$response" |
sed -n '1,'"$_endLine"'p' |
grep '</name><value><struct>' |
tail -n 1 |
sed 's/.*<name>\([0-9]*\)<\/name>.*/\1/' )
135 _info
"Deleting record"
136 _euserv_delete_record
"$_record_id"
141 #################### Private functions below ##################################
143 _euserv_get_domain_orders
() {
144 # returns: _euserv_domain_orders
146 _debug
"get domain_orders"
148 xml_content
=$
(printf '<?xml version="1.0" encoding="UTF-8"?>
150 <methodName>domain.get_domain_orders</methodName>
157 <value><string>%s</string></value>
160 <name>password</name>
161 <value><string>%s</string></value>
167 </methodCall>' "$EUSERV_Username" "$EUSERV_Password")
169 export _H1
="Content-Type: text/xml"
170 response
="$(_post "$xml_content" "$EUSERV_Api" "" "POST
")"
172 ok
="$(printf '%s' "$response" | grep "<member
><name
>status
</name
><value
><i4
>100</i4
></value
></member
>")"
173 if [ -z "$ok" ]; then
174 _err
"Error could not get domain orders"
175 _debug
"xml_content" "$xml_content"
176 _debug
"response" "$response"
180 _euserv_domain_orders
="$response"
184 _euserv_get_domain_id
() {
185 # returns: _euserv_domain_id
187 _debug
"get domain_id"
189 _startLine
=$
(printf '%s' "$_euserv_domain_orders" |
grep -n '>domain_name<.*>'"$domain"'<' | cut
-d ':' -f 1 )
190 _euserv_domain_id
=$
(printf '%s' "$_euserv_domain_orders" |
sed -n "$_startLine"',$p' |
grep '>domain_id<' |
head -n 1 |
sed 's/.*<i4>\([0-9]*\)<\/i4>.*/\1/' )
192 if [ -z "$_euserv_domain_id" ] ; then
193 _err
"Could not find domain_id for domain $domain"
194 _debug
"_euserv_domain_orders" "$_euserv_domain_orders"
205 # Just to read the domain_orders once
210 _euserv_get_domain_orders
211 response
="$_euserv_domain_orders"
214 h
=$
(printf "%s" "$domain" | cut
-d .
-f $i-100)
221 if _contains
"$response" "$h"; then
222 _sub_domain
=$
(printf "%s" "$domain" | cut
-d .
-f 1-$p)
224 if ! _euserv_get_domain_id
"$_domain"; then
225 _err
"invalid domain"
238 _euserv_delete_record
() {
240 xml_content
=$
(printf '<?xml version="1.0" encoding="UTF-8"?>
242 <methodName>domain.dns_delete_record</methodName>
254 <name>password</name>
260 <name>dns_record_id</name>
269 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$record_id")
271 export _H1
="Content-Type: text/xml"
272 response
="$(_post "$xml_content" "$EUSERV_Api" "" "POST
")"
274 ok
="$(printf '%s' "$response" | grep "<member
><name
>status
</name
><value
><i4
>100</i4
></value
></member
>")"
275 if [ -z "$ok" ]; then
276 _err
"Error deleting record"
277 _debug
"xml_content" "$xml_content"
278 _debug
"response" "$response"
286 _euserv_add_record
() {
291 xml_content
=$
(printf '<?xml version="1.0" encoding="UTF-8"?>
293 <methodName>domain.dns_create_record</methodName>
305 <name>password</name>
307 <string>%s</string></value>
310 <name>domain_id</name>
316 <name>dns_record_subdomain</name>
322 <name>dns_record_type</name>
328 <name>dns_record_value</name>
334 <name>dns_record_ttl</name>
343 </methodCall>' "$EUSERV_Username" "$EUSERV_Password" "$_euserv_domain_id" "$sub_domain" "$txtval" )
345 export _H1
="Content-Type: text/xml"
346 response
="$(_post "$xml_content" "$EUSERV_Api" "" "POST
")"
348 ok
="$(printf '%s' "$response" | grep "<member
><name
>status
</name
><value
><i4
>100</i4
></value
></member
>")"
349 if [ -z "$ok" ]; then
350 _err
"Error could not create record"
351 _debug
"xml_content" "$xml_content"
352 _debug
"response" "$response"
355 # _dns_record_id="$(echo "$response" | _egrep_o "[\s\S]<name>dns_record_id<\/name>[\s]*?<value>[\s]*?<i4>(\K\d*)")"
356 # _debug "_dns_record_id" "$_dns_record_id"