From 6c6ed9fc34a674121fba4b3b34e7f01986efa928 Mon Sep 17 00:00:00 2001 From: murf Date: Tue, 27 Nov 2007 06:24:02 +0000 Subject: 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: http://svn.digium.com/svn/asterisk/branches/1.4@89622 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_dial.c | 22 +++++++++++++++++++++- configs/cdr.conf.sample | 10 ++++++++++ include/asterisk/cdr.h | 1 + main/cdr.c | 13 +++++++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/apps/app_dial.c b/apps/app_dial.c index c1bb40b95..73d2d4c15 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -57,6 +57,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" @@ -762,7 +763,26 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct dial_l } } - + if (peer && !ast_cdr_log_unanswered()) { + /* suppress the CDR's that didn't win */ + struct dial_localuser *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 dial_localuser *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); + } + } + } + return peer; } diff --git a/configs/cdr.conf.sample b/configs/cdr.conf.sample index 6137eb402..c2882c1f0 100644 --- a/configs/cdr.conf.sample +++ b/configs/cdr.conf.sample @@ -13,6 +13,16 @@ ; 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". diff --git a/include/asterisk/cdr.h b/include/asterisk/cdr.h index b61e25014..b88234a39 100644 --- a/include/asterisk/cdr.h +++ b/include/asterisk/cdr.h @@ -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, char *buf, size_t size, 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); diff --git a/main/cdr.c b/main/cdr.c index 5aa7a24f1..0bed0cfda 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -89,6 +89,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; @@ -102,6 +103,11 @@ AST_MUTEX_DEFINE_STATIC(cdr_pending_lock); static ast_cond_t cdr_pending_cond; +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 */ @@ -984,8 +990,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, ""); check_post(cdr); if (ast_tvzero(cdr->end)) @@ -1247,6 +1251,7 @@ static int handle_cli_status(int fd, int argc, char *argv[]) ast_cli(fd, "CDR logging: %s\n", enabled ? "enabled" : "disabled"); ast_cli(fd, "CDR mode: %s\n", batchmode ? "batch" : "simple"); if (enabled) { + ast_cli(fd, "CDR output unanswered calls: %s\n", unanswered ? "yes" : "no"); if (batchmode) { if (batch) cnt = batch->size; @@ -1298,6 +1303,7 @@ static int do_reload(void) { struct ast_config *config; const char *enabled_value; + const char *unanswered_value; const char *batched_value; const char *scheduleronly_value; const char *batchsafeshutdown_value; @@ -1329,6 +1335,9 @@ static int do_reload(void) 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); } -- cgit v1.2.3