CDR bei CANCEL doppelt (überflüssige "s"-Einträge * 1.4)

ingok2

Neuer User
Mitglied seit
12 Okt 2005
Beiträge
6
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich habe in der trunk-version 1.4.11 folgendes Problem:
Wenn ein ausgehender CALL beendet wird bevor der Angerufene abnimmt (CANCEL) werden 2 CDR-Werte geschrieben:
1. der richtige mit SRC=12, dcontext = trunkdial, channel=SIP/12, dstchannel=mISDN/0, Lastapp=Dial, lastdata=mISDN/0-DIDxxx/xxx, duration: 3, accountcode="CANCEL"
2. der nicht benötigte: SRC=12, dcontext = default, channel=mISDN/0, dstchannel = "", lastapp="", lastdata="",duration:3, accountcode=""!

Passiert leider nur bei cancel, hangupcontext ist identisch.
Ich weiß ja, es gibt Änderungen im cdr-bereich, aber zur Auswertung ist es eine Katastrophe, das sind 2 Gespräche mit NOANSWER!

Weiß jemand Rat?
 
Das Problem habe ich auch und leider noch keine brauchbare Lösung gefunden :-(
 
Da gibt es - seit den entsprechenden Änderungen am CDR-Code (in der 1.4er Reihe war das bei 1.4.3) - leider nach wie vor kein Licht am Ende des Tunnels: Gespräche mit NO ANSWER respektive CANCEL erzeugen einen korrekten CDR sowie zusätzlich so viele, wie Asterisk-seits am Call beteiligt werden (ist besonders hübsch bei eingehendem Gruppenruf :mad: )

Ich lasse hier die CDRs in eine mysql-DB schreiben und helfe mir mit einem Workaround: Alle "Unsinns-CDRs" haben bei mir dst="s", die fachlich nicht vorkommen kann. Und damit läuft dann halt leider Gottes ein Cronjob in der Form

Code:
echo "delete from cdr where dst='s'" | mysql asterisk > /dev/null 2>&1
 
Code:
--- cdr_addon_mysql.c.old       2007-06-19 00:40:40.000000000 +0200
+++ cdr_addon_mysql.c   2007-08-30 01:49:55.587048884 +0200
@@ -227,5 +227,6 @@

        if (connected) {
-               if (mysql_real_query(&mysql, sqlcmd, strlen(sqlcmd))) {
+               if (strcmp("s",cdr->dst) != 0 &&
+                   mysql_real_query(&mysql, sqlcmd, strlen(sqlcmd))) {
                        ast_log(LOG_ERROR, "mysql_cdr: Failed to insert into database: (%d) %s", mysql_errno(&mysql), mysql_error(&mysql));
                        mysql_close(&mysql);

ungetestet! ;-)

Gruß
britzelfix
 
Zuletzt bearbeitet:
hmm. Ich habe die Einträge in der Master.csv - sollte ein patch nicht besser in 'cdr.c' rein?
 
@Netview

Selbst ist der Mann. Das Posting war
an abw1oim gerichtet, der wie ich
die CDR in MySQL pflegt.

Gruß
britzelfix
 
@britzelfix

Vielen Dank! :groesste: Ich muss zugeben, C ist nicht meine Stärke :)
Habe Deinen Patch mal benutzt und getestet und es funktioniert. Nochmal Danke !

@Netview

Im entsprechenden cdr_csv.c gibt es eine Methode

Code:
static int csv_log(struct ast_cdr *cdr)

Diese erzeugt den CDR. Nach kurzer Anlayse könnte die Wandlung von

Code:
 if (build_csv_record(buf, sizeof(buf), cdr)) {
         ast_log(LOG_WARNING, "Unable to create CSV record in %d bytes.  CDR not recorded!\n", (int)sizeof(buf));
} else {

in

Code:
 if (strcmp("s",cdr->dst) != 0 && 
     build_csv_record(buf, sizeof(buf), cdr)) {
         ast_log(LOG_WARNING, "Unable to create CSV record in %d bytes.  CDR not recorded!\n", (int)sizeof(buf));
} else {

zum gleichen Ergebnis führen (identische Prüfung auf dst="s") wie die von britzelfix vorgestellte Lösung für mysql. Verwendung allerdings ausdrücklich auf eigene Gefahr!
 
@abw1oim

vielen Dank für deinen Hinweis - ich hatte mir in der Zwischenzeit auch schon soetwas gebastelt, konnte allerdings wegen eines langfristigen Ausfalls von Kabel-Deutschland die Lösung die du oben schon beschrieben hast nicht eher hier posten :-(

Egal - es funktioniert auch mit dem modul cdr_csv.c :)

Edit: hier sind die patches für cdr_csv.c und cdr_custom.c um die "s"-Einträge zu unterdrücken
 

Anhänge

  • cdr_csv.zip
    582 Bytes · Aufrufe: 2
  • cdr_custom.zip
    388 Bytes · Aufrufe: 1
@Netview: Danke !

Kleine Ergänzung:
Wenn man erreichen will, dass beim Unterdücken der CDRs ohne Inhalt (siehe Digium-Patch) auch keine Message geloggt wird, kann man den Patch wie folgt anpassen:

Code:
--- branches/1.4/main/cdr.c	2007/08/30 21:11:48	81392
+++ branches/1.4/main/cdr.c	2007/09/11 20:36:15	82261
@@ -978,6 +978,10 @@
 	struct ast_cdr_beitem *i;
 
 	for ( ; cdr ; cdr = cdr->next) {
+		if (cdr->disposition < AST_CDR_ANSWERED && (ast_strlen_zero(cdr->channel) || ast_strlen_zero(cdr->dstchannel))) {
+			ast_set_flag(cdr, AST_CDR_FLAG_POST_DISABLED);
+			continue; /* people don't want to see unanswered single-channel events */
+		}
 		chan = S_OR(cdr->channel, "<unknown>");
 		check_post(cdr);
 		if (ast_tvzero(cdr->end))

Das ast_set_flag sagt dem Modul, dass der CDR bewußt nicht gepostet werden soll, woduch die Meldung auf der CLI/im Log unterbleibt.
 
Hinweis:

Der hier von Netview angesrochene Patch ist in 1.4.12 integriert (siehe Changelog).
Die Sache mit dem Logging allerdings nicht, wer dies also ausschalten will, sei auf meinen vorherigen Post

ast_set_flag(cdr, AST_CDR_FLAG_POST_DISABLED);

als Ergänzung verwiesen.
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,121
Beiträge
2,246,507
Mitglieder
373,619
Neuestes Mitglied
Twann
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.