On- und Offline- Status des fli4l-Routers auf der Homepage

Hier soll aufgezeigt werden, wie man auf der eigenen Homepage eine Status-Seite erstellt, auf der der On- oder Offline-Status des eigenen fli4l-Routers ersichtlich ist. Wird diese Website angesurft, während der eigene Router offline ist, erscheint eine frei definierbare Website, wo z.B. zu lesen ist: Sorry, bin offline.

Ist man online, erscheint eine auf dem eigenen HTTP-Server liegende Seite, die die aktuelle IP enthält.
Das ganze funktioniert allerdings nur, wenn im Browser des Besuchers JavaScript aktiviert ist.

ACHTUNG!

Die öffentliche Weitergabe der eigenen IP-Adresse kann ein sehr grosses Sicherheitsrisiko sein! Jeder Fremde, der diese IP-Adresse kennt, könnte versuchen, in den eigenen Rechner einzudringen. Falls dieser Versuch glückt, könnten Persönliche Daten, wie z.B. Passwörter, von Fremden eingesehen werden, oder es könnte sogar im Extremfall die gesamte Festplatte gelöscht werden. Ich übernehme da natürlich keine Haftung. Jeder handelt auf eignes Risiko!
Um wenigstens etwas Sicherheit zu haben, sollte man diese öffentliche Website in einem geheimen Verzeichnis der Homepage verstecken, und diese URL nur guten Freunden mitteilen. Wenn der Provider es anbietet, besteht auch die Möglichkeit den Zugriff mit einem Passwort zu sichern.

Voraussetzungen

Benötigt wird Webspace beim Provider mit FTP-Zugriffsmöglichkeit.
Ein laufender HTTP-Server auf dem fli4l-Router, der von aussen erreichbar sein muss. Nicht ausreichend ist der interne Mini-HTTPD, der für das Webinterface vom Router benötigt wird!
Es muss ein zweiter HTTP-Server eingerichtet werden. Wie man das macht, stehtMini-Howto fuer fli4l als Mini-Webserver von Florian Zierer
Wer, wie im oben genannten HOWTO erwähnt, keine Festplatte hat, oder sie nicht nutzen will, kann, wenn noch genügend Platz auf der Diskette ist, das Verzeichnis des 2. HTTP-Servers auch so legen, dass es über die Bootdiskette in die RAM-Disk entpackt wird. Der Vorteil hierbei: Die Platte läuft bei Zugriff nicht an, wenn sie per hdparm schläft.

Gelesen und ausprobiert haben sollte man das Mini-Howto fuer IP-Aktualisierung auf einer HTML-Seite von Carl Kossack. Ich werde den Upload der HTML-Seite jedoch nicht aus der /etc/portfw.sh heraus starten, sondern aus der /etc/ppp/ip-up.user. Das, um auch eine andere Möglichkeit aufzuzeigen. Ausserdem ist bei dieser Methode kein portforwarding nötig. Ich werde mich aber ansonsten, soweit möglich, an den im oben genannten HOWTO beschriebenen Weg halten. Wichtig ist, dass ftp auf dem Router installiert, sowie der Port 80 in der Firewall-Konfiguration nicht gesperrt ist, wie im Mini-Howto fuer IP-Aktualisierung auf einer HTML-Seite beschrieben ist.

Funktionsweise, Technik

Auf dem eigenen HTTP-Server wird ein kleines transparentes GIF-Image abgelegt (transparent.gif).
Auf dem Homepage-Server des Providers wird eine HTML-Seite abgelegt (offline.html). Sie enthält den Text: Sorry, bin offline!
Bei jeder Interneteinwahl wird eine Web-Seite auf den Homepage-Server des Providers geladen. Diese HTML-Seite enthält die Aktuelle eigene IP-Adresse in Form einer URL. Diese URL zeigt zu unserem Rechner, auf die online.html.

