Add Manager CDR (off by default) (bug #2127) courtesy cybershield
authorMark Spencer <markster@digium.com>
Sun, 25 Jul 2004 14:56:34 +0000 (14:56 +0000)
committerMark Spencer <markster@digium.com>
Sun, 25 Jul 2004 14:56:34 +0000 (14:56 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3509 65c4cc65-6c06-0410-ace0-fbb531ad65f3

cdr/Makefile
cdr/cdr_manager.c [new file with mode: 0755]
configs/cdr_manager.conf.sample [new file with mode: 0755]

index 5ccd634..d2ba09c 100755 (executable)
@@ -12,7 +12,7 @@
 #
 
 #ADD cdr_pgsql.so to MODS= to include PostgreSQL support: REQUIRES PostgreSQL libs
-MODS=cdr_csv.so
+MODS=cdr_csv.so cdr_manager.so
 
 
 CFLAGS+=-fPIC
diff --git a/cdr/cdr_manager.c b/cdr/cdr_manager.c
new file mode 100755 (executable)
index 0000000..1ebc58e
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Asterisk Call Manager CDR records.
+ * 
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ *
+ */
+
+#include <sys/types.h>
+#include <asterisk/channel.h>
+#include <asterisk/cdr.h>
+#include <asterisk/module.h>
+#include <asterisk/logger.h>
+#include <asterisk/utils.h>
+#include <asterisk/manager.h>
+#include <asterisk/config.h>
+#include "../asterisk.h"
+#include "../astconf.h"
+#include <strings.h>
+#include <unistd.h>
+#include <time.h>
+
+#define DATE_FORMAT    "%Y-%m-%d %T"
+#define CONF_FILE      "cdr_manager.conf"
+
+static char *desc = "Asterisk Call Manager CDR Backend";
+static char *name = "cdr_as";
+
+static int enablecdr = 0;
+
+static void loadconfigurationfile(void)
+{
+       char *cat;
+       struct ast_config *cfg;
+       struct ast_variable *v;
+       
+       cfg = ast_load(CONF_FILE);
+       if (!cfg) {
+               /* Standard configuration */
+               enablecdr = 0;
+               return;
+       }
+       
+       cat = ast_category_browse(cfg, NULL);
+       while (cat) {
+               if (!strcasecmp(cat, "general")) {
+                       v = ast_variable_browse(cfg, cat);
+                       while (v) {
+                               if (!strcasecmp(v->name, "enabled")) {
+                                       enablecdr = ast_true(v->value);
+                               }
+                               
+                               v = v->next;
+                       }
+               }
+       
+               /* Next category */
+               cat = ast_category_browse(cfg, cat);
+       }
+       
+       ast_destroy(cfg);
+}
+
+static int manager_log(struct ast_cdr *cdr)
+{
+       time_t t;
+       struct tm timeresult;
+       char strStartTime[80] = "";
+       char strAnswerTime[80] = "";
+       char strEndTime[80] = "";
+       
+       if (!enablecdr)
+               return 0;
+
+       t = cdr->start.tv_sec;
+       localtime_r(&t, &timeresult);
+       strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult);
+       
+       if (cdr->answer.tv_sec) {
+               t = cdr->answer.tv_sec;
+               localtime_r(&t, &timeresult);
+               strftime(strAnswerTime, sizeof(strAnswerTime), DATE_FORMAT, &timeresult);
+       }
+
+       t = cdr->end.tv_sec;
+       localtime_r(&t, &timeresult);
+       strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult);
+
+       manager_event(EVENT_FLAG_CALL, "Cdr",
+           "AccountCode: %s\r\n"
+           "Source: %s\r\n"
+           "Destination: %s\r\n"
+           "DestinationContext: %s\r\n"
+           "CallerID: %s\r\n"
+           "Channel: %s\r\n"
+           "DestinationChannel: %s\r\n"
+           "LastApplication: %s\r\n"
+           "LastData: %s\r\n"
+           "StartTime: %s\r\n"
+           "AnswerTime: %s\r\n"
+           "EndTime: %s\r\n"
+           "Duration: %d\r\n"
+           "BillableSeconds: %d\r\n"
+           "Disposition: %s\r\n"
+           "AMAFlags: %s\r\n"
+           "UniqueID: %s\r\n"
+           "UserField: %s\r\n",
+           cdr->accountcode, cdr->src, cdr->dst, cdr->dcontext, cdr->clid, cdr->channel,
+           cdr->dstchannel, cdr->lastapp, cdr->lastdata, strStartTime, strAnswerTime, strEndTime,
+           cdr->duration, cdr->billsec, ast_cdr_disp2str(cdr->disposition), 
+           ast_cdr_flags2str(cdr->amaflags), cdr->uniqueid, cdr->userfield);
+               
+       return 0;
+}
+
+char *description(void)
+{
+       return desc;
+}
+
+int unload_module(void)
+{
+       ast_cdr_unregister(name);
+       return 0;
+}
+
+int load_module(void)
+{
+       int res;
+
+       /* Configuration file */
+       loadconfigurationfile();
+       
+       res = ast_cdr_register(name, desc, manager_log);
+       if (res) {
+               ast_log(LOG_ERROR, "Unable to register Asterisk Call Manager CDR handling\n");
+       }
+       
+       return res;
+}
+
+int reload(void)
+{
+       loadconfigurationfile();
+       return 0;
+}
+
+int usecount(void)
+{
+       return 0;
+}
+
+char *key()
+{
+       return ASTERISK_GPL_KEY;
+}
diff --git a/configs/cdr_manager.conf.sample b/configs/cdr_manager.conf.sample
new file mode 100755 (executable)
index 0000000..1d7984b
--- /dev/null
@@ -0,0 +1,6 @@
+;
+; Asterisk Call Management CDR
+;
+[general]
+enabled = no
+