Gebührenerfassung für Euracom 18x mittels SQL Datenbank

Einführung

Das Programm liest die von der Tk-Anlage über die V24-Schnittstelle ausgegebenen Gebührendaten und schreibt die aufgearbeiteten Daten in eine SQL-Datenbank. Ebenso wird für jeden Datensatz auch eine Meldung via syslog() ausgegeben. Die Verbindung zur Datenbank, die sich auch auf einem anderen Rechner im Netz befinden kann, wird automatisch bei Bedarf aufgebaut und, falls eine gewisse Zeit keine Einträge mehr eingefügt wurden, auch wieder abgebaut. Sollte die Datenbank genau zu dem Zeitpunkt wenn Daten eingefügt werden müssen, nicht erreichbar sein, schreibt das Programm die Daten in eine Datei. In regelmäßigen Abständen wird versucht, die Verbindung zum DBMS herzustellen. Sobald dies gelungen ist, werden die fehlenden Datensätze in die Tabelle geschrieben.

Zur Zeit unterstützte DMBS sind: PostgreSQL, mSQL und MySQL

Systemvoraussetzungen

Hardware

Das Programm liest die Gebühreninformationen, die am Druckerausgang einer Ackermann Euracom 18{0,1,2} Tk-Anlange ausgegeben werden. Nachbauten der Anlage (z.B. QUANTE IS-{0,1,2}) werden ebenfalls unterstützt. Es können alle Firmware-Releases bis einschließlich 3.02d eingesetzt werden.

Der Druckerport der Anlage (bei F/W <= 1.11B ist das defaultmäßig der Port V24-2) muß mit einem freien RS232 Port des Rechners verbunden werden. Benutzen Sie ein Verbindungskabel bei dem die Leitungen RX, TX, DTR, DSR, RTS, CTS und GND 1:1 durchgeschaltet sind (kein Null-Modem Kabel!). Wenn Sie auf der sicheren Seite seien möchten, verwenden Sie ein 9-poliges 1:1 Kabel. Falls Ihr Rechner noch einen 25 polige DSub Anschluß hat, so benötigen Sie ein anderes Verdrahtungsschema. Ich verweise da auf das Kapitel PC/Drucker an den RS232-C Anschlüssen installieren (4.8) im Handbuch der Euracom-Anlage. Für den Eingang auf Seiten des PC reicht ein Port mit 82450, 8250 oder 16450 UART vollkommen aus. Auf der anderen Seite, wenn natürlich ein 16550A oder eine intelligente serielle Interfacekarte vorhanden ist -- umso besser. (Beachten Sie dazu bitte den Punkt Bugs).

Software

Zusätzlich zu diesem Programm benötigen Sie noch folgende Software:

Konfiguration und Installation

Kompilieren der Sourcen

Nach dem Entpacken der Sourcen starten Sie ./configure. Auf jeden Fall muß der Parameter --with-area-code=x angegeben werden. Ersetzen Sie x durch Ihre Vorwahl (ohne die 0). Für eine Liste aller unterstüzten Parameter rufen Sie ./configure mit --help auf.

Werfen Sie danach einen Blick in das erzeugte Makefile. Die Umstellung auf autoconf ist noch nicht völlig abgeschlossen, so daß evtl. noch einige Anpassungen im Makefile vorgenommen werden müssen (Pfade zum DBMS).

Danach sollte ein make alle benötigten Programme erzeugen. Auf einem Linux/GNU System wird die Kompilierung mit großer Wahrscheinlichkeit ohne Probleme ablaufen, bei anderen Unices kann es sein, daß einige Include-Files nicht vorhanden sind, oder andere (kleinere) Kompatibilitätsprobleme auftreten. In so einem Fall bitte ich um eine Mail an mich, so daß ich die Möglichkeit habe, die Programme portabler zu gestalten.

Einrichten der Datenbank

Meldete make keine Probleme bei der Kompilation, so können wir nun den nächsten Punkt angehen, der Erstellung der Datenbank, in der das Programm die Gebühreninformationen schreiben wird.

PostgreSQL version

Zuerst ist mittels createdb isdn eine neue Datenbank Namens isdn anzulegen. Theoretisch ist natürlich auch ein anderer Name möglich, aber besonders auf Linux-Systemen, die isdn4linux verwenden, bietet sich isdn besonders an, da auch das Programm isdnlog defaultmäßig diesen Namen als Datenbank verwendet (wenn man isdnlog mit PostgreSQL-Unterstützung kompiliert hat).

