94 lines
2.4 KiB
Bash
94 lines
2.4 KiB
Bash
#!/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
|
|
|