Custom Comma Separated Value CDR records. More...
#include "asterisk.h"
#include <time.h>
#include "asterisk/paths.h"
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
Go to the source code of this file.
Defines | |
#define | CUSTOM_LOG_DIR "/cdr_custom" |
#define | DATE_FORMAT "%Y-%m-%d %T" |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | custom_log (struct ast_cdr *cdr) |
static int | load_config (int reload) |
static int | load_module (void) |
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 = "Customizable Comma Separated Values CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static char | format [1024] = "" |
static ast_mutex_t | lock = AST_MUTEX_INIT_VALUE |
static char | master [PATH_MAX] |
static ast_mutex_t | mf_lock = AST_MUTEX_INIT_VALUE |
static char * | name = "cdr-custom" |
Custom Comma Separated Value CDR records.
Logs in LOG_DIR/cdr_custom
Definition in file cdr_custom.c.
#define CUSTOM_LOG_DIR "/cdr_custom" |
Definition at line 48 of file cdr_custom.c.
#define DATE_FORMAT "%Y-%m-%d %T" |
Definition at line 50 of file cdr_custom.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 174 of file cdr_custom.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 174 of file cdr_custom.c.
static int custom_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 110 of file cdr_custom.c.
References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), buf, ast_channel::cdr, errno, LOG_ERROR, mf_lock, and pbx_substitute_variables_helper().
Referenced by load_module().
{ FILE *mf = NULL; /* Make sure we have a big enough buf */ char buf[2048]; struct ast_channel dummy; /* Abort if no master file is specified */ if (ast_strlen_zero(master)) return 0; /* Quite possibly the first use of a static struct ast_channel, we need it so the var funcs will work */ memset(&dummy, 0, sizeof(dummy)); dummy.cdr = cdr; pbx_substitute_variables_helper(&dummy, format, buf, sizeof(buf) - 1); /* because of the absolutely unconditional need for the highest reliability possible in writing billing records, we open write and close the log file each time */ ast_mutex_lock(&mf_lock); mf = fopen(master, "a"); if (mf) { fputs(buf, mf); fflush(mf); /* be particularly anal here */ fclose(mf); mf = NULL; ast_mutex_unlock(&mf_lock); } else { ast_log(LOG_ERROR, "Unable to re-open master file %s : %s\n", master, strerror(errno)); ast_mutex_unlock(&mf_lock); } return 0; }
static int load_config | ( | int | reload | ) | [static] |
Definition at line 60 of file cdr_custom.c.
References ast_config_AST_LOG_DIR, ast_config_destroy(), ast_config_load, ast_copy_string(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_variable_browse(), CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, ast_variable::lineno, lock, LOG_ERROR, LOG_NOTICE, LOG_WARNING, ast_variable::name, ast_variable::next, ast_variable::value, and var.
Referenced by load_module(), and reload().
{ struct ast_config *cfg; struct ast_variable *var; struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; int res = -1; if ((cfg = ast_config_load("cdr_custom.conf", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) return 0; if (cfg == CONFIG_STATUS_FILEINVALID) { ast_log(LOG_ERROR, "Invalid config file\n"); return 1; } strcpy(format, ""); strcpy(master, ""); ast_mutex_lock(&lock); if (cfg) { var = ast_variable_browse(cfg, "mappings"); while(var) { if (!ast_strlen_zero(var->name) && !ast_strlen_zero(var->value)) { if (strlen(var->value) > (sizeof(format) - 1)) ast_log(LOG_WARNING, "Format string too long, will be truncated, at line %d\n", var->lineno); ast_copy_string(format, var->value, sizeof(format) - 1); strcat(format,"\n"); snprintf(master, sizeof(master),"%s/%s/%s", ast_config_AST_LOG_DIR, name, var->name); if (var->next) { ast_log(LOG_NOTICE, "Sorry, only one mapping is supported at this time, mapping '%s' will be ignored at line %d.\n", var->next->name, var->next->lineno); break; } } else ast_log(LOG_NOTICE, "Mapping must have both filename and format at line %d\n", var->lineno); var = var->next; } ast_config_destroy(cfg); res = 0; } else { if (reload) ast_log(LOG_WARNING, "Failed to reload configuration file.\n"); else ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n"); } ast_mutex_unlock(&lock); return res; }
static int load_module | ( | void | ) | [static] |
Definition at line 152 of file cdr_custom.c.
References ast_cdr_register(), ast_log(), AST_MODULE_LOAD_DECLINE, custom_log(), ast_module_info::description, load_config(), and LOG_ERROR.
{ int res = 0; if (!load_config(0)) { res = ast_cdr_register(name, ast_module_info->description, custom_log); if (res) ast_log(LOG_ERROR, "Unable to register custom CDR handling\n"); return res; } else return AST_MODULE_LOAD_DECLINE; }
static int reload | ( | void | ) | [static] |
static int unload_module | ( | void | ) | [static] |
Definition at line 146 of file cdr_custom.c.
References ast_cdr_unregister().
{ ast_cdr_unregister(name); return 0; }
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Customizable Comma Separated Values CDR Backend" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .reload = reload, } [static] |
Definition at line 174 of file cdr_custom.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 174 of file cdr_custom.c.
char format[1024] = "" [static] |
Definition at line 58 of file cdr_custom.c.
Referenced by acf_sprintf(), acf_strftime(), acf_strptime(), action_originate(), add_codec_to_answer(), ast_codec_pref_getsize(), ast_getformatbyname(), ast_monitor_stop(), ast_openvstream(), ast_parse_allow_disallow(), ast_rtp_lookup_mime_multiple(), ast_speech_new(), ast_strftime(), build_peer(), build_user(), check_header(), console_request(), create_video_frame(), echo_exec(), get_soxmix_format(), handle_saydatetime(), iax2_request(), local_alloc(), map_video_codec(), mgcp_request(), minivm_notify_exec(), misdn_new(), nbs_request(), oh323_request(), phone_request(), process_sdp_a_audio(), reload_config(), sayunixtime_exec(), sendmail(), set_config(), sip_request_call(), skinny_request(), socket_process(), start_monitor_action(), start_monitor_exec(), and unistim_request().
ast_mutex_t lock = AST_MUTEX_INIT_VALUE [static] |
Definition at line 52 of file cdr_custom.c.
char master[PATH_MAX] [static] |
Definition at line 57 of file cdr_custom.c.
Referenced by __unload_module(), dahdi_bridge(), dahdi_link(), dahdi_restart(), and setup_dahdi().
ast_mutex_t mf_lock = AST_MUTEX_INIT_VALUE [static] |
Definition at line 53 of file cdr_custom.c.
Referenced by custom_log().
char* name = "cdr-custom" [static] |
Definition at line 55 of file cdr_custom.c.