jon-b
5/10/2014 - 3:18 AM

CloudFlare dynamic dns updater module for Synology

CloudFlare dynamic dns updater module for Synology

#!/bin/sh

# cloudflareddns.sh - dynamic dns updater module for Synology
#
# Author:
#	Michael Wildman (http://mwild.me)
#
# Version:
#	0.2
#
# Description:
#	copy to /sbin/cloudflaredns.sh
#	make executable (chmod +x)
#	add the following entry to /etc.defaults/ddns_provider.conf
#
#		[CloudFlare]                                                                                                                                                
#			modulepath=/sbin/cloudflaredns.sh                                                                                                                   
#			queryurl=https://www.cloudflare.com/api_json.html?a=rec_edit&tkn=__PASSWORD__&email=__USERNAME__&z=__HOSTNAME__&content=__MYIP__ 
#	
#	(note that URL is not actually used, DSM will pass us the variables)
#	run a rec_load_all query to get the record id
#	(see https://www.cloudflare.com/docs/client-api.html)
#
# Changelog:
#	0.2:
#		- Simplified this thing to its most basic requirements (curl + logging)
#		- Now either returns 'good' or the result (no checking for cases -- the log was always more useful anyway!)
#
# Based on Brian Schmidt Pedersen (http://blog.briped.net) gratisdns.sh

# TODO
# read addition parameters from cloudflare api calls
#

# these variables are passed by DSM
# username is your email
__USERNAME__="$(echo ${@} | cut -d' ' -f1)"
# password is your cloudflare API key
__PASSWORD__="$(echo ${@} | cut -d' ' -f2)"
__HOSTNAME__="$(echo ${@} | cut -d' ' -f3)"
__MYIP__="$(echo ${@}  | cut -d' ' -f4)"

# log location
__LOGFILE__="/var/log/cloudflareddns.log"

# additional parameters needed for CloudFlare
__RECTYPE__="A"
__RECID__=""
__RECNAME__=""
__TTL__="1"
__SERVICEMODE__="0"

log() {
	__LOGTIME__=$(date +"%b %e %T")
	if [ "${#}" -lt 1 ]; then
		false
	else
		__LOGMSG__="${1}"
	fi
	if [ "${#}" -lt 2 ]; then
		__LOGPRIO__=7
	else
		__LOGPRIO__=${2}
	fi

	logger -p ${__LOGPRIO__} -t "$(basename ${0})" "${__LOGMSG__}"
	echo "${__LOGTIME__} $(basename ${0}) (${__LOGPRIO__}): ${__LOGMSG__}" >> ${__LOGFILE__}
}

__URL__="https://www.cloudflare.com/api_json.html?a=rec_edit&tkn=${__PASSWORD__}&email=${__USERNAME__}&z=${__HOSTNAME__}&type=${__RECTYPE__}&id=${__RECID__}&name=${__RECNAME__}&content=${__MYIP__}&ttl=${__TTL__}&service_mode=${__SERVICEMODE__}"

# Update DNS record:
log "Updating with ${__MYIP__}..." 7
__RESPONSE__=$(curl --silent "${__URL__}")

# Strip the result element from response json
__RESULT__=$(echo ${__RESPONSE__} | grep -o -E .result.:.[A-z]+.)

case ${__RESULT__} in
	'"result":"success"')
		__STATUS__='good'
		true
		;;
	*)
		__STATUS__="${__RESULT__}"
		log "__RESPONSE__=${__RESPONSE__}" 5
		false
		;;
esac
log "Status: ${__STATUS__}" 6

printf "%s" "${__STATUS__}"