map
This commit is contained in:
51
cloudflare/cloudflare-ddns.sh
Normal file
51
cloudflare/cloudflare-ddns.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "[$(date)] --- DDNS Check Started ---"
|
||||
|
||||
# 1. Validate variables are not empty
|
||||
if [ -z "$CF_API_TOKEN" ] || [ -z "$CF_ZONE_ID" ] || [ -z "$CF_RECORD_NAME" ]; then
|
||||
echo "ERROR: One or more environment variables (TOKEN, ZONE_ID, RECORD_NAME) are missing!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Get current public IP (Trying two services for reliability)
|
||||
NEW_IP=$(curl -s https://api.ipify.org || curl -s https://ifconfig.me/ip)
|
||||
|
||||
if [[ ! $NEW_IP =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then
|
||||
echo "ERROR: Could not get a valid Public IP."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Get the current Record info from Cloudflare
|
||||
RECORD_DATA=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records?name=$CF_RECORD_NAME&type=A" \
|
||||
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||
-H "Content-Type: application/json")
|
||||
|
||||
# Extract Record ID and Current IP from the JSON response
|
||||
RECORD_ID=$(echo "$RECORD_DATA" | jq -r '.result[0].id // empty')
|
||||
OLD_IP=$(echo "$RECORD_DATA" | jq -r '.result[0].content // empty')
|
||||
|
||||
if [ -z "$RECORD_ID" ]; then
|
||||
echo "ERROR: Could not find DNS record for $CF_RECORD_NAME. Check your Zone ID and Name."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4. Compare and Update
|
||||
if [ "$NEW_IP" = "$OLD_IP" ]; then
|
||||
echo "IP is still $OLD_IP. No update needed."
|
||||
else
|
||||
echo "IP changed from $OLD_IP to $NEW_IP. Updating Cloudflare..."
|
||||
|
||||
UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID" \
|
||||
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data "{\"type\":\"A\",\"name\":\"$CF_RECORD_NAME\",\"content\":\"$NEW_IP\",\"ttl\":120,\"proxied\":false}")
|
||||
|
||||
SUCCESS=$(echo "$UPDATE_RESPONSE" | jq -r '.success')
|
||||
|
||||
if [ "$SUCCESS" = "true" ]; then
|
||||
echo "SUCCESS: Cloudflare updated to $NEW_IP"
|
||||
else
|
||||
echo "FAILURE: Update failed. Response: $UPDATE_RESPONSE"
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user