You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
5.7 KiB
210 lines
5.7 KiB
#!/usr/bin/env sh |
|
# shellcheck disable=SC2034 |
|
dns_miab_info='Mail-in-a-Box |
|
Site: MailInaBox.email |
|
Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi2#dns_miab |
|
Options: |
|
MIAB_Username Admin username |
|
MIAB_Password Admin password |
|
MIAB_Server Server hostname. FQDN of your_MIAB Server |
|
Issues: github.com/acmesh-official/acme.sh/issues/2550 |
|
Author: Darven Dissek, William Gertz |
|
' |
|
|
|
######## Public functions ##################### |
|
|
|
#Usage: dns_miab_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" |
|
dns_miab_add() { |
|
fulldomain=$1 |
|
txtvalue=$2 |
|
_info "Using miab challenge add" |
|
_debug fulldomain "$fulldomain" |
|
_debug txtvalue "$txtvalue" |
|
|
|
#retrieve MIAB environemt vars |
|
if ! _retrieve_miab_env; then |
|
return 1 |
|
fi |
|
|
|
#check domain and seperate into domain and host |
|
if ! _get_root "$fulldomain"; then |
|
_err "Cannot find any part of ${fulldomain} is hosted on ${MIAB_Server}" |
|
return 1 |
|
fi |
|
|
|
_debug2 _sub_domain "$_sub_domain" |
|
_debug2 _domain "$_domain" |
|
|
|
#add the challenge record |
|
_api_path="custom/${fulldomain}/txt" |
|
_miab_rest "$txtvalue" "$_api_path" "POST" |
|
|
|
#check if result was good |
|
if _contains "$response" "updated DNS"; then |
|
_info "Successfully created the txt record" |
|
return 0 |
|
else |
|
_err "Error encountered during record add" |
|
_err "$response" |
|
return 1 |
|
fi |
|
} |
|
|
|
#Usage: dns_miab_rm _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" |
|
dns_miab_rm() { |
|
fulldomain=$1 |
|
txtvalue=$2 |
|
|
|
_info "Using miab challenge delete" |
|
_debug fulldomain "$fulldomain" |
|
_debug txtvalue "$txtvalue" |
|
|
|
#retrieve MIAB environemt vars |
|
if ! _retrieve_miab_env; then |
|
return 1 |
|
fi |
|
|
|
#check domain and seperate into doamin and host |
|
if ! _get_root "$fulldomain"; then |
|
_err "Cannot find any part of ${fulldomain} is hosted on ${MIAB_Server}" |
|
return 1 |
|
fi |
|
|
|
_debug2 _sub_domain "$_sub_domain" |
|
_debug2 _domain "$_domain" |
|
|
|
#Remove the challenge record |
|
_api_path="custom/${fulldomain}/txt" |
|
_miab_rest "$txtvalue" "$_api_path" "DELETE" |
|
|
|
#check if result was good |
|
if _contains "$response" "updated DNS"; then |
|
_info "Successfully removed the txt record" |
|
return 0 |
|
else |
|
_err "Error encountered during record remove" |
|
_err "$response" |
|
return 1 |
|
fi |
|
} |
|
|
|
#################### Private functions below ################################## |
|
# |
|
#Usage: _get_root _acme-challenge.www.domain.com |
|
#Returns: |
|
# _sub_domain=_acme-challenge.www |
|
# _domain=domain.com |
|
_get_root() { |
|
_passed_domain=$1 |
|
_debug _passed_domain "$_passed_domain" |
|
_i=2 |
|
_p=1 |
|
|
|
#get the zones hosed on MIAB server, must be a json stream |
|
_miab_rest "" "zones" "GET" |
|
|
|
if ! _is_json "$response"; then |
|
_err "ERROR fetching domain list" |
|
_err "$response" |
|
return 1 |
|
fi |
|
|
|
#cycle through the passed domain seperating out a test domain discarding |
|
# the subdomain by marching thorugh the dots |
|
while true; do |
|
_test_domain=$(printf "%s" "$_passed_domain" | cut -d . -f "${_i}"-100) |
|
_debug _test_domain "$_test_domain" |
|
|
|
if [ -z "$_test_domain" ]; then |
|
return 1 |
|
fi |
|
|
|
#report found if the test domain is in the json response and |
|
# report the subdomain |
|
if _contains "$response" "\"$_test_domain\""; then |
|
_sub_domain=$(printf "%s" "$_passed_domain" | cut -d . -f 1-"${_p}") |
|
_domain=${_test_domain} |
|
return 0 |
|
fi |
|
|
|
#cycle to the next dot in the passed domain |
|
_p=${_i} |
|
_i=$(_math "$_i" + 1) |
|
done |
|
|
|
return 1 |
|
} |
|
|
|
#Usage: _retrieve_miab_env |
|
#Returns (from store or environment variables): |
|
# MIAB_Username |
|
# MIAB_Password |
|
# MIAB_Server |
|
#retrieve MIAB environment variables, report errors and quit if problems |
|
_retrieve_miab_env() { |
|
MIAB_Username="${MIAB_Username:-$(_readaccountconf_mutable MIAB_Username)}" |
|
MIAB_Password="${MIAB_Password:-$(_readaccountconf_mutable MIAB_Password)}" |
|
MIAB_Server="${MIAB_Server:-$(_readaccountconf_mutable MIAB_Server)}" |
|
|
|
#debug log the environmental variables |
|
_debug MIAB_Username "$MIAB_Username" |
|
_debug MIAB_Password "$MIAB_Password" |
|
_debug MIAB_Server "$MIAB_Server" |
|
|
|
#check if MIAB environemt vars set and quit if not |
|
if [ -z "$MIAB_Username" ] || [ -z "$MIAB_Password" ] || [ -z "$MIAB_Server" ]; then |
|
_err "You didn't specify one or more of MIAB_Username, MIAB_Password or MIAB_Server." |
|
_err "Please check these environment variables and try again." |
|
return 1 |
|
fi |
|
|
|
#save the credentials to the account conf file. |
|
_saveaccountconf_mutable MIAB_Username "$MIAB_Username" |
|
_saveaccountconf_mutable MIAB_Password "$MIAB_Password" |
|
_saveaccountconf_mutable MIAB_Server "$MIAB_Server" |
|
return 0 |
|
} |
|
|
|
#Useage: _miab_rest "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" "custom/_acme-challenge.www.domain.com/txt "POST" |
|
#Returns: "updated DNS: domain.com" |
|
#rest interface MIAB dns |
|
_miab_rest() { |
|
_data="$1" |
|
_api_path="$2" |
|
_httpmethod="$3" |
|
|
|
#encode username and password for basic authentication |
|
_credentials="$(printf "%s" "$MIAB_Username:$MIAB_Password" | _base64)" |
|
export _H1="Authorization: Basic $_credentials" |
|
_url="https://${MIAB_Server}/admin/dns/${_api_path}" |
|
|
|
_debug2 _data "$_data" |
|
_debug _api_path "$_api_path" |
|
_debug2 _url "$_url" |
|
_debug2 _credentails "$_credentials" |
|
_debug _httpmethod "$_httpmethod" |
|
|
|
if [ "$_httpmethod" = "GET" ]; then |
|
response="$(_get "$_url")" |
|
else |
|
response="$(_post "$_data" "$_url" "" "$_httpmethod")" |
|
fi |
|
|
|
_retcode="$?" |
|
|
|
if [ "$_retcode" != "0" ]; then |
|
_err "MIAB REST authentication failed on $_httpmethod" |
|
return 1 |
|
fi |
|
|
|
_debug response "$response" |
|
return 0 |
|
} |
|
|
|
#Usage: _is_json "\[\n "mydomain.com"\n]" |
|
#Reurns "\[\n "mydomain.com"\n]" |
|
#returns the string if it begins and ends with square braces |
|
_is_json() { |
|
_str="$(echo "$1" | _normalizeJson)" |
|
echo "$_str" | grep '^\[.*\]$' >/dev/null 2>&1 |
|
}
|
|
|