#!/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__}" |
This comment has been minimized.
This comment has been minimized.
@indigital see if my steps help 1 - Visit your Synology DiskStation's web wget https://gist.github.com/tehmantra/f1d2579f3c922e8bb4a0/raw/706f8db7d8506e62b17a5568951544e5c5ee0644/cloudflaredns.sh -O /sbin/cloudflaredns.sh
chmod +x /sbin/cloudflaredns.sh
cat >> /etc.defaults/ddns_provider.conf << 'EOF'
[CloudFlare]
modulepath=/sbin/cloudflaredns.sh
queryurl=https://www.cloudflare.com/api_json.html?a=rec_edit&tkn=__PASSWORD__&email=__USERNAME__&z=__HOSTNAME__&content=__MYIP__
EOF 6 - Visit CloudFlare account settings page and copy your API key curl https://www.cloudflare.com/api_json.html \
-d 'a=rec_load_all' \
-d 'tkn=YOUR_API_KEY_HERE' \
-d 'email=YOUR_ACCOUNT_HERE' \
-d 'z=YOUR_ROOT_DOMAIN_HERE' 8 - In the reesult of above command, find out target entry (having the "name" field set to your desired sub-domain), and use the values from the record to update these two lines of __RECID__="VALUE_OF_rec_id_FIELD"
__RECNAME__="VALUE_OF_display_name_FIELD" 9 - Visit DS web again and go to Control Panel / External Access / Add |
This comment has been minimized.
This comment has been minimized.
Awesome tips thank you all very much ! :) |
This comment has been minimized.
This comment has been minimized.
Hi, Thanks for the scripts, I have succeed to make work on one of my site on my Synology. What I did: FYI, I have created virtualhost for each domain. Is this due to the scripts or something else ? Cheers, |
This comment has been minimized.
This comment has been minimized.
There's a couple of improvements I'm going to play around with and suggest, after testing... Starting by acknowledging the multi-host requirement from @wsokc , we can quite easily split the Next, do away with the need to manually specify record IDs... The code is there to fetch the ID, so why don't we just work out the root domain from each If I get anywhere with these ideas, I'll let you know (but anyone can feel free to try these out for themselves). Updated fork with record ID fetching and zone validation: |
This comment has been minimized.
This comment has been minimized.
I use this script in DSM 5.2, it works, but system keep alert me malware detected every week, due to modified system files. I just upgrade to DSM 6.0. After upgrade, the shell script is deleted by system. Follow the above instruction (get RECID and RECNAME, API_KEY, etc), then put those variables into the URL. So now you have a full working URL ready.
It should update your IP address if you run this in browser. Now do the same thing that the script do, run this using First change IPv4_ADDRESS to
|
This comment has been minimized.
This comment has been minimized.
Awesome script thanks! Since Cloudflare is migrating their API v1 to v4 the script needs to be updated (https://www.cloudflare.com/migrating-to-v4/). Will you do this some time? Best, Nick |
This comment has been minimized.
This comment has been minimized.
One line curl command to update a DNS record in CloudFlare using v4 API:
If you need further details and other API calls to retrieve ZONE_ID and RECORD_ID then check Using CloudFlare as a DDNS Service Provider in Synology post. |
This comment has been minimized.
This comment has been minimized.
@huseyinozyilmaz Thanks. And do you know how i can use your command in the script? |
This comment has been minimized.
This comment has been minimized.
Sorry for the late reply. I no longer have a synology nas, so I will not be maintaining this script. Cheers, Michael |
This comment has been minimized.
This comment has been minimized.
I have created a modified version script using Cloudflare API v4 here. You may want to check it out. |
This comment has been minimized.
This comment has been minimized.
@joshuaavalon. Thanks for the hint of Cloudflare API v4. I went a little bit deep into Cloudflare's github repository and find that Cloudflare has provided many Cloudflare API v4 wrappers in different languages such as php and python. One of API wrapper examples in python does demonstrate how to update DDNS. I took it and modified it a little bit so that it can work with Synology NAS interface. It features automatically zone and recid retrival. You can check it out in my repository. |
This comment has been minimized.
This comment has been minimized.
getting this error: |
This comment has been minimized.
This comment has been minimized.
A better Cloudflare module for Synology is here. Available to install via pip and most importantly, supports root domain to be set as your DDNS, e.g. example.com, as well as properly handles geographic domains (example.co.uk). |
This comment has been minimized.
This comment has been minimized.
I've made a Cloudflare DDNS updater script which supports mulidomains and subdomains, feel free to use it https://github.com/mrikirill/SynologyDDNSCloudflareMultidomain |
This comment has been minimized.
This comment has been minimized.
@mrikirill same to many scripts out there, yours will choke on |
This comment has been minimized.
This comment has been minimized.
@dvershinin yep mate, you're right, didn't think about this case. I'm going to fix it. Feel free to send an issue in my project) |
This comment has been minimized.
This comment has been minimized.
@mrikirill just above your comment, I mention cloudflareddns which addresses all these edge case from the start. |
This comment has been minimized.
Can someone make a youtube video demonstrating how to install this on a synology diskstation? I've never done anything like this before (or maybe I have and don't know it)...