Wird nun die Seite angesurft, wird per JavaScript geprüft, ob das transparent.gif auf unserem Rechner erreichbar ist. Wenn es geladen werden konnte, erscheint automatisch die online.html von unserem eigenen Rechner, sofern man noch online ist.
Ist man nicht mehr online, ist das transparent.gif nicht erreichbar. In diesem Fall erscheint nach einem kurzen einstellbaren Timeout, während die Uhrzeit unserer letzen Onlineverbindung angezeigt wird, die auf dem Homepage-Server des Providers liegende offline.html.
Der Timeout ist nötig, weil es ohne ihn ewig dauert, bis der Timeout des Homepageservers abgelaufen ist.

Dateien

Ausgehend von: fli4l 2.0.3-Downloadverzeichnis/ opt/files/usr/mybin/vorlage.txt: ist die Seite, die bei jeder Interneteinwahl hochgeladen wird
opt/etc/ppp/ip-up.user: Stellt die momentane IP zur Verfügung, leitet den FTP-Upload ein

mini_httpd2/online.html: Eine HTML Seite die ebenfalls aus der /etc/ppp/ip-up.user heraus generiert wird, und die IP-Adresse enthält.
dein_provider/geheim/offline.html: Die offline-Seite

Folgende opt-Pakete müssen installiert und eingerichtet sein:

httpd: Mini-Webserver für Status-Ausgaben
inet: Telnet/FTP/SSH-Server (FTP wird benötigt)
tools: Diverse Linux-Programme als Tools (OPT_FTP wird benötigt als FTP Client)

An die Arbeit;-)

Zuerst wird ein Verzeichnis auf dem Homepage-Server des Providers erstellt. Im Folgenden dein_provider/geheim/ genannt. In dieses Verzeichnis kopieren wir eine HTML-Seite beliebigen Inhalts, z.B. der Mitteilung: Sorry, bin zur Zeit offline, probiere es später noch mal!. Diese HTML-Seite soll offline.html genant werden.

Nun muss ein Verzeichnis für den zweiten HTTP-Server erstellt und/oder gemountet (eingebunden) werden. Entweder nutzt man dafür eine Partition der Festplatte, oder die RAM-Disk.
Dieses Verzeichnis soll unsere Homepage-Dateien auf dem Router aufnehmen. Da der Mini-HTTP für die Stastusanzeige in .../usr/local/htdocs hat, kommen unsere eigenen Dateien der Einfachheit halber nach .../usr/local/htdocs2. Dieses Verzeichnis ist zu erstellen, bzw als solches zu mounten.
Im Verzeichnis des 2. HTTP-Servers unseres fli4l-Routers wird nun ein kleines Image abgelegt, im Folgenden transparent.gif genannt. Dieses Image soll winzig klein und transparent sein. Wer so etwas nicht selber erstellen kann, kann es sich bei mir herunterladen: transparent.gif

Nun wird in fli4l-2.0.1/opt/files/usr/local/mybin die Datei vorlage.txt erstellt, mit folgendem Inhalt:

<html><head>
<meta http-equiv="expires" content="0">
<meta http-equiv="pragma" content="no-cache">
<meta name="robots" content="noindex, nofollow">
<title>forwarder</title>
<script language="JavaScript">
<!--
setTimeout("location.href='offline.html'",2000)
//-->
</script>
</head>
<body>
<br><br><br><br><br><br><br>
<table align="center" border="0">
<tr><td>
Sie werden gleich weitergeleitet!<br>
<br>
<br>
Diese Seite wurde am _datum_  um  _uhrzeit_  Uhr erstellt.<br>
</td></tr>
</table>
<table height="100%"><tr><td> </td></tr></table>
<img src=http://_ip_/transparent.gif border=0 width=0 height=0
onLoad="window.location.href='http://_ip_/online.html';">
</body></html>

Die vorlage.txt in fli4l-2.0.3/opt/files/opt/usr/local/mybin ist, nachdem eine neue Diskette erstellt worden ist, sowie ein Reboot gemacht wurde, später auf dem fli4l-Router zu finden in: /usr/local/bin/vorlage.txt. Sie wandert also von usr/local/mybin nach /usr/local/bin, sozusagen;-) Genau genommen wandert sie nicht, es wird lediglich ein Softlink von usr/local/mybin zu /opt/files/opt/usr/local/mybin erstellt. Das nur der Vollständigkeit halber.

