Browse Source
Merge pull request #1 from kvakanet/kvakanet-dnsmanager
Merge pull request #1 from kvakanet/kvakanet-dnsmanager
Add dnsmanager supportpull/3170/head
kvakanet
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 150 additions and 0 deletions
@ -0,0 +1,150 @@ |
|||||
|
#!/usr/bin/env sh |
||||
|
|
||||
|
# Ispsystem dnsmanager API |
||||
|
# Author: Oleg from Reddock |
||||
|
# Created: 2020-09-13 |
||||
|
# |
||||
|
# export ISP_DNS_URL="https://dnsmanager_url/dnsmgr" |
||||
|
# export ISP_DNS_USER="username" |
||||
|
# export ISP_DNS_PASS="password" |
||||
|
# |
||||
|
# Usage: |
||||
|
# acme.sh --issue --dns dns_dnsmgr -d example.com |
||||
|
|
||||
|
ISP_DNS_URL="${ISP_DNS_URL:-$(_readaccountconf_mutable ISP_DNS_URL)}" |
||||
|
############################ Public Functions ############################## |
||||
|
#Usage: dns_dnsmgr_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" |
||||
|
dns_dnsmgr_add() { |
||||
|
fulldomain=$1 |
||||
|
txtvalue=$2 |
||||
|
_info "Using ispsystem dnsmanager api" |
||||
|
_debug fulldomain "${fulldomain}" |
||||
|
_debug txtvalue "${txtvalue}" |
||||
|
ISP_DNS_USER="${ISP_DNS_USER:-$(_readaccountconf_mutable ISP_DNS_USER)}" |
||||
|
ISP_DNS_PASS="${ISP_DNS_PASS:-$(_readaccountconf_mutable ISP_DNS_PASS)}" |
||||
|
if [ -z "${ISP_DNS_USER}" ] || [ -z "${ISP_DNS_PASS}" ]; then |
||||
|
ISP_DNS_USER="" |
||||
|
ISP_DNS_PASS="" |
||||
|
_err "Ispsystem dnsmanager username and password must be present." |
||||
|
return 1 |
||||
|
fi |
||||
|
_saveaccountconf_mutable ISP_DNS_USER "${ISP_DNS_USER}" |
||||
|
_saveaccountconf_mutable ISP_DNS_PASS "${ISP_DNS_PASS}" |
||||
|
_saveaccountconf_mutable ISP_DNS_URL "${ISP_DNS_URL}" |
||||
|
|
||||
|
_debug "First detect the root zone" |
||||
|
if ! _get_root "${fulldomain}"; then |
||||
|
_err "invalid domain" |
||||
|
return 1 |
||||
|
fi |
||||
|
|
||||
|
_debug "Adding txt record" |
||||
|
|
||||
|
if _zone_add_record "${_domain}" "${fulldomain}" "${txtvalue}"; then |
||||
|
if _contains "${response}" "\"ok\":true" >/dev/null; then |
||||
|
_info "Added, OK" |
||||
|
return 0 |
||||
|
else |
||||
|
_err "Adding txt record error." |
||||
|
return 1 |
||||
|
fi |
||||
|
else |
||||
|
_err "Adding txt record error." |
||||
|
fi |
||||
|
} |
||||
|
|
||||
|
#Usage: fulldomain txtvalue |
||||
|
#Remove the txt record after validation. |
||||
|
dns_dnsmgr_rm() { |
||||
|
fulldomain=$1 |
||||
|
txtvalue=$2 |
||||
|
_info "Using ispsystem dnsmanager api" |
||||
|
_debug fulldomain "${fulldomain}" |
||||
|
_debug txtvalue "${txtvalue}" |
||||
|
ISP_DNS_USER="${ISP_DNS_USER:-$(_readaccountconf_mutable ISP_DNS_USER)}" |
||||
|
ISP_DNS_PASS="${ISP_DNS_PASS:-$(_readaccountconf_mutable ISP_DNS_PASS)}" |
||||
|
if [ -z "${ISP_DNS_USER}" ] || [ -z "${ISP_DNS_PASS}" ]; then |
||||
|
ISP_DNS_USER="" |
||||
|
ISP_DNS_PASS="" |
||||
|
_err "Ispsystem dnsmanager username and password must be present." |
||||
|
return 1 |
||||
|
fi |
||||
|
_saveaccountconf_mutable ISP_DNS_USER "${ISP_DNS_USER}" |
||||
|
_saveaccountconf_mutable ISP_DNS_PASS "${ISP_DNS_PASS}" |
||||
|
_saveaccountconf_mutable ISP_DNS_URL "${ISP_DNS_URL}" |
||||
|
|
||||
|
_debug "First detect the root zone" |
||||
|
if ! _get_root "${fulldomain}"; then |
||||
|
_err "invalid domain" |
||||
|
return 1 |
||||
|
fi |
||||
|
|
||||
|
_zone_rm_record "${_domain}" "${fulldomain}" "${txtvalue}" |
||||
|
_debug response: "${response}" |
||||
|
_info "Record deleted" |
||||
|
return 0 |
||||
|
} |
||||
|
|
||||
|
############################ Private Functions ############################## |
||||
|
_zone_find() { |
||||
|
_isp_domain="$1" |
||||
|
_isp_body="authinfo=${ISP_DNS_USER}:${ISP_DNS_PASS}&func=domain&filter=on&out=bjson&name=${_isp_domain}" |
||||
|
response="$(_post "${_isp_body}" "${ISP_DNS_URL}")" |
||||
|
if [ "$?" != "0" ]; then |
||||
|
_err "error ${_isp_domain} find domain" |
||||
|
return 1 |
||||
|
fi |
||||
|
_debug2 response "${response}" |
||||
|
return 0 |
||||
|
} |
||||
|
# |
||||
|
_zone_add_record() { |
||||
|
_isp_domain="$1" |
||||
|
_isp_record_name="$2" |
||||
|
_isp_record_value="$3" |
||||
|
|
||||
|
_isp_body="authinfo=${ISP_DNS_USER}:${ISP_DNS_PASS}&func=domain.record.edit&ttl=90&sok=ok&rtype=txt&out=bjson&plid=${_isp_domain}&name=${_isp_record_name}.&value=${_isp_record_value}" |
||||
|
response="$(_post "${_isp_body}" "${ISP_DNS_URL}")" |
||||
|
if [ "$?" != "0" ]; then |
||||
|
_err "error ${_isp_domain} add domain record" |
||||
|
return 1 |
||||
|
fi |
||||
|
_debug2 response "${response}" |
||||
|
return 0 |
||||
|
} |
||||
|
# |
||||
|
_zone_rm_record() { |
||||
|
_isp_domain="$1" |
||||
|
_isp_record_name="$2" |
||||
|
_isp_record_value="$3" |
||||
|
|
||||
|
_isp_body="authinfo=${ISP_DNS_USER}:${ISP_DNS_PASS}&func=domain.record.delete&sok=ok&out=bjson&plid=${_isp_domain}&elid=${_isp_record_name}.%20TXT%20%20${_isp_record_value}" |
||||
|
response="$(_post "${_isp_body}" "${ISP_DNS_URL}")" |
||||
|
if [ "$?" != "0" ]; then |
||||
|
_err "error ${_isp_domain} delete domain record" |
||||
|
return 1 |
||||
|
fi |
||||
|
_debug2 response "${response}" |
||||
|
return 0 |
||||
|
} |
||||
|
# |
||||
|
_get_root() { |
||||
|
domain=$1 |
||||
|
i=2 |
||||
|
while true; do |
||||
|
h=$(printf "%s" "${domain}" | cut -d . -f ${i}-100) |
||||
|
_debug h "${h}" |
||||
|
if [ -z "${h}" ]; then |
||||
|
return 1 |
||||
|
fi |
||||
|
if ! _zone_find "${h}"; then |
||||
|
return 1 |
||||
|
fi |
||||
|
if _contains "${response}" "\"name\":\"${h}\"" >/dev/null; then |
||||
|
_domain="${h}" |
||||
|
return 0 |
||||
|
fi |
||||
|
i="$(_math "${i}" + 1)" |
||||
|
done |
||||
|
return 0 |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue