ISDNLOG - Version 1.24 - Buseck, den 12-Nov-95  11:08

1. Einleitung
-------------
Die beiden Programme "isdnlog" sowie "isdnrep" ermoeglichen (in Verbindung
mit isdn4linux ;-) eine Protokollierung aller ISDN-Verbindungen, eine
staendige Zustandsanzeige beider B-Kanaele, sowie eine Gebuehrenabrechnung.

  isdnlog
    lauscht staendig am "/dev/isdnctrl0", und schreibt alle Verbindungen
    nach "/var/adm/isdn.log"

  isdnrep
    erstellt eine Gebuehrenabrechnung aus der "isdn.log"

## Damit "isdnlog" auch alle Verbindungen, die nicht mit der ISDN-Karte
## getaetigt werden erfassen kann (Telefon, Fax, Modem  ...) muss der
## Teles-Treiber Version 0.4d (oder hoeher) installiert sein!

Einige Verbindungen werden leider nicht mit Telefonnummer protokolliert.
Dies erklaert am besten Gernot Zander:

: Rausgehende Gespraeche von fremden Geraeten (Teflon, Modem) koennen
: nicht richtig protokolliert werden, weil die Nummer nur ans's Amt
: geschickt, aber nicht _zurueckgeschickt_ wird. Bei eigenen Anrufen weiss der
: Treiber die Nummer zwangslaeufig:-), bei ankommenden wird sie _vom_ Amt
: mitgeteilt.
: Die Karte (und damit teles0.4d) kann nur das mitschreiben, was _vom_
: Amt kommt oder was sie selber _zum_ Amt schickt. Nicht aber, was Fremd-
: geraete _zum_ Amt senden.


2. Erstellung
-------------
Erstellt wird das ganze mittels:

  cd /usr/src
  tar xzf <wo_auch_immer>/isdnlog-<Version>.tar.gz
  cd isdnlog
  make install

Dadurch werden zwei Programme installiert:
  /sbin/isdnlog
  /usr/sbin/isdnrep


3. Die Konfigurationsdatei
--------------------------

Die Konfigurationsdatei "/etc/isdnlog.conf" muss folgendermassen gefuellt
werden:

# @(#)isdnlog.conf   1.00  22-Oct-95  11:42
#
# MSN/EAZ      SymName         Zone   Info-arg's
#
# (Zonen: 1=City, 2=Region 50, 3=Region 200, 4=Fernzone, 5=angrenzende Laender)
############################################################################
*nnnnn         Phone           1      /var/isdn/sounds/dingdong.au
*nnnnn         FAX             1      /var/isdn/sounds/calc.wav
*nnnnn         ISDN            1
nnnnnnnnnnn    EUnet           3      /var/isdn/sounds/dial.au
*nnnnnnnn?     mar             2      /var/isdn/sounds/ring.au
MYMSNS=3
HANGUP=/var/isdn/sounds/hangup.au

Leere Zeilen, sowie Zeilen, die mit einem "#" beginnen, werden als Kommentar
ignoriert.

Ansonsten besteht jede Zeile aus 3 oder 4 - durch mindestens 1 Blank
getrennte - Spalten.

In der ersten Spalte steht eine Telefonnummer. Diese kann die ueblichen
Wildcard-Symbole enthalten, also "?" matched genau ein Zeichen, "*" matched
beliebig viele (also auch "keine") Zeichen, und mit "[]" koennen mehrere
moegliche Zeichen angegeben werden (oder auch eine Range [4-7], oder auch
die Verneinung, also [!6])

In der zweiten Spalte steht eine beliebige Symbolische Beschreibung fuer
diese Nummer ("Mausi", "EUnet" usw.). Diese darf *kein* Blank enthalten!
Weiterhin darf diese Beschreibung maximal 14 Zeichen lang sein.

In der dritten Spalte steht die Tarifzone, in der sich von uns aus gesehen
diese Nummer befindet:

 1 = City (bis 31.12.1995 "Ortszone/Nahzone", bis 20 km)
 2 = Region 50 (bis 31.12.1995 "Regionalzone", bis 50 km)
 3 = Region 200 (bis 31.12.1995 "Weitzone", dann bis 200 km)
 4 = Fernzone (bis 31.12.1995 "Weitzone", dann alles ueber 200 km)
 5 = angrenzende Laender

