Merged revisions 89622 via svnmerge from
authorSteve Murphy <murf@digium.com>
Tue, 27 Nov 2007 06:47:08 +0000 (06:47 +0000)
committerSteve Murphy <murf@digium.com>
Tue, 27 Nov 2007 06:47:08 +0000 (06:47 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r89622 | murf | 2007-11-26 23:24:02 -0700 (Mon, 26 Nov 2007) | 1 line

closes issue #11379; OK, this is an attempt to make both sides happy. To the cdr.conf file, I added the option 'unanswered', which defaults to 'no'. In this mode, you will see a cdr for a call, whether it was answered or not. The disposition will be NO ANSWER or ANSWERED, as appropriate. The src is as you'd expect, the destination channel will be one of the channels from the Dial() call, usually the last in the list if more than one chan was specified. With unanswered set to 'yes', you will still see this cdr entry in both cases. But in the case where the dial timed out, you will also see a cdr for each line attempted, marked NO ANSWER, with no destination channel name. The new option defaults to 'no', so you don't see the pesky extra cdr's by default, and you will not see the irritating 'not posted' messages.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@89623 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c
configs/cdr.conf.sample
include/asterisk/cdr.h
main/cdr.c

index 714c38a..a7f5fff 100644 (file)
@@ -50,6 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/app.h"
 #include "asterisk/causes.h"
 #include "asterisk/rtp.h"
+#include "asterisk/cdr.h"
 #include "asterisk/manager.h"
 #include "asterisk/privacy.h"
 #include "asterisk/stringfields.h"
@@ -820,7 +821,26 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in,
                }
                
        }
-
+       if (peer && !ast_cdr_log_unanswered()) {
+               /* suppress the CDR's that didn't win */
+               struct chanlist *o;
+               for (o = outgoing; o; o = o->next) {
+                       struct ast_channel *c = o->chan;
+                       if (c && c != peer && c->cdr) {
+                               ast_set_flag(c->cdr, AST_CDR_FLAG_POST_DISABLED);
+                       }
+               }
+       } else if (!peer && !ast_cdr_log_unanswered()) {
+                       /* suppress the CDR's that didn't win */
+               struct chanlist *o;
+               for (o = outgoing; o; o = o->next) {
+                       struct ast_channel *c = o->chan;
+                       if (c && c->cdr) {
+                               ast_set_flag(c->cdr, AST_CDR_FLAG_POST_DISABLED);               
+                       }
+               }
+       }
+       
 #ifdef HAVE_EPOLL
        for (epollo = outgoing; epollo; epollo = epollo->next)
                ast_poll_channel_del(in, epollo->chan);
index 6137eb4..c2882c1 100644 (file)
 ; any loading of backend CDR modules.  Default is "yes".
 ;enable=yes
 
+; Define whether or not to log unanswered calls. Setting this to "yes" will
+; report every attempt to ring a phone in dialing attempts, when it was not 
+; answered. For example, if you try to dial 3 extensions, and this option is "yes",
+; you will get 3 CDR's, one for each phone that was rung. Default is "no". Some
+; find this information horribly useless. Others find it very valuable. Note, in "yes"
+; mode, you will see one CDR, with one of the call targets on one side, and the originating
+; channel on the other, and then one CDR for each channel attempted. This may seem 
+; redundant, but cannot be helped.
+;unanswered = no
+
 ; Define the CDR batch mode, where instead of posting the CDR at the end of
 ; every call, the data will be stored in a buffer to help alleviate load on the
 ; asterisk server.  Default is "no".
index cdbf35e..b2307e5 100644 (file)
@@ -100,6 +100,7 @@ int ast_cdr_setvar(struct ast_cdr *cdr, const char *name, const char *value, int
 int ast_cdr_serialize_variables(struct ast_cdr *cdr, struct ast_str **buf, char delim, char sep, int recur);
 void ast_cdr_free_vars(struct ast_cdr *cdr, int recur);
 int ast_cdr_copy_vars(struct ast_cdr *to_cdr, struct ast_cdr *from_cdr);
+int ast_cdr_log_unanswered(void);
 
 typedef int (*ast_cdrbe)(struct ast_cdr *cdr);
 
index 5578fe2..c828ec8 100644 (file)
@@ -83,6 +83,7 @@ static pthread_t cdr_thread = AST_PTHREADT_NULL;
 #define BATCH_SAFE_SHUTDOWN_DEFAULT 1
 
 static int enabled;            /*! Is the CDR subsystem enabled ? */
+static int unanswered;
 static int batchmode;
 static int batchsize;
 static int batchtime;
@@ -100,6 +101,11 @@ int check_cdr_enabled()
        return enabled;
 }
 
+int ast_cdr_log_unanswered(void)
+{
+       return unanswered;
+}
+
 /*! Register a CDR driver. Each registered CDR driver generates a CDR 
        \return 0 on success, -1 on failure 
 */
@@ -976,8 +982,6 @@ static void post_cdr(struct ast_cdr *cdr)
        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)))
-                       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))
@@ -1241,6 +1245,7 @@ static char *handle_cli_status(struct ast_cli_entry *e, int cmd, struct ast_cli_
        ast_cli(a->fd, "CDR logging: %s\n", enabled ? "enabled" : "disabled");
        ast_cli(a->fd, "CDR mode: %s\n", batchmode ? "batch" : "simple");
        if (enabled) {
+               ast_cli(a->fd, "CDR output unanswered calls: %s\n", unanswered ? "yes" : "no");
                if (batchmode) {
                        if (batch)
                                cnt = batch->size;
@@ -1291,6 +1296,7 @@ static int do_reload(int reload)
 {
        struct ast_config *config;
        const char *enabled_value;
+       const char *unanswered_value;
        const char *batched_value;
        const char *scheduleronly_value;
        const char *batchsafeshutdown_value;
@@ -1326,6 +1332,9 @@ static int do_reload(int reload)
                if ((enabled_value = ast_variable_retrieve(config, "general", "enable"))) {
                        enabled = ast_true(enabled_value);
                }
+               if ((unanswered_value = ast_variable_retrieve(config, "general", "unanswered"))) {
+                       unanswered = ast_true(unanswered_value);
+               }
                if ((batched_value = ast_variable_retrieve(config, "general", "batch"))) {
                        batchmode = ast_true(batched_value);
                }