From efb7fae61a1b02e973a68f12a2178fb15a31f51a Mon Sep 17 00:00:00 2001 From: Eng Acs Date: Sat, 16 Nov 2024 19:00:36 +0300 Subject: [PATCH] added 20i.com DNS --- dnsapi/dns_20i.sh | 125 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 dnsapi/dns_20i.sh diff --git a/dnsapi/dns_20i.sh b/dnsapi/dns_20i.sh new file mode 100644 index 00000000..e745463f --- /dev/null +++ b/dnsapi/dns_20i.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +# Helper function: Perform a GET request +_get() { + local url=$1 + curl -s -H "Authorization: Bearer $U20I_Bearer" "$url" +} + +# Helper function: Perform a POST request +_post() { + local data=$1 + local url=$2 + curl -s -X POST -H "Authorization: Bearer $U20I_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 + + if [ -z "$U20I_Bearer" ]; then + echo "Error: U20I_Bearer must be set in the environment." + 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") + 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 + + if [ -z "$U20I_Bearer" ]; then + echo "Error: U20I_Bearer must be set in the environment." + 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") + 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 +}