Mit make database werden alle benötigten Tabellen erzeugt, wobei für die reine Gebührenerfassung nur die Tabelle euracom von Bedeutung ist. Dem Benutzer, unter dessen Kennung "euracom" abläuft, muß (INSERT) Zugriff auf die Tabelle erlaubt werden (falls der Benutzer nicht identisch mit dem DBA ist). Evtl. muß dieser Benutzer vorher mit createuser <username> eingerichtet werden.

GRANT INSERT ON euracom TO Benutzer;

miniSQL version

???

Installation

Für diesen Schritt werden Sie in den meisten Fällen root-Rechte benötigen. Ein make install nimmt Ihnen lästige Arbeit ab, indem es alle benötigten Files an die richtige Stelle kopiert. Defaultmäßig wird das Hauptprogramm euracom nach /usr/local/sbin, die Manual-Page nach /usr/local/man/man8 und das shared object für PostgreSQL nach PGBASE/obj kopiert.

Falls Sie euracom nicht als root starten wollen oder können (die Option --run-as-user ist davon nicht betroffen), dann müssen Sie darauf achten, daß sie Schreib- und Lesezugriff auf die Verzeichnisse haben, die in config.h unter PIDFILE und LOCKPATH aufgeführt sind. Natürlich brauchen Sie ebenfalls RW-permission auf das serielle Device.

Wenn in der config.h das Makro DEF_LOGFAC nicht geändert wurde, schreibt euracom syslog-Ausgaben in die syslog Facility local0. Es ist sinnvoll, in der /etc/syslog.conf einen Eintrag zu machen, daß alle local0 Messages separat geloggt werden sollen, was durch folgenden Eintrag bewerkstelligt wird:

local0.*	/var/log/telephone.log

Gebührenausdruck der Anlage vorbereiten

Verbinden Sie nun den Druckerausgang der Tk-Anlage mit einem freien V24-Port Ihres Rechners und aktivieren Sie die Gebührendruckfunktion der Anlage. Die folgende Befehlsfolge, die sie an jedem Master-fähigen Telefon der Anlage eingeben können aktiviert die Gebührenauswertung für jeden internen Anschluß (mit Anzeige der kompletten Rufnummer), und erfaßt auch kommende Verbindungen (mit und ohne Verbindung):

Das sollte es eigentlich gewesen sein!

Start des Daemons

Starten Sie das Programm mit euracom [-options] device. device ist hier die verwendete serielle Schnittstelle. Das Programm versucht als erstes das Device zu locken, um Kollisionen mit anderen Programmes auszuschließen. Sollte ein anderer Prozeß diesen Port bereits benutzen (und kennzeichnet dies durch die Verwendung eines Locks), so bricht euracom mit einer Fehlermeldung ab. Das gleiche gilt, wenn bereits ein euracom Prozeß aktiv ist.

Alle Fehler während der Initialisierung werden via syslog() geloggt (Ausnahme sind Fehler in den Kommandozeilenparametern, die auf STDERR ausgegeben werden). Sobald die Meldung "Euracom vx.x.x listening on /dev/xxx" erscheint" ist das Programm bereit, eingehende Gebührendaten zu empfangen und zu verarbeiten. Wenn Sie so weit gar nicht kommen, hilft vielleicht ein Blick in die Bugs-Section.

Um Fehlern besser auf die Spur zu kommen, können sie das Programm mit der Option --no-daemon starten. Damit bleibt das Programm im Vordergrund und gibt alle Ausgaben auf STDERR aus. Ebenfalls hilfreich ist die Option --debug (optional mit Angabe des debugging-Levels), welche erweiterte Logging-Informationen ausgibt. Falls Sie erweiterte Debugging-Ausgaben haben möchten, das Programm aber weiterhin als daemon (also im Background) abgearbeitet werden soll, ist die Angabe eines Logging Files mit --log-file=file zwingend erforderlich.

Für weitere Kommandozeilen-Optionen rufen Sie einfach euracom mit dem Switch --help auf. Ansonsten verweise ich hier auf die mitgelieferte Manual page von Volker Schmidt.

Am sinnvollsten ist es, wenn Sie das Programm euracom automatisch beim Hochfahren des Systems starten. Ein Beispiel für eine SysV-like Startup-Prozedur, die dies bewerkstelligt ist z.B.:

