-
-
Save m-wild/f1d2579f3c922e8bb4a0 to your computer and use it in GitHub Desktop.
#!/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__}" |
One line curl command to update a DNS record in CloudFlare using v4 API:
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}" -H "X-Auth-Email: {EMAIL}" -H "X-Auth-Key: {API_KEY}" -H "Content-Type: application/json" --data "{\"id\":\"{ZONE_ID}\",\"type\":\"A\",\"name\":\"{RECORD_NAME}\",\"content\":\"
curl ifconfig.co\"}"
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.
@huseyinozyilmaz Thanks. And do you know how i can use your command in the script?
Sorry for the late reply. I no longer have a synology nas, so I will not be maintaining this script.
Check the forks for fixes (or maybe turn this into a full github repo so it can get pull requests etc?)
Cheers, Michael
I have created a modified version script using Cloudflare API v4 here. You may want to check it out.
@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.
getting this error:
RESPONSE={"success":false,"errors":[{"code":7003,"message":"Could not route to /zones/dns_records, perhaps your object identifier is invalid?"},{"code":7000,"message":"No route for that URI"}],"messages":[],"result":null}
Sep 5 13:17:42 cloudflaredns.sh (7): Status: false,
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).
I've made a Cloudflare DDNS updater script which supports mulidomains and subdomains, feel free to use it https://github.com/mrikirill/SynologyDDNSCloudflareMultidomain
@mrikirill same to many scripts out there, yours will choke on example.co.uk
domain (e.g. complex TLDs).
Don't assume that TLD has no dots inside :)
@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)
@mrikirill just above your comment, I mention cloudflareddns which addresses all these edge case from the start.
nice script
personally i went this route as it's less invasive https://hub.docker.com/r/oznu/cloudflare-ddns/#!
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