Wie man sieht, sind bereits die ab 1.1.1996 geltenden Tarife der Telekom
beruecksichtigt. Bei allen Verbindungen in diesem Jahr werden die Zonen
3 und 4 noch gleich behandelt (Weitzone), ab 1.1.96 greifen dann die neuen
Tarife.

In der vierten Spalte kann ein Argument fuer die "-i" Info-Funktion von
isdnlog stehen (siehe dort).

## Die ersten drei Eintraege muessen zwingend die eigenen MSN's / EAZ's sein,
## sonst kann "isdnrep" noch nicht einmal rein- von rausgehenden Anrufen
## unterscheiden !!

Hat man selber mehr als 3 MSN's, muss dies durch einen Eintrag

    	       MYMSNS=x

(z.b. "MYMSNS=5", falls man 5 MSN's hat) bekannt gemacht werden.
Dieser Eintrag kann in einer beliebigen Zeile der "isdnlog.conf" stehen.
Fehlt dieser Eintrag, werden 3 MSN's angenommen.

Aber auch dann gilt weiterhin: ALLE eigenen MSN's muessen als erste Nummern
in der "isdnlog.conf" eingetragen werden!

Durch den Eintrag

               HANGUP=xxx

kann fuer die "-i" Option von isdnlog ein Argument fuer jeden Hangup bereit
gestellt werden.

Falls man sich selbst anrufen moechte, sollten die eigenen Telefonnummern
(diesmal _mit_ Vorwahl, aber ohne vorlaufende "0") wie alle anderen fremden
Gegenstationen eingetragen werden.


4. isdnlog
----------
Gestartet wird isdnlog (am besten gleich in der "/etc/rc.d/rc.isdn") mittels:

         telesctrl /dev/isdnctrl0 1 4
         isdnlog [ -vspr ] [ -mx ] [ -i cmd ] [ /dev/isdnctrl0 | - ] [ & ]

Beim "telesctrl" koennen auch noch weitere Debug-Flags eingeschaltet werden,
isdnlog benoetigt allerdings auf jeden Fall mindestens die "4"

Die Optionen von isdnlog haben im einzelnen folgende Funktion:

  -v     "verbose" isdnlog schreibt den gesamten Output von "/dev/isdnctrl0",
  	 ergaenzt um Datum/Uhrzeit auch nach "/tmp/isdnctrl0"

  -s     "sync"    fuehrt direkt nach jedem Eintrag in die "/tmp/isdnctrl0"
  	 einen flush() darauf aus (fuer Kisten, die gerne mal zwischendurch
         abstuerzen)

  -p	 "pipe"    reicht den Output von "/dev/isdnctrl0" auf stdout weiter,
  	 falls jemand da noch was anderes rausholen moechte (also z.b.
  	 "isdnlog -p /dev/isdnctrl0 | isdnproto &" oder so)

  -r     "replay"  ermoeglicht, die "/tmp/isdnctrl0" (mit der Option "-v"
  	 erzeugt) nochmals durchrechnen zu lassen.
         Dazu sollte zuvor die "/var/adm/isdn.log" geloescht, und dann
         "isdnlog -r /tmp/isdnctrl0" aufgerufen werden.

  -t     Bei jeder Datum/Uhrzeit-Uebertragung von der VSt wird die eigene
  	 Systemzeit darauf gesetzt.

         ## Dies funktioniert nur, wenn isdnlog als "root" laeuft!

         ## Lt. diversen Aussagen ist diese Uhrzeit sehr ungenau, und enthaelt
         ## nicht mal die Sekunden. Daher kann von dieser Option eigentlich
         ## nur abgeraten werden!

  -m x   bei jedem "Klappern" auf dem S0-Bus taucht auf stderr der
  	 Console, von der isdnlog aus gestartet wurde, eine dem Argument "x"
         entsprechende Anzeige auf.

    	   1 = Sofort, wenn Telefonnummern auf dem S0-Bus auftauchen,
    	       werden diese angezeigt:

	   OUT-? 15:38:32  Phone->seneca

	   ## In den meisten Faellen werden eingehende Anrufe zwei mal
	   ## ganz kurz hintereinander angezeigt.


           2 = Bei jedem Gebuehrenimpuls wird die Anzahl der bislang
               aufgelaufenen Gebuehreneinheiten fuer die aktuelle Verbindung
               angezeigt:

	   OUT-1 15:38:32  Phone->seneca  4.EH = DM 0.92 (130 s)

           ## Dies funktioniert natuerlich nur, wenn auf der aktiven
           ## ISDN-Leitung Gebuehreninfo "A" (Charging-Info's during call's -
           ## AOC-D) bestellt wurde!

           Es wird die Anzahl der aufgelaufenen Einheiten sowie diese
           Einheiten umgerechnet in Geld (EH * DM 0,23) angezeigt.
           In Klammern wird angegeben, nach wieviel Sekunden (seit dem
           Verbindungsaufbau) dieser Gebuehrentakt erschien - eigentlich
           mehr, um aufzuzeigen, wie _ungenau_ die Uhr der VSt eigentlich
           laeuft!


   	   4 = Kommt eine Verbindung zustande (Telefon wird abgenommen,
   	       ISDN-Karte akzeptiert den Call etc.) wird dies angezeigt:

	   OUT-1 15:38:32  Phone->seneca  CONNECT


           8 = Sobald diese Verbindung beendet wurde, wird dies angezeigt
      	       (Wie bei -m2 mit Anzahl Einheiten, diese in Geld sowie
      	        Gesamtdauer der Verbindung. Die Anzahl Einheiten stammt hier
                jedoch aus der AOC-E Meldung der VSt)

	   OUT-1 15:57:39  Phone->seneca  HANGUP (4 EH = DM 0.92 = 142 s)


          16 = Der Grund fuer einen Verbindungsabbau/das nicht zustande
               kommen einer Verbindung wird angezeigt

           OUT-1 15:57:39  Phone->seneca  Normal call clearing


          32 = Die von der VSt uebermittelte Uhrzeit wird angezeigt

           OUT-1 15:57:39  Phone->seneca  TIME: 10Nov95  20:11


         Werden mehrere Optionen gewuenscht, muss bei -mx die Summe der
         Optionen angegeben werden, d.h. falls alle obigen Optionen
         gewuenscht werden, muss "isdnlog" nun mit "-m63" gestartet werden.

   	 Jede dieser Zeilen beginnt mit "IN", falls man angerufen wurde,
   	 oder "OUT", falls man rauswaehlt.

   	 Danach folgt "?", "1" oder "2"
   	 1 oder 2 ist der entsprechende eigene B-Kanal, und bei "?" wurde noch
   	 kein B-Kanal zugewiesen.

   	 Sofern die Telefonnummern bekannt sind (Also in der "isdnlog.conf"
   	 stehen) werden anstelle dieser die symbolischen Namen angezeigt.


  -i cmd "info"    startet beim Zustandekommen jeder Verbindung das angegebene
     	 Programm, und uebergibt Ihm dabei als Argument die 4. Spalte aus
         der "isdnlog.conf" fuer die entsprechende Telefonnummer.

   	 Ich persoenlich nutze das hier dafuer, bei jedem rein- oder
   	 rausgehenden Ruf ueber die Soundkarte eine der Nummer entsprechende
   	 Melodie abzuspielen:

   	 Also habe ich in die /etc/isdnlog.conf eingetragen

   	 # MSN/EAZ      SymName         Zone   Info-arg's
   	 #################################################################
   	 nnnnnnnnnn     Phone           1      /var/isdn/sounds/ring.au
   	 nnnnnnnnnnn    EUnet           3      /var/isdn/sounds/dial.au
   	 HANGUP=/var/isdn/sounds/hangup.au


   	 und starte "isdnlog" dann so:

     	   export AUDIOSERVER=ak4:0
     	   isdnlog -i /usr/X11R6/bin/auplay /dev/isdnctrl0

         Dadurch wird hier bei jedem Verbindungsaufbau Richtung EUnet
         folgender Befehl ausgefuehrt:

           /usr/X11R6/bin/auplay /var/isdn/sounds/dial.au

         Das bei der "-i" Option angegebene Programm kann auch einen
         Platzhalter enthalten.
   	 Beispielsweise kann mit der Angabe "isdnlog -i 'cat $1 /dev/audio'
   	 folgender Befehl erreicht werden:

           cat /var/isdn/sounds/dial.au /dev/audio

   	 Findet der Algorithmus zur Suche des "Info-Args" unter den
   	 in der "isdnlog.conf" eingetragenen Partnern keine passende Zeile,
   	 nimmt es den der entspechenden eigenen MSN zugeordneten Eintrag.

   	 Somit habe ich mir hier Standard-Sound's fuer mir noch unbekannte
   	 Anrufer, Faxe etc. bei meinen MSN's hinterlegt.

   	 Sind beide Telefonnummern leer (z.b. bei rausgehenden Modem-
   	 Verbindungen ueber einen a/b Adapter), wird - falls gefuellt - das
   	 bei der ersten MSN hinterlegte Argument verwandt.

   	 Ist in der "/etc/isdnlog.conf" der Eintrag

           HANGUP=Info-Arg

   	 (hier bei mir "HANGUP=/var/isdn/sounds/hangup.au")
   	 vorhanden, wird bei jedem Verbindungsabbau das Info-Programm mit
   	 diesem Argument aufgerufen.

  -x     Aktiviert den bidirektionalen Datentransfer zum/vom X11-Popup


## Bevor der Teles-Treiber entladen wird (rmmod teles), muss unbedingt zuvor
## "isdnlog" gestoppt werden ( kill `cat /var/run/isdnlog.pid` ) !!


Output der ganzen Geschichte ist die Datei "/var/adm/isdn.log" mit folgendem
Inhalt:

Sep 30 15:24:10 1995|xxxxx|xxxxxx|    3| 344| 812471050|    1|I|No user responding
      (1)             (2)   (3)    (4)   (5)   (6)       (7) (8)     (9)

Wobei in den einzelnen Spalten folgendes steht:

 (1) Zeitpunkt des Verbindungsaufbaues (in Local-Time)
 (2) Telefonnummer des Anrufers (oder Blank, falls z.b. Analog-Anschluss)
     (d.h. natuerlich auch die eigene MSN, wenn man selber raus-ruft!)
 (3) Telefonnummer des Angerufenen (d.h. die eigene MSN, wenn man angerufen
     wird)
 (4) Dauer der Verbindung in Sekunden
 (5) Dauer der Verbindung in 1/100 Sekunden
     (im obigen Beispiel: 912 / 100 = 9,12 Sekunden)
 (6) Zeitpunkt des Verbindungsaufbaues in UTC
 (7) Anzahl zu zahlender Gebuehreneinheiten (AOC-D)
 (8) "I" fuer incoming call, "O" fuer outgoing call
 (9) Kam eine Verbindung nicht zustande (d.h. z.b. man wird angerufen, nimmt
     aber nicht ab) taucht hier der Grund fuer das nicht Zustandekommen im
     Klartext auf ("Cause")


5. isdnrep
----------

Gestartet wird isdnrep mittels:

         isdnrep [ -an6 ]

Die Optionen von isdnrep haben im einzelnen folgende Funktion:

  -a     "all"     isdnrep druckt alle Verbindungen an, die sich in der
  	       	   "/var/adm/isdn.log" angesammelt haben (sonst nur "heute")

  -n     "numbers" isdnrep druckt anstelle der Symbolischen Namen die
  	 	   Telefonnummern an

  -6     "Tarif96" isdnrep verwendet (zum testen) die Telekom-Tarife fuer
  	 	   1996, anstelle der aktuell gueltigen


Es wird nun auf stdout eine Abrechnung mit folgender Optik generiert:

I S D N  Connection Report  -  Sat Sep 30 19:42:43 1995

Sat Sep 30 1995
  07:09:05 called by syntronic          0 sec     0 EH                 (1)
  08:40:59   calling EUnet             12 sec     1 EH      0.23 DM    (2)
  10:23:59   calling MSN#3              0 sec     0 EH	    	       (3)
  10:46:11   calling EUnet              7 sec     1 EH      0.23 DM
  10:50:16 called by mar               20 sec     1 EH
                                               SUBTOTAL     0.46 DM    (4)
                                                  TOTAL    51.98 DM    (5)

Summary for Sat Sep 16 1995 .. Sat Sep 30 1995	  	   	       (6)
----------------------------------------------
EUnet           17.42 min   84 EH   19.32 DM
mar              0.65 min    1 EH    0.23 DM
seneca          17.97 min   29 EH    6.67 DM
gold            12.22 min   18 EH    4.14 DM


** 194.30 Minuten /  38.04 DM verschenkt! **			       (7)


Unknown caller(s)                                                      (8)
----------------------------------------------
called by nnnnnnnnnnn    Sep 22 19:59:14



Fussnoten:
  (1) "called by xxx" war ein eingehender Anruf, kostet also nix
  (2) "  calling xxx" ist ein rausgehender Ruf, macht also bei 12 sec,
      Weitzone, Billigtarif (da Samstag) 1 Gebuehreneinheit = DM 0,23
  (3) Dies war ein Selbstanruf auf die eigene 3. Telefonnummer
  (4) "SUBTOTAL" ist das Geld, was man selbst fuer diesen Tag zu zahlen hat
  (5) "TOTAL"  ist das Geld, was man selbst fuer alle Eintraege in der
      "var/adm/isdn.log" zu zahlen hat
  (6) "Summary" bringt noch mal eine Gesamtuebersicht ueber alle Verbindungen
  (7) Hier hat "isdnrep" mal ausgerechnet, wieviel noch moegliche Verbindungs-
      Zeit, sowie das in Geld durch nicht vollstaendige Ausnutzung jedes
      Gebuehrentakt's "verschenkt" wird.
  (8) "UNKNOWN CALLER" hier tauchen nochmals alle bislang unbekannten
      Telefonnummern (also die, die noch nicht in der "/etc/isdnlog.conf"
      eingetragen sind) nebst Zeitpunkt(e) der Verbindung(en) auf.

Steht am Ende einer Verbindung "(-n)" oder "(n)", gab es eine Differenz
zwischen den von "isdnrep" rein rechnerisch ermittelten und den vom "Amt"
uebermittelten Einheiten:

  -> negativer Wert: Telekom will mehr, als isdnrep errechnet hat
  -> positiver Wert: Telekom will weniger, als isdnrep errechnet hat

## Ich gehe davon aus, das Differenzen +/- eine Einheit immer ein
## Rechen-/Rundungsfehler in "isdnrep" sind!

Wurden die Einheiten mit einem "*" markiert, wurden vom "Amt" keine
Einheiten gemeldet (Charging-Info fehlte)
Daher steht dann hier die von isdnrep errechnete Anzahl Einheiten.


6. Dateien
----------

Folgende Files werden von diesem System verwendet:

  /sbin/isdnlog          - Das Protokoll-Programm
  /usr/sbin/isdnrep	 - Das Report-Programm
  /etc/isdnlog.conf	 - Die Config-Datei
  /var/adm/isdn.log	 - Das Logbuch
  /var/run/isdnlog.pid	 - Enthaelt die PID des laufenden isdnlog
  /dev/isdnctrl0	 - Gibt das Q.931 Protokoll des Teles-Treibers aus
  /tmp/isdnctrl0	 - Dasselbe Protokoll als ASCII-Datei


7. Dank
-------
Bedanken moechte ich mich vor allem bei
  Fritz Elfert (fritz@wuemaus.franken.de)
fuer sein tolles isdn4linux!
  Jan den Ouden (denouden@groovin.xs4all.nl)
fuer den prima Teles-Treiber
  Gernot Zander (hifi@scorpio.in-berlin.de)
fuer den goldenen Hinweis, der zu diesem Programm fuehrte
  Beat Doebeli (doebeli@vptt.ch)
fuer den Einbau jeglicher D-Channel Messages
  Michael Bongartz (micha@mubo.saar.de)
fuer die Ermittlung der AOC-D sowie AOC-E Bytes im D-Channel-Protokoll
  Peter Adebahr (adsys@bruck.geophysik.uni-muenchen.de)
fuer die Beschaffung der Gebuehreninformationen '96

Sowie bei
  Martin Stover (mstover@Kool.f.EUnet.de)
und vielen anderen aus der isdn4linux Mailing-Liste fuer ihre Muehen
beim Testen von isdnlog sowie staendigen neuen Ideen dafuer.



Andreas Kool (akool@Kool.f.EUnet.de)
