- isdnlog Version 3.06

- README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
- isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
- isdnlog: dont change CHARGEINT, if rate is't known!
- sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
- tarif.dat 1.09 [15-Mar-99] :: added WorldCom
- isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
This commit is contained in:
akool 1999-03-15 21:27:30 +00:00
parent 6afa489aa5
commit 1e62012337
10 changed files with 495 additions and 194 deletions

View File

@ -1,4 +1,4 @@
## $Id: Makefile.in,v 1.58 1999/03/14 14:26:10 akool Exp $
## $Id: Makefile.in,v 1.59 1999/03/15 21:27:30 akool Exp $
##
## ISDN accounting for isdn4linux.
##
@ -19,6 +19,15 @@
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
## $Log: Makefile.in,v $
## Revision 1.59 1999/03/15 21:27:30 akool
## - isdnlog Version 3.06
## - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
## - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
## - isdnlog: dont change CHARGEINT, if rate is't known!
## - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
## - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
## - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
##
## Revision 1.58 1999/03/14 14:26:10 akool
## - isdnlog Version 3.05
## - new Option "-u1" (or "ignoreRR=1")
@ -455,7 +464,7 @@ SERVICEFILE = /etc/services
# DON'T EDIT BELOW THIS LINE
######################################################################
VERSION = 3.05
VERSION = 3.06
MANPAGES = isdnlog/callerid.conf.5 isdnlog/isdn.conf.5 isdnlog/isdnformat.5 isdnlog/isdnlog.5 isdnlog/isdnlog.8 isdnlog/isdnlog.users.5 isdnrep/isdnrep.1 isdnconf/isdnconf.1

View File

