Sat Apr 26 2014 22:02:00

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 __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, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_strcustomfields
static ast_rwlock_t customfields_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 }
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.


Define Documentation

#define CONF_FILE   "cdr_manager.conf"

Definition at line 47 of file cdr_manager.c.

Referenced by load_config().

#define CUSTOM_FIELDS_BUF_SIZE   1024

Definition at line 48 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

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

Definition at line 46 of file cdr_manager.c.

Referenced by manager_log().


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 230 of file cdr_manager.c.

static void __unreg_module ( void  ) [static]

Definition at line 230 of file cdr_manager.c.

static int load_config ( int  reload) [static]

Definition at line 59 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 138 of file cdr_manager.c.

References ast_cdr::accountcode, ast_cdr::amaflags, ast_cdr::answer, ast_cdr_disp2str(), ast_cdr_dup(), ast_cdr_flags2str(), 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, 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, dummy(), ast_cdr::duration, ast_cdr::end, EVENT_FLAG_CDR, ast_cdr::lastapp, ast_cdr::lastdata, LOG_ERROR, 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];

   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)) {
      struct ast_channel *dummy = ast_dummy_channel_alloc();
      if (!dummy) {
         ast_log(LOG_ERROR, "Unable to allocate channel for variable substitution.\n");
         return 0;
      }
      ast_channel_cdr_set(dummy, ast_cdr_dup(cdr));
      pbx_substitute_variables_helper(dummy, ast_str_buffer(customfields), buf, sizeof(buf) - 1);
      ast_channel_unref(dummy);
   }
   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 220 of file cdr_manager.c.

References load_config().

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

Definition at line 202 of file cdr_manager.c.

References ast_cdr_unregister(), and ast_free.


Variable Documentation

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, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, } [static]

Definition at line 230 of file cdr_manager.c.

Definition at line 230 of file cdr_manager.c.

struct ast_str* customfields [static]

Definition at line 54 of file cdr_manager.c.

ast_rwlock_t customfields_lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } [static]

Definition at line 55 of file cdr_manager.c.

Referenced by load_config(), and manager_log().

int enablecdr = 0 [static]

Definition at line 52 of file cdr_manager.c.

const char name[] = "cdr_manager" [static]

Definition at line 50 of file cdr_manager.c.