diff --git a/cloudflareCtrl.sh b/cloudflareCtrl.sh new file mode 100755 index 0000000..f21944e --- /dev/null +++ b/cloudflareCtrl.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# Partly adapted from: https://github.com/ddries/d2c.sh/blob/master/d2c.sh +# +# requires: wget, ca-certificates, grep, jq +#rm -f /tmp/cookies.txt + +COOKIEFILE="/tmp/cookies-cloudflareCtrl.txt" + +source ~/.cloudflare +#ZONE_ID= +#API_KEY= + +URL="https://api.cloudflare.com/client/v4" + +# * * * NO MORE CHANGES DOWN HERE * * * + +COMMANDS="sed grep curl jq" +for COMMAND in $COMMANDS; do + if ! command -v $COMMAND &> /dev/null + then + echo "$COMMAND could not be found!" + exit 1 + fi +done + +# parse parameters +DOMAIN=$(echo $1 | sed -r 's/^.*\.(.+\..+)$/\1/') +SUBDOMAIN=$(echo $1 | sed -r 's/^(.+)\..+\..+$/\1/') + +if [ "$DOMAIN" == "$SUBDOMAIN" ]; then + SUBDOMAIN="" +fi + +echo "DOMAIN=${DOMAIN}" +echo "SUBDOMAIN=${SUBDOMAIN}" + +UPDATE_IP=$2 + +################################################# + +# get records from Cloudflare +RRAW=$(curl --silent --request GET \ + --url ${URL}/zones/${ZONE_ID}/dns_records \ + --header 'Content-Type: application/json' \ + --header "Authorization: Bearer ${API_KEY}" \ + | jq '.result[] | select(.type == "AAAA" and .name == "'${DOMAIN}'") | [.id, .name, .ttl, .content, .type]' +) + +#echo $RRAW + +id=$(jq -r '.[0]' <<< "${RRAW}") +content=$(jq -r '.[3]' <<< "${RRAW}") + +#echo "old ip: ${content}" + +#if [ "$UPDATE_IP" != "$content" ]; then + # update DNS + curl --silent --request PATCH \ + --url "${URL}/zones/${ZONE_ID}/dns_records/${id}" \ + --header 'Content-Type: application/json' \ + --header "Authorization: Bearer ${API_KEY}" \ + --data '{ + "content": "'${UPDATE_IP}'", + "comment": "Updated by ffx at '$(date -Is)'" + }' + + echo "OK: ${name}" +#else +# echo "${name} did not change" +#fi + +SUCCESS=$? +echo "Retval: $SUCCESS" + +exit $SUCCESS