From 5eb0007dc57890fb7fc2c1163720e68a1cfd4d37 Mon Sep 17 00:00:00 2001 From: Alexandre Oliveira Date: Sun, 18 Jun 2017 22:38:06 -0300 Subject: [PATCH] Add DuckDNS DNS API --- dnsapi/dns_duckdns.sh | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 dnsapi/dns_duckdns.sh diff --git a/dnsapi/dns_duckdns.sh b/dnsapi/dns_duckdns.sh new file mode 100644 index 00000000..a0f49931 --- /dev/null +++ b/dnsapi/dns_duckdns.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env sh + +# DNS API for DuckDNS +# +# Report bugs at https://github.com/RockyTV/acme.sh/issues +# +# Set this environment variable to match your DuckDNS account token: +# DUCKDNS_TOKEN=aaaaaaaa-bbbb-cccc-dddddddddddd + +######## Public functions ##################### +# Usage: dns_duckdns_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" +dns_duckdns_add() { + fulldomain=$1 + txtvalue=$2 + + _info "Adding TXT record to DuckDNS domain" + _debug "fulldomain: $fulldomain" + _debug "txtvalue: $txtvalue" + + if ! _get_root "$fulldomain"; then + _err "Domain does not exist." + return 1 + fi + + if [ -z "$DUCKDNS_TOKEN" ]; then + DUCKDNS_TOKEN="" + _err "DuckDNS token is not defined." + _err "Please export your account token to DUCKDNS_TOKEN and try again." + return 1 + fi + _saveaccountconf DUCKDNS_TOKEN "$DUCKDNS_TOKEN" + + duckdns_url="https://www.duckdns.org/update?domains=$_domain&token=$DUCKDNS_TOKEN&txt=$txtvalue" + response=$(_get $duckdns_url) + if [ $response != "OK" ]; then + _err "Failed to update TXT record for DuckDNS domain." + return 1 + fi + + return 0 +} + +# Usage: fulldomain txtvalue +# Remove the txt record after validation. +dns_duckdns_rm() { + fulldomain=$1 + txtvalue=$2 + + _info "Removing TXT record from DuckDNS domain" + _debug "fulldomain: $fulldomain" + _debug "txtvalue: $txtvalue" + + DUCKDNS_TOKEN="$(_read_conf "$ACCOUNT_CONF_PATH" "DUCKDNS_TOKEN")" + _debug "DuckDNS token: $DUCKDNS_TOKEN" + + if ! _get_root "$fulldomain"; then + _err "Domain does not exist." + return 1 + fi + + duckdns_url="https://www.duckdns.org/update?domains=$_domain&token=$DUCKDNS_TOKEN&txt=&clear=true" + response=$(_get $duckdns_url) + if [ $response != "OK" ]; then + _err "Failed to update TXT record for DuckDNS domain." + return 1 + fi + + return 0 +} + +#################### Private functions below ################################## +# _acme-challenge.www.domain.com +# returns +# _domain=domain.com +_get_root() { + domain=$1 + i="$(echo "$fulldomain" | tr '.' ' ' | wc -w)" + i=$(_math "$i" - 1) + + while true; do + h=$(printf "%s" "$domain" | cut -d . -f "$i"-100) + if [ -z "$h" ]; then + return 1 + fi + _domain="$h" + return 0 + done + _debug "$domain not found" + return 1 +} \ No newline at end of file