diff --git a/acme.sh b/acme.sh index e9eb6b94..994227a1 100755 --- a/acme.sh +++ b/acme.sh @@ -7589,6 +7589,14 @@ _process() { _webroot="$_webroot,$wvalue" fi ;; + --bearer) + bearer_value="" + if [ "$2" ] && ! _startswith "$2" "-"; then + bearer_value="$2" + shift + fi + _bearer="$bearer_value" + ;; --dnssleep) _dnssleep="$2" Le_DNSSleep="$_dnssleep" diff --git a/dnsapi/dns_20i.sh b/dnsapi/dns_20i.sh new file mode 100644 index 00000000..aff661a8 --- /dev/null +++ b/dnsapi/dns_20i.sh @@ -0,0 +1,140 @@ +#!/bin/bash + +# Helper function: Perform a GET request +_get() { + local url=$1 + local Bearer=$2 + curl -s -H "Authorization: Bearer $Bearer" "$url" +} + +# Helper function: Perform a POST request +_post() { + local data=$1 + local url=$2 + local Bearer=$3 + curl -s -X POST -H "Authorization: Bearer $Bearer" -H "Content-Type: application/json" -d "$data" "$url" +} + + +# Add a TXT record to 20i DNS +dns_20i_add() { + local fulldomain=$1 + local txtvalue=$2 + + # Parse arguments for bearer token or other credentials + _parse_arguments "$@" + + # Use the passed bearer token or fallback to environment variable + local bearer="${_bearer:-$U20I_Bearer}" + + if [ -z "$bearer" ]; then + echo "Error: Bearer token must be provided using --bearer or U20I_Bearer environment variable." + return 1 + fi + + echo "Adding TXT record to 20i for domain: $fulldomain" + + # Extract root domain and subdomain + local domain=$(echo "$fulldomain" | sed -r 's/^[^\.]+\.(.+)$/\1/') + local subdomain="_acme-challenge" + + # Check if the TXT record already exists + local dns_response=$(_get "https://api.20i.com/domain/$domain/dns" $bearer) + if echo "$dns_response" | jq -e '.error' > /dev/null 2>&1; then + local error_message=$(echo "$dns_response" | jq -r '.error.message') + echo "Error retrieving DNS records: $error_message" + return 1 + fi + + if echo "$dns_response" | jq -e ".records[] | select(.type == \"TXT\" and .host == \"$fulldomain\" and .txt == \"$txtvalue\")" > /dev/null 2>&1; then + echo "TXT record already exists. Skipping addition." + return 0 + fi + + # Construct payload for adding the TXT record + local payload=$(cat < /dev/null 2>&1; then + local error_message=$(echo "$add_response" | jq -r '.error.message') + echo "Error adding TXT record: $error_message" + return 1 + fi + + echo "TXT record added successfully." + return 0 +} + +# Remove a TXT record from 20i DNS +dns_20i_rm() { + local fulldomain=$1 + local txtvalue=$2 + + # Parse arguments for bearer token or other credentials + _parse_arguments "$@" + + # Use the passed bearer token or fallback to environment variable + local bearer="${_bearer:-$U20I_Bearer}" + + if [ -z "$bearer" ]; then + echo "Error: Bearer token must be provided using --bearer or U20I_Bearer environment variable." + return 1 + fi + + echo "Removing TXT record from 20i for domain: $fulldomain" + + # Extract root domain and subdomain + local domain=$(echo "$fulldomain" | sed -r 's/^[^\.]+\.(.+)$/\1/') + + # Get existing DNS records + local dns_response=$(_get "https://api.20i.com/domain/$domain/dns" $bearer) + if echo "$dns_response" | jq -e '.error' > /dev/null 2>&1; then + local error_message=$(echo "$dns_response" | jq -r '.error.message') + echo "Error retrieving DNS records: $error_message" + return 1 + fi + + # Find the record to delete by matching TXT record + local record_ref=$(echo "$dns_response" | jq -r \ + ".records[] | select(.type == \"TXT\" and .host == \"$fulldomain\" and .txt == \"$txtvalue\") | .ref") + + if [ -z "$record_ref" ] || [ "$record_ref" == "null" ]; then + echo "No matching TXT record found for removal." + return 1 + fi + + # Construct payload for deleting the TXT record + local payload=$(cat < /dev/null 2>&1; then + local error_message=$(echo "$remove_response" | jq -r '.error.message') + echo "Error removing TXT record: $error_message" + return 1 + fi + + echo "TXT record removed successfully." + return 0 +}