#!/bin/bash # Exit on error set -e # --- Configuration --- ENV_DIR="./zones" LOG_DIR="./logs" DATE=$(date +%F) LOG_FILE="$LOG_DIR/update_${DATE}.log" # --- Ensure log directory exists --- mkdir -p "$LOG_DIR" # --- Logging function --- log() { local message="$1" echo "$message" | tee -a "$LOG_FILE" } # --- Step 1: Get current IP from Mullvad --- log "[*] Fetching IP from Mullvad..." IP_INFO=$(curl -s https://ipv4.am.i.mullvad.net/json) CURRENT_IP=$(echo "$IP_INFO" | jq -r '.ip') if [[ -z "$CURRENT_IP" ]]; then log "[!] Failed to extract IP address." exit 1 fi log "[*] Current public IP is: $CURRENT_IP" log "" # --- Step 2: Loop through all .env files --- for ENV_FILE in "$ENV_DIR"/*.env; do log "[*] Processing config: $ENV_FILE" # Load environment variables set -a source "$ENV_FILE" set +a # Check for required variables if [[ -z "$ZONE_ID" || -z "$DNS_RECORD_ID" || -z "$CLOUDFLARE_API_TOKEN" || -z "$DNS_NAME" ]]; then log "[!] Missing required variables in $ENV_FILE" log "" continue fi # --- Step 3: Get existing DNS record from Cloudflare --- log "[*] Fetching current DNS record for $DNS_NAME..." DNS_RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ -H "Content-Type: application/json") EXISTING_IP=$(echo "$DNS_RECORD" | jq -r '.result.content') if [[ "$EXISTING_IP" == "$CURRENT_IP" ]]; then log "[=] No update needed. $DNS_NAME already points to $CURRENT_IP" log "" continue fi # --- Step 4: Update DNS record --- log "[*] IP has changed: $EXISTING_IP → $CURRENT_IP" log "[*] Updating Cloudflare DNS record..." UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \ -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"type\": \"A\", \"name\": \"$DNS_NAME\", \"content\": \"$CURRENT_IP\", \"ttl\": 3600, \"proxied\": true, \"comment\": \"Auto-updated via script\" }") SUCCESS=$(echo "$UPDATE_RESPONSE" | jq -r '.success') if [[ "$SUCCESS" == "true" ]]; then log "[+] Successfully updated $DNS_NAME to $CURRENT_IP" else log "[!] Failed to update $DNS_NAME" log "Cloudflare response:" echo "$UPDATE_RESPONSE" | tee -a "$LOG_FILE" fi log "" done