Bei Bedarf kann von der Aktuallisierung auch ein Logfile in /tmp geschrieben werden.
Für den IP Abgleich werden 2 verschiedene Adressen abgefragt; falls die Hauptadresse von DynDNS nicht zu erreichen ist, wird stattdessen myip.ch abgefragt.
Es besteht somit nicht die Gefahr von DynDNS wegen Flood gesperrt zu werden wie es bei anderen Scripts/Plugins leider vorkommt!
Usage: dyndnsupdater.sh [now|auto|kill|help]
Damit das Script funktioniert, muss man mit einem Linux fähigen Editor (zb Ultra Edit) den Header bearbeiten. Dort muss die dyndns Host, Username und Passwort eingetragen werden.
Erstellt eine neue, ausführbare Datei mit folgendem Inhalt:
(zum Beispiel /bin/dyndnsupdater.sh , aber wo das Script letzlich liegt ist egal)
Code: Alles auswählen
#!/bin/sh
#
# v0.4
#
# credits: Didge2002, SnowHead, r00t
#
USER="benutzer" # DynDNS Benutzername
PASS="password" # DynDNS Passwort
HOST="host.ath.cx" # DynDNS Hostname
EVERY="300" # Zeit in Sekunden zwischen den Abfragen
LOG="1" # Erstelle Logfile /tmp/log.dyndns? (wenn möglich aus lassen) [0=nein; 1=ja]
WILDCARD="1" # Sind Wildcards enabled, können auch Adressen wie "bla.host.ath.cx" angesprochen werden
###
# required system cmd's:
# awk cat cut date echo expr killall pidof ping rm sed sleep wget
CHECKIPURL="http://checkip.dyndns.org/"
CHECKIPURL2="http://www.myip.ch/"
URL="http://members.dyndns.org/nic/update?hostname=$HOST"
LOGFILE="/tmp/log.dyndns"
if [ "$WILDCARD" = "1" ]; then
URL="$URL&wildcard=ON"
fi
do_update() {
wget -q -O /tmp/dyndns_answer --user="$USER" --password="$PASS" $URL
}
LOG_update() {
if [ $LOG = "1" ]; then
_DT=$(date +"%d.%m.%Y %H:%M:%S")
dyndns_answer=$(cat /tmp/dyndns_answer)
echo "$_DT: HOSTIP: $HOSTIP - CURRENTIP: $CURRENTIP - DynDNS answer: $dyndns_answer" >>$LOGFILE
fi
}
abuse_check() {
dyndns_answer=$(cat /tmp/dyndns_answer)
if [ "$dyndns_answer" = "abuse" ]; then
if [ -z "$1" -a $LOG = "1" ]; then
echo "WARNING!! You abused the DynDNS update function! You must Unlock your hostname: $HOST !" >>$LOGFILE
fi
echo "WARNING!! You abused the DynDNS update function! You must Unlock your hostname: $HOST !"
fi
}
get_IPs() {
HOSTIP=$(ping -c 1 "$HOST" | sed -n 1p | sed -e 's/(//g' -e 's/)//g' | awk '{ print $3 }')
wget -q --timeout=10 -O /tmp/dyndns_current_ip $CHECKIPURL
CURRENTIP=$(cat /tmp/dyndns_current_ip | cut -d ' ' -f 6 | cut -d '<' -f 1)
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
if [ ! -z "$1" ]; then
echo "Hmm... $CHECKIPURL seems to be down?! Using: $CHECKIPURL2 insteed"
fi
if [ -z "$1" -a $LOG = "1" ]; then
echo "Hmm... $CHECKIPURL seems to be down?! Using: $CHECKIPURL2 insteed" >>$LOGFILE
fi
wget -q -O /tmp/dyndns_current_ip $CHECKIPURL2
CURRENTIP=$(cat /tmp/dyndns_current_ip | cut -d ' ' -f 6 | cut -d '<' -f 1)
fi
}
update_interval() {
echo $(pidof -x $0) >/tmp/.dyndns.pid
while true; do
get_IPs
if [ "$HOSTIP" != "$CURRENTIP" ]; then
do_update
abuse_check
LOG_update
fi
sleep $EVERY
done
}
kill_script() {
counter="5"
PID=$(cat /tmp/.dyndns.pid)
if [ -z "$PID" ]; then
PID=$(pidof -x $0)
fi
if [ ! -z "$PID" ]; then
PID="$PID `pidof -x sleep`"
echo "PID: $PID"
kill -9 $PID >/dev/null 2>&1
echo "Killed $PID"
else
echo "Nothing to $1!"
fi
sleep 5
if [ ! -z `pidof -x sleep` ]; then
while [ $counter -gt 0 ]; do
echo "...Retrying to kill script! (retrys: $counter , PID: $PID)"
kill -9 $PID >/dev/null 2>&1
PID=$(pidof -x $0)
PID="$PID `pidof -x sleep`"
counter=`expr $counter - 1`
done
fi
echo "Should be killed..."
rm -f /tmp/.dyndns.pid
}
echo_PIDs() {
PID=$(cat /tmp/.dyndns.pid)
if [ -z "$PID" ]; then
PID=$(pidof -x $0)
fi
if [ -z "$PID" ]; then
echo "Seems script isnt running in background"
else
PID="$PID `pidof -x sleep`"
echo "Scripts currently ProcessIDs: $PID"
fi
}
show_status() {
get_IPs
if [ "$HOSTIP" != "$CURRENTIP" ]; then
echo "The IP of $HOST ($HOSTIP) does NOT match your current Internet-IP: $CURRENTIP"
echo "Your should update immediately! (with: $0 now)"
else
dyndns_answer=$(cat /tmp/dyndns_answer)
echo "DynDNS answer: $dyndns_answer"
echo_PIDs
fi
}
case "$1" in
"")
update_interval
;;
auto)
$0 &
;;
stop|kill)
kill_script $1
;;
now)
get_IPs
do_update
abuse_check
echo "HOST: $HOST - HOSTIP: $HOSTIP - CURRENTIP: $CURRENTIP"
echo "DynDNS answer: $dyndns_answer"
;;
pid*)
echo_PIDs
;;
status)
show_status
;;
help|hilfe|?)
echo "Usage: $0 [now|auto|kill|help]"
echo "$0 now -> Force to update $HOST immediately (Sofortiges updaten von $HOST)"
echo "$0 auto -> Checks/updates $HOST every $EVERY seconds (Überprüft/updated $HOST alle $EVERY Sekunden)"
echo "$0 kill -> Kills running script (Script wird beendet)"
echo "$0 status -> Zeigt den aktuellen Status, ob ein update nötig ist"
echo "$0 pids -> Zeigt die verwendeten ProzessIDs dieses Scripts"
echo "$0 help -> This help... (Zeigt diese Hilfe an...)"
;;
*)
echo "Usage: $0 [now|auto|kill|help]"
;;
esac
exit 0
Damit das Script automatisch beim Hochfahren der Box auch gestartet wird, muss noch der Eintrag:
/bin/dyndnsupdater.sh &
in euer Startscript wie zb:
/var/etc/init.d/start_neutrino
oder /etc/rc.local
oder bei der Dreambox in /etc/init.d/bootup
eingetragen werden, aber auf jedenfall vor dem exit 0
Bei dem start_neutrino File am besten hinter den Aufruf von "timerd" und vor "neutrino" eintragen und das "&" ist Wichtig und darf nicht weggelassen werden, sonst bootet die Box nicht weiter! (oder seit v0.4 gegen ein "auto" austauschen)
Das Ende des Startup-Scripts sollte dann ungefähr so aussehen:
Code: Alles auswählen
/bin/dyndnsupdater.sh &
exit 0
export EDITOR=nano; crontab -e
Code: Alles auswählen
@reboot /root/dynDNSupdater.sh auto >/dev/null 2>&1
Wenn ihr das LOG an habt, sähe das Ergebnis ungefähr so aus:
30.08.2010 21:09:24: HOSTIP: 84.xxx.xxx.42 - CURRENTIP: 84.xxx.xxx.79 - DynDNS answer: good 84.xxx.xxx.79
31.08.2010 21:10:22: HOSTIP: 84.xxx.xxx.79 - CURRENTIP: 84.xxx.xxx.43 - DynDNS answer: good 84.xxx.xxx.43
01.09.2010 21:09:24: HOSTIP: 84.xxx.xxx.43 - CURRENTIP: 84.xxx.xxx.110 - DynDNS answer: good 84.xxx.xxx.110
02.09.2010 21:09:13: HOSTIP: 84.xxx.xxx.110 - CURRENTIP: 84.xxx.xxx.113 - DynDNS answer: good 84.xxx.xxx.113
Das Script müsste eigentlich auf allen receivern mit embedded linux (linux allg.) etc funktionieren.
Falls dennoch Probleme auftauchen bitte kurz bescheid geben!
Danke
PS: Nur so am Rande Falls irgendwer 9xkluges meckern will... Die Idee zu diesem Script hatte damals mein zwillingsbruder r00t - für den ichs dann gecoded hab...
Ursprünglich sollte das hier und auch die Munin Scripts in IPC eingebaut werden - mittlerweile behalte ichs mir aber vor dies zu tun weil die Piraten auch schon sowas angekündigt haben aber diesmal will ich sehn ob sies tatsächlich auch alleine hinkriegen.....