diff --git a/dnsapi/dns_edgecenter.sh b/dnsapi/dns_edgecenter.sh new file mode 100644 index 00000000..372b3579 --- /dev/null +++ b/dnsapi/dns_edgecenter.sh @@ -0,0 +1,178 @@ +#!/bin/bash +# shellcheck disable=SC2034 +dns_edgecenter_info='EdgeCenter DNS +Site: https://edgecenter.ru +Docs: github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_edgecenter +Options: + EDGECENTER_API_KEY auth APIKey +Author: Konstantin Ruchev +' + +EDGECENTER_API="https://api.edgecenter.ru" +DOMAIN_TYPE= +DOMAIN_MASTER= + +######## Public functions ##################### + +#Usage: dns_edgecenter_add _acme-challenge.www.domain.com "TXT_RECORD_VALUE" +dns_edgecenter_add() { + _info "Using EdgeCenter" + + if ! _dns_edgecenter_init_check; then + return 1 + fi + + zone="$(_dns_edgecenter_get_zone_name "$1")" + if [ -z "$zone" ]; then + _err "Missing DNS zone at EdgeCenter. Please log into your control panel and create the required DNS zone for the initial setup." + return 1 + fi + + host="$(echo "$1" | sed "s/\.$zone\$//")" + record=$2 + + _debug "Zone" "$zone" + _debug "Host" "$host" + _debug "Record" "$record" + + _info "Adding the TXT record for $1" + _dns_edgecenter_http_api_call "post" "dns/v2/zones/$zone/$host.$zone/txt" "{\"resource_records\": [ { \"content\": [\"$record\"] } ], \"ttl\": 60 }" + + if _contains "$response" "\"error\":\"rrset is already exists\""; then + _debug "Record already exists, updating it." + _dns_edgecenter_http_api_call "put" "dns/v2/zones/$zone/$host.$zone/txt" "{\"resource_records\": [ { \"content\": [\"$record\"] } ], \"ttl\": 60 }" + return 1 + fi + if _contains "$response" "\"exception\":"; then + _err "Record cannot be added." + return 1 + fi + _info "TXT record added successfully." + return 0 +} + +#Usage: dns_edgecenter_rm _acme-challenge.www.domain.com "TXT_RECORD_VALUE" +dns_edgecenter_rm() { + _info "Using EdgeCenter" + + if ! _dns_edgecenter_init_check; then + return 1 + fi + + if [ -z "$zone" ]; then + zone="$(_dns_edgecenter_get_zone_name "$1")" + if [ -z "$zone" ]; then + _err "Missing DNS zone at EdgeCenter. Please log into your control panel and create the required DNS zone for the initial setup." + return 1 + fi + fi + + host="$(echo "$1" | sed "s/\.$zone\$//")" + record=$2 + + _debug "Zone" "$zone" + _debug "Host" "$host" + + _info "Deleting the TXT record for $1" + _dns_edgecenter_http_api_call "delete" "dns/v2/zones/$zone/$host.$zone/txt" + + if [ -z "$response" ]; then + _info "TXT record deleted successfully." + else + _err "The TXT record for $host cannot be deleted." + fi + + return 0 +} + +#################### Private functions below ################################## + +_dns_edgecenter_init_check() { + if [ -n "$EDGECENTER_INIT_CHECK_COMPLETED" ]; then + _debug "EdgeCenter initialization already completed." + return 0 + fi + + EDGECENTER_API_KEY="${EDGECENTER_API_KEY:-$(_readaccountconf_mutable EDGECENTER_API_KEY)}" + if [ -z "$EDGECENTER_API_KEY" ]; then + _err "You haven't specified the EdgeCenter API key yet." + _err "Please set EDGECENTER_API_KEY and try again." + return 1 + fi + + _debug "EdgeCenter API Key" "$EDGECENTER_API_KEY" + + _dns_edgecenter_http_api_call "get" "dns/v2/clients/me/features" + if ! _contains "$response" "\"id\":"; then + _err "Invalid EDGECENTER_API_KEY. Please check your credentials." + return 1 + fi + + _saveaccountconf_mutable EDGECENTER_API_KEY "$EDGECENTER_API_KEY" + + EDGECENTER_INIT_CHECK_COMPLETED=1 + _debug "EdgeCenter initialization completed." + return 0 +} + +_dns_edgecenter_get_zone_name() { + i=2 + while true; do + zoneForCheck=$(printf "%s" "$1" | cut -d . -f $i-100) + + if [ -z "$zoneForCheck" ]; then + _debug "No zone found in domain: $1" + return 1 + fi + + _debug "Trying zone" "$zoneForCheck" + _dns_edgecenter_http_api_call "get" "dns/v2/zones/$zoneForCheck" + + if ! _contains "$response" "\"error\":\"get zone by name: zone is not found\""; then + _debug "Zone found" "$zoneForCheck" + echo "$zoneForCheck" + return 0 + fi + + i=$(_math "$i" + 1) + done + return 1 +} + +_dns_edgecenter_http_api_call() { + method=$1 + api_method=$2 + body=$3 + + _debug "EdgeCenter API Key in call" "$EDGECENTER_API_KEY" + + export _H1="Authorization: APIKey $EDGECENTER_API_KEY" + + case "$method" in + *get*) + _debug "HTTP GET: $EDGECENTER_API/$api_method" + response="$(_get "$EDGECENTER_API/$api_method")" + ;; + *post*) + _debug "HTTP POST: $EDGECENTER_API/$api_method" + _debug "Payload:" "$body" + response="$(_post "$body" "$EDGECENTER_API/$api_method")" + ;; + *delete*) + _debug "HTTP DELETE: $EDGECENTER_API/$api_method" + response="$(_post "" "$EDGECENTER_API/$api_method" "" "DELETE")" + ;; + *put*) + _debug "HTTP PUT: $EDGECENTER_API/$api_method" + response="$(_post "" "$EDGECENTER_API/$api_method" "" "PUT")" + ;; + *) + _err "HTTP method $method not supported." + return 1 + ;; + esac + + _debug "HTTP response" "$response" + + return 0 +}