#!/bin/bash

# --------------------------------------------------
#
# ----- ---- --- CloudFlare DDNS --- ---- -----
#
# Code from: https://WebInsider.pl/cloudflare-ddns-api4
#
# CloudFlare API DOC:
# https://api.cloudflare.com/
#
# --------------------------------------------------

IP_CONTROL_LAST=1 # 1 - check the latest IP (file $IP_LOG_FILE), 0 - always sends the new IP

# Use Your fav IP chceck URL:
IP_CHECK_URL=
# e.g.:
# https://cdn.pryc.eu/add/myip.php

IP_LOG_FILE=/boot/last-ip.txt # Last IP LOG file

CF_API_KEY= # CF API KEY
CF_EMAIL= # CF E-mail

DOMAIN= # Domain
DOMAIN_RECORD_NAME= # Domain or subdomain to set IP

CF_RECORD_PROXIED=true # Whether the record is receiving the performance and security benefits of Cloudflare, valid values: true,false

CF_ZONE_ID= # CF Zone ID for selected domain
CF_REKORD_ID= # CF Record (domain/subdomain) ID

# Basic config test
if [[ ! $IP_CHECK_URL ]] || [[ ! $CF_API_KEY ]] || [[ ! $CF_EMAIL ]] || [[ ! $DOMAIN ]] || [[ ! $DOMAIN_RECORD_NAME ]]  || [[ ! $CF_RECORD_PROXIED ]]  || [[ ! $IP_LOG_FILE ]]
then
	echo "First set: IP_CHECK_URL, CF_API_KEY, CF_EMAIL, DOMAIN DOMAIN_RECORD_NAME, CF_RECORD_PROXIED, IP_LOG_FILE"
	exit 0
fi


# Start oprions: Basic config (ZONE ID, REKORD ID)

START_OPTION=$1

if [ "$START_OPTION" = "CF_ZONE_ID" ]
then
	curl -X GET "https://api.cloudflare.com/client/v4/zones?name="$DOMAIN"&status=active&page=1&per_page=20&order=status&direction=desc&match=all" \
     -H "X-Auth-Email: "$CF_EMAIL \
     -H "X-Auth-Key: "$CF_API_KEY \
     -H "Content-Type: application/json"
	 exit 0
fi

if [ "$START_OPTION" = "CF_REKORD_ID" ]
then	
	curl -X GET "https://api.cloudflare.com/client/v4/zones/"$CF_ZONE_ID"/dns_records?page=1&per_page=20&order=type&direction=desc&match=all" \
     -H "X-Auth-Email: "$CF_EMAIL \
     -H "X-Auth-Key: "$CF_API_KEY \
     -H "Content-Type: application/json"
	 exit 0
fi


# ZONE config test
if [[ ! $CF_ZONE_ID ]]
then
	echo "First run: script_name CF_ZONE_ID"
	echo "E.g.: cloudflare-ddns CF_ZONE_ID"
	echo "Next set it in script"
	exit 0
fi

if [[ ! $CF_REKORD_ID ]]
then
	echo "First run: script_name CF_REKORD_ID"
	echo "Eg: cloudflare-ddns CF_REKORD_ID"
	echo "Next set it in script"
	exit 0
fi


if [ -z "$IP_CHECK_URL" ]
then
	echo "IP_CHECK_URL is empty!"
	exit 0
else
	IP_NOW=`wget -O - -q $IP_CHECK_URL` # Get current IP, if IP_CONTROL_LAST=1	
fi
	

if [ ! -f $IP_LOG_FILE ] && [ "$IP_CONTROL_LAST" = "1" ]
then
    sudo touch $IP_LOG_FILE
fi

if [ $IP_LOG_FILE ] && [ "$IP_CONTROL_LAST" = "1" ]
then
    IP_LAST=$(cat $IP_LOG_FILE)
fi

# --------------------------------------------------

function f_cf_api_change_ip() {

	curl -X PUT "https://api.cloudflare.com/client/v4/zones/"$CF_ZONE_ID"/dns_records/"$CF_REKORD_ID \
     -H "X-Auth-Email: "$CF_EMAIL \
     -H "X-Auth-Key: "$CF_API_KEY \
     -H "Content-Type: application/json" \
	 --data '{"type":"A","name":"'$DOMAIN_RECORD_NAME'","content":"'$IP_NOW'","proxied":'$CF_RECORD_PROXIED'}'
	 
}

if [ "$IP_CONTROL_LAST" = "1" ]
then
	if [ "$IP_NOW" != "$IP_LAST" ]
	then
		echo "New IP - changing..."
		echo $IP_NOW | sudo tee $IP_LOG_FILE > /dev/null
		f_cf_api_change_ip	
	else	
		echo "IP is OK"
	fi
else
	echo "Changing IP..."
	echo $IP_NOW | sudo tee $IP_LOG_FILE > /dev/null
	f_cf_api_change_ip	
fi


exit 0
