On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

Software besorgen und anwenden
Message
Author
Ray

On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#1 Post by Ray »

Hallo Leute,

da man an meinem Router (Netgear RP 614) an den LEDs nicht erkennen kann, ob er noch online ist, möchte ich für mein SuSE 8.1 ein ähnliches Tool wie routercontrol für Windows, um den augenblicklichen Modus (Off- oder Online) festzustellen.
Gibt es soetwas auch für Linux?

Danke für Euer Feedback!

Ciao
Ray

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#2 Post by ratte »

ich habe auch einen netgear, aelteres modell.

dem kann man sagen, dass der die (Routing Information Protocol, RFC1058 and RFC 1389) RIP Direction auf Both (default) setzt. damit hast du alle 30 sec. RIP-infos auf der NIC, die an dem router angeschlossen ist.
mit tcpdump kann man sich dass ansehen, und wenn der router offline ist, steht da 0.0.0.0 ansonsten eine andere IP.
-> das kann man vielleicht rausgreppen und mit <i>ledblink</i> zusammen auf dem linux rechner entsprechend blinken lassen.

alternativ kann man vielleicht auch bei dir die seite per script holen:

wget --http-user=<name> --http-passwd=<spasswort> http://<ip>/<page>

und das mit

lynx -force_html -dump <page> > /tmp/file als ASCII text pumpen und parsen.

n bisserl scripten (des admins liebste taetigkeit neben quake3) musste schon selbst.

ratte

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#3 Post by ratte »

es hat mir doch keine ruhe gelassen.

ich habe also ein script entwickelt, das die online-tatsache ueberprueft.

features:

-kann in boot-up startscripten oder in der $HOME/.bash_login automatisch aufgerufen werden.

-onlinestatus: scroll taste ist an

-ofllinestatus: scroll taste ist aus

-scroll-led ueber alle 8 consolen mit/ohne licht an und ohne scroll-funktion (!)

der online/offline-status wird geprueft, indem vom netgear-router die info-seite ueber Wlan und LLan aufgerufen wird. bei meinem geraet wird als erstes die Wlan IP, di. die oeffentliche IP, also die, die man durch die einwahl beim ISP bekommen hat, ausgegeben. darauf basiert das script.
ist der download nicht erfolgreich, wird automatisch offline-status angenommen, zb. wenn die NIC zum router runtergefahren wird oder andere gruende die verbindung zum router bzw. das downloaden der seite verhindern.

eingebaut ist ein timeout von einer minute zwischen den downloads.

und hier ist das script:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
#
# script for bootup or $HOME/.bash_login scripts,
# to automagically highlight the scroll led over
# all 8 ttys if we are online with our netgear-
# router, else downlight them.
#
# STATIC keeps the script running, simulating it
# as a deamon (is listed at ps).
# TEMPFILE is needed to pass information and
# automatically deleted. If powerdown or else,
# del /tmp/*file
# ROUTER, USER, PASS and PAGE are netgear dependend
# information.
# ! important ! don't screw up lines of the code,
# because it breaks the logic.
#
# has to be started with & to put it into background,
# else it blocks the console

STATIC="/bin/sh"
TEMPFILE=/tmp/$$file
ROUTER=<netgear-ip>
USER="<netgear-user>"
PASS="<netgear-password>"
PAGE=<netgears webpage we need>

while [ -e $STATIC ]; do
/usr/bin/wget -q --output-document=$TEMPFILE \
--http-user=$USER --http-passwd=$PASS --tries=2 \
http://$ROUTER/$PAGE && \
/usr/bin/lynx -force_html -dump $TEMPFILE | \
grep -a -B 1 -m 1 "IP A" | grep -v 0.0.0.0 1>/dev/null 2>&1
if [ $? == 0 ]
then INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L +scroll < $tty
done
elif [ $? == 1 ]
then INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L -scroll < $tty
done
fi
/bin/rm $TEMPFILE
/bin/sleep 1m
done

</font><hr></pre></blockquote>

den code in ein file pumpen, die <platzhalter> mit echten informationen ersetzen, mit `chmod +x` ausfuehrbar machen und im gewuenschten script mit

<b>scriptname &</b>

einplegen.

um sicherzugehen, dass das scroll-led wieder ausgeschaltet wird, wenn linux runtergefahren wird, kann man zb. folgendes in bootdown script unterbringen:

