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