Als nächstes wird die fli4l-2.0.3/opt/etc/ppp/ip-up.user angepasst. Folgendes bitte übernehmen:

#!/bin/sh
#-------------------------------------------------------
# /etc/ppp/ip-up.user
#
# Enter your specific commands here, wget etc.
#
# Creation:       08.09.2000  fm
# Last Update:  15.11.2001  asta
#-------------------------------------------------------
# Seite generieren
    export datum=$(date "+%d.%m.%Y")
    export time=$(date "+%H:%M:%S")

# Alle sed-Anweisungen in einer Zeile !!!
# [ _ip_ wird durch Inhalt $ip, _datum_ durch $datum und _time_ durch $time ersetzt.....]
    /usr/bin/sed -e 's/_ip_/'$4'/g' /usr/local/bin/vorlage.txt | /usr/bin/sed -e 's/_datum_/'$datum'/g' | /usr/bin/sed -e 's/_uhrzeit_/'$time'/g' > /tmp/datei.txt
 
# Ãœbertragen der Seite...
#################################################################################
 
/bin/echo "machine dein_provider.de login dein_login password GEHEIM" > /.netrc
chmod 600 /.netrc
(/bin/echo "cd public_html/geheim/"; /bin/echo "send /tmp/datei.txt index.html"; echo "bye" ) |
/usr/bin/ftp provider.de
rm /tmp/datei.txt
 
/bin/echo "<html>
      <head><title>Aktuelle Daten von `hostname`</title></head>
      <body>
      <h3>Hello! You are visiting my privat webserver.</h3>
      <h2>If you can read this, I am online now!</h2>
 
      <br>
      Technical referense:<br>
      Hostname: `hostname`<br>
      Linux: fli4l v `cat /etc/version`, the on(e)-disk-router <br>
      P166MMX, 64 MB SDRAM, 2xFloppy, 540 MB HDD, 1xFritz!Card PCI, 2x NE2000 comp ISA Ethernet 10 MBit<br>
      <h3>Uptime (my fli4l-router is running since): " > /usr/local/htdocs2/online.html

MYTIME=`/bin/cat /proc/uptime | /usr/bin/cut -d' ' -f1 | /usr/bin/cut -d'.' -f1`
SEC=`/usr/bin/expr $MYTIME % 60`
MYTIME=`/usr/bin/expr $MYTIME / 60`
MIN=`/usr/bin/expr $MYTIME % 60`
MYTIME=`/usr/bin/expr $MYTIME / 60`
HRS=`/usr/bin/expr $MYTIME % 24`
DAYS=`/usr/bin/expr $MYTIME / 24`
/bin/echo "$DAYS Days $HRS:$MIN:$SEC" >> /usr/local/htdocs2/online.html
 
/bin/echo " </h3>
      <h2><b>IP-Adresse: $4</b></h2>
      <h4>Use this IP for connections with me!</h4>
      <br><br><br>
      <h3>Automaticaly generated file: `date`.</h3>
      </body>
      </html>" >> /usr/local/htdocs2/online.html

# KEIN exit 0 am Ende der ip-up.user für fli4l 2x !

/usr/local/htdocs2/online.htm ist an die eigenen Gegebenheiten anzupassen (3 Mal in obiger Auflistung). Je nachdem, wo das httpd-Verzeichnis für den 2.Webserver eingerichtet wurde, muss der PATH hier angegeben werden.
Die Variable, die die IP enthällt, war bei fli4l 1.6.x in der /usr/local/bin/ip-up: $1, bei fli4l ab 2.0.1 in der /etc/ppp/ip-up.user hingegen ist es nun: $4, oder $local. Ich bitte dieses bei einem Update zu beachten. 
Die ip-up.user füllt erst die vorlage.txt aus, und speichert sie inklusive der eingesetzten Variablen als /tmp/datei.txt.
Die /tmp/datei.txt wird per ftp nach http:/provider/homepage/geheim/index.html geladen, und anschliessend gelöscht.

