diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 58 | ||||
-rw-r--r-- | update-ddns.conf | 3 | ||||
-rw-r--r-- | update-ddns.in | 80 |
4 files changed, 142 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7177e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +update-ddns diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2d11b9d --- /dev/null +++ b/Makefile @@ -0,0 +1,58 @@ +# +# update-ddns - script to update freedns.afraid.org's ddns entries if necessary +# +# Copyright (c) 2013-2016 Erich Eckner <opensource at eckner dot net> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# + +DESTDIR = +ETCDIR = /etc +BINDIR = /usr/bin +MANDIR = /usr/share/man + +VERSION = 0.0 + +all: update-ddns + +%: %.in + sed " \ + s/#VERSION#/$(VERSION)/; \ + s@#BINDIR#@$(BINDIR)@; \ + s@#ETCDIR#@$(ETCDIR)@; \ + s@#HELPTEXT#\(\s\+\)#@ --help \1display this help and exit\n --version\1display version and exit@; \ + " $< > $@ + [ "$@" = "update-ddns" ] && chmod +x "$@" || true + +.PHONY: install dist clean + +install: all + install -D -m0755 update-ddns $(DESTDIR)$(BINDIR)/update-ddns + install -D -m0644 update-ddns.conf $(DESTDIR)$(ETCDIR)/update-ddns.conf + +clean: + ls -A | \ + grep "^\($(shell sed 's|\.|\\.|; s|\*|.*|; s|$$|\\|' .gitignore | tr '\n' '\|')\)\$$" | \ + xargs -r rm + +dist: clean + git status --porcelain 2> /dev/null | grep -q "\S" && (git add .; git commit -m"neue Version: $(VERSION)") || true + ! git tag -d v$(VERSION) 2> /dev/null + git tag v$(VERSION) + git push + git push --tags + +# End of file diff --git a/update-ddns.conf b/update-ddns.conf new file mode 100644 index 0000000..4d7762b --- /dev/null +++ b/update-ddns.conf @@ -0,0 +1,3 @@ +6 authToken1 eno1 dnsName1 +4 authToken2 eno1 dnsName2 +4 authToken3 http://ip-check.url 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 |