Merge pull request #2690 from nstepa/dns_yandex

Fix dns records removing after usage.
This commit is contained in:
neil 2020-02-22 13:39:04 +08:00 committed by GitHub
commit f6172d7273
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,9 @@
# Values to export: # Values to export:
# export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # export PDD_Token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# Sometimes cloudflare / google doesn't pick new dns records fast enough.
# You can add --dnssleep XX to params as workaround.
######## Public functions ##################### ######## Public functions #####################
#Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" #Usage: dns_myapi_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
@ -13,97 +16,106 @@ dns_yandex_add() {
fulldomain="${1}" fulldomain="${1}"
txtvalue="${2}" txtvalue="${2}"
_debug "Calling: dns_yandex_add() '${fulldomain}' '${txtvalue}'" _debug "Calling: dns_yandex_add() '${fulldomain}' '${txtvalue}'"
_PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
_PDD_get_domain "$fulldomain" || return 1 _PDD_credentials || return 1
_debug "Found suitable domain in pdd: $curDomain"
curData="domain=${curDomain}&type=TXT&subdomain=${curSubdomain}&ttl=360&content=${txtvalue}" _PDD_get_domain || return 1
curUri="https://pddimp.yandex.ru/api2/admin/dns/add" _debug "Found suitable domain: $domain"
curResult="$(_post "${curData}" "${curUri}")"
_debug "Result: $curResult" _PDD_get_record_ids || return 1
_debug "Record_ids: $record_ids"
if [ ! -z "$record_ids" ]; then
_info "All existing $subdomain records from $domain will be removed at the very end."
fi
data="domain=${domain}&type=TXT&subdomain=${subdomain}&ttl=300&content=${txtvalue}"
uri="https://pddimp.yandex.ru/api2/admin/dns/add"
result="$(_post "${data}" "${uri}" | _normalizeJson)"
_debug "Result: $result"
if ! _contains "$result" '"success":"ok"'; then
if _contains "$result" '"success":"error"' && _contains "$result" '"error":"record_exists"'; then
_info "Record already exists."
else
_err "Can't add $subdomain to $domain."
return 1
fi
fi
} }
#Usage: dns_myapi_rm _acme-challenge.www.domain.com #Usage: dns_myapi_rm _acme-challenge.www.domain.com
dns_yandex_rm() { dns_yandex_rm() {
fulldomain="${1}" fulldomain="${1}"
_debug "Calling: dns_yandex_rm() '${fulldomain}'" _debug "Calling: dns_yandex_rm() '${fulldomain}'"
_PDD_credentials || return 1 _PDD_credentials || return 1
export _H1="PddToken: $PDD_Token"
_PDD_get_domain "$fulldomain" || return 1 _PDD_get_domain "$fulldomain" || return 1
_debug "Found suitable domain in pdd: $curDomain" _debug "Found suitable domain: $domain"
record_id=$(pdd_get_record_id "${fulldomain}") _PDD_get_record_ids "${domain}" "${subdomain}" || return 1
_debug "Result: $record_id" _debug "Record_ids: $record_ids"
for rec_i in $record_id; do for record_id in $record_ids; do
curUri="https://pddimp.yandex.ru/api2/admin/dns/del" data="domain=${domain}&record_id=${record_id}"
curData="domain=${curDomain}&record_id=${rec_i}" uri="https://pddimp.yandex.ru/api2/admin/dns/del"
curResult="$(_post "${curData}" "${curUri}")" result="$(_post "${data}" "${uri}" | _normalizeJson)"
_debug "Result: $curResult" _debug "Result: $result"
if ! _contains "$result" '"success":"ok"'; then
_info "Can't remove $subdomain from $domain."
fi
done done
} }
#################### Private functions below ################################## #################### Private functions below ##################################
_PDD_get_domain() { _PDD_get_domain() {
fulldomain="${1}" subdomain_start=1
__page=1 while true; do
__last=0 domain_start=$(_math $subdomain_start + 1)
while [ $__last -eq 0 ]; do domain=$(echo "$fulldomain" | cut -d . -f "$domain_start"-)
uri1="https://pddimp.yandex.ru/api2/admin/domain/domains?page=${__page}&on_page=20" subdomain=$(echo "$fulldomain" | cut -d . -f -"$subdomain_start")
res1="$(_get "$uri1" | _normalizeJson)"
_debug2 "res1" "$res1" _debug "Checking domain $domain"
__found="$(echo "$res1" | sed -n -e 's#.* "found": \([^,]*\),.*#\1#p')" if [ -z "$domain" ]; then
_debug "found: $__found results on page" return 1
if [ "0$__found" -lt 20 ]; then
_debug "last page: $__page"
__last=1
fi fi
__all_domains="$__all_domains $(echo "$res1" | tr "," "\n" | grep '"name"' | cut -d: -f2 | sed -e 's@"@@g')" uri="https://pddimp.yandex.ru/api2/admin/dns/list?domain=$domain"
result="$(_get "${uri}" | _normalizeJson)"
_debug "Result: $result"
__page=$(_math $__page + 1) if _contains "$result" '"success":"ok"'; then
done
k=2
while [ $k -lt 10 ]; do
__t=$(echo "$fulldomain" | cut -d . -f $k-100)
_debug "finding zone for domain $__t"
for d in $__all_domains; do
if [ "$d" = "$__t" ]; then
p=$(_math $k - 1)
curSubdomain="$(echo "$fulldomain" | cut -d . -f "1-$p")"
curDomain="$__t"
return 0 return 0
fi fi
subdomain_start=$(_math $subdomain_start + 1)
done done
k=$(_math $k + 1)
done
_err "No suitable domain found in your account"
return 1
} }
_PDD_credentials() { _PDD_credentials() {
if [ -z "${PDD_Token}" ]; then if [ -z "${PDD_Token}" ]; then
PDD_Token="" PDD_Token=""
_err "You need to export PDD_Token=xxxxxxxxxxxxxxxxx" _err "You need to export PDD_Token=xxxxxxxxxxxxxxxxx."
_err "You can get it at https://pddimp.yandex.ru/api2/admin/get_token" _err "You can get it at https://pddimp.yandex.ru/api2/admin/get_token."
return 1 return 1
else else
_saveaccountconf PDD_Token "${PDD_Token}" _saveaccountconf PDD_Token "${PDD_Token}"
fi fi
export _H1="PddToken: $PDD_Token"
} }
pdd_get_record_id() { _PDD_get_record_ids() {
fulldomain="${1}" _debug "Check existing records for $subdomain"
_PDD_get_domain "$fulldomain" uri="https://pddimp.yandex.ru/api2/admin/dns/list?domain=${domain}"
_debug "Found suitable domain in pdd: $curDomain" result="$(_get "${uri}" | _normalizeJson)"
_debug "Result: $result"
curUri="https://pddimp.yandex.ru/api2/admin/dns/list?domain=${curDomain}" if ! _contains "$result" '"success":"ok"'; then
curResult="$(_get "${curUri}" | _normalizeJson)" return 1
_debug "Result: $curResult" fi
echo "$curResult" | _egrep_o "{[^{]*\"content\":[^{]*\"subdomain\":\"${curSubdomain}\"" | sed -n -e 's#.* "record_id": \(.*\),[^,]*#\1#p'
record_ids=$(echo "$result" | _egrep_o "{[^{]*\"subdomain\":\"${subdomain}\"[^}]*}" | sed -n -e 's#.*"record_id": \([0-9]*\).*#\1#p')
} }