Danach wird eine zweite HTML-Seite per echo-Anweisung generiert und auf unserem HTTP-Server als online.html gespeichert (Path anpassen!!), Auch hier gibt es ein paar leckere Features. Die Variable hostname wird automatisch durch den Namen des FLI4L-Routers ersetzt. Ausserdem enthält die Seite die Uptime des Routers:-). Für den Uptime-Script-Teil möchte ich den Mitgliedern der Mailingliste und Newsgroup spline.fli4l danken. Ich weiss leider nicht mehr, wer obiges gepostet hat. Deswegen kann ich keinen Namen nennen, sorry.

2. Mini-HTTPD starten

Das einbinden des 2. Mini-HTTPD habe ich genau so gemacht, wie es Mini-Howto fuer FLI4L als Mini-Webserver von Florian Zierer für die fli4l-Version 1.6.x beschrieben ist. 
In der fli4l-2.0.3/opt/etc/rc.d/rc350.httpd wird einfach folgendes eingefügt:

[snip script]
#-------------------------------------------------------------------------
# start mini_httpd and restart it, if it is killed
#-------------------------------------------------------------------------
cd $docroot
{ trap "" 1
  while true; do
    /usr/local/sbin/mini_httpd -D -p $HTTPD_PORT -u root -c "**.cgi" 2>&1 | $log
  done
} &
cd /

#-------------------------------------------------------------------------
# start des 2. Webservers auf port 80
#-------------------------------------------------------------------------
cd /usr/local/htdocs2        # Verzeichniss in dem die HTML Seite zu finden ist
/usr/local/sbin/mini_httpd -u root -c "*.cgi" -p 80
cd /

Wobei der normale, erste Mini-HTTPD für die Statusanzeige in der httpd.txt auf Port 81 zu konfigurieren ist. Der 2 Mini-HTTPD läuft auf Port 80.:

#------------------------------------------------------------------------------
# Optional package: HTTP-Server for Monitoring
#------------------------------------------------------------------------------
OPT_HTTPD='yes'                  # install mini web server: yes or no
HTTPD_PORT='81'                 # http port, see also FIREWALL_DENY_PORT_x !

Port 80 ist in der base.txt für Zugriffe von aussen freizuschalten:

FIREWALL_DENY_PORT_3='54:79    REJECT'  # privileged ports: reject or deny
FIREWALL_DENY_PORT_4='81:112    REJECT' # 80 für httpd-2 geöffnet

Das war es schon. Nun wird eine neue Diskette erstellt, oder die neue Konfiguration per FTP auf den Router übertragen, und ein Reboot gemacht. Die Dateien ip-up.user oder die vorlage.txt lassen sich auch zur Laufzeit per FTP austauschen. Geht schneller, wenn man noch am Rumprobieren ist;-)
Nun kommt der grosse Augenblick: Eine Anwahl wird ausgelöst. Dabei sollte die vorlage.txt generiert und zu unserem Provider transferiert werden.
Den Lieblingsbrowser nehmen, und diese Seite aufrufen. Am Besten über den Proxy des Providers. dein_provider.de/geheim/index.html.
Jetzt gibt es 3 Möglichkeiten: Du hast etwas falsch gemacht, ich habe etwas falsch gemacht, die 3. Möglichkeit: Es funktioniert:-)
Den offline-Status kann am Besten ein Freund testen. Oder falls eine 2. vom Router unabhängige Internetverbindung vorhanden ist, damit. Oder noch einfacher: Einfach das transprent.gif auf dem laufenden Router umbenennen. Es befindet sich dort in /usr/local/htdocs2, oder welches Verzeichnis auch immer für den 2. Minni-HTTPD gewählt wurde.
Umbenannt wird es durch folgende Eingaben direkt auf dem Router:

