Thu Apr 28 2011 16:56:56

Asterisk developer's documentation


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.

Defines

#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)
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
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Asterisk Manager Interface CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_strcustomfields
static ast_rwlock_t customfields_lock = AST_RWLOCK_INIT_VALUE
static int enablecdr = 0
static char * name = "cdr_manager"

Detailed Description

Asterisk Call Manager CDR records.

See also

Definition in file cdr_manager.c.


Define Documentation

#define CONF_FILE   "cdr_manager.conf"

Definition at line 43 of file cdr_manager.c.

Referenced by load_config().

#define CUSTOM_FIELDS_BUF_SIZE   1024

Definition at line 44 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

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

Definition at line 42 of file cdr_manager.c.

Referenced by manager_log().


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 221 of file cdr_manager.c.

static void __unreg_module ( void  ) [static]

Definition at line 221 of file cdr_manager.c.

static int load_config ( int  reload) [static]

Definition at line 55 of file cdr_manager.c.

References ast_category_browse(), ast_cdr_register(), ast_cdr_unregister(), 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_lock, LOG_ERROR, LOG_NOTICE, LOG_WARNING, manager_log(), ast_variable::name, ast_variable::next, and ast_variable::value.

Referenced by load_module(), and reload().

{
   char *cat = NULL;
   struct ast_config *cfg;
   struct ast_variable *v;
   struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
   int newenablecdr = 0;

   cfg = ast_config_load(CONF_FILE, config_flags);
   if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
      return 0;
   }

   if (cfg == CONFIG_STATUS_FILEINVALID) {
      ast_log(LOG_ERROR, "Config file '%s' could not be parsed\n", CONF_FILE);
      return -1;
   }

   if (!cfg) {
      /* Standard configuration */
      ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n");
      if (enablecdr)
         ast_cdr_unregister(name);
      enablecdr = 0;
      return -1;
   }

   if (reload) {
      ast_rwlock_wrlock(&customfields_lock);
   }

   if (reload && customfields) {
      ast_free(customfields);
      customfields = NULL;
   }

   while ( (cat = ast_category_browse(cfg, cat)) ) {
      if (!strcasecmp(cat, "general")) {
         v = ast_variable_browse(cfg, cat);
         while (v) {
            if (!strcasecmp(v->name, "enabled"))
               newenablecdr = ast_true(v->value);

            v = v->next;
         }
      } else if (!strcasecmp(cat, "mappings")) {
         customfields = ast_str_create(CUSTOM_FIELDS_BUF_SIZE);
         v = ast_variable_browse(cfg, cat);
         while (v) {
            if (customfields && !ast_strlen_zero(v->name) && !ast_strlen_zero(v->value)) {
               if ((ast_str_strlen(customfields) + strlen(v->value) + strlen(v->name) + 14) < ast_str_size(customfields)) {
                  ast_str_append(&customfields, -1, "%s: ${CDR(%s)}\r\n", v->value, v->name);
                  ast_log(LOG_NOTICE, "Added mapping %s: ${CDR(%s)}\n", v->value, v->name);
               } else {
                  ast_log(LOG_WARNING, "No more buffer space to add other custom fields\n");
                  break;
               }

            }
            v = v->next;
         }
      }
   }

   if (reload) {
      ast_rwlock_unlock(&customfields_lock);
   }

   ast_config_destroy(cfg);

   if (enablecdr && !newenablecdr)
      ast_cdr_unregister(name);
   else if (!enablecdr && newenablecdr)
      ast_cdr_register(name, "Asterisk Manager Interface CDR Backend", manager_log);
   enablecdr = newenablecdr;

   return 0;
}
static int load_module ( void  ) [static]
static int manager_log ( struct ast_cdr cdr) [static]

Definition at line 134 of file cdr_manager.c.

References ast_cdr::accountcode, ast_cdr::amaflags, ast_cdr::answer, ast_cdr_disp2str(), ast_cdr_flags2str(), ast_localtime(), 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_lock, DATE_FORMAT, ast_cdr::dcontext, ast_cdr::disposition, ast_cdr::dst, ast_cdr::dstchannel, ast_cdr::duration, ast_cdr::end, EVENT_FLAG_CDR, ast_cdr::lastapp, ast_cdr::lastdata, manager_event, pbx_substitute_variables_helper(), ast_cdr::src, ast_cdr::start, ast_cdr::uniqueid, and ast_cdr::userfield.

Referenced by load_config().

{
   struct ast_tm timeresult;
   char strStartTime[80] = "";
   char strAnswerTime[80] = "";
   char strEndTime[80] = "";
   char buf[CUSTOM_FIELDS_BUF_SIZE];
   struct ast_channel dummy;

   if (!enablecdr)
      return 0;

   ast_localtime(&cdr->start, &timeresult, NULL);
   ast_strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult);

   if (cdr->answer.tv_sec) {
      ast_localtime(&cdr->answer, &timeresult, NULL);
      ast_strftime(strAnswerTime, sizeof(strAnswerTime), DATE_FORMAT, &timeresult);
   }

   ast_localtime(&cdr->end, &timeresult, NULL);
   ast_strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult);

   buf[0] = '\0';
   ast_rwlock_rdlock(&customfields_lock);
   if (customfields && ast_str_strlen(customfields)) {
      memset(&dummy, 0, sizeof(dummy));
      dummy.cdr = cdr;
      pbx_substitute_variables_helper(&dummy, ast_str_buffer(customfields), buf, sizeof(buf) - 1);
   }
   ast_rwlock_unlock(&customfields_lock);

   manager_event(EVENT_FLAG_CDR, "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: %ld\r\n"
       "BillableSeconds: %ld\r\n"
       "Disposition: %s\r\n"
       "AMAFlags: %s\r\n"
       "UniqueID: %s\r\n"
       "UserField: %s\r\n"
       "%s",
       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,buf);

   return 0;
}
static int reload ( void  ) [static]

Definition at line 212 of file cdr_manager.c.

References load_config().

{
   return load_config(1);
}
static int unload_module ( void  ) [static]

Definition at line 194 of file cdr_manager.c.

References ast_cdr_unregister(), and ast_free.


Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Asterisk Manager Interface CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } [static]

Definition at line 221 of file cdr_manager.c.

Definition at line 221 of file cdr_manager.c.

struct ast_str* customfields [static]

Definition at line 50 of file cdr_manager.c.

ast_rwlock_t customfields_lock = AST_RWLOCK_INIT_VALUE [static]

Definition at line 51 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

int enablecdr = 0 [static]

Definition at line 48 of file cdr_manager.c.

char* name = "cdr_manager" [static]

Definition at line 46 of file cdr_manager.c.