imond ist ein netzwerkfähiges Server-Programm, welches bestimmte Anfragen beantwortet oder auch Kommandos zur Steuerung des Routers entgegennehmen kann.
Ausserdem steuert imond das Least-Cost-Routing. Dazu verwendet er eine Konfigurationsdatei /etc/imond.conf, welche beim Booten automatisch aus den ISDN_CIRC_x_XXX-Variablen der Datei config/isdn.txt und anderen über ein Shell-Script erzeugt wird.
imond läuft permanent als Daemon und horcht gleichzeitig auf TCP/IP-Port 5000 und Device /dev/isdninfo.
Folgende Kommandos sind über den TCP/IP-Port 5000 möglich:
addlink ci-index | Channel zum Circuit hinzufügen (Channel-Bundling) |
adjust-time seconds | Ändert die Uhrzeit des Routers um die angegebenen Sekunden |
delete filename pw | Löscht die Datei auf dem Router |
hup-timeout #ci-index [value] | Anzeigen bzw. Setzen des HUP-Timeout für ISDN-Circuits |
removelink ci-index | Zusätzlichen Channel wieder entfernen |
reset-telmond-log-file | Löschen der telmond-Protokolldatei |
reset-imond-log-file | Löschen der imond-Protokolldatei |
receive filename #bytes pw | Eine Datei auf den Router übertragen. Dazu quittiert imond den Befehl mit einem ACK (0x06). Danach wird die Datei in 1024er-Blöcken übertragen, die imond auch jeweils mit einem ACK bestätigt. Als letztes übermittelt imond noch ein OK. |
send filename pw | Wenn das Passwort stimmt und die Datei existiert, liefert imond ein OK #bytes. Anschliessend überträgt imond die Datei in 1024er Blöcken, die jeweils mit einem ACK (0x06) bestätigt werden müssen. Als letztes liefert imond noch ein OK. |
support pw | Liefert den Status/Konfiguration vom Router |
sync | Synchronisiert den Cache von gemounteten Laufwerken |
dial | Wählt den Provider an (Default-Route-Circuit) |
dialmode [auto|manual|off] | Liefert bzw. setzt den Dialmode |
disable | Hängt ein und setzt dialmode auf ``off'' |
enable | Setzt dialmode auf ``auto'' |
halt | Fährt den Router sauber herunter |
hangup [#channel-id] | Hängt ein |
poweroff | Fährt den Router herunter und schaltet ab |
reboot | Reboot vom i4l-Router! |
route [ci-index] | Setzen Default-Route auf Circuit X (0=automatisch) |
channels | Ausgabe Anzahl der verfügbaren ISDN-Kanäle |
charge #channel-id | Ausgabe der Online-Kosten für einen Channel |
chargetime #channel-id | Online-Zeit unter Berücksichtigung des Taktes |
circuit [ci-index] | Ausgabe eines Circuit-Namens |
circuits | Ausgabe Anzahl der Default-Route-Circuits |
cpu | Liefert die Auslastung der CPU in Prozent |
date | Ausgabe Datum/Uhrzeit |
device ci-index | Liefert das Device des Circuits |
driverid #channel-id | Ausgabe Driver-Id für Channel X |
help | Ausgabe Hilfe |
inout #channel-id | Ausgabe der Richtung (incoming/outgoing) |
imond-log-file | Ausgabe imond-Protokolldatei |
ip #channel-id | Ausgabe der IP |
is-allowed command | Ausgabe, ob Befehl konfiguriert/gültig
ist
Mögliche Befehle: dial|dialmode|route|reboot| imond-log|telmond-log|mgetty-log |
is-enabled | Ausgabe, ob dialmode auf off (0) oder auto (1) |
links ci-index | Ausgabe Anzahl momentaner Channel 0, 1 oder 2, 0 heisst: Kein Channel-Bundling möglich |
log-dir imond|telmond|mgetty | Liefert das Logverzeichnis |
mgetty-log-file | Ausgabe mgetty-Protokolldatei |
online-time #channel-id | Ausgabe Online-Zeit der akt. Verbindung in hh:mm:ss |
pass [password] | Abfrage, ob Password nötig bzw. Password-
Eingabe
1 Userpassword gesetzt 2 Adminpassword gesetzt 4 imond befindet sich im Admin-Modus |
phone #channel-id | Ausgabe Telefonnummer/Name des ``Gegners'' |
pppoe | Liefert die Anzahl der pppoe-Devices (also 0 oder 1) |
quantity #channel-id | Liefert die übertragenen Datenmengen (in Byte) |
quit | Beenden der Verbindung zu imond |
rate #channel-id | Ausgabe Übertragungsraten (incoming/outgoing in B/sec) |
status #channel-id | Ausgabe Status für Channel X |
telmond-log-file | Ausgabe telmond-Protokolldatei |
time #channel-id | Ausgabe Summe Online-Zeiten, Format hh:mm:ss |
timetable [ci-index] | Ausgabe der Zeittabelle für LC-Routing |
uptime | Ausgabe der Uptime des Routers in Sekunden |
usage #channel-id | Ausgabe Art der Verbindung, mögliche Antworten: Fax, Voice, Net, Modem, Raw |
version | Ausgabe der Protokoll- und Programm-Version |
Der TCP/IP-Port 5000 ist nur vom maskierten LAN aus erreichbar. Standardmäßig wird ein Zugriff von aussen über die Firewall-Konfiguration abgeblockt.
Imond unterstützt zwei Benutzerebenen: den User- und den Admin-Modus. Für beide Ebenen kann ein Passwort gesetzt werden mittels IMOND_PASS bzw. IMOND_ADMIN_PASS. Dadurch werden die imon-Clients von imond gezwungen, eine Password-Abfrage durchzuführen und anschließend das Password an imond zu übertragen. Solange dieses Password nicht übermittelt wurde, nimmt imond nur die beiden Kommandos ``pass'' und ``quit'' entgegen. Alle anderen werden mit einem Fehler zurückgewiesen.
Möchte man das weiter einschränken, z.B. den Zugriff nur von nur einem PC erlauben, muss die Firewall-Konfiguration angepasst werden.
Die Befehle
enable/disable/dialmode dial/hangup route reboot/halt
können durch die Konfigurationsvariablen IMOND_XXX global ein- oder abgeschaltet werden (s. Kapitel ``Konfiguration'').
Mit einem Unix/Linux-Rechner (oder einem Windows-Rechner in der DOS-Box) kann man das Ganze leicht ausprobieren:
Nach Eingabe von
telnet fli4l 5000 \# oder entsprechender Name des fli4l-Routers
kann man direkt die oben aufgeführten Kommandos eingeben und sich die Ausgabe anschauen.
Zum Beispiel bekommt man mit ``help'' die Hilfe angezeigt, mit ``quit'' wird die Verbindung zum imond abgebaut.
imond konstruiert aus der Konfigurationsdatei /etc/imond.conf (welche wiederum beim Booten aus den Konfigurationsvariablen ISDN_CIRC_x_TIMES usw. erstellt wird), eine zeitabhängige Tabelle (Time-Table). Diese umfasst eine komplette Kalenderwoche im 1-Stunden-Raster (168 Stunden = 168 Bytes). Die Tabelle setzt sich jedoch lediglich aus Circuits zusammen, für die eine Default-Route definert ist.
Mit dem imond-Kommando ``timetable'' kann man sich diese Tabelle anschauen.
Hier ein Beispiel:
Nehmen wir an, dass 3 Circuits definiert wurden, nämlich:
CIRCUIT_1_NAME='Addcom' CIRCUIT_2_NAME='AOL' CIRCUIT_3_NAME='Firma'
wobei lediglich die ersten beiden Circuits mit Default-Routen belegt sind, also die enstprechenden Variablen ISDN_CIRC_x_ROUTE den Wert `0.0.0.0' haben.
Wenn die dazugehörigen Variablen ISDN_CIRC_x_TIMES folgendermaßen aussehen:
ISDN_CIRC_1_TIMES='Mo-Fr:09-18:0.0388:N Mo-Fr:18-09:0.0248:Y Sa-Su:00-24:0.0248:Y' ISDN_CIRC_2_TIMES='Mo-Fr:09-18:0.019:Y Mo-Fr:18-09:0.049:N Sa-Su:09-18:0.019:N Sa-Su:18-09:0.049:N' ISDN_CIRC_3_TIMES='Mo-Fr:09-18:0.08:N Mo-Fr:18-09:0.03:N Sa-Su:00-24:0.03:N'
dann wird daraus folgende Datei /etc/imond.conf:
#day hour device defroute phone name charge ch-int Mo-Fr 09-18 ippp0 no 010280192306 Addcom 0.0388 60 Mo-Fr 18-09 ippp0 yes 010280192306 Addcom 0.0248 60 Sa-Su 00-24 ippp0 yes 010280192306 Addcom 0.0248 60 Mo-Fr 09-18 ippp1 yes 019160 AOL 0.019 180 Mo-Fr 18-09 ippp1 no 019160 AOL 0.049 180 Sa-Su 09-18 ippp1 no 019160 AOL 0.019 180 Sa-Su 18-09 ippp1 no 019160 AOL 0.049 180 Mo-Fr 09-18 isdn2 no 0221xxxxxxx Firma 0.08 90 Mo-Fr 18-09 isdn2 no 0221xxxxxxx Firma 0.03 90 Sa-Su 00-24 isdn2 no 0221xxxxxxx Firma 0.03 90
imond erstellt dann im Speicher folgende Time-Table - hier die Ausgabe über das imond-Kommando ``timetable'':
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 -------------------------------------------------------------------------- Su 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 Mo 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 Tu 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 We 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 Th 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 Fr 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 Sa 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 No. Name DefRoute Device Ch/Min ChInt 1 Addcom no ippp0 0.0388 60 2 Addcom yes ippp0 0.0248 60 3 Addcom yes ippp0 0.0248 60 4 AOL yes ippp1 0.0190 180 5 AOL no ippp1 0.0490 180 6 AOL no ippp1 0.0190 180 7 AOL no ippp1 0.0490 180 8 Firma no isdn2 0.0800 90 9 Firma no isdn2 0.0300 90 10 Firma no isdn2 0.0300 90
Für den Circuit 1 (Addcom) sind also drei Zeitbereiche (1-3) eingetragen, für Circuit 2 (AOL) vier Zeitbereiche (4-7) und für den letzen drei Zeitbereiche (8-10).
In der Time-Table werden jeweils die Indices ausgegeben, welche für die jeweilige Stunde gültig sind. Hier tauchen lediglich die Indices 2-4 auf, da alle anderen keine LC-Default-Routen sind.
Sieht man in der Tabelle irgendwo Nullen, gibt es Lücken in den ISDN_CIRC_X_TIMES-Werten. Dann existiert zu diesen Zeiten keine Default-Route, Internet-Zugang abgeknipst!
Beim Programmstart ermittelt imond zunächst den Wochentag und die aktuelle Stunde. Anschließend wird dann über die Time-Table der Index ermittelt und damit dann auch der entsprechende Circuit. Auf diesen wird dann die Default-Route gesetzt.
Bei Zustandsänderungen der Channels, z.B. Wechsel von online nach offline - jedoch spätestens nach 1 Minute - geht das Spiel von neuem los: Zeit ermitteln, Lookup in Tabelle, Default-Route-Circuit ermitteln.
Ändert sich der aktuell verwendete Circuit, z.B. montags um 18:00 Uhr, wird die alte Default-Route gelöscht, eine vielleicht bestehende Verbindung beendet (sorry...) und anschließend die Default-Route auf den neuen Circuit gesetzt. Dies kann von imond bis zu 60 Sekunden später bemerkt werden, also wird spätestens um 18:00:59 umgeschaltet.
Bei Circuits, die keine Default-Route belegen, ändert sich überhaupt nichts. Hier wird der Inhalt von ISDN_CIRC_x_TIMES lediglich zur Berechnung der Telefonkosten verwendet. Diese können dann relevant sein, wenn man über den Client imonc das LC-Routing temporär ausschaltet und einen Circuit manuell wählt.
Man kann sich jedoch auch die Tabellen für andere Zeitbereich-Indices (im Beispiel von 1 bis 10) anschauen, auch die der ``Non-LC-Default-Route-Circuits''.
Kommando:
timetable index
Beispiel:
telnet fli4l 5000 timetable 5 quit
Die Ausgabe sieht dann so aus:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 -------------------------------------------------------------------------- Su 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Mo 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 Tu 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 We 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 Th 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 Fr 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 Sa 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 No. Name DefRoute Device Ch/Min ChInt 5 AOL no ippp1 0.0490 180
Alles klar?
Mit dem imond-Kommando ``route'' kann das LC-Routing ein- und ausgeschaltet werden. Bei Angabe eines positiven Circuit-Indices (1...N) wird die Default-Route auf den angegebenen Circuit gelegt. Ist der Index 0, wird das LC-Routing wieder aktiviert und der Circuit automatisch ausgewählt.
Das ganze Modell zur Berechnung der Onlinekosten funktioniert nur korrekt, wenn der Zeittakt für einen Circuit (Variable ISDN_CIRC_x_CHARGEINT) über die ganze Woche konstant ist. Dies ist im Normalfall bei Internet-Providern die Regel. Wählt man sich jedoch über die Telekom (ich meine nicht T-Online!) z.B. in sein Firmennetz ein, gilt das als ganz normales Telefongespräch. Und da wechselt ab 18:00 der Takt von 90 Sekunden auf 4 Minuten (Stand Juni 00). Deshalb ist die Definition von
ISDN_CIRC_3_CHARGEINT='90' ISDN_CIRC_3_TIMES='Mo-Fr:09-18:0.08:N Mo-Fr:18-09:0.03:N Sa-Su:00-24:0.03:N'
eigentlich nicht ganz korrekt. Es sind zwar abends umgerechnet auf die Minute 3 Pfennig (4 Minuten kosten 12 Telekom-Pfennige), jedoch ist der Takt falsch. Deshalb können bei der Kostenanzeige Differenzen zu den tatsächlichen Zahlen auftreten.
Hier ist ein Tipp, wie verschieden lange Taktzeiten dennoch richtig berücksichtigt werden können (auch wichtig für ISDN_CIRC_x_CHARGEINT): Man definiert einfach 2 Circuits, einen für tagsüber mit ISDN_CIRC_1_CHARGEINT=`90' und den anderen mit ISDN_CIRC_2_CHARGEINT=`240'. Natürlich muss man dann auch noch ISDN_CIRC_x_TIMES entsprechend wählen, damit tagsüber Circuit 1 und abends Circuit 2 verwendet wird.
Wie gesagt: Bei Nutzung von Verbindungen zu Internet-Providern gibt es das Problem nicht, weil dort der Zeittakt immer konstant ist und lediglich die Kosten pro Minute wechseln (oder gibt es sowas doch??? Ich traue T-* alles zu :-).