122 lines
4.0 KiB
Bash
Executable File
122 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
# shellcheck disable=SC2034
|
|
dns_myloc_info='myloc.de
|
|
Site: myloc.de
|
|
Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_myloc
|
|
Issues: github.com/acmesh-official/acme.sh/issues/5193
|
|
Options:
|
|
MYLOC_token API token
|
|
'
|
|
|
|
# updater for the (experimental) API of myloc.de / webtropia.com
|
|
# usage: acme.sh --issue -d example.com --dns dns_myloc --dnssleep 60
|
|
# API documentation at https://apidoc.myloc.de/
|
|
# As the API does not support quering available zones yet, the zone for a given
|
|
# fulldomain is searched recursively by removing prefixes one-by-one.
|
|
|
|
_myloc_api="https://zkm.myloc.de/api"
|
|
|
|
#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
|
dns_myloc_add() {
|
|
_myloc_fulldomain=$1
|
|
_myloc_txtvalue=$2
|
|
|
|
_myloc_token="${MYLOC_token:-$(_readaccountconf_mutable MYLOC_token)}"
|
|
if [ -z "$_myloc_token" ]; then
|
|
_err "You didn't specify MYLOC_token"
|
|
return 1
|
|
fi
|
|
|
|
export _H1="Content-Type: application/json"
|
|
export _H2="Authorization: Bearer $_myloc_token"
|
|
|
|
_myloc_zone="$(_myloc_get_zone "$_myloc_fulldomain")"
|
|
if [ $? -ne 0 ]; then
|
|
return 1
|
|
fi
|
|
|
|
# save token if the previous request was successful
|
|
_saveaccountconf_mutable MYLOC_token "$_myloc_token"
|
|
|
|
_info "Adding record"
|
|
_myloc_record="{\"type\":\"TXT\",\"name\":\"${_myloc_fulldomain}\",\"content\":\"\\\"${_myloc_txtvalue}\\\"\",\"ttl\":60}"
|
|
_debug "add record request $_myloc_record to ${_myloc_api}/dns/zone/${_myloc_zone}"
|
|
_myloc_response="$(_post "$_myloc_record" "${_myloc_api}/dns/zone/${_myloc_zone}" "" "PUT")"
|
|
_myloc_status=$?
|
|
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\r\n")"
|
|
_debug "add record response $_code $_myloc_response"
|
|
if [ $_myloc_status -ne 0 ]; then
|
|
_err "Add txt record curl error."
|
|
return 1
|
|
elif [ "$_code" = "204" ] && [ -z "$_myloc_response" ]; then
|
|
_info "Add txt record success"
|
|
return 0
|
|
elif _contains "$_myloc_response" "error" || _contains "$_myloc_response" "unexpected"; then
|
|
_err "Add txt record api error."
|
|
return 1
|
|
else
|
|
_err "Add txt record unknown response."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
#_myloc_fulldomain _myloc_txtvalue
|
|
dns_myloc_rm() {
|
|
_myloc_fulldomain=$1
|
|
_myloc_txtvalue=$2
|
|
|
|
_myloc_token="${MYLOC_token:-$(_readaccountconf_mutable MYLOC_token)}"
|
|
if [ -z "$_myloc_token" ]; then
|
|
_err "You didn't specify MYLOC_token"
|
|
return 1
|
|
fi
|
|
|
|
export _H1="Content-Type: application/json"
|
|
export _H2="Authorization: Bearer $_myloc_token"
|
|
|
|
_myloc_zone="$(_myloc_get_zone "$_myloc_fulldomain")"
|
|
if [ $? -ne 0 ]; then
|
|
return 1
|
|
fi
|
|
|
|
# save token if the previous request was successful
|
|
_saveaccountconf_mutable MYLOC_token "$_myloc_token"
|
|
|
|
_info "Deleting record for $_myloc_fulldomain"
|
|
_myloc_record="{\"type\":\"TXT\",\"name\":\"${_myloc_fulldomain}\",\"content\":\"\\\"${_myloc_txtvalue}\\\"\"}"
|
|
_debug "delete record $_myloc_record"
|
|
_myloc_response="$(_post "$_myloc_record" "${_myloc_api}/dns/zone/${_myloc_zone}" "" "DELETE")"
|
|
_myloc_status=$?
|
|
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\r\n")"
|
|
_debug "delete response $_code $_myloc_response"
|
|
if [ $_myloc_status -ne 0 ] || [ "$_code" != "204" ]; then
|
|
_err "Failed to delete record"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Usage: _myloc_get_zone "_acme-challenge.sub1.mydomain.com"
|
|
# Subdomains are walked until a zone is found or TLD is reached
|
|
_myloc_get_zone() {
|
|
_myloc_zone=$1
|
|
|
|
while [ "${_myloc_zone#*.}" != "$_myloc_zone" ]; do
|
|
_debug "Get zone trying $_myloc_zone"
|
|
_myloc_response="$(_get "${_myloc_api}/dns/zone/${_myloc_zone}")"
|
|
_myloc_status=$?
|
|
_debug "Get zone response $_myloc_response"
|
|
_code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\r\n")"
|
|
if [ $_myloc_status -eq 0 ] && [ "$_code" = "200" ]; then
|
|
_debug "Get zone success for $_myloc_zone"
|
|
echo "${_myloc_zone}"
|
|
return 0
|
|
fi
|
|
_myloc_zone="${_myloc_zone#*.}"
|
|
done
|
|
|
|
_err "Get zone failed for all candidates"
|
|
return 1
|
|
}
|