# aktuelle ip aus
INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L -scroll < $tty
done


ratte

Ray

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#4 Post by Ray »

WOW! Vielen Dank! Werde das Ganze gleich mal ausprobieren ...

Ciao
Ray

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#5 Post by ratte »

dummerweise ist mir da ein fehler passiert.

grep -v negiert den match nicht so, wie ich es erwartet habe.

daher kommt hier eine neue version:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
#
# script for bootup or $HOME/.bash_login scripts,
# to automagically highlight the scroll led over
# all 8 ttys if we are online with our netgear-
# router, elso downlight them.
#
# STATIC keeps the script running, simulating it
# as a deamon (is listed at ps).
# TEMPFILE is needed to pass information and
# automatically deleted. If powerdown or else,
# del /tmp/*file
# ROUTER, USER, PASS and PAGE are netgear dependend
# information.
#
# this script runs endless, therefore it must be killed
# to stop it.


# user config

STATIC="/bin/sh"
TEMPFILE=/tmp/$$file
ROUTER=<netgear-ip>
USER="<netgear-user>"
PASS="<netgear-spasswort>"
PAGE=<netgear-page>
SLEEPER=1m

# no need to make changes from here on

# subfunctions

online ()
{
INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L +scroll < $tty
done
}

offline ()
{
INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L -scroll < $tty
done

}

# main

while [ -e $STATIC ]; do

sleep $SLEEPER

offline
/usr/bin/wget -q --output-document=$TEMPFILE \
--http-user=$USER --http-passwd=$PASS --tries=3 \
http://$ROUTER/$PAGE || continue

/usr/bin/lynx -force_html -dump $TEMPFILE | \
grep -a -B 1 -m 1 "IP A" | grep 0.0.0.0 1>/dev/null 2>&1
if [ $? = 0 ]; then
offline
else
online
fi

rm $TEMPFILE
done
</font><hr></pre></blockquote>

Jochen

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#6 Post by Jochen »

@ratte: Ein "grep 0.0.0.0" sucht nach einer Zeichenkette, aus 4 Nullen mit beliebigen Zeichen dazwischen besteht. Das könnte auch der Grund für Dein Problem mit dem -v gewesen sein. Mach besser ein <pre>grep '0\<!--no-->.0\<!--no-->.0\<!--no-->.0'</pre>So gilt dann tatsächlich nur "0.0.0.0" als Treffer.

Jochen

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#7 Post by ratte »

wohl war, jedoch kann da nichts passieren, da keine ip adresse mit fuehrenden nullen notiert wird bzw. das erste byte eine null sein kann.

natuerlich ist das "richtiger" und du hast vollkommen recht, ich aber auch :)

ratte

Jochen

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#8 Post by Jochen »

Nu je, Du hast den unbestrittenen Vorteil, den Output des Netgear-Routers zu kennen. Aber was, wenn ab dem nächsten Firmware-Update auch die Zahl übertragener Bytes mit ausgegeben werden? Beispielsweise 20304050 Bytes? <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Aber schon OK, ich pack meinen Oberlehrer jetzt auch wieder weg. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> Ist halt nur defensive Programmierung, weil ich mit der offensiven schon hinreichend schlechte Erfahrungen gemacht habe...

Jochen

Jochen

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#9 Post by Jochen »

Nu je, Du hast den unbestrittenen Vorteil, den Output des Netgear-Routers zu kennen. Aber was, wenn ab dem nächsten Firmware-Update auch die Zahl übertragener Bytes mit ausgegeben werden? Beispielsweise 20304050 Bytes? <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Aber schon OK, ich pack meinen Oberlehrer jetzt auch wieder weg. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> Ist halt nur defensive Programmierung, weil ich mit der offensiven schon hinreichend schlechte Erfahrungen gemacht habe...

Jochen

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#10 Post by ratte »

Mit der http loesung war ich nicht so richtig zufrieden, deshalb habe ich mich an die zweite loesung rangemacht. Schliesslich erzeugt man mit der http loesung zusaetzlichen verkehr auf der leitung und stresst die cpu des routers, der besseres zu tun hat, naemlich zu routen. ausserdem hat die (kurze) praxis gezeigt, dass nicht jeder http-request mit wget von erfolg gekroent ist, warum auch immer.

