diff --git a/dnsapi/dns_arvancdn b/dnsapi/dns_arvancdn new file mode 100644 index 00000000..52238936 --- /dev/null +++ b/dnsapi/dns_arvancdn @@ -0,0 +1,134 @@ +#!/usr/bin/env #!/bin/sh + +# Author: Mohammad Ali Sarbanha +# Repository: https://github.com/sarbanha/acme.sh-dnsapi-dns_arvancdn + +# export ARVAN_API_KEY="-----------" + +ARVAN_CDN_API="https://napi.arvancloud.com/cdn/4.0" + +#Usage: dns_arvancdn_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" +dns_arvancdn_add() { + + fulldomain=$1 + challenge=$2 + zone=${fulldomain:16} + + _debug "dns_arvan_add(): Started" + + ARVAN_API_KEY="${ARVAN_API_KEY:-$(_readaccountconf_mutable ARVAN_API_KEY)}" + if [ -z $ARVAN_API_KEY ]; then + ARVAN_API_KEY="" + _err "dns_arvan_add(): ARVAN_API_KEY has not been defined yet." + _err "dns_arvan_add(): export ARVAN_API_KEY=\"---YOUR-API-KEY---\"" + return 1 + fi + _saveaccountconf_mutable ARVAN_API_KEY "$ARVAN_API_KEY" + + _debug "dns_arvan_add(): Check domain root zone availability for $zone" + if ! _get_root $zone; then + _err "dns_arvan_add(): Invalid domain $zone" + return 1 + fi + + _debug "dns_arvan_add(): fulldomain $fulldomain" + _debug "dns_arvan_add(): textvalue $challenge" + _debug "dns_arvan_add(): domain $zone" + + _record_add $zone $challenge + +} + +#Usage: dns_arvancdn_rm fulldomain txtvalue +dns_arvancdn_rm(){ + + fulldomain=$1 + challenge=$2 + zone=${fulldomain:16} + + ARVAN_API_KEY="${ARVAN_API_KEY:-$(_readaccountconf_mutable ARVAN_API_KEY)}" + if [ -z $ARVAN_API_KEY ]; then + ARVAN_API_KEY="" + _err "dns_arvan_rm(): ARVAN_API_KEY has not been defined yet." + _err "dns_arvan_rm(): export ARVAN_API_KEY=\"---YOUR-API-KEY---\"" + return 1 + fi + + record_id=$(_record_get_id $zone $challenge) + + _record_remove $zone $record_id + +} + +#################### +# Private functions +#################### + +#Usage: _get_root zone +_get_root(){ + _zone=$1 + + export _H1="Content-Type: application-json" + export _H2="Authorization: apikey $ARVAN_API_KEY" + + _response=$(_get $ARVAN_CDN_API/domains/$_zone) + _debug2 "_get_root()" $_response + _debug2 "_get_root()" $_zone + if _contains "$_response" "$_zone"; then + # is valid + _valid=0 + else + # is not valid + _valid=1 + fi + + return $_valid +} + +#Usage: _record_add zone challenge +_record_add(){ + zone=$1 + challenge=$2 + + export _H1="Content-Type: application-json" + export _H2="Authorization: apikey $ARVAN_API_KEY" + + payload="{\"type\":\"txt\",\"name\":\"_acme-challenge\",\"cloud\":false,\"value\":{\"text\":\"$challenge\"},\"ttl\":120}" + _response=$(_post "$payload" "$ARVAN_CDN_API/domains/$zone/dns-records" "" "POST" "application/json" | _base64) + + _debug2 "_record_add(): " $_response + _debug2 " Payload: " $payload +} + +#Usage: _record_get_id zone challenge +_record_get_id(){ + + zone=$1 + challenge=$2 + + export _H1="Content-Type: application-json" + export _H2="Authorization: apikey $ARVAN_API_KEY" + + _response=$(_get $ARVAN_CDN_API/domains/$zone/dns-records/?type=txt\&search=$challenge | _json_decode | _normalizeJson | grep -Eo '"id":.*?,"value":\{"text":".*?"\}' | sed 's/"id":"\([^"]*\)".*/\1/') + _debug2 "_record_get_id(): " $_response + + + echo "$_response" + +} + +#Usage: _record_remove zone record_id +_record_remove(){ + + zone=$1 + record_id=$2 + + export _H1="Content-Type: application-json" + export _H2="Authorization: apikey $ARVAN_API_KEY" + + _response=$(_post "" $ARVAN_CDN_API/domains/$zone/dns-records/$record_id "" "DELETE" "application/json") + + _debug "_record_remove(): ACME Challenge Removed" + _debug2 " Response: " $_response + +}