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.
116 lines
4.4 KiB
116 lines
4.4 KiB
#!/usr/bin/env bash
|
|
|
|
## DNS-01 challenge plugin for ACME & ukraine.com.ua DNS hosting.
|
|
|
|
## How to usage:
|
|
## 1. Create the API token: https://adm.tools/user/api/
|
|
## 2. export DNS_UKRAINE_API_KEY="..."
|
|
## 3. acme.sh --issue -d your.domain.com.ua --dns dns_ukraine --server letsencrypt --dnssleep 180
|
|
|
|
## Author: QipDev <dev@qip.cx>
|
|
## Report Bugs: https://github.com/sorbing/acme.sh
|
|
## Development DNS API plugin for acme.sh: https://github.com/acmesh-official/acme.sh/wiki/DNS-API-Dev-Guide
|
|
|
|
## Debug API:
|
|
## curl -X POST -H "Authorization: Bearer $DNS_UKRAINE_API_KEY" https://adm.tools/action/dns/list/
|
|
## curl -X POST -H "Authorization: Bearer $DNS_UKRAINE_API_KEY" -H "Content-Type: application/json" --data "{\"domain_id\":000000}" https://adm.tools/action/dns/records_list/
|
|
|
|
|
|
######## Public functions #####################
|
|
|
|
## Add the TXT record `_acme-challenge.your.domain` for validation.
|
|
## Ukraine DNS API Documentation:
|
|
## - https://adm.tools/user/api/#/tab-sandbox/dns/list
|
|
## - https://adm.tools/user/api/#/tab-sandbox/dns/record_add
|
|
dns_ukraine_add() {
|
|
fulldomain=$1
|
|
txtvalue=$2
|
|
|
|
_info "Using dns_ukraine.sh"
|
|
_debug fulldomain "$fulldomain" ## fulldomain='_acme-challenge.your.domain.com.ua'
|
|
_debug txtvalue "$txtvalue" ## txtvalue='XxXxXxXxX'
|
|
|
|
## Save the credentials to the account conf file
|
|
DNS_UKRAINE_API_KEY="${DNS_UKRAINE_API_KEY:-$(_readaccountconf_mutable DNS_UKRAINE_API_KEY)}"
|
|
if [ -z "$DNS_UKRAINE_API_KEY" ]; then
|
|
DNS_UKRAINE_API_KEY=""
|
|
_err "You don't specify env variable DNS_UKRAINE_API_KEY."
|
|
_err 'Please create your api key and export DNS_UKRAINE_API_KEY="...".'
|
|
return 1
|
|
fi
|
|
_saveaccountconf_mutable DNS_UKRAINE_API_KEY "$DNS_UKRAINE_API_KEY"
|
|
|
|
## Get domain_id
|
|
__dns_ukraine_get_domain_id "$fulldomain"
|
|
_debug ukraine_domain_id "$DOMAIN_ID"
|
|
|
|
if test -z "$DOMAIN_ID"; then
|
|
_err "Failed to add the TXT record $fulldomain"
|
|
return 1
|
|
fi
|
|
|
|
data="{\"domain_id\":\"$DOMAIN_ID\",\"type\":\"TXT\",\"record\":\"$ACME_CHALLENGE_RECORD\",\"data\":\"$txtvalue\"}"
|
|
response="$(_post "$data" "https://adm.tools/action/dns/record_add/" "" "POST")"
|
|
_debug response "$response"
|
|
}
|
|
|
|
## Remove the TXT record after validation.
|
|
## Ukraine DNS API Documentation:
|
|
## - https://adm.tools/user/api/#/tab-sandbox/dns/records_list
|
|
## - https://adm.tools/user/api/#/tab-sandbox/dns/record_delete
|
|
dns_ukraine_rm() {
|
|
fulldomain=$1
|
|
txtvalue=$2
|
|
_info "Using dns_ukraine.sh"
|
|
_debug fulldomain "$fulldomain"
|
|
_debug txtvalue "$txtvalue"
|
|
|
|
## Get domain_id
|
|
__dns_ukraine_get_domain_id "$fulldomain"
|
|
_debug ukraine_domain_id "$DOMAIN_ID"
|
|
|
|
response="$(_post "{\"domain_id\":\"$DOMAIN_ID\"}" "https://adm.tools/action/dns/records_list/" "" "POST")"
|
|
subdomain_id=$(echo "$response" | grep -Po '(?<="id":")\d+(?=","domain_id":"[0-9]+","record":"'$ACME_CHALLENGE_RECORD'")')
|
|
|
|
if test -z "$subdomain_id"; then
|
|
_err "Failed getting subdomain_id from API ukraine.com.ua to delete the dns record: $ACME_CHALLENGE_RECORD"
|
|
return 1
|
|
fi
|
|
|
|
response="$(_post "{\"subdomain_id\":\"$subdomain_id\"}" "https://adm.tools/action/dns/record_delete/" "" "POST")"
|
|
_debug response "$response"
|
|
}
|
|
|
|
|
|
#################### Private functions below ##################################
|
|
|
|
__dns_ukraine_get_domain_id() {
|
|
fulldomain=$1
|
|
|
|
export _H1="Authorization: Bearer $DNS_UKRAINE_API_KEY"
|
|
export _H2="Accept: application/json"
|
|
export _H3="Content-Type: application/json"
|
|
|
|
local response="$(_post "" "https://adm.tools/action/dns/list/" "" "POST" "application/json")"
|
|
|
|
local subdomain=$(echo "$fulldomain" | sed -E 's/^_acme-challenge\.//')
|
|
local topdomain=$subdomain
|
|
|
|
DOMAIN_ID=$(echo "$response" | grep -Po '(?<="'$topdomain'":{"domain_id":)\d+')
|
|
if test -z "$DOMAIN_ID"; then
|
|
topdomain=$(echo "$topdomain" | sed -E 's/^[^\.]+\.//')
|
|
DOMAIN_ID=$(echo "$response" | grep -Po '(?<="'$topdomain'":{"domain_id":)\d+')
|
|
|
|
if test -z "$DOMAIN_ID"; then
|
|
topdomain=$(echo "$topdomain" | sed -E 's/^[^\.]+\.//')
|
|
DOMAIN_ID=$(echo "$response" | grep -Po '(?<="'$topdomain'":{"domain_id":)\d+')
|
|
fi
|
|
fi
|
|
|
|
if test -z "$DOMAIN_ID"; then
|
|
_err "Failed getting domain_id from API ukraine.com.ua"
|
|
return 1
|
|
fi
|
|
|
|
ACME_CHALLENGE_RECORD=$(echo "$fulldomain" | sed -E "s/\.$topdomain$//") ## _acme-challenge.subdomain
|
|
}
|