Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Macros | Functions | Variables
cdr_manager.c File Reference

Asterisk Call Manager CDR records. More...

#include "asterisk.h"
#include <time.h>
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
Include dependency graph for cdr_manager.c:

Go to the source code of this file.

Macros

#define CONF_FILE   "cdr_manager.conf"
 
#define CUSTOM_FIELDS_BUF_SIZE   1024
 
#define DATE_FORMAT   "%Y-%m-%d %T"
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_config (int reload)
 
static int load_module (void)
 
static int manager_log (struct ast_cdr *cdr)
 
static int reload (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Asterisk Manager Interface CDR Backend" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, .requires = "cdr", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_strcustomfields
 
static ast_rwlock_t customfields_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} }
 
static int enablecdr = 0
 
static const char name [] = "cdr_manager"
 

Detailed Description

Asterisk Call Manager CDR records.

See also

Definition in file cdr_manager.c.

Macro Definition Documentation

◆ CONF_FILE

#define CONF_FILE   "cdr_manager.conf"

Definition at line 183 of file cdr_manager.c.

◆ CUSTOM_FIELDS_BUF_SIZE

#define CUSTOM_FIELDS_BUF_SIZE   1024

Definition at line 184 of file cdr_manager.c.

◆ DATE_FORMAT

#define DATE_FORMAT   "%Y-%m-%d %T"

Definition at line 182 of file cdr_manager.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 378 of file cdr_manager.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 378 of file cdr_manager.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 378 of file cdr_manager.c.

◆ load_config()

static int load_config ( int  reload)
static

Definition at line 195 of file cdr_manager.c.

196{
197 char *cat = NULL;
198 struct ast_config *cfg;
199 struct ast_variable *v;
200 struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
201 int newenablecdr = 0;
202
203 cfg = ast_config_load(CONF_FILE, config_flags);
204 if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
205 return 0;
206 }
207
208 if (cfg == CONFIG_STATUS_FILEINVALID) {
209 ast_log(LOG_ERROR, "Config file '%s' could not be parsed\n", CONF_FILE);
210 return -1;
211 }
212
213 if (!cfg) {
214 /* Standard configuration */
215 ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n");
216 if (enablecdr) {
218 }
219 enablecdr = 0;
220 return -1;
221 }
222
223 if (reload) {
225 }
226
227 if (reload && customfields) {
230 }
231
232 while ( (cat = ast_category_browse(cfg, cat)) ) {
233 if (!strcasecmp(cat, "general")) {
234 v = ast_variable_browse(cfg, cat);
235 while (v) {
236 if (!strcasecmp(v->name, "enabled"))
237 newenablecdr = ast_true(v->value);
238
239 v = v->next;
240 }
241 } else if (!strcasecmp(cat, "mappings")) {
243 v = ast_variable_browse(cfg, cat);
244 while (v) {
246 if ((ast_str_strlen(customfields) + strlen(v->value) + strlen(v->name) + 14) < ast_str_size(customfields)) {
247 ast_str_append(&customfields, -1, "%s: ${CDR(%s)}\r\n", v->value, v->name);
248 ast_log(LOG_NOTICE, "Added mapping %s: ${CDR(%s)}\n", v->value, v->name);
249 } else {
250 ast_log(LOG_WARNING, "No more buffer space to add other custom fields\n");
251 break;
252 }
253
254 }
255 v = v->next;
256 }
257 }
258 }
259
260 if (reload) {
262 }
263
265
266 if (!newenablecdr) {
268 } else if (newenablecdr) {
270 }
271 enablecdr = newenablecdr;
272
273 return 0;
274}
#define ast_free(a)
Definition: astmm.h:180
#define ast_log
Definition: astobj2.c:42
int ast_cdr_backend_unsuspend(const char *name)
Unsuspend a CDR backend.
Definition: cdr.c:3004
int ast_cdr_backend_suspend(const char *name)
Suspend a CDR backend temporarily.
Definition: cdr.c:2986
static const char name[]
Definition: cdr_manager.c:186
#define CONF_FILE
Definition: cdr_manager.c:183
static int enablecdr
Definition: cdr_manager.c:188
static struct ast_str * customfields
Definition: cdr_manager.c:190
#define CUSTOM_FIELDS_BUF_SIZE
Definition: cdr_manager.c:184
static int reload(void)
Definition: cdr_manager.c:366
static ast_rwlock_t customfields_lock
Definition: cdr_manager.c:191
#define ast_config_load(filename, flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
Definition: extconf.c:3326
@ CONFIG_FLAG_FILEUNCHANGED
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition: extconf.c:1289
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1215
#define LOG_ERROR
#define LOG_NOTICE
#define LOG_WARNING
#define ast_rwlock_wrlock(a)
Definition: lock.h:240
#define ast_rwlock_unlock(a)
Definition: lock.h:238
#define NULL
Definition: resample.c:96
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: utils.c:2199
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
Definition: strings.h:730
size_t ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition: strings.h:742
Structure used to handle boolean flags.
Definition: utils.h:199
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next

