aboutsummaryrefslogtreecommitdiffstats
path: root/cdr
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-07-25 14:56:34 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-07-25 14:56:34 +0000
commit2974f32e4f200726ffdcf7f2a5d9f22a47f6014e (patch)
tree9d33a356e349ad3b5b299c55bfd061c93f3b296b /cdr
parent26b052792cc41e2a5aaaa40efaa7137d46728663 (diff)
Add Manager CDR (off by default) (bug #2127) courtesy cybershield
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3509 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'cdr')
-rwxr-xr-xcdr/Makefile2
-rwxr-xr-xcdr/cdr_manager.c158
2 files changed, 159 insertions, 1 deletions
diff --git a/cdr/Makefile b/cdr/Makefile
index 5ccd6343f..d2ba09cac 100755
--- a/cdr/Makefile
+++ b/cdr/Makefile
@@ -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
index 000000000..1ebc58e73
--- /dev/null
+++ b/cdr/cdr_manager.c
@@ -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;
+}