DDNS Raspberry PI - CloudFlare

Script desenvolvido para ser utilizado no Raspberry em conjunto com uma Cron ou um outro serviço de execução automática.

Etapas executadas no script abaixo:

  1. Obtém o seu ip público pelo link da CloudFlare
  2. Recupera a zona do seu domínio
  3. Recupera o registro do dns
  4. Atualiza o IP e Proxy do registro

Requerimentos:

#!/bin/sh
CLOUDFLARE_TOKEN=TOKEN
DOMAIN=domain.com
SUBDOMAIN=www
PROXIED=true

CURRENT_IP=$(curl -s https://cloudflare.com/cdn-cgi/trace | grep -Pom 1 '[0-9.]{7,15}')

ZONE_ID=$(curl -s --request GET \
  --url "https://api.cloudflare.com/client/v4/zones?name=$DOMAIN" \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer '"$CLOUDFLARE_TOKEN" \
  | jq -r '.result[].id')
RESULT=$(curl -s --request GET \
  --url "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=A&name=$SUBDOMAIN.$DOMAIN" \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer '"$CLOUDFLARE_TOKEN" \
  | jq -r '.result[]')

RECORD_ID=$(echo "$RESULT" | jq -r '.id')
CLOUD_IP=$(echo "$RESULT" | jq -r '.content')
CLOUD_PROXIED=$(echo "$RESULT" | jq -r '.proxied')
echo "### CloudFlare Settings ###\nDomain: $DOMAIN\nSub-domain: $SUBDOMAIN\nZone: $ZONE_ID\nRecord: $RECORD_ID\nIP: $CLOUD_IP\nProxied: $CLOUD_PROXIED"
echo "###########################"
echo "My IP: $CURRENT_IP"
echo "###########################\n"

if ([ "$CURRENT_IP" != "$CLOUD_IP" ] || [ "$PROXIED" != "$CLOUD_PROXIED" ]) && [ ! -z "$CURRENT_IP" ] && [ ! -z "$CLOUD_IP" ]; then
UPDATED=$(curl -s --request PATCH \
  --url "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer '"$CLOUDFLARE_TOKEN"'' \
  --data '{
  "content": "'"$CURRENT_IP"'",
  "name": "'"$SUBDOMAIN.$DOMAIN"'",
  "proxied": '"$PROXIED"',
  "type": "A",
  "comment": "Updated by script",
  "tags": [],
  "ttl": 3600
}' | jq -r '.success')
echo "DNS Update status: $UPDATED"
else
echo "Skiped: IP and Proxied are the same or has empty IP"
fi