summaryrefslogtreecommitdiff
path: root/update-ddns.in
diff options
context:
space:
mode:
Diffstat (limited to 'update-ddns.in')
-rw-r--r--update-ddns.in80
1 files changed, 80 insertions, 0 deletions
diff --git a/update-ddns.in b/update-ddns.in
new file mode 100644
index 0000000..da7facd
--- /dev/null
+++ b/update-ddns.in
@@ -0,0 +1,80 @@
+#!/bin/bash
+
+set -e
+
+stty &> /dev/null || \
+ sleep $[$RANDOM%60]
+
+if ! ipCmd="$(which ip 2> /dev/null)"
+then
+ for p1 in / /usr/
+ do
+ for p2 in bin/ sbin/
+ do
+ ipCmd="${p1}${p2}ip"
+ [ -x "${ipCmd}" ] && break
+ done
+ [ -x "${ipCmd}" ] && break
+ done
+fi
+
+while read -r ipVer authToken dev dnsName
+do
+
+ if [[ "${ipVer}" = "#"* ]] || [ -z "${ipVer}" ]
+ then
+ continue
+ fi
+
+ if [ ${ipVer} == "4" ]
+ then
+ dnsVer="A"
+ inetVer="inet"
+ syncPre=""
+ elif [ ${ipVer} == "6" ]
+ then
+ dnsVer="AAAA"
+ inetVer="inet6"
+ syncPre="v6."
+ else
+ >&2 echo 'Error: First column in "#ETCDIR#/update-ddns.conf" needs to be "4" or "6"!'
+ exit 1
+ fi
+
+ if [ -z "${dnsName}" ]
+ then
+ dnsIps="$(
+ curl -${ipVer} "${dev}" 2> /dev/null
+ )"
+ ips="1"
+ else
+ dnsIps="$(
+ dig "${dnsName}" ${dnsVer} | \
+ grep -v '^\s*\(;\|$\)' | \
+ grep "\s${dnsVer}\s" | \
+ awk '{print $5}' | \
+ sort -u
+ )"
+
+ ips="$(
+ "${ipCmd}" addr show dev "${dev}" | \
+ grep "^\s*${inetVer}\s.*\sscope\sglobal\s" | \
+ awk '{print $2}' | \
+ cut -d/ -f1 | \
+ sort -u
+ )"
+ fi
+
+ if [ -z "$(
+ (
+ echo "${dnsIps}"
+ echo "${ips}"
+ ) | \
+ sort | \
+ uniq -d
+ )" ]
+ then
+ echo curl -sS "https://${syncPre}sync.afraid.org/u/${authToken}/"
+ fi
+
+done < #ETCDIR#/update-ddns.conf