References ast_category_browse(), ast_cdr_backend_suspend(), ast_cdr_backend_unsuspend(), ast_config_destroy(), ast_config_load, ast_free, ast_log, ast_rwlock_unlock, ast_rwlock_wrlock, ast_str_append(), ast_str_create, ast_str_size(), ast_str_strlen(), ast_strlen_zero(), ast_true(), ast_variable_browse(), CONF_FILE, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, CUSTOM_FIELDS_BUF_SIZE, customfields, customfields_lock, enablecdr, LOG_ERROR, LOG_NOTICE, LOG_WARNING, name, ast_variable::name, ast_variable::next, NULL, reload(), and ast_variable::value.

Referenced by load_module(), and reload().

◆ load_module()

static int load_module ( void  )
static

Definition at line 352 of file cdr_manager.c.

353{
354 if (ast_cdr_register(name, "Asterisk Manager Interface CDR Backend", manager_log)) {
356 }
357
358 if (load_config(0)) {
361 }
362
364}
int ast_cdr_unregister(const char *name)
Unregister a CDR handling engine.
Definition: cdr.c:3108
int ast_cdr_register(const char *name, const char *desc, ast_cdrbe be)
Register a CDR handling engine.
Definition: cdr.c:3063
static int manager_log(struct ast_cdr *cdr)
Definition: cdr_manager.c:276
static int load_config(int reload)
Definition: cdr_manager.c:195
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78

References ast_cdr_register(), ast_cdr_unregister(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, load_config(), manager_log(), and name.

◆ manager_log()

static int manager_log ( struct ast_cdr cdr)
static

Definition at line 276 of file cdr_manager.c.

277{
278 struct ast_tm timeresult;
279 char strStartTime[80] = "";
280 char strAnswerTime[80] = "";
281 char strEndTime[80] = "";
283
284 if (!enablecdr)
285 return 0;
286
287 ast_localtime(&cdr->start, &timeresult, NULL);
288 ast_strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult);
289
290 if (cdr->answer.tv_sec) {
291 ast_localtime(&cdr->answer, &timeresult, NULL);
292 ast_strftime(strAnswerTime, sizeof(strAnswerTime), DATE_FORMAT, &timeresult);
293 }
294
295 ast_localtime(&cdr->end, &timeresult, NULL);
296 ast_strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult);
297
298 buf[0] = '\0';
302 if (!dummy) {
303 ast_log(LOG_ERROR, "Unable to allocate channel for variable substitution.\n");
304 return 0;
305 }
309 }
311
313 "AccountCode: %s\r\n"
314 "Source: %s\r\n"
315 "Destination: %s\r\n"
316 "DestinationContext: %s\r\n"
317 "CallerID: %s\r\n"
318 "Channel: %s\r\n"
319 "DestinationChannel: %s\r\n"
320 "LastApplication: %s\r\n"
321 "LastData: %s\r\n"
322 "StartTime: %s\r\n"
323 "AnswerTime: %s\r\n"
324 "EndTime: %s\r\n"
325 "Duration: %ld\r\n"
326 "BillableSeconds: %ld\r\n"
327 "Disposition: %s\r\n"
328 "AMAFlags: %s\r\n"
329 "UniqueID: %s\r\n"
330 "UserField: %s\r\n"
331 "%s",
333 cdr->dstchannel, cdr->lastapp, cdr->lastdata, strStartTime, strAnswerTime, strEndTime,
336
337 return 0;
338}
const char * ast_cdr_disp2str(int disposition)
Disposition to a string.
Definition: cdr.c:3563
struct ast_cdr * ast_cdr_dup(struct ast_cdr *cdr)
Duplicate a public CDR.
Definition: cdr.c:3118
#define DATE_FORMAT
Definition: cdr_manager.c:182
static void dummy(char *unused,...)
Definition: chan_unistim.c:220
const char * ast_channel_amaflags2string(enum ama_flags flags)
Convert the enum representation of an AMA flag to a string representation.
Definition: channel.c:4390
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:3006
void ast_channel_cdr_set(struct ast_channel *chan, struct ast_cdr *value)
#define ast_dummy_channel_alloc()
Create a fake channel structure.
Definition: channel.h:1328
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition: localtime.c:1739
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition: localtime.c:2524
#define ast_rwlock_rdlock(a)
Definition: lock.h:239
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:254
#define EVENT_FLAG_CDR
Definition: manager.h:85
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition: ael_main.c:211
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
char dstchannel[AST_MAX_EXTENSION]
Definition: cdr.h:291
long int disposition
Definition: cdr.h:307
char lastdata[AST_MAX_EXTENSION]
Definition: cdr.h:295
char userfield[AST_MAX_USER_FIELD]
Definition: cdr.h:325
long int billsec
Definition: cdr.h:305
struct timeval answer
Definition: cdr.h:299
char channel[AST_MAX_EXTENSION]
Definition: cdr.h:289
long int duration
Definition: cdr.h:303
long int amaflags
Definition: cdr.h:309
char src[AST_MAX_EXTENSION]
Definition: cdr.h:283
char dst[AST_MAX_EXTENSION]
Definition: cdr.h:285
char clid[AST_MAX_EXTENSION]
Definition: cdr.h:281
char uniqueid[AST_MAX_UNIQUEID]
Definition: cdr.h:317
struct timeval start
Definition: cdr.h:297
char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: cdr.h:311
char lastapp[AST_MAX_EXTENSION]
Definition: cdr.h:293
char dcontext[AST_MAX_EXTENSION]
Definition: cdr.h:287
struct timeval end
Definition: cdr.h:301
Main Channel structure associated with a channel.
struct ast_cdr * cdr