#!/bin/sh

PATH=/usr/local/sbin:/bin:/usr/bin

case "$1" in
    start)
        echo -n "Starting EURACOM accounting..."
        euracom --protocol-file=/var/log/euracom.protocol \
                --log-file=/var/log/euracom.log  \
                --db-host=dbserver \
                --run-as-user=phone /dev/ttyS3
        echo "o.k."
        ;;
    stop)
        echo -n "Shutting down EURACOM accounting: "
        kill -TERM `cat /var/run/euracom.pid`
        echo
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac
exit 0

Gebührenauswertung (z.Zt. nur für PostgreSQL)

Im Prinzip können wir jetzt aufhören. Etwas Optimismus vorausgesetzt, läuft bei Ihnen jetzt ein Programm, daß die Verbindungsdaten aller ein- und ausgehenden Gespräche, die über die Anlage geführt, mitprotokolliert, via syslog() ausgibt und dauerhaft in eine Datenbank schreibt. Mit rudimentären SQL92 Kenntnissen können Sie sich z.B. eine Liste der zuletzt geführten Gespräche ausgeben lassen, Monats-, Wochen- oder Tagessummen der Gesprächsgebühren berechnen lassen, etc. pp. Mit dem mitgelieferten Perl-Skript charger.pl geht man noch einen kleinen Schritt weiter. Man erhält einen Einzelverbindungsnachweis für einen, vom Benutzer festgelegten Zeitraum, in dem Zeitpunkt des Gespräches, Zielnummer, und Gebühren, sowie die Summe der Gebühren aufgeführt sind. Optional wird noch der Ortsnetzname der Nummer, sowie der Inhaber der Nummer ausgegeben, falls diese Werte in der Datenbank vorhanden sind.

Benötigte Tabellen

Für die Gebührenauswertung sind 2 weitere Tabellen nötig, die sich ebenfalls in der DB "isdn" befinden müssen. Beide Tabellen sind bereits durch make database erzeugt und mit Beispielwerten gefüllt worden.

