Cloudflare

From RHS Wiki
Revision as of 15:59, 6 August 2025 by Rafahsolis (talk | contribs) (Created page with "== Cloudflare DynDNS Script == <syntaxhighlight lang="bash"> #!/bin/bash # USO: ./ddns.sh cloud.herrerosolis.com CF_API_TOKEN="otH3s***********************uCi3oB" ZONE_NAME=...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Cloudflare DynDNS Script[edit]

#!/bin/bash

# USO: ./ddns.sh cloud.herrerosolis.com

CF_API_TOKEN="otH3s***********************uCi3oB"
ZONE_NAME="herrerosolis.com"
RECORD_NAME="$1"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

if [ -z "$RECORD_NAME" ]; then
  log "❌ Debes indicar el nombre del registro como parámetro."
  log "   Ejemplo: ./actualiza_dns.sh cloud.herrerosolis.com"
  exit 1
fi

# Obtener IP pública
IP=$(curl -s https://ipv4.icanhazip.com)

if [[ ! $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  log "❌ No se pudo obtener una IP pública válida."
  exit 1
fi

log "🌐 IP pública detectada: $IP"

# Obtener Zone ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" | jq -r '.result[0].id')

if [ -z "$ZONE_ID" ] || [ "$ZONE_ID" = "null" ]; then
  log "❌ No se encontró el ZONE_ID para $ZONE_NAME"
  exit 1
fi

# Obtener Record ID y actual IP
RECORD_INFO=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json")

RECORD_ID=$(echo "$RECORD_INFO" | jq -r '.result[0].id')
CURRENT_IP=$(echo "$RECORD_INFO" | jq -r '.result[0].content')

if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" = "null" ]; then
  log "❌ No se encontró el RECORD_ID para $RECORD_NAME"
  exit 1
fi

log "📄 IP actual en Cloudflare: $CURRENT_IP"

if [ "$IP" = "$CURRENT_IP" ]; then
  log "✅ La IP ya está actualizada. No se requiere acción."
  exit 0
fi


# Actualizar el registro
RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  -H "Authorization: Bearer $CF_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$IP\",\"ttl\":300,\"proxied\":false}")

SUCCESS=$(echo "$RESPONSE" | jq -r '.success')

if [ "$SUCCESS" = "true" ]; then
  log "✅ Registro DNS actualizado correctamente: $RECORD_NAME$IP"
else
  log "❌ Error al actualizar el registro DNS:"
  log "$RESPONSE"
fi
sudo apt install jq
sudo touch /var/log/ddns.log
sudo chown $USER /var/log/ddns.log
crontab -e
*/5 * * * * /path/to/dyndns.sh www.example.com >> /var/log/ddns.log 2>&1