@ -1,4 +1,4 @@
ISDNLOG - Version 3.05 - 14-Mar-99 14:11
ISDNLOG - Version 3.06 - 15-Mar-99 22:05
isdnlog ist ein Utility zur Auswertung des D-Kanals eines
@ -118,11 +118,12 @@ Inhalt:
16.1. Postgres95
16.2. MySQL
17. Tarifdatenbank
18. Probleme?
19. Verwendete Dateien
20. Verwendete Environment-Variablen
21. Verwendete Abkuerzungen
22. Danksagung
18. LCR (Least cost router)
19. Probleme?
20. Verwendete Dateien
21. Verwendete Environment-Variablen
22. Verwendete Abkuerzungen
23. Danksagung
Vorwort
@ -3237,8 +3238,18 @@ Kommentare werden geloescht.
-t 'SI' Zeigt alle Eintraege mit Service-Indicator 'SI' an.
Gilt nicht fuer den Befehl -A.
-c 'Code' "code" Ermittelt die Vorzahl zu der Telefonnummer und gibt
diese dann aus. Gilt nicht fuer -A und -D.
-c 'Code' "code" Ermittelt die Ortsbezeichnung sowie die Gebuehrenzone
(relativ zum eigenen Standort, d.h. dem Eintrag
AREACODE in der "callerid.conf") zu der Telefonnummer
"code".
Daneben wird ausgegeben, ueber welchen Provider
jetzt gerade eine (181 Sekunden lange) Verbindung
zu dieser Nummer am guenstigsten waere.
Gilt nicht fuer -A und -D.
(181 Sekunden als gedachte Dauer der Verbindung
wurde gewaehlt, weil durch diese "krumme" Zahl
alle Provider, die im Sekunden-Takt abrechnen
massiv im Vorteil sind - was gewuenscht ist!)
-i "ignore" Es wird dann bei den Optionen -n und -a die
Gross/Kleinschreibung ignoriert.
@ -3951,7 +3962,196 @@ die Kennzahl "98" den Tarif der Fa. Mox Telecom AG meint.
: - Sonderbehandlung von 24. Dezember bis 31. Dezember (Telekom)
18. Probleme?
18. LCR (Least cost router)
---------------------------
Seit dem 1.1.1998 duerfen in Deutschland ganz offiziell (im kommerziellen
Umfeld war das schon laenger gang und gebe) auch andere Firmen
(neben der DTAG = Deutsche Telekom) Telefondienste anbieten.
Dazu wurde die RegTP - Regulierungsbehoerde fuer Telekomunikation und Post
(http://www.regtp.de) ins Leben gerufen, die seitdem (u.a.) die
Verbindungsnetzbetreiberauswahlkennziffern vergibt.
Ueber diese Nummern kann nun jeder selbst entscheiden, ueber welchen
Provider (== Telefongesellschaft) er fuer das folgende Telefonat telefonieren
moechte.
Daher taucht im Bereich der Telekomunikation ein neuer - bislang primaer
in den USA gelaeufiger Begriff auf: das LCR, Least cost routing, d.h. die
Auswahl des guenstigsten Providers fuer eine gleich entstehende Verbindung.
Dazu muá folgendermaáen gewaehlt werden:
010 xxx 49 69 123456
^-------------------------- Verbindungsnetzbetreiberauswahl
^---------------------- Nummer des gewuenschten Providers
^------------------ Landesvorwahl
^--------------- Ortsvorwahl
^----------- Rufnummer
Endet der Ruf im eigenen Land, kann die Landesvorwahl entfallen.
Endet der Ruf im eigenen Ortsnetz, kann die Ortsvorwahl (bis auf weiteres)
entfallen.
Mittels "xxx" wird der gewuenschte Provider selektiert, wobei die RegTP
zuerst alle 99 2-stelligen Nummern vergeben hat, und danach dazu ueber ging,
dreistellige Nummern, bislang i.d.F, 0xx zu vergeben.
Um ein konkretes Beispiel zu machen: Wenn man beabsichtigt, von Muenchen
nach Frankfurt ein Telefonat mit der Nummer 4711 zu fuehren, und dazu
den Provider VIAG Intercom verwenden moechte, waehlt man folgende Nummer:
010 90 069 4711
^---------------- Verbindungsnetzbetreiberauswahl
^------------- VIAG Intercom
^--------- Frankfurt
^------ Rufnummer
Ein grundlegendes Problem wurde jedoch bislang nicht geloest: Sobald man
ueber einen alternativen Carrier (also irgend eine Telefongesellschaft
jenseits der DTAG) eine Verbindung aufbaut, werden keinerlei Gebuehren-
informationen mehr uebertragen - weder waehrend, noch am Ende der
Verbindung.
D.h. die schoenen "Leistungsmerkmale" AOCD sowie AOCE funktionieren _nicht_
mehr.
Daher macht es per heute (1999) wirklich absolut keinen Sinn mehr, einen
ISDN-Komfort-Anschluá zu beantragen! Das dort enthaltene "Leitungsmerkmal"
Gebuehreninformationen waehrend der Verbindung wird sowieso nur noch bei
Verbindungen ueber die DTAG erbracht (da die DTAG meistens die teuerste
Gesellschaft ist, kommt das also praktisch nie mehr vor ...)
Wer den isdnlog (und eine up-to-date "tarif.dat") verwendet, bekommt jedoch
bei *allen* Gesellschaften - incl. der DTAG - Gebuehreninformationen geliefert,
in Bezug auf AOCD (waehrend der Verbindung) sogar genauer, als die
von der DTAG!
Was kann nun isdnlog (ab der Version 3.x) mit dieser neuen Situation anstellen?
1. isdnlog erkennt eine evtl. vorgewaehlte Verbindungsnetzbetreiberauswahl,
und dekodiert den entsprechenden Provider heraus.
Dazu greift isdnlog auf drei Quellen zurueck:
- zum ersten besitzt isdnlog ... bislang hardcoded ... die Namen
aller bislang bei der RegTP angemeldeten Provider. Von den bis zum
11.Maerz 1999 angemeldeten 126 Telefongesellschaften bieten allerdings
noch bei weitem nicht alle wirklich Telefondienste an.
- zum zweiten besitzt isdnlog eine Tarif-Datenbank, die Datei
"/usr/lib/isdn/tarif.dat"
Dort sind die Tarife der diversen Telefongesellschaften hinterlegt.
Da sich die Tarife haeufig sogar taeglich aendern, kann diese
Datei im Moment nur als Anhaltspunkt angesehen werden. Zu welchem
Zeitpunkt die dort hinterlegten Tarife mit Sicherheit gueltig waren,
kann dem Eintrag "V:" am Anfang der Datei entnommen werden.
Sollte mir irgend jemand verbesserte Tarifinformationen zuschicken
(an akool@isdn4linux.de), bitte ich darum, immer auch diese
Versionsnummer zu incrementieren!
- diverse Telefongesellschaften arbeiten mittlerweile mit sog.
Resellern - Firmen, die unter derselben Verbindungsnetzbetreiberauswahl
zu unterschiedlichen Tarifen Telefondienste anbieten. Hierzu muá man
sich bei einem der Reseller zuerst anmelden - meistens kostenlos.
Zum Beispiel hat die Firma Star Telecom die
Verbindungsnetzbetreiberauswahl 01098 erhalten, bietet jedoch an
Privatkunden praktisch gar keine Telefondienste an.
Stattdessen verkauft Star ihre Dienste weiter an die Firmen
Nikoma, Mox sowie C@llas
Ist man gewillt, ueber eine dieser drei Firmen zu telefonieren,
muá man sich zuerst dort anmelden. Erschwerend kommt hinzu, dass alle
diese Firmen noch unterschiedliche Tarif-Varianten anbieten:
- Abrechnung im Minutentakt
- Abrechnung im Sekundentakt, dafuer etwas teurer
- besondere Abrechnung, wenn man in einer sog. Superregion, d.h.
einer Groástadt wie Frankfurt, Muenchen, Hamburg, Stuttgart usw.
wohnt.
Da jedoch alles oben genannte ueber ein und dieselbe
Verbindungsnetzbetreiberauswahlkennziffer, im Beispiel also
01098 laeuft, ist isdnlog absolut ausser Stande zu entscheiden,
was nun gemeint ist, wenn eine Verbindung mit der Nummer "01098"
beginnt.
Daher sieht isdnlog in der Datei "/etc/isdn/tarif.conf" nach,
welcher konkrete Provider sowie welche konkrete Tarifvariante
gemeint ist, wenn z.b. die Nummer 01098 auftaucht.
Diese Datei muá dementspechend jeder entsprechend seiner eigenen
Situation fuellen.
2. Anhand des ermittelten Providers kann isdnlog nun berechnen, was dieser
Provider fuer eine Verbindung verlangt, und wie lang bei diesem Provider
ein "Gebuehrentakt" dauert.
Mit diesen Informationen macht isdnlog per heute folgendes:
1. Er ist in der Lange, am Ende einer Verbindung auszugeben, was die
gerade beendete Verbindung gekostet hat.
2. Er ist in der Lage, den CHARGEINT von isdn4linux neu zu setzen,
d.h. die Steuerung, wann eine ISDN-Data-Verbindung auflegen soll,
um genau in einen Gebuehrentakt hineinzupassen.
3. Er ist in der Lage, den Gebuehrentakt (-> AOCD) zu "erfinden", und
auszugeben. Dieser dazuerfundene Gebuehrentakt wurde CI (fuer
ChargeInt) getauft.
4. Da isdnlog von (fast) allen aktiven Providern die Tarifinformationen
besitzt, macht er zu Beginn einer Verbindung evtl. den Vorschlag,
einen anderen - guenstigeren - Provider zu waehlen.
Das ist (leider) nur fast das, was ein sog. LCR (least-cost-router)
erbringt. Ein echter LCR sagt nicht, welchen Provider man haette
benutzten sollen, sondern benutzt genau diesen automatisch.
Dies ist aber per heute leider aufgrund der Physik einer
handelsueblichen ISDN-Karte nicht moeglich.
(Ich persoenlich benutze seit dem 1.1.1998 eine Tk-Anlage mit
internem S0-Bus, an dem alle ISDN-Telefone angeschlossen sind)
3. Praktisch alle neuen Provider kaempfen mit einem ueblen Problem: Sie
besitzen (in Relation zur DTAG) nur eine sehr begrenzte Anzahl freier
Leitungen. Besonders Provider, die mit extrem guenstigen Angeboten
locken, sind erst nach 10 .. 20 maligem Versuchen verfuegbar.
(Das beste Beispiel z.Zt. (Maerz 1999) ist sicherlich die Firma
01079:Viatel, die zwar extrem guenstige Tarife anbietet, aber praktisch
nie verfuegbar ist)
Dieses Problem kann natuerlich auch isdnlog nicht aus der Welt schaffen,
jedoch bringt isdnrep eine Statistik
(in der Rubrik "Outgoing calls ordered by Provider") mit der
prozentualen Verfuegbarkeit jedes benutzen Providers.
Diese Verfuegbarkeitsrate bezieht sich natuerlich nur auf die jeweils
eigenen Daten.
4. Zum echten LCR gehoert aber noch etwas anderes! Bei den normalen
Telefonnummern ist es einfach (naja, ich habe ueber 3 Jahre gebraucht,
bis isdnlog das konnte), anhand einer Vorzonungstabelle zu berechnen,
was eine Verbindung zwischen A und B kostet. Leider gibt es jedoch in
Deutschland ca. 210 sog. Sonderrufnummern, die sich nicht dem ueblichen
Schema unterziehen. Ein sehr bekanntes Beispiel fuer eine Sonderrufnummer
iat die Telefonnummer "112 -> Feuerwehr"
Die Telefonnummer 112 kostet nichts, was aber beileibe nicht fuer alle
Sonderrufnummern gilt. Ganz im Gegenteil: Es gibt viele Sonderrufnummern,
die weit mehr kosten, als die Fernzone! Bekannt sind hier sicherlich
alle Rufnummern, die mit 0180 oder 0190 beginnen, oder die div.
Telefonauskunften 118xx
Dummerweise kosten diese Sondernummern bei jedem Provider etwas anderes,
oder werden Fallweise von dem einen oder anderen Provider gar nicht
unterstuetzt. Daher besitzt isdnlog die Datei
"/usr/lib/isdn/sonderrufnummern.dat", die diese Besonderheiten - so
weit bekannt, enthaelt.
19. Probleme?
-------------
Sollte isdnlog nicht wie beschrieben arbeiten, muessen folgende Punkte
@ -4077,7 +4277,7 @@ gdb bin/isdnlog
Den _gesamten_ Output an die oben angegebene Adresse senden.
19. Verwendete Dateien
20. Verwendete Dateien
----------------------
Folgende Files werden von diesem System verwendet:
@ -4099,6 +4299,7 @@ Folgende Files werden von diesem System verwendet:
/usr/lib/isdn/areacodes - Neues Vorwahl-Verzeichnis
/usr/lib/isdn/sonderrufnummern.dat - Verzeichnis aller Sonderrufnummern (110, 112 ...)
/usr/lib/isdn/vorwahl.dat - Verzonungstabelle
/usr/lib/isdn/tarif.dat - Tarifdatenbank
/var/log/isdn.log - Das Logbuch
/var/run/isdnlog.pid - Enthaelt die PID des laufenden isdnlog
/dev/isdnctrl0 - Gibt das Q.931 Protokoll des HiSax-Treibers aus
@ -4107,7 +4308,7 @@ Folgende Files werden von diesem System verwendet:
/usr/X11R6/lib/X11/app-defaults/Isdn - Resourcefile fuer xisdn
20. Verwendete Environment-Variablen
21. Verwendete Environment-Variablen
------------------------------------
Folgende Environment-Variablen werden von diesem System verwendet:
@ -4119,7 +4320,7 @@ Folgende Environment-Variablen werden von diesem System verwendet:
X-Client "xisdn"
21. Verwendete Abkuerzungen
22. Verwendete Abkuerzungen
---------------------------
VSt = Vermittlungsstelle (das Amt)
@ -4161,7 +4362,7 @@ Folgende Environment-Variablen werden von diesem System verwendet:
PRI = Primary rate interface (30 B-Kanaele)
22. Danksagung
23. Danksagung
--------------
Bedanken moechte ich mich vor allem bei

View File

@ -1,4 +1,4 @@
/* $Id: isdnconf.c,v 1.13 1999/03/07 18:18:42 akool Exp $
/* $Id: isdnconf.c,v 1.14 1999/03/15 21:27:48 akool Exp $
*
* ISDN accounting for isdn4linux. (Report-module)
*
@ -20,6 +20,15 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: isdnconf.c,v $
* Revision 1.14 1999/03/15 21:27:48 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.13 1999/03/07 18:18:42 akool
* - new 01805 tarif of DTAG
* - new March 1999 tarife
@ -308,7 +317,7 @@ int find_data(char *_alias, char *_number, section *conf_dat)
ptr = (CEPtr = Get_Entry(SPtr->entries,CONF_ENT_PROG))?(CEPtr->value?CEPtr->value:""):"";
print_msg(PRT_NORMAL,"%s:\t%s\n",make_word(CONF_ENT_PROG),ptr);
ptr = (CEPtr = Get_Entry(SPtr->entries,CONF_ENT_USER))?(CEPtr->value?CEPtr->value:""):"";
print_msg(PRT_NORMAL,"%s:\t%s\n",make_word(CONF_ENT_USER),ptr);
@ -668,19 +677,58 @@ int main(int argc, char *argv[], char *envp[])
if (areacode[0] != '\0')
{
char *ptr;
int len;
char *ptr, msg[BUFSIZ];
int len, i, zone;
(void)initSondernummern(msg);
/* print_msg(PRT_NORMAL, "%s\n", msg); */
initTarife(msg);
/* print_msg(PRT_NORMAL, "%s\n", msg); */
if ((ptr = get_areacode(areacode,&len,quiet?C_NO_ERROR|C_NO_WARN:0)) != NULL)
{
if (!isdnmon)
{
const char *area = area_diff_string(NULL,areacode);
const char *area;
if ((i = is_sondernummer(areacode, DTAG)) > -1) {
print_msg(PRT_NORMAL, "%s\n", SN[i].info);
if (!memcmp(areacode, "01610", 5) ||
!memcmp(areacode, "01617", 5) ||
!memcmp(areacode, "01619", 5))
zone = C_NETZ;
else if (!memcmp(areacode, "01618", 5))
zone = C_MOBILBOX;
else if (!memcmp(areacode, "0170", 4) ||
!memcmp(areacode, "0171", 4))
zone = D1_NETZ;
else if (!memcmp(areacode, "0172", 4) ||
!memcmp(areacode, "0173", 4))
zone = D2_NETZ;
else if (!memcmp(areacode, "0177", 4) ||
!memcmp(areacode, "0178", 4))
zone = E_PLUS_NETZ;
else if (!memcmp(areacode, "0176", 4) ||
!memcmp(areacode, "0179", 4))
zone = E2_NETZ;
else
zone = GLOBALCALL;
}
else {
area = area_diff_string(NULL,areacode);
zone = area_diff(NULL, areacode);
print_msg(PRT_NORMAL,"%s%s%s\n",ptr,area[0] != '\0'?" / ":"", area[0] != '\0'?area:"");
} /* else */
showcheapest(zone, 181);
print_msg(PRT_NORMAL,"%s%s%s\n",ptr,area[0] != '\0'?" / ":"", area[0] != '\0'?area:"");
exit(0);
}
print_msg(PRT_NORMAL,"%s\t%d\t",ptr,len);
}
else

View File

@ -1,4 +1,4 @@
/* $Id: processor.c,v 1.42 1999/03/14 18:47:44 akool Exp $
/* $Id: processor.c,v 1.43 1999/03/15 21:27:58 akool Exp $
*
* ISDN accounting for isdn4linux. (log-module)
*
@ -19,6 +19,15 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: processor.c,v $
* Revision 1.43 1999/03/15 21:27:58 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.42 1999/03/14 18:47:44 akool
* damn CLIP :-( Internal call's are free of charge!!
*
@ -507,7 +516,7 @@
#define _PROCESSOR_C_
#include "isdnlog.h"
static int HiSax = 0, hexSeen = 0, uid = -1;
static int HiSax = 0, hexSeen = 0, uid = UNKNOWN;
static char *asnp, *asnm;
#ifdef Q931
static int lfd = 0;
@ -590,7 +599,7 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
auto int partner = ((dir && (who == CALLING)) || (!dir && (who == CALLED)));
*sondernummer = -1;
*sondernummer = UNKNOWN;
*intern = 0;
#ifdef Q931
@ -731,7 +740,7 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
auto char s[BUFSIZ];
if (*provider < 100)
sprintf(s, "Via provider \"010%02d\", %s", *provider, Providername(*provider));
sprintf(s, "Via provider \"010%02d\", %s", *provider, Providername(*provider));
else
sprintf(s, "Via provider \"010%03d\", %s", *provider - 100, Providername(*provider));
@ -741,13 +750,22 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
} /* if */
#endif
if (!dir && (who == CALLED))
if (!dir && (who == CALLED)) {
*sondernummer = is_sondernummer(num, DTAG); /* try with DTAG, these provider must support them all (i think) */
*intern = strlen(num) < interns0;
if (*sondernummer == UNKNOWN)
*sondernummer = is_sondernummer(num, *provider);
if (*sondernummer == UNKNOWN)
*sondernummer = !memcmp(num, "019", 3); /* anything like 019xx is a Sondernummer! */
} /* if */
*intern = strlen(num) < interns0;
#ifdef Q931
if (q931dmp) {
if (*sondernummer != -1) {
if (*sondernummer != UNKNOWN) {
auto char s[256];
sprintf(s, "(Sonderrufnummer %s : %s)", num, sondernummername(num, DTAG));
@ -759,7 +777,7 @@ static void buildnumber(char *num, int oc3, int oc3a, char *result, int version,
} /* if */
#endif
if ((*sondernummer == -1) && !*intern)
if ((*sondernummer == UNKNOWN) && !*intern)
switch (oc3 & 0x70) { /* Calling party number Information element, Octet 3 - Table 4-11/Q.931 */
case 0x00 : if (*num) { /* 000 Unknown */
@ -3461,7 +3479,7 @@ static void huptime(int chan, int bchan, int setup)
else
newhuptimeout = oldhuptimeout;
if (oldchargeint != newchargeint || oldhuptimeout != newhuptimeout) {
if (((oldchargeint != newchargeint) || (oldhuptimeout != newhuptimeout)) && (newchargeint != UNKNOWN)) {
#if NET_DV >= NETDV_CHARGEINT
if (net_dv >= NETDV_CHARGEINT)
call[chan].chargeint = cfg.chargeint = newchargeint;
@ -4675,7 +4693,7 @@ doppelt:break;
strcat(sx, " ");
strcat(sx, qmsg(TYPE_CAUSE, version, call[chan].cause));
if (((p = location(call[chan].loc) != ""))) {
if (((p = location(call[chan].loc)) != "")) {
strcat(sx, " (");
strcat(sx, location(call[chan].loc));
strcat(sx, ")");

View File

@ -1,4 +1,4 @@
/* $Id: takt_de.c,v 1.12 1999/03/14 14:27:12 akool Exp $
/* $Id: takt_de.c,v 1.13 1999/03/15 21:28:04 akool Exp $
*
* ISDN accounting for isdn4linux. (log-module)
*
@ -19,6 +19,15 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: takt_de.c,v $
* Revision 1.13 1999/03/15 21:28:04 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.12 1999/03/14 14:27:12 akool
* - isdnlog Version 3.05
* - new Option "-u1" (or "ignoreRR=1")
@ -95,6 +104,7 @@
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#define MAXZONES 19
#define UNKNOWN -1
#define SONDERNUMMER -2 /* FIXME: set by readconfig(), but unused by now */
@ -118,7 +128,8 @@
#define INTERNET 17
#define GLOBALCALL 18
#define DTAG 33
#define I4LCONFDIR "/etc/isdn"
#define I4LCONFDIR "/etc/isdn"
#define DATADIR "/usr/lib/isdn"
#else
#include "isdnlog.h"
#endif
@ -220,14 +231,14 @@ char *zonen[MAXZONES] = { "Intern", "CityCall", "RegioCall", "GermanCall",
static TARIF t[MAXPROVIDER];
static int line = 0;
static int use[MAXPROVIDER];
#ifdef STANDALONE
typedef struct {
int prefix;
double tarif;
} SORT;
static SORT sort[MAXPROVIDER];
#endif
static void warning(char *s)
{
@ -541,7 +552,7 @@ int taktlaenge(int chan, char *why)
*why = 0;
if (!t[call[chan].provider].used) {
strcpy(why, "NO CHARGE INFOS FOR THIS PROVIDER");
sprintf(why, "No charge infos for provider %d", call[chan].provider);
return(UNKNOWN);
} /* if */
@ -594,8 +605,7 @@ void preparecint(int chan, char *msg, char *hint, int viarep)
provider = ((call[chan].provider == UNKNOWN) ? preselect : call[chan].provider);
if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, Abrechnung zum CityCall-Tarif */
(SN[call[chan].sondernummer[CALLED]].tarif == SO_CITYCALL) &&
(provider == DTAG))
(SN[call[chan].sondernummer[CALLED]].tarif == SO_CITYCALL))
zone = CITYCALL;
else if ((call[chan].sondernummer[CALLED] != UNKNOWN) && /* Sonderrufnummer, kostenlos */
(SN[call[chan].sondernummer[CALLED]].tarif == SO_FREE) &&
@ -629,7 +639,7 @@ void preparecint(int chan, char *msg, char *hint, int viarep)
if ((i = call[chan].confentry[OTHER]) > UNKNOWN)
zone = known[i]->zone;
if (zone == UNKNOWN)
zone = area_diff(NULL, call[chan].num[CALLED]);
zone = area_diff(NULL, call[chan].num[CALLED]);
if ((zone == AREA_ERROR) || (zone == AREA_UNKNOWN))
zone = UNKNOWN;
@ -770,7 +780,7 @@ void price(int chan, char *hint, int viarep)
onesec = call[chan].pay / duration;
pay2 = (duration - 600) * onesec * 0.30;
sprintf(sx, "10plus %s %s - %s %s = %s %s\n",
sprintf(sx, "10plus %s %s - %s %s = %s %s",
WAEHRUNG,
double2str(call[chan].pay, 6, 2, DEB),
WAEHRUNG,
@ -1181,129 +1191,90 @@ void exitTarife()
} /* exitTarife */
#if V1
void initSondernummern()
{
register char *p1, *p2, *p3;
register int tarif;
auto FILE *f;
auto char s[BUFSIZ], msn[128], sinfo[256], linfo[256], fn[BUFSIZ];
auto double grund1, grund2, takt1, takt2;
sprintf(fn, "%s/sonderrufnummern.dat", DATADIR);
if ((f = fopen(fn, "r")) != (FILE *)NULL) {
while ((p1 = fgets(s, BUFSIZ, f))) {
if (*p1 != '#') {
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
strcpy(msn, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
if (!strcmp(p1, "City"))
tarif = 1;
else if (!strcmp(p1, "free"))
tarif = 0;
else
tarif = UNKNOWN;
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
grund2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt1 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
takt2 = atof(p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '|'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(sinfo, p1);
p1 = p2 + 1;
if ((p2 = strchr(p1, '\n'))) {
*p2 = 0;
p3 = p2 - 1;
while (*p3 == ' ')
*p3-- = 0;
while (*p1 == ' ')
p1++;
strcpy(linfo, p1);
nSN++;
SN = realloc(SN, sizeof(SonderNummern) * nSN);
SN[nSN - 1].msn = strdup(msn);
SN[nSN - 1].sinfo = strdup(sinfo);
SN[nSN - 1].tarif = tarif;
SN[nSN - 1].grund1 = grund1;
SN[nSN - 1].grund2 = grund2;
SN[nSN - 1].takt1 = takt1;
SN[nSN - 1].takt2 = takt2;
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* if */
} /* while */
fclose(f);
} /* if */
} /* initSondernummern */
int is_sondernummer(char *num)
{
register int i;
if ((strlen(num) >= interns0) && ((*num == '0') || (*num == '1')))
for (i = 0; i < nSN; i++)
if (!strncmp(num, SN[i].msn, strlen(SN[i].msn)))
return(i);
return(-1);
} /* sondernummer */
#endif /* V1 */
#ifdef STANDALONE
int compare(const SORT *s1, const SORT *s2)
static int compare(const SORT *s1, const SORT *s2)
{
return(s1->tarif > s2->tarif);
} /* compare */
void showcheapest(int zone, int duration)
{
register int prefix, n = 0, n1, tz, cheapest = UNKNOWN;
auto char why[BUFSIZ], s[BUFSIZ];
auto double cheaptarif, providertarif, tarif;
auto time_t cur_time;
auto struct tm *tm;
time(&cur_time);
tm = localtime(&cur_time);
tz = tarifzeit(tm, why, 0);
print_msg(PRT_NORMAL, "%s\n", why);
if (!preselect) {
preselect = DTAG;
/* print_msg(PRT_NORMAL, "ASSUMING PRESELECT IS 010%d:%s\n", preselect, t[preselect].Provider); */
} /* if */
cheaptarif = 99999.9;
if (duration == -1)
duration = TEST;
for (prefix = 0; prefix < MAXPROVIDER; prefix++) {
if (t[prefix].used) {
tz = tarifzeit(tm, why, ((prefix == DTAG) && CityWeekend));
tarif = tpreis(prefix, zone, tz, tm->tm_hour, duration);
if (prefix == preselect)
providertarif = tarif;
if ((tarif > 0.0) && (tarif < cheaptarif)) {
cheaptarif = tarif;
cheapest = prefix;
} /* if */
sort[n].prefix = prefix;
sort[n].tarif = tarif;
n++;
} /* if */
} /* for */
if (cheapest != UNKNOWN) {
tarif = t[cheapest].tarif[zone][tz][tm->tm_hour];
if (t[cheapest].takt1[zone] == UNKNOWN)
sprintf(s, "DM %5.3f/%7.3fs", t[cheapest].taktpreis[zone], tarif);
else
sprintf(s, "DM %5.3f/Min, Takt %d/%d", tarif, t[cheapest].takt1[zone], t[cheapest].takt2[zone]);
print_msg(PRT_NORMAL, "\nUse 010%02d:%s, %s, costs DM %7.3f/%ds",
cheapest, t[cheapest].Provider, s,
cheaptarif, duration);
if (cheapest != preselect) {
print_msg(PRT_NORMAL, "\n\tsaving DM %7.3f/%ds vs. preselect (010%02d:%s)",
providertarif - cheaptarif, duration,
preselect, t[preselect].Provider);
} /* if */
print_msg(PRT_NORMAL, "\n\n");
} /* if */
qsort(sort, n, sizeof(SORT), compare);
for (n1 = 0; n1 < n; n1++)
if (sort[n1].tarif != -1)
print_msg(PRT_NORMAL, "010%02d:%s%*sDM %5.3f\n", sort[n1].prefix,
t[sort[n1].prefix].Provider, 15 - strlen(t[sort[n1].prefix].Provider), "", sort[n1].tarif);
} /* showcheapest */
#ifdef STANDALONE
int main(int argc, char *argv[], char *envp[])
{
register int prefix, z, d, h, n = 0, n1, cheapest = UNKNOWN;

View File

@ -1,4 +1,4 @@
/* $Id: isdnrep.c,v 1.57 1999/03/14 14:27:25 akool Exp $
/* $Id: isdnrep.c,v 1.58 1999/03/15 21:28:32 akool Exp $
*
* ISDN accounting for isdn4linux. (Report-module)
*
@ -24,6 +24,15 @@
*
*
* $Log: isdnrep.c,v $
* Revision 1.58 1999/03/15 21:28:32 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.57 1999/03/14 14:27:25 akool
* - isdnlog Version 3.05
* - new Option "-u1" (or "ignoreRR=1")
@ -661,7 +670,7 @@ static sum_calls day_sum;
static sum_calls day_com_sum;
static sum_calls all_sum;
static sum_calls all_com_sum;
/*****************************************************************************/
static double *msn_sum;
@ -836,7 +845,7 @@ int read_logfile(char *myname)
else
lineformat = DEF_FMT;
}
if (get_format(lineformat) == NULL)
return(UNKNOWN);
@ -974,7 +983,7 @@ int read_logfile(char *myname)
#elif defined(ISDN_AT)
einheit = 1.056;
#else
einheit = Tarif96 ? 0.121 : 0.23;
einheit = Tarif96 ? 0.12 : 0.23;
#endif
else
einheit = cur_call.currency_factor;
@ -1618,7 +1627,7 @@ static int print_line(int status, one_call *cur_call, int computed, char *overla
else
colsize[i] = append_string(&string,*fmtstring," ");
break;
case 'j': if (status == F_BODY_LINE)
{
if (!numbers)
@ -1635,7 +1644,7 @@ static int print_line(int status, one_call *cur_call, int computed, char *overla
}
}
break;
/* Link for answering machine! */
case 'C': if (html)
{
@ -1659,11 +1668,11 @@ static int print_line(int status, one_call *cur_call, int computed, char *overla
print_msg(PRT_ERR, "Unknown format %%G!\n");
break;
/* there are dummy entries */
case 'c':
case 'd':
case 'c':
case 'd':
case 's': if (status != F_BODY_LINE)
free_col = 1;
colsize[i] = append_string(&string,*fmtstring, " ");
break;
default : print_msg(PRT_ERR, "Internal Error: unknown format `%c'!\n",(*fmtstring)->s_type);
@ -1745,7 +1754,7 @@ static int append_string(char **string, prt_fmt *fmt_ptr, char* value)
default : htmlfmt = H_RIGHT;
break;
}
if (!strncmp(STR_FAX,value,strlen(STR_FAX)))
htmlfmt = H_LEFT;
@ -1761,7 +1770,7 @@ static int append_string(char **string, prt_fmt *fmt_ptr, char* value)
tmpfmt = tmpfmt2;
app_fmt_string(tmpstr,BUFSIZ*3-1,tmpfmt,condition,value);
if (*string == NULL)
*string = (char*) calloc(strlen(tmpstr)+1,sizeof(char));
else
@ -2196,7 +2205,7 @@ static int print_entries(one_call *cur_call, double unit, int *nx, char *myname)
/*****************************************************************************/
static int print_header(int lday)
static int print_header(int lday)
{
sum_calls tmp_sum;
time_t now;
@ -2250,7 +2259,7 @@ static char *get_time_value(time_t t, int *day, int flag)
static int oldday = UNKNOWN;
static int oldyear = UNKNOWN;
struct tm *tm;
if (flag & SET_TIME)
{
@ -2329,7 +2338,7 @@ static int set_alias(one_call *cur_call, int *nx, char *myname)
if (cur_call->version[0] != '\0')
{
if (!strcmp(cur_call->version,LOG_VERSION_2) ||
!strcmp(cur_call->version,LOG_VERSION_3) ||
!strcmp(cur_call->version,LOG_VERSION_3) ||
!strcmp(cur_call->version,LOG_VERSION_4) ||
!strcmp(cur_call->version,LOG_VERSION) )
cc = ((known[i]->si == cur_call->si) || j) &&
@ -2491,19 +2500,19 @@ static int set_caller_infos(one_call *cur_call, char *string, time_t from)
if (!memcmp(cur_call->num[1], "+491019", 7)) {
cur_call->provider = 19;
memmove(cur_call->num[1] + 3, cur_call->num[1] + 8, strlen(cur_call->num[1]) - 7);
adapt++;
adapt++;
}
else if (!memcmp(cur_call->num[1], "+491033", 7)) {
cur_call->provider = 33;
memmove(cur_call->num[1] + 3, cur_call->num[1] + 8, strlen(cur_call->num[1]) - 7);
adapt++;
adapt++;
}
else if (!memcmp(cur_call->num[1], "+491070", 7)) {
cur_call->provider = 70;
memmove(cur_call->num[1] + 3, cur_call->num[1] + 8, strlen(cur_call->num[1]) - 7);
adapt++;
adapt++;
} /* else */
if (adapt)
strcpy(cur_call->version, LOG_VERSION_4);
@ -2554,7 +2563,7 @@ static int set_caller_infos(one_call *cur_call, char *string, time_t from)
case 18: cur_call->zone = atoi(array[i]);
break;
default : print_msg(PRT_ERR,"Unknown element found `%s'!\n",array[i]);
default : print_msg(PRT_ERR,"Unknown element found `%s'!\n",array[i]);
break;
}
}
@ -2981,7 +2990,7 @@ static void strich(int type)
if (html)
{
switch (type) {
case 3 :
case 3 :
case 1 : print_msg(PRT_NORMAL,H_LINE,get_format_size(),1);
break;
case 2 : print_msg(PRT_NORMAL,H_LINE,get_format_size(),3);
@ -3005,7 +3014,7 @@ static void strich(int type)
string[--size] = type==2?'=':'-';
print_msg(PRT_NORMAL,"%s\n",string);
free(string);
}
} /* strich */
@ -3351,7 +3360,7 @@ static int Compare_files(const void *e1, const void *e2)
else
if ((*(file_list**) e1)->time < (*(file_list**) e2)->time)
return(UNKNOWN);
return 0;
}
@ -3513,7 +3522,7 @@ static char *nam2html(char *file)
ptr += 3;
file++;
break;
default : *ptr++ = *file++;
default : *ptr++ = *file++;
break;
}
}
@ -3674,7 +3683,7 @@ static char *create_vbox_file(char *file, int *compression)
return NULL;
}
}
close(fdin);
return fileout;
}
@ -3850,7 +3859,7 @@ static int find_format_length(char *string)
return(UNKNOWN);
memmove(string,dest,strlen(dest)+1);
return len;
}

View File

@ -1,4 +1,4 @@
# $Id: sonderrufnummern.dat,v 1.6 1999/03/14 14:26:18 akool Exp $
# $Id: sonderrufnummern.dat,v 1.7 1999/03/15 21:27:38 akool Exp $
#
# Sonderrufnummerndatenbank
#
@ -19,6 +19,15 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# $Log: sonderrufnummern.dat,v $
# Revision 1.7 1999/03/15 21:27:38 akool
# - isdnlog Version 3.06
# - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
# - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
# - isdnlog: dont change CHARGEINT, if rate is't known!
# - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
# - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
# - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
#
# Revision 1.6 1999/03/14 14:26:18 akool
# - isdnlog Version 3.05
# - new Option "-u1" (or "ignoreRR=1")
@ -45,7 +54,7 @@
#
# Stand: 1/99
#
V:1.01 [14-Mar-99]
V:1.02 [15-Mar-99]
33|0010 |free| | | | |Operator Service
33|0031800 |free| | | | |Plus Freephone Service (Niederl.)
33|0041800 |free| | | | |Plus Freephone Service (Schweiz)
@ -510,3 +519,4 @@ V:1.01 [14-Mar-99]
70|01172 |free| | | | |DTAG-Störungsannahme
70|01174 |free| | | | |DTAG-Störungsannahme
70|2000 |? | | | | |EXPO-Hotline
88|0191999 |City| | | | |UUnet PPP-Zugang

View File

@ -1,8 +1,8 @@
# @(#)tarif.dat 1.08 14-Mar-99 11:35
# @(#)tarif.dat 1.09 15-Mar-99 20:00
#
# Copyright 1995, 1999 by Andreas Kool (akool@isdn4linux.de)
#
V:1.08 [14-Mar-99]
V:1.09 [15-Mar-99]
#
# P: Provider
# G: tt.mm.jjjj Tarif g<>ltig ab
@ -168,6 +168,7 @@ C: pro Monat 2 Stunden Nutzungsentgelt frei
C: monatliche Grundgeb<65>hr DM 8,00
C:ISDN-Tarif
C:FIXME: Tarife überprüfen! 04-Mar-99
C:FORMEL: 7,2 / Minutenpreis => Taktlaenge
C:Quelle: http://www.telekom.de/untern/tarife/mobil/index.htm
I:0191011
Z:1,0.12
@ -326,6 +327,21 @@ T:W21-09=0.60
T:E09-21=0.74
T:E21-09=0.60
################################################################
P:88=WorldCom
C:Dies sind *nicht* die korrekten Tarife von WorldCom, da WorldCom
C:keine Tarifdaten veroeffentlicht!
C:Vielmehr handelt es sich hier nur um die Tarife fuer den
C:UUnet Ortstarif-Zugang!
I:0191999
Z:1,0.12
T:W02-05=240 # Nacht
T:W05-09=150 # Spar
T:W09-18=90 # Standard
T:W18-21=150 # Spar
T:W21-02=240 # Mondschein
T:E05-21=150 # Spar
T:E21-05=240 # Mondschein
################################################################
P:90=Viag Intercom
G:01.01.1999
Z:2-3,60/60

View File

@ -1,4 +1,4 @@
/* $Id: isdnconf.c,v 1.22 1999/02/28 19:33:39 akool Exp $
/* $Id: isdnconf.c,v 1.23 1999/03/15 21:28:44 akool Exp $
*
* ISDN accounting for isdn4linux. (Utilities)
*
@ -20,6 +20,15 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: isdnconf.c,v $
* Revision 1.23 1999/03/15 21:28:44 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.22 1999/02/28 19:33:39 akool
* Fixed a typo in isdnconf.c from Andreas Jaeger <aj@arthur.rhein-neckar.de>
* CHARGEMAX fix from Oliver Lauer <Oliver.Lauer@coburg.baynet.de>
@ -890,7 +899,7 @@ void setDefaults()
#elif defined(ISDN_AT)
currency_factor = 1.056;
#else
currency_factor = 0.121;
currency_factor = 0.12;
#endif
} /* if */
@ -1235,7 +1244,7 @@ static int Set_Globals(section *SPtr)
_print_msg("%s: ERROR: Can't allocate memory!\n", Myname);
return 0;
}
lineformats[++cnt] = NULL;
}

View File

@ -1,4 +1,4 @@
/* $Id: tools.h,v 1.29 1999/03/14 14:27:37 akool Exp $
/* $Id: tools.h,v 1.30 1999/03/15 21:28:54 akool Exp $
*
* ISDN accounting for isdn4linux.
*
@ -20,6 +20,15 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: tools.h,v $
* Revision 1.30 1999/03/15 21:28:54 akool
* - isdnlog Version 3.06
* - README: explain some terms about LCR, corrected "-c" Option of "isdnconf"
* - isdnconf: added a small LCR-feature - simply try "isdnconf -c 069"
* - isdnlog: dont change CHARGEINT, if rate is't known!
* - sonderrufnummern 1.02 [15-Mar-99] :: added WorldCom
* - tarif.dat 1.09 [15-Mar-99] :: added WorldCom
* - isdnlog now correctly handles the new "Ortstarif-Zugang" of UUnet
*
* Revision 1.29 1999/03/14 14:27:37 akool
* - isdnlog Version 3.05
* - new Option "-u1" (or "ignoreRR=1")
@ -706,7 +715,7 @@ typedef struct {
int oc3;
int takteChargeInt;
int card;
int knock;
int knock;
time_t nextcint;
float cint;
int cinth;
@ -945,6 +954,7 @@ _EXTERN char *qmsg(int type, int version, int val);
_EXTERN char *Myname;
_EXTERN void initTarife(char *msg);
_EXTERN void exitTarife(void);
_EXTERN void showcheapest(int zone, int duration);
_EXTERN void price(int chan, char *hint, int viarep);
_EXTERN char *realProvidername(int prefix);
_EXTERN void preparecint(int chan, char *msg, char *hint, int viarep);