Digital Eliteboard

Registriere dich noch heute kostenloses um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereiche, welche für Gäste verwert bleiben

dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz etc)

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
dynDNS update script (kompatible zu allen embedded linux's also receiver, fritz etc)

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 , wo das Script letzlich liegt ist egal)
Code:
#!/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 binary'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 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 2min (120sec) 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 jednfall vor dem exit 0
(Danke incognito23 für den Dreambox-Hinweis)

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:
/bin/dyndnsupdater.sh &


[I]exit 0[/I]
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 :smile:



Letztes Script-Update: 31.08.2010 (~12:30)
 
Zuletzt bearbeitet:
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Die aktuelle Scriptversion pingt den DynDNS Host an und vergleicht diese IP mit der IP die von http://checkip.dyndns.org/ zurück gegeben wird und bei Abweichung wird der DynDNS Host aktuallisiert
 

onder

Spezialist
Mitglied seit
29. Oktober 2009
Beiträge
596
Reaktion auf Beiträge
23
Punkte
68
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

bei linux reciver haste den ort angegeben wo kommt sie bei fritz hin
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

das kannst du dir aussuchen :smile:
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

ja, eigentlich ist es generell egal.
es sollte nur nicht in /tmp gelegt werden aber ansonsten kann man es sich aussuchen, ob /bin oder /var/bin oder /home/bla ... :smile:

nachher (1-2h) kommt aber noch ne neue version von dem script - hab noch ein paar bugs gefunden bzw behoben
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Es wird leider schon etwas grösser das Script, ursprünglich 970Byte, mittlerweile 4,1kB :smile:

An der Version 0.4 habe ich das beenden vom Script im Hintergerund verbessert - jetzt versucht er mind. 5x das Script zu beenden (es klappt leider nicht immer beim ersten mal)
Und was mir auch noch sehr wichtig war, ist eine alternative URL um die aktuelle IP herraus zu finden.
Falls http://checkip.dyndns.org/ jetzt mal nicht reagiert wird stattdessen http://www.myip.ch/ abgefragt

Ausserdem wird mit './dyndnsupdater.sh help' eine kleine Kommando-Hilfe angezeigt und mit './dyndnsupdater.sh auto' lässt sich das script in den Hintergrund parken (quasi identisch zu './dyndnsupdater.sh &')
 

onder

Spezialist
Mitglied seit
29. Oktober 2009
Beiträge
596
Reaktion auf Beiträge
23
Punkte
68
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

dieser script soll doch bestimmt auf den usb stick und wohin ?
auf die fritz kann sie wohl nicht kopiert werden?
kann mann als editor auch crimson nehmen?
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Probier es doch einfach mal aus?

Wie ich bereits sagte ist der Ort wo das Script letzlich abgelegt wird, völlig wumpe - hauptsache es ist ausführbar und auch richtig ins Startupscript eingebunden


Meiner Meinung nach trifft das für alle Scripts zu, die nicht in irgendeiner Form auf einem receiver übers Fernbedienungsmenue oder ähnlich angesprochen werden müssen


Wenn du nicht weisst ob dein Editor "crimson" Linux kompatible ist, benutz lieber nano oder vi (vim) auf deiner Box oder besorg dir UltraEdit oder Proton
(ich kenne nicht jeden editor)
 

incognito23

Ist gelegentlich hier
Mitglied seit
30. März 2009
Beiträge
71
Reaktion auf Beiträge
2
Punkte
8
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Hi, ich möchte auch gerne das Script nutzen. Kann mir jemand sagen, wo ich den Eintrag: /bin/dyndnsupdater.sh & einfügen muss?
Ich hab einen DM 800 mit Gemini 5.1 drauf. In welches Startscript kann man ihn integrieren? :emoticon-0122-itwas

Vielen Dank.
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Hi, ich möchte auch gerne das Script nutzen. Kann mir jemand sagen, wo ich den Eintrag: /bin/dyndnsupdater.sh & einfügen muss?
Ich hab einen DM 800 mit Gemini 5.1 drauf. In welches Startscript kann man ihn integrieren? :emoticon-0122-itwas
Sicher das du keine /etc/rc.local wie ich es oben erwähnt habe, hast ?

Damit das Script automatisch beim Hochfahren der Box gestartet wird, muss noch der Eintrag:/bin/dyndnsupdater.sh &
in euer Startscript wie zb /var/etc/init.d/start_neutrino oder /etc/rc.local eingetragen werden.
Auch hierfür einen linuxfähigen Editor benutzen!
(am besten hinter den Aufruf von "timerd" und vor "neutrino")

Das "&" ist wichtig und darf nicht weggelassen werden, sonst bootet die Box nicht weiter!
 

incognito23

Ist gelegentlich hier
Mitglied seit
30. März 2009
Beiträge
71
Reaktion auf Beiträge
2
Punkte
8
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Hi, nein, habe ich nicht. Es gibt verschiede Ordner: rc0, rc1, rc 2 usw. aber eine Datei rc-lokal finde ich niergendwo.
 
OP
OP
R

r00t

Hacker
Mitglied seit
17. August 2010
Beiträge
398
Reaktion auf Beiträge
74
Punkte
28
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Wedernoch ? Das kann eigentlich nicht sein :smile:
(rc.local nicht rc-lokal)

Und sonst erstell sie neu: vi /etc/rc.local

/var/etc/init.d/start_neutrino gäbe aber wie gesagt auch noch ;)
 

incognito23

Ist gelegentlich hier
Mitglied seit
30. März 2009
Beiträge
71
Reaktion auf Beiträge
2
Punkte
8
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Im init.d gibt es keine Datei die mit Start anfängt. Neutrino wohl gar nicht, weil es Enigma ist.
Kann ich die rc.local nur mit dem Start-Befehl anlegen oder muss da noch was rein?

Danke!

Edit:
Ich hab gerade in anderem Forum erfahren, dass die Datei es nicht auf der Dreambox gibt. Man muss den Startbefehl ans
Ende der /etc/init.d/bootup, anhängen!
 
Zuletzt bearbeitet:

incognito23

Ist gelegentlich hier
Mitglied seit
30. März 2009
Beiträge
71
Reaktion auf Beiträge
2
Punkte
8
AW: dynDNS update script (kompatible zu allen embedded linux's also receiver, fitz et

Hi, ich nochmal.

Ich hätte eine Frage, was bedeutet dieser Satz (rot eingezeichnet):

"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)".

Soll man das "auto" irgendwo einfügen?

Vielen Dank.
 
Oben Unten