Wie ich kürzlich geschrieben habe, bin ich ja jetzt Besitzer einer echten TLD-Domain. Die alte DynDNS-Domain sollte aber weiterhin erreichbar bleiben. Das IP-Update der neuen Domain macht die Fritz!Box, indem ich dort die Daten von Selfhost eingetragen habe. Die Fritz!Box kann aber von Hause aus nur einen Account updaten. Und die Firmware wollte ich (noch) nicht selbst modifizieren. Also mußte ein Script her, dass regelmäßig vom Server aus eine IP-Änderung feststellt, um dann den DynDNS-Account zu aktualisieren.
Vorgehensweise:
1. Update-Client von DynDNS downloaden.
2. Die Konfiguration (Login-Informationen) für den Client vornehmen (liegt bei mir unter /etc/ddclient/ddclient.conf).
3. Ein Script entwerfen, dass regelmäßig die IP ermittelt, und bei einer Änderung, diese an DynDNS mitteilt.
Das Script lief ursprünglich als Cron-Job. Das hat aber den Nachteil, dass der Syslog-Daemon regelmäßig einen Eintrag in /var/log/cron.log schreibt. Und da das Script minütlich läuft, sorgt das für jede Menge Output. Ich habe auch keine Möglichkeit gefunden, einzelne Jobs vom Logging auszuschließen.
Deshalb sieht das Script jetzt so aus, dass es im Hintergrund läuft und einmal pro Minute die Aufgaben erfüllt.
#!/bin/bash
#
# My own cronjob
# It calls every n_seconds the dyn-dns-updater
#
# Declaration of variables
#
# Seconds to wait until call of the updater
n_seconds=60
ip_address=
while true ; do
sleep $n_seconds
#get current ip-address by asking gimme-th.at (fritz.box refreshes this automatically)
ip_address_act=$(ping -c1 gimme-th.at | grep -o -m1 ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}’)
#Getting the old address by reading the file, with the previous ip-address
ip_address=$(cat /etc/ddclient/ip_address | grep -o ‘\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}’)
#if ip-address has changed, we call the updater and write the new ip-address to file
if [ "$ip_address_act" != "$ip_address" ]; then
/usr/sbin/ddclient -daemon=0 -syslog -quiet -force
echo $ip_address_act > /etc/ddclient/ip_address
echo $(date) “: New ip assigned: ” $ip_address_act >> /var/log/dyndns_act.log
echo $(date) “: ” $ip_address_act >> /var/log/ip_history.log
fi
done
Wie läuft das Ganze jetzt ab? In der While-Schleife wird zuerst n_seconds gewartet, anschließend beginnt der Überprüfungsvorgang. Dazu wird gimme-th.at angepingt. (Das IP-Update der Seite macht ja die Fritz!Box). Aus dem Ping-Result wird mittels sed die IP herausgelöst und mit der aktuellen (die in /etc/ddclient/ip_address liegt) verglichen. Hat sich da eine Änderung ergeben, so wird der ddclient aufgerufen, und damit die IP upgedated. Anschließend die neue IP in das File /etc/ddclient/ip_address geschrieben und das File /var/log/ip_history.log um die neue IP erweitert. Letzter Punkt ist nur erforderlich, um meine persönliche Neugier zu befriedigen :-).
Optimierungsmöglichkeit: Die aktuelle IP-Adresse von der Fritz!Box holen. Diese notiert das ja selbstständig in einem LogFile. Leider bin ich da nicht rangekommen, da man dort per http-Request den Nutzernamen und das Passwort senden müßte. Das sollte prinzipiell nicht schwer sein, ich habe es aber nicht ohne Weiteres hinbekommen, und mich deshalb auf diesen etwas umständlicheren Weg geeinigt.