References ast_cdr::accountcode, ast_cdr::amaflags, ast_cdr::answer, ast_cdr_disp2str(), ast_cdr_dup(), ast_channel_amaflags2string(), ast_channel_cdr_set(), ast_channel_unref, ast_dummy_channel_alloc, ast_localtime(), ast_log, ast_rwlock_rdlock, ast_rwlock_unlock, ast_str_buffer(), ast_str_strlen(), ast_strftime(), ast_cdr::billsec, buf, ast_channel::cdr, ast_cdr::channel, ast_cdr::clid, CUSTOM_FIELDS_BUF_SIZE, customfields, customfields_lock, DATE_FORMAT, ast_cdr::dcontext, ast_cdr::disposition, ast_cdr::dst, ast_cdr::dstchannel, dummy(), ast_cdr::duration, enablecdr, ast_cdr::end, EVENT_FLAG_CDR, ast_cdr::lastapp, ast_cdr::lastdata, LOG_ERROR, manager_event, NULL, pbx_substitute_variables_helper(), ast_cdr::src, ast_cdr::start, ast_cdr::uniqueid, and ast_cdr::userfield.

Referenced by load_module().

◆ reload()

static int reload ( void  )
static

Definition at line 366 of file cdr_manager.c.

367{
368 return load_config(1);
369}

References load_config().

Referenced by load_config().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 340 of file cdr_manager.c.

341{
343 return -1;
344 }
345
346 if (customfields)
348
349 return 0;
350}

References ast_cdr_unregister(), ast_free, customfields, and name.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Asterisk Manager Interface CDR Backend" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, .requires = "cdr", }
static

Definition at line 378 of file cdr_manager.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 378 of file cdr_manager.c.

◆ customfields

struct ast_str* customfields
static

Definition at line 190 of file cdr_manager.c.

Referenced by load_config(), manager_log(), and unload_module().

◆ customfields_lock

ast_rwlock_t customfields_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, {1, 0} }
static

Definition at line 191 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

◆ enablecdr

int enablecdr = 0
static

Definition at line 188 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

◆ name

const char name[] = "cdr_manager"
static

Definition at line 186 of file cdr_manager.c.

Referenced by load_config(), load_module(), and unload_module().