Die Tabelle avon enthält das Verzeichnis der Vorwahlen (Attribut "nummer" hat die Form "+49vorwahl-ohne-null", also, z.B. "+49228" für Bonn), die zweite Tabelle wkn kann vom Benutzer mit Telefonnummern (in internationaler Schreibweise (in diesem Fall allerdings ohne irgendwelche Trennzeichen), also die Felder

  1. Ländervorwahl (+49 für Deutschland)
  2. Vorwahl (ohne 0)
  3. Teilnehmernummer (oder Anlagen Basisnummer)
  4. optional: Durchwahl

Der Benutzer, der die Gebührenauswertung vornimmt, benötigt 'SELECT' Zugriff auf alle Tabellen (avon, wkn und euracom)!

Als Eingabedaten für die "avon"-Tabelle empfehle ich die OKZ-Datei aus dem isdnlog Paket.

User-defined functions

Für die Auswertung ist es erforderlich, PostgreSQL um 2 Funktionen zu erweitern, nämlich prefix_match(text,text) und length(text). Dazu müssen Sie folgende PostgreSQL statements absetzen:

CREATE FUNCTION prefix_match (text, text) 
  RETURNS bool
  AS '/opt/postgreSQL/obj/prefixmatch.so'
  LANGUAGE 'c';

CREATE FUNCTION length (text)
  RETURNS int2
  AS '/opt/postgreSQL/obj/prefixmatch.so'
  LANGUAGE 'c';

Wenn im Makefile PGBASE angepaßt wurde, so müssen Sie natürlich /opt/postgreSQL/obj/prefixmatch.so durch den korrekten Pfad von prefixmatch.so ersetzen.

Aufruf von charger.pl

Für eine komplette Übersicht sämtlicher unterstützter Kommandozeilen-Parameter starten Sie charger.pl mit dem Switch -h. Aber Sie werden das Programm ohnehin noch anpassen müssen, denn ich bezweifele, daß Sie in Ihrer Kostenabrechnung gerne meinen Namen in der Fußzeile haben möchten...

Die Zeit/Datumsangaben, die den Optionen -v und -b als Argument mit übergeben werden, können in jedem Format vorliegen, welches PostgreSQL unterstützt.

Beispielausgabe von "charger.pl"

bus@goliath [108] =>./charger.pl -v'24.09.1997'
AnschlußDatum RufnummerEinheitenBetrag
24.09.1997 03:05Vergeblicher Anruf von 0228 941234-0
Mustereintrag; Zentrale (Bonn)
2124.09.1997 11:5302364 98765
Testuser, Werner (Haltern Westf)
131.56 DEM
1126.09.1997 08:590228 941234-361
Mustereintrag; Durchwahl 2 (Bonn)
60.72 DEM
4226.09.1997 09:04Eingehender Anruf
1126.09.1997 09:09Eingehender Anruf von 0228 941234-361
Mustereintrag; Durchwahl 2 (Bonn)
2 Gespräche192.28 DEM
Grundgebühr18.00 DEM
GESAMT:20.28 DEM


Michael Bussmann, Im Brook 8, 45721 Haltern

Weitere Utilities

"do_charger.sh"

do_charger ist das Programm, das bei mir jeden 1. des Monats per cron aufgerufen wird, um die monatliche Gebührenauswertung/Telefonrechnung zu erstellen. Starten Sie es bitte nicht, ohne entsprechende Anpassungen an Ihre lokale Situation vorzunehmen!

avon.pl

Dieses kleine Progrämmchen dient dazu, eine Telefonnummer (in internationaler Schreibweise (wieder ohne Trennzeichen)) in einen formatierten String umzuwandeln, der die Nummer in Ortsnetz, Basisnummer + Durchwahl unterteilt und Ortsnetzname und Anschlußinhaber auflistet. Dies setzt natürlich voraus, daß die Tabellen avon und wkn entsprechend gefüllt sind.

Auch hier erhalten Sie eine komplette Übersicht der Kommandozeilen-Parameter durch Angabe der Option -h.

Nach dem Start erwartet das Programm auf STDIN eine Telefonnummer und gibt dann auf STDOUT den aufgearbeiteten String aus. Die Eingabe EOF (^D) beendet das Programm.

Spaß mit SQL

Auch wenn man mit charger.pl eine mehr oder minder schön aufgearbeitete Verbindungsliste in HTML bekommt, ist es doch zuweilen einfacher und schneller ein paar SQL-Statements direkt abzusetzen, z.B. wenn man mal eben so auf die Schnelle eine Übersicht der bis dato angelaufenen Kosten braucht. Hier also mal ein paar (na gut, im Moment nur ein) Beispiele für solche Statements:

Monatsgesamtsummen (für Januar 1998) pro Teilnehmer:
SELECT int_no,sum(einheiten) AS einheiten_summe,sum(pay) AS gesamt_summe,count(*) AS anzahl
FROM euracom
WHERE sys_date BETWEEN '1998-01-01 00:00:00' AND '1998-01-31 23:59:59'
AND int_no!=0
AND pay>0
GROUP BY int_no;

Bekannte Bugs

Natürlich bekannte Bugs; wenn hier unbekannte Bugs ständen, wären Sie wohl bald gefixt. Nein, dann wären es keine unbekannten Bugs mehr...
Wie auch immer, bevor ich mich hier verrenne: Mir liegen zur Zeit folgende Bugreports vor:

Wenn Sie irgendwelche Bugs, Verbesserungsvorschläge, Kritik haben (oder mir einfach nur sagen wollen, daß Sie das Programm benutzen), zögern Sie nicht und schreiben mir. Die Adresse finden Sie im Abschnitt Kontaktadresse. Falls Sie Bugs entdecken, ist es sinnvoll, mir ebenfalls die Logs zukommen zu lassen. Starten Sie dazu das Programm mit --debug (und evtl. --log-file=file bzw. --no-daemon). Bei coredumps bitte ich von der Zusendung des core files abzusehen :-), dafür könnte sich der Stack-Trace als zweckmäßiger erweisen.

Kontaktadresse

Falls Probleme bei der Installation oder während des Betriebes auftreten, so werde ich gerne versuchen zu helfen. Ebenso würde es mich natürlich interessieren, bei wem die Software tatsächlich im Einsatz ist. Also, Bugreports, Lob, Tadel, Kommentare, etc. nach bus@mb-net.net. Weitere Kontaktmöglichkeiten finden Sie hier.




ruf098 WWW, Michael Bussmann, <bus@mb-net.net> , Last change: $Date: 2001/06/16 17:16:03 $, $Revision: 1.18 $