also das router protokoll untersuchen ist die guenstigere loesung.
die ist uebrigens RFC konform und sprengt auch bei firmware-upgrades die programmlogik nicht, aussser das RIP-1 protokoll wird begraben :( aber alles ist vergaenglich...

also, die aufgabe war, innerhalb des zeitrahmens von 30 sekunden (und etwas mehr) die routerinformationen aus dem verkehr auf dem interface rauszugreppen.

zeitkritische programmierung in bash, das war eine interessante herausforderung, da man tcpdump nicht sagen kann, horche mal 30 sekunden auf das interface.

das script ist dokumentiert, der interessierte leser kann nachvollziehen, wie ich das geschafft habe.

neuland war auch, aus einer information nicht zeilenweise auszulesen, sondern nur teile der zeile. in perl waere das mit regular expressions ja ein klacks gewesen, in bash musste ich mich an sed mit versuch und irrtum herantasten.
sed-profis koennen ja vielleicht mal kommentieren, wieso das ausschneiden der "actual internal ip" funktioniert und wie man's besser machen kann. rein logisch finde ich naemlich, dass die sed pattern die ip nicht treffen duerften, die praxis zeigte aber, dass sie's tun.

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh

#
# script for bootup or $HOME/.bash_login scripts,
# to automagically highlight the scroll led over
# all 8 ttys if we are online with our netgear-
# router, elso downlight them.
# additionally, the online status is dumped to
# INFOFILE.
#
# STATIC keeps the script running, simulating it
# as a deamon (is listed at ps).
# TEMPFILE is needed to pass information and
# automatically deleted. If powerdown or else,
# del /tmp/onlinefile*
#
# you have to enable RIP with the direction "Both"
# or "Out Only" and the version RIP-1 to match
# against the scripts logic.
# RIP-1 sends router information every 30 seconds.
# a sample tcpdump:
#
# 18:46:06.374316 <netgear-ip>.route > <three bytes net>.255.route:\
# RIPv1-resp [items 2]: {0.0.0.0}(1) {<actual internal ip>}(1) [ttl 1]

STATIC="/bin/sh"
MYTTY=`/usr/bin/tty`
TEMPFILE="/tmp/onlinefile$$"
INFOFILE="/tmp/OnlineStatus"
TAKETIME="/bin/date"
NETWATCH="/usr/sbin/tcpdump"
NETWATCH_OPTION_1="-q -c 1 -p -s0 -i eth1 -n port 520 -w $TEMPFILE"
NETWATCH_OPTION_2="-r $TEMPFILE"
MATCH="port 520"

# subfunctions

online ()
{
INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L +scroll < $tty
done
echo online > $INFOFILE
}

offline ()
{
INITTY=/dev/tty[1-8]
for tty in $INITTY; do
/usr/bin/setleds -L -scroll < $tty
done
echo offline > $INFOFILE
}

# simulate deamon

while [ -e $STATIC ]; do

# get start- and endtime in seconds

NOW=`$TAKETIME +%s`
let THEN=$NOW+35

# send tcpdump into background

HIT=`$NETWATCH $NETWATCH_OPTION_1` &

# save tcpdumps PID to kill the process in case

MYPS=`ps ax | grep tcpdump | grep "$MATCH" `
MYPID=`echo $MYPS | sed -n -e "s/ .*//p"`

# time loop to not exceed 35 seconds

while [ $NOW -lt $THEN ]; do

NOW=`$TAKETIME +%s`
done

# in case of, kill tcpdump with no grace

killall -9 $MYPID

# read what we have recieved from tcpdump

HIT=`$NETWATCH $NETWATCH_OPTION_2`

# extract the second ip named "actual internal ip" above

ONLINE=`echo $HIT | sed -n -e "s/^.*{//p"| sed -n -e "s/}.*$//p"`

# test, if we recieved information at all

if [ $ONLINE ]; then

# second ip is 0.0.0.0 if the router is offline

if [ $ONLINE == "0.0.0.0" ]; then
offline
else
online
fi
else
offline
fi
rm $TEMPFILE
done
</font><hr></pre></blockquote>

ratte

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#11 Post by ratte »

ein kleinigkeit ist noch nachzureichen:

so, wie das script vorliegt, verbratet es zuviel cpu-zeit.

es muessen zwei zusaetzliche zeilen eingefuegt werden:

oben, bei der variablenvereinbarung:

<b>SLEEPER="/bin/sleep"</b>

in der mitte, bei der 35 sekunden zeitschleife in der while schleife eine zeile

<b>$SLEEPER 1s</b>

einfuegen, sodass

<i>NOW=`$TAKETIME +%s`</i>

in der zeile darunter ist.

ratte

Jochen

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#12 Post by Jochen »

Wie Du Dir sicher denken konntest, muss ich natürlich wieder eine Meinung dazu haben... <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Wenn Du die PID des Hintergrundprozesses brauchst, gibt sie Dir die Shell in der Variablen $!. Und die Warteschleife ist m.E. gänzlich unnötig - warum sagst Du nicht direkt, dass die Shell 30 Sek. warten soll? Dementsprechend wäre meine Lösung so:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
HIT=`$NETWATCH $NETWATCH_OPTION_1` &
NETWATCH_PID=$! # Da immer nur die PID des zuletzt in den Hintergrund geschickten Prozesses gemerkt wird
sleep 35
kill $NETWATCH_PID >/dev/null 2>&1 # Nicht mit SIGKILL, tcpdump sollte hinter sich aufräumen dürfen
</font><hr></pre></blockquote>
Ansonsten ein paar Kommentare:

Die Funktionen online() und offline() sind fast gleich, bis auf die Option zu setleds. Da Funktionen aber auch Parameter verstehen, würde ich hier ein bisschen vereinfachen. Nenne die Funktion "leds" und setze als erste Zeile<pre>[ "$1" = "on" ] && SCROLL_OPTION=+scroll && SCROLL_OPTION=-scroll</pre>Und setleds wird dann mit<pre>setleds -L $SCROLL_OPTION <$tty</pre>aufgerufen. Nutzen kannst Du die Funktion dann mit ""leds on" und "leds off".

Ach ja, apropos tty: Es ist deshalb Konvention, Variablennamen in der Shell gross zu schreiben, da UNIX-Programme per Konvention kleingeschriebene Namen haben. So kann man sie gut unterscheiden. Und da es ja auch ein Kommando "tty" gibt, sollte man den Namen hier vielleicht mal ändern.

Das Skript ist schön Bourne-Shell-konform. Wenn Du aber nun mal die bash verwendest, kannst Du auch deren Vorteile nutzen, wie z.B. lokale Variablen in Shellfunktionen (local INITTY=...).

Ein<pre>trap 'rm -f $TEMPFILE; exit 32' 0</pre> sorgt dafür, das Zwischendateien bei Abbruch des Skripts immer gelöscht werden.

Und zum sed sage ich später was, wenn ich nicht ganz so müde bin. Gute Nacht denne!

Jochen

rattengift

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#13 Post by rattengift »

> lokale Variablen in Shellfunktionen (local INITTY=...).

eeecht? das geht? werde ich sogleich verwenden (bin auch grade am skript-basteln). danke und gute nacht.

ratte

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#14 Post by ratte »

ja Jochen, auf deine kritik war ich sogar gespannt, vielen dank fuer die lehrstunde.

mit deinen vorschlaegen bin ich einverstanden und habe sie in mein script auch eingepflegt und auch verstanden (wenn auch noch nicht gewusst).

die einfuegung der trap zeile konnte ich jedoch nicht sicherstellen bezueglich des orts (man bash is overwhelmed :)
gleich nach den variablenvereinbarungen ist ok, oder?

ratte

rattengift

Re: On-/Offline-Modus von DSL-Hardwarerouter per Software anzeigen lassen ...

#15 Post by rattengift »

@Jochen:
> <font face="Courier New">[ "$1" = "on" ] && SCROLL_OPTION=+scroll && SCROLL_OPTION=-scroll</font><!--fixed-->

muss wohl heissen:
<font face="Courier New">[ "$1" = "on" ] && SCROLL_OPTION=+scroll || SCROLL_OPTION=-scroll</font><!--fixed-->

@ratte:
soweit ich mich erinnere bevorzugst du ja die textconsole. aber wie ist das denn unter x/kde, etc mit setleds? was muss man da beachten? was muss ich zusätzlich tun, damit es klappt? ich könnte das für eine ähnliche anwendung auch grade gut gebrauchen.

Post Reply