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.
 
 
 
 
 
 

43 lines
1.7 KiB

#!/usr/bin/env bash
email=""
key=""
fulldomain="$1"
token="$2"
# get a list of all domain names from cloudflare. If you have a lot, you may need
# "status=active&page=1&per_page=1000&match=all" instead of just "match=all"
all_domains=$(curl --silent -X GET "https://api.cloudflare.com/client/v4/zones?match=all" \
-H "X-Auth-Email: ${email}" -H "X-Auth-Key: ${key}" -H "Content-Type: application/json" \
| grep -o "\"name\":\"[^\"]*\"" | awk -F'"' '{print $4}')
NumParts=$(echo "$fulldomain" | awk -F"." '{print NF}')
i=1
while [ $i -lt "$NumParts" ]; do
let parts=NumParts-i
testpart=$(echo "$fulldomain" |awk -v n=$parts -F\. '{for (i=n; i<NF; i++) printf $i "."; printf $NF}')
res=$(echo "$all_domains" | grep -c "$testpart")
if [[ "$res" == "1" ]]; then
domain=$(echo "$all_domains" | grep "$testpart")
let i=NumParts
fi
let i=i+1
done
if [ -z "$domain" ]; then
echo "domain name can't be found on your cloudflare account"
exit 1
fi
txtname=$( echo "_acme-challenge.${fulldomain}" | sed "s/.${domain}//")
response=$(curl --silent -X GET "https://api.cloudflare.com/client/v4/zones?name=${domain}&match=all" \
-H "X-Auth-Email: ${email}" -H "X-Auth-Key: ${key}" -H "Content-Type: application/json")
domain_section=$(echo "$response" | awk -F"[}]" '{for(i=1;i<=NF;i++){if($i~/\"'"${domain}"'\"/){print $i}}}')
domain_id=$(echo "$domain_section" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/\"'"id"'\"/){print $(i+1)}}}'| awk -F'"' '{print $2}')
response=$(curl --silent -X POST "https://api.cloudflare.com/client/v4/zones/${domain_id}/dns_records" \
-H "X-Auth-Email: ${email}" -H "X-Auth-Key: ${key}" -H "Content-Type: application/json" \
--data "{\"type\":\"TXT\",\"name\":\"${txtname}\",\"content\":\"$token\",\"ttl\":300}")