3 # Supports IONOS DNS API v1.0.1
6 # Export IONOS_PREFIX and IONOS_SECRET before calling acme.sh:
8 # $ export IONOS_PREFIX="..."
9 # $ export IONOS_SECRET="..."
11 # $ acme.sh --issue --dns dns_ionos ...
13 IONOS_API
="https://api.hosting.ionos.com/dns"
14 IONOS_ROUTE_ZONES
="/v1/zones"
16 IONOS_TXT_TTL
=60 # minimum accepted by API
23 if ! _ionos_init
; then
27 _body
="[{\"name\":\"$_sub_domain.$_domain\",\"type\":\"TXT\",\"content\":\"$txtvalue\",\"ttl\":$IONOS_TXT_TTL,\"prio\":$IONOS_TXT_PRIO,\"disabled\":false}]"
29 if _ionos_rest POST
"$IONOS_ROUTE_ZONES/$_zone_id/records" "$_body" && [ "$_code" = "201" ]; then
30 _info
"TXT record has been created successfully."
41 if ! _ionos_init
; then
45 if ! _ionos_get_record
"$fulldomain" "$_zone_id" "$txtvalue"; then
46 _err
"Could not find _acme-challenge TXT record."
50 if _ionos_rest DELETE
"$IONOS_ROUTE_ZONES/$_zone_id/records/$_record_id" && [ "$_code" = "200" ]; then
51 _info
"TXT record has been deleted successfully."
59 IONOS_PREFIX
="${IONOS_PREFIX:-$(_readaccountconf_mutable IONOS_PREFIX)}"
60 IONOS_SECRET
="${IONOS_SECRET:-$(_readaccountconf_mutable IONOS_SECRET)}"
62 if [ -z "$IONOS_PREFIX" ] ||
[ -z "$IONOS_SECRET" ]; then
63 _err
"You didn't specify an IONOS api prefix and secret yet."
64 _err
"Read https://beta.developer.hosting.ionos.de/docs/getstarted to learn how to get a prefix and secret."
66 _err
"Then set them before calling acme.sh:"
67 _err
"\$ export IONOS_PREFIX=\"...\""
68 _err
"\$ export IONOS_SECRET=\"...\""
69 _err
"\$ acme.sh --issue -d ... --dns dns_ionos"
73 _saveaccountconf_mutable IONOS_PREFIX
"$IONOS_PREFIX"
74 _saveaccountconf_mutable IONOS_SECRET
"$IONOS_SECRET"
76 if ! _get_root
"$fulldomain"; then
77 _err
"Cannot find this domain in your IONOS account."
87 if _ionos_rest GET
"$IONOS_ROUTE_ZONES"; then
88 _response
="$(echo "$_response" | tr -d "\n")"
91 h
=$
(printf "%s" "$domain" | cut
-d .
-f $i-100)
96 _zone
="$(echo "$_response" | _egrep_o "\"name
\":\"$h\".
*\
}")"
98 _zone_id
=$
(printf "%s\n" "$_zone" | _egrep_o
"\"id\":\"[a-fA-F0-9\-]*\"" | _head_n
1 | cut
-d : -f 2 |
tr -d '\"')
99 if [ "$_zone_id" ]; then
100 _sub_domain
=$
(printf "%s" "$domain" | cut
-d .
-f 1-$p)
117 _ionos_get_record
() {
122 if _ionos_rest GET
"$IONOS_ROUTE_ZONES/$zone_id?recordName=$fulldomain&recordType=TXT"; then
123 _response
="$(echo "$_response" | tr -d "\n")"
125 _record
="$(echo "$_response" | _egrep_o "\"name
\":\"$fulldomain\"[^\
}]*\"type\":\"TXT
\"[^\
}]*\"content
\":\"\\\\\"$txtrecord\\\\\"\".
*\
}")"
126 if [ "$_record" ]; then
127 _record_id
=$
(printf "%s\n" "$_record" | _egrep_o
"\"id\":\"[a-fA-F0-9\-]*\"" | _head_n
1 | cut
-d : -f 2 |
tr -d '\"')
141 IONOS_API_KEY
="$(printf "%s.
%s
" "$IONOS_PREFIX" "$IONOS_SECRET")"
143 export _H1
="X-API-Key: $IONOS_API_KEY"
148 if [ "$method" != "GET" ]; then
149 export _H2
="Accept: application/json"
150 export _H3
="Content-Type: application/json"
152 _response
="$(_post "$data" "$IONOS_API$route" "" "$method" "application
/json
")"
154 export _H2
="Accept: */*"
157 _response
="$(_get "$IONOS_API$route")"
160 _code
="$(grep "^HTTP
" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\\r
\\n
")"
162 if [ "$?" != "0" ]; then
163 _err
"Error $route: $_response"
167 _debug2
"_response" "$_response"
168 _debug2
"_code" "$_code"