mv /usr/local/htdocs2/transparent.gif /usr/local/htdocs2/umbenannt.gif

mv bedeutet move, verschieben
verschiebe alte_Datei nach neue_Datei
Nun kann das transparent.gif nicht mehr gefunden werden, so als wenn man offline währe
Nicht vergessen es nacher wieder zuzückzubenennen:
mv /usr/local/htdocs2/umbenannt.gif /usr/local/htdocs2/transparent.gif

Kleiner Tip: Wenn der online-Status funktioniert, dann kann man sich die dein_provider.de/geheim/index.html per ftp auf den eigenen Rechner holen, umbenennen (z.B. in test.html) und per ftp wieder zurück schieben. Einmal auflegen und wieder anwählen, damit wir eine andere IP bekommen. Nun die test.html im Browser aufrufen. Da wir inzwischen eine andere IP bekommen haben, sind wir aus Sicht der test.html quasi offline;-)
Der Timeout vor der Weiterleitung zur offline.html kann in der vorlage.txt mittels setTimeout("location.href='offline.html'",2000) eingestellt werden. Angegeben sind Millisekunden. Unter 1000 sollte man nicht gehen, da die Verbindung zum eigenen Webserver langsam sein kann, wenn z.B. die Platte erst anlaufen muss.
Wenn alles funktioniert können die offline.html, und die online.html sowie auch die automatisch generierte index.html (über die vorlage.txt) an ein persönliches Layout angepasst werden.
Zum Beispiel kann anstatt auf die online.html (auf dem eigenen Rechner) auf ein Frameset verwiesen werden dass links ein eigenes Menüe und rechts die online.html enthält. So hat man eine Webpräsenz auf dem eigenen Rechner;-)

T-Online-User, bitte folgendes beachten:

In der ip-up.user muss der FTP-Upload-Teil angepasst werden. Wenn man zu T-Online FTP macht, ist man ohne Login und Passwort, gleich drin. Trotzdem gibt es ein Passwort sowie einen Login, der für alle T-Online-User gleich lautet:

Login: ftp
Passwort: . (ein Punkt)


Ferner funktionierte der Upload der Seite nur mit dem Zusatz "passive". Der Weg zu dieser Erkenntnis war lang: ca 100 eMails, und ein Login per SSH;-) 
Für T-Online-User sieht der Upload-Teil dann so aus, statt wie weiter oben aufgelistet:

# Ãœbertragen der Seite...
#################################################################################
 
/bin/echo "machine dein_provider.de login ftp password ." > /.netrc
chmod 600 /.netrc
(/bin/echo "passive"; /bin/echo "cd public_html/geheim/"; /bin/echo "send /tmp/datei.txt index.html"; /bin/echo "bye" ) |
/usr/bin/ftp provider.de
rm /tmp/datei.txt

Ich wünsche allen FLI4L-Usern viel Spass mit diesem Feature;-)I

Wer das ganze einmal ausprobieren möchte, für den habe ich in ein Verzeichnis meiner Homepage alle benötigten Dateien abgelegt, und für diesen Test modifiziert.. Dort kann das ganze aufgerufen werden. Es wird hier nicht auf meinen tatsächlichen Rechner gezeigt, sondern nur auf eine vorhandene und eine nicht vorhandene Datei. Nur die Funktion an sich soll gezeigt werden.
ON-Line-Test
OFF-Line Test

Danksagung

Danken möchte ich folgenden Personen, ohne die dieses Mini-HOWTO nicht möglich gewesen wäre:
Matthias Sennewald für die Idee es per JavaScript zu realisieren. Ausserdem hat Matthias die Generierung der vorlage.txt erstellt.
Den Lesern der FLI4L-Mailingliste sowie der Newsgroup spline.fli4l.
Danke für die gute Zusammenarbeit. Wie man sieht, zahlt sich Teamwork aus:-)

Fehler oder Verbesserungen bitte an mich senden! Danke:-)

First upload: 10.12.2001
Last update : 24.12.2003

Arnim Staschke     http://www.staschke.de