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
 | |
| 
 |