Merged revisions 11503 via svnmerge from
[asterisk/asterisk.git] / cdr / cdr_manager.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2004 - 2005
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17 /*! \file
18  *
19  * \brief Asterisk Call Manager CDR records.
20  * 
21  * See also
22  * \arg \ref AstCDR
23  * \arg \ref AstAMI
24  * \arg \ref Config_ami
25  * \ingroup cdr_drivers
26  */
27
28 #include <sys/types.h>
29 #include <strings.h>
30 #include <unistd.h>
31 #include <time.h>
32
33 #include "asterisk.h"
34
35 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
36
37 #include "asterisk/channel.h"
38 #include "asterisk/cdr.h"
39 #include "asterisk/module.h"
40 #include "asterisk/logger.h"
41 #include "asterisk/utils.h"
42 #include "asterisk/manager.h"
43 #include "asterisk/config.h"
44
45 #define DATE_FORMAT     "%Y-%m-%d %T"
46 #define CONF_FILE       "cdr_manager.conf"
47
48 static char *desc = "Asterisk Call Manager CDR Backend";
49 static char *name = "cdr_manager";
50
51 static int enablecdr = 0;
52
53 static void loadconfigurationfile(void)
54 {
55         char *cat;
56         struct ast_config *cfg;
57         struct ast_variable *v;
58         
59         cfg = ast_config_load(CONF_FILE);
60         if (!cfg) {
61                 /* Standard configuration */
62                 enablecdr = 0;
63                 return;
64         }
65         
66         cat = ast_category_browse(cfg, NULL);
67         while (cat) {
68                 if (!strcasecmp(cat, "general")) {
69                         v = ast_variable_browse(cfg, cat);
70                         while (v) {
71                                 if (!strcasecmp(v->name, "enabled")) {
72                                         enablecdr = ast_true(v->value);
73                                 }
74                                 
75                                 v = v->next;
76                         }
77                 }
78         
79                 /* Next category */
80                 cat = ast_category_browse(cfg, cat);
81         }
82         
83         ast_config_destroy(cfg);
84 }
85
86 static int manager_log(struct ast_cdr *cdr)
87 {
88         time_t t;
89         struct tm timeresult;
90         char strStartTime[80] = "";
91         char strAnswerTime[80] = "";
92         char strEndTime[80] = "";
93         
94         if (!enablecdr)
95                 return 0;
96
97         t = cdr->start.tv_sec;
98         localtime_r(&t, &timeresult);
99         strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult);
100         
101         if (cdr->answer.tv_sec) {
102                 t = cdr->answer.tv_sec;
103                 localtime_r(&t, &timeresult);
104                 strftime(strAnswerTime, sizeof(strAnswerTime), DATE_FORMAT, &timeresult);
105         }
106
107         t = cdr->end.tv_sec;
108         localtime_r(&t, &timeresult);
109         strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult);
110
111         manager_event(EVENT_FLAG_CALL, "Cdr",
112             "AccountCode: %s\r\n"
113             "Source: %s\r\n"
114             "Destination: %s\r\n"
115             "DestinationContext: %s\r\n"
116             "CallerID: %s\r\n"
117             "Channel: %s\r\n"
118             "DestinationChannel: %s\r\n"
119             "LastApplication: %s\r\n"
120             "LastData: %s\r\n"
121             "StartTime: %s\r\n"
122             "AnswerTime: %s\r\n"
123             "EndTime: %s\r\n"
124             "Duration: %ld\r\n"
125             "BillableSeconds: %ld\r\n"
126             "Disposition: %s\r\n"
127             "AMAFlags: %s\r\n"
128             "UniqueID: %s\r\n"
129             "UserField: %s\r\n",
130             cdr->accountcode, cdr->src, cdr->dst, cdr->dcontext, cdr->clid, cdr->channel,
131             cdr->dstchannel, cdr->lastapp, cdr->lastdata, strStartTime, strAnswerTime, strEndTime,
132             cdr->duration, cdr->billsec, ast_cdr_disp2str(cdr->disposition), 
133             ast_cdr_flags2str(cdr->amaflags), cdr->uniqueid, cdr->userfield);
134                 
135         return 0;
136 }
137
138 char *description(void)
139 {
140         return desc;
141 }
142
143 int unload_module(void)
144 {
145         ast_cdr_unregister(name);
146         return 0;
147 }
148
149 int load_module(void)
150 {
151         int res;
152
153         /* Configuration file */
154         loadconfigurationfile();
155         
156         res = ast_cdr_register(name, desc, manager_log);
157         if (res) {
158                 ast_log(LOG_ERROR, "Unable to register Asterisk Call Manager CDR handling\n");
159         }
160         
161         return res;
162 }
163
164 int reload(void)
165 {
166         loadconfigurationfile();
167         return 0;
168 }
169
170 int usecount(void)
171 {
172         return 0;
173 }
174
175 char *key()
176 {
177         return ASTERISK_GPL_KEY;
178 }