Script - dynDNSupdater.sh

Fragen oder Probleme?
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Script - dynDNSupdater.sh

Beitrag von feissmaik »

Dieses Script pingt regelmässig die IP der DynDNS-host und vergleicht sie mit der aktuellen IP des Internetanschlusses und eine aktuallisierung (update) erfolgt nur wenn diese voneinander abweichen also unterschiedlich sind.
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
ACHTUNG: $EVERY sollte man auf keinen fall unter 1min (60sec) stellen, ansonsten wird die Host evtl. von DynDNS gesperrt wegen abuse (Missbrauch)!

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
Alternativ kann es auch in die crontab eingetragen werden, entweder direkt in die Datei /etc/crontab, mit angabe des Benutzers, oder als Standardeintrag in die crontab des Benutzers root:

export EDITOR=nano; crontab -e

Code: Alles auswählen

@reboot                 /root/dynDNSupdater.sh auto >/dev/null 2>&1
Um es auszuprobieren oder manuell updaten zu lassen könnt ihr das Script so aufrufen: dyndnsupdater.sh now

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.....
Du musst nicht kämpfen um zu siegen
ThePatcher1
IPC Anfänger
Beiträge: 53
Registriert: Di 26. Apr 2011, 20:25
Kontaktdaten:

Script - dynDNSupdater.sh

Beitrag von ThePatcher1 »

Servus feiss, eine frage. Ich habe mir einen zweiten Host bei dyn gemacht und weissjetzt nicht wie ich den aktualisieren kann. Mein Haupthost wird durch meinen Router aktuell gehalten! Wäre das hier die beste Lösung oder gibt es da noch was besseres bzw. einfacheres?? Ich google und google aber werde nicht schlau. Hab es auch schon mi webhop bei dyn probiert aber das klappt irgendwie nicht!
Gruß und danke
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von feissmaik »

Wenn deine erste DynDNS-Host von deinem Router aktuell gehalten wird kannst du dieses Script für die 2. DynDNS-Host nutzen - sollte eigentlich kein Problem sein...


Wenn das nicht funktionieren sollte, dann leg dir für deine 2. DynDNS-Host einen neuen DynDNS Account an - dann funktioniert das auf jedenfall ;)
(hab so selber 2 verschiedene DynDNS-Hosts auf einer static IP)
Du musst nicht kämpfen um zu siegen
ysimmerath
IPC Interessierter
Beiträge: 101
Registriert: Di 19. Apr 2011, 17:08
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von ysimmerath »

ThePatcher1 hat geschrieben:Servus feiss, eine frage. Ich habe mir einen zweiten Host bei dyn gemacht und weissjetzt nicht wie ich den aktualisieren kann. Mein Haupthost wird durch meinen Router aktuell gehalten! Wäre das hier die beste Lösung oder gibt es da noch was besseres bzw. einfacheres?? Ich google und google aber werde nicht schlau. Hab es auch schon mi webhop bei dyn probiert aber das klappt irgendwie nicht!
Gruß und danke
Hi,
als alternative kannst du auch ddclient benutzen es klappt hervorragend mit 2 dyndns host, benutze ich selber ;)
ThePatcher1
IPC Anfänger
Beiträge: 53
Registriert: Di 26. Apr 2011, 20:25
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von ThePatcher1 »

Servus, ich habe mal ddclient drauf gemacht aber dann hat mir mein router nicht mehr die erste Hostadresse aktiviert!
Dann habe ich beide Hostaddys in die DDclient reingemacht und es lief so halbwegs!
Was ich aber etwas Sch.... finde ist eben dies, das die aktualisierung doch 3Min oder mehr dauert wenn man mit "use=web" die IP aktualisiert, da es ja sonst Probleme mit dnydns geben soll!

Wie hast du es denn realisiert?
ThePatcher1
IPC Anfänger
Beiträge: 53
Registriert: Di 26. Apr 2011, 20:25
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von ThePatcher1 »

sers feiss!
kann ich diese Zeile doppelt machen wenn ich 2 Hostaddys habe??
HOST="addy1" # DynDNS Hostname
HOST="addy2" # DynDNS Hostname


??
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von feissmaik »

@ThePatcher1 : Nein das geht nicht, 2x die gleiche Variable überschreiben sich (scripts werden von oben nach unten verarbeitet)
Der ddclient hat bei mir sehr viele Probleme verursacht - ua. abuse sperrungen weswegen ich überhaupt erst mir nen eigenes Script geschrieben hatte....

Wenn du mehrere DynDNS hosts hast, gibts mehrere Möglichkeiten:


1) Was dir schon geraten wurde, ein Host über deinen Router updaten lassen und die andere über ddclient oder diesem Script

2) beide Hosts über ddclient updaten lassen

3) Mithilfe meines Scripts beide Hosts updaten lassen: Dafür musst du für die 2. Host einen seperaten Shellbenutzer anlegen damit sich die beiden Scripts nicht in die quere kommen... Also 1. Host wird zb über root aktualisiert und um die 2. Host kümmert sich der Shellbenutzer CS o.ä.
Du musst nicht kämpfen um zu siegen
ThePatcher1
IPC Anfänger
Beiträge: 53
Registriert: Di 26. Apr 2011, 20:25
Kontaktdaten:

Script - dynDNSupdater.sh

Beitrag von ThePatcher1 »

Da es ja probleme gibt wenn ich eins den Router machen lassen und eins den ddclient bleibt mir wohl nix anderes über als beide über ddclient zu aktualisieren. Das mit den zwei hier im Skript hört sich sehr kompliziert an!
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von feissmaik »

Wieso hört sich das kompliziert an?
versteh ich nich :)

Du hast bereits den benutzer root - du brauchst dir nurnoch einen weiteren normalen Shellbenutzer anlegen der dann das 2. dynDNSupater.sh Script ausführt...

Als root machst du:

useradd -m -s/bin/bash CS
cp dynDNSupdater.sh /home/CS/
chown CS:CS /home/CS/*
su - CS

Dann bearbeitest du das DynDNSupdater.sh Script und fügst dort die Daten der 2. Host ein... Dann trägst du das 2. dynDSupdater.sh in die Benutzercrontab ein: EDITOR=nano; crontab -e

Code: Alles auswählen

@reboot                 /home/CS/dynDNSupdater.sh auto >/dev/null 2>&1
Die Benutzershell verlässt du wieder mit: exit

Fertig....
Du musst nicht kämpfen um zu siegen
ysimmerath
IPC Interessierter
Beiträge: 101
Registriert: Di 19. Apr 2011, 17:08
Kontaktdaten:

Re: Script - dynDNSupdater.sh

Beitrag von ysimmerath »

ThePatcher1 hat geschrieben:Wie hast du es denn realisiert?
bei mir sieht so aus

Code: Alles auswählen

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

protocol=dyndns2
use=web, web=checkip.dyndns.com, web-skip='IP Address'
server=members.dyndns.org
login=*****
password='****'
dyndny1.dyndns.org

protocol=dyndns2
use=web, web=checkip.dyndns.com, web-skip='IP Address'
server=members.dyndns.org
login=****
password='*****'
dyndns2.dyndns.org
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste