#!/usr/bin/env sh # shellcheck disable=SC2034 dns_mydevil_info='MyDevil.net MyDevil.net already supports automatic Lets Encrypt certificates, except for wildcard domains. This script depends on devil command that MyDevil.net provides, which means that it works only on server side. Site: MyDevil.net Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_mydevil Issues: github.com/acmesh-official/acme.sh/issues/2079 Author: Marcin Konicki ' ######## Public functions ##################### #Usage: dns_mydevil_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" dns_mydevil_add() { fulldomain=$1 txtvalue=$2 domain="" if ! _exists "devil"; then _err "Could not find 'devil' command." return 1 fi _info "Using mydevil" domain=$(mydevil_get_domain "$fulldomain") if [ -z "$domain" ]; then _err "Invalid domain name: could not find root domain of $fulldomain." return 1 fi # No need to check if record name exists, `devil` always adds new record. # In worst case scenario, we end up with multiple identical records. _info "Adding $fulldomain record for domain $domain" if devil dns add "$domain" "$fulldomain" TXT "$txtvalue"; then _info "Successfully added TXT record, ready for validation." return 0 else _err "Unable to add DNS record." return 1 fi } #Usage: fulldomain txtvalue #Remove the txt record after validation. dns_mydevil_rm() { fulldomain=$1 txtvalue=$2 domain="" if ! _exists "devil"; then _err "Could not find 'devil' command." return 1 fi _info "Using mydevil" domain=$(mydevil_get_domain "$fulldomain") if [ -z "$domain" ]; then _err "Invalid domain name: could not find root domain of $fulldomain." return 1 fi # catch one or more numbers num='[0-9][0-9]*' # catch one or more whitespace w=$(printf '[\t ][\t ]*') # catch anything, except newline any='.*' # filter to make sure we do not delete other records validRecords="^${num}${w}${fulldomain}${w}TXT${w}${any}${txtvalue}$" for id in $(devil dns list "$domain" | tail -n+2 | grep "${validRecords}" | cut -w -s -f 1); do _info "Removing record $id from domain $domain" echo "y" | devil dns del "$domain" "$id" || _err "Could not remove DNS record." done } #################### Private functions below ################################## # Usage: domain=$(mydevil_get_domain "_acme-challenge.www.domain.com" || _err "Invalid domain name") # echo $domain mydevil_get_domain() { fulldomain=$1 domain="" for domain in $(devil dns list | cut -w -s -f 1 | tail -n+2); do _debug "Checking domain: $domain" if _endswith "$fulldomain" "$domain"; then _debug "Fulldomain '$fulldomain' matches '$domain'" printf -- "%s" "$domain" return 0 fi done return 1 }