#!/bin/zsh
# Description: Dyn DNS update script, checks token, compares IPs, and updates DNS zone if needed.

# Set variables
# ========
TOKEN_FILE="/root/scripts/dynProxy/token.txt"
IP_FILE="/root/scripts/dynProxy/ip.txt"
UPDATE_URL="http://ip.dynproxy.net/update_zone"
LOG_FILE="/var/log/update_zone.log"

# Functions
# ========
log() {
	print "$(date '+%Y-%m-%dT%H:%M:%S.%6N'): $1" >> "$LOG_FILE"
}

# Output FastCGI headers if applicable
if [ -t 0 ]; then
	echo "Content-Type: text/plain"
	echo ""
fi

# Ensure the token file exists
if [ ! -f "$TOKEN_FILE" ]; then
	log "ERROR: Token file not found."
	exit 1
fi

# Read the token
TOKEN=$(< "$TOKEN_FILE")
if [ -z "$TOKEN" ]; then
	log "ERROR: Token is empty."
	exit 1
fi

# Log the token retrieval
log "INFO: Token retrieved for update."

# Fetch the current public IP from the external service
IP_CURL=$(curl -s http://ip.dynproxy.net)
if [ -z "$IP_CURL" ]; then
	log "ERROR: Failed to fetch current public IP."
	exit 1
fi

# Ensure the IP file exists
if [ ! -f "$IP_FILE" ]; then
	log "INFO: IP file not found. Creating a new one with current IP."
	echo "$IP_CURL" > "$IP_FILE"
fi

# Read the previous IP from the IP file
PREVIOUS_IP=$(< "$IP_FILE")

# Compare the current IP with the previous IP
if [ "$IP_CURL" != "$PREVIOUS_IP" ]; then
	log "INFO: IP has changed from $PREVIOUS_IP to $IP_CURL. Proceeding with DNS update."

	# Log the IP to be updated
	log "INFO: Updating DNS for IP $IP_CURL."

	# Post the token and IP to trigger the DNS zone update
	RESPONSE=$(curl -s -o /tmp/curl_output -w "%{http_code}" -X POST \
				   -H "Content-Type: application/x-www-form-urlencoded" \
				   --data-urlencode "token=$TOKEN" \
				   --data-urlencode "ip=$IP_CURL" \
				   $UPDATE_URL)

	# Log the response and result
	if [ "$RESPONSE" -eq 200 ]; then
		log "SUCCESS: DNS zone update triggered successfully for token $TOKEN and IP $IP_CURL."
		echo "DNS zone update triggered successfully"
		# Write the new IP to the IP file
		echo "$IP_CURL" > "$IP_FILE"
	else
		log "ERROR: Failed to trigger DNS zone update for token $TOKEN and IP $IP_CURL. Response code: $RESPONSE. Response body: $(cat /tmp/curl_output)"
		echo "Failed to trigger DNS zone update. HTTP response: $RESPONSE"
		exit 1
	fi
else
	log "INFO: IP has not changed. No update needed."
	echo "IP has not changed. No update needed."
fi

# Cleanup temporary files
rm -f /tmp/curl_output