#include "asterisk.h"
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "asterisk/channel.h"
#include "asterisk/cdr.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
#include "asterisk/logger.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 | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Customizable Comma Separated Values 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 = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, .reload = reload, } |
static const struct ast_module_info * | ast_module_info = &__mod_info |
static char | format [1024] = "" |
static ast_mutex_t | lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) |
static char | master [PATH_MAX] |
static ast_mutex_t | mf_lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) |
static char * | name = "cdr-custom" |
Definition in file cdr_custom.c.
#define CUSTOM_LOG_DIR "/cdr_custom" |
Definition at line 55 of file cdr_custom.c.
#define DATE_FORMAT "%Y-%m-%d %T" |
Definition at line 57 of file cdr_custom.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 173 of file cdr_custom.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 173 of file cdr_custom.c.
static int custom_log | ( | struct ast_cdr * | cdr | ) | [static] |
Definition at line 108 of file cdr_custom.c.
References ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_strlen_zero(), ast_channel::cdr, errno, LOG_ERROR, mf_lock, and pbx_substitute_variables_helper().
Referenced by load_module().
00109 { 00110 FILE *mf = NULL; 00111 00112 /* Make sure we have a big enough buf */ 00113 char buf[2048]; 00114 struct ast_channel dummy; 00115 00116 /* Abort if no master file is specified */ 00117 if (ast_strlen_zero(master)) 00118 return 0; 00119 00120 memset(buf, 0 , sizeof(buf)); 00121 /* Quite possibly the first use of a static struct ast_channel, we need it so the var funcs will work */ 00122 memset(&dummy, 0, sizeof(dummy)); 00123 dummy.cdr = cdr; 00124 pbx_substitute_variables_helper(&dummy, format, buf, sizeof(buf) - 1); 00125 00126 /* because of the absolutely unconditional need for the 00127 highest reliability possible in writing billing records, 00128 we open write and close the log file each time */ 00129 ast_mutex_lock(&mf_lock); 00130 mf = fopen(master, "a"); 00131 if (mf) { 00132 fputs(buf, mf); 00133 fflush(mf); /* be particularly anal here */ 00134 fclose(mf); 00135 mf = NULL; 00136 ast_mutex_unlock(&mf_lock); 00137 } else { 00138 ast_log(LOG_ERROR, "Unable to re-open master file %s : %s\n", master, strerror(errno)); 00139 ast_mutex_unlock(&mf_lock); 00140 } 00141 00142 return 0; 00143 }
static int load_config | ( | int | reload | ) | [static] |
Definition at line 67 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(), lock, LOG_NOTICE, LOG_WARNING, and var.
00068 { 00069 struct ast_config *cfg; 00070 struct ast_variable *var; 00071 int res = -1; 00072 00073 strcpy(format, ""); 00074 strcpy(master, ""); 00075 ast_mutex_lock(&lock); 00076 if((cfg = ast_config_load("cdr_custom.conf"))) { 00077 var = ast_variable_browse(cfg, "mappings"); 00078 while(var) { 00079 if (!ast_strlen_zero(var->name) && !ast_strlen_zero(var->value)) { 00080 if (strlen(var->value) > (sizeof(format) - 1)) 00081 ast_log(LOG_WARNING, "Format string too long, will be truncated, at line %d\n", var->lineno); 00082 ast_copy_string(format, var->value, sizeof(format) - 1); 00083 strcat(format,"\n"); 00084 snprintf(master, sizeof(master),"%s/%s/%s", ast_config_AST_LOG_DIR, name, var->name); 00085 if (var->next) { 00086 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); 00087 break; 00088 } 00089 } else 00090 ast_log(LOG_NOTICE, "Mapping must have both filename and format at line %d\n", var->lineno); 00091 var = var->next; 00092 } 00093 ast_config_destroy(cfg); 00094 res = 0; 00095 } else { 00096 if (reload) 00097 ast_log(LOG_WARNING, "Failed to reload configuration file.\n"); 00098 else 00099 ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n"); 00100 } 00101 ast_mutex_unlock(&lock); 00102 00103 return res; 00104 }
static int load_module | ( | void | ) | [static] |
Definition at line 151 of file cdr_custom.c.
References ast_cdr_register(), ast_log(), AST_MODULE_LOAD_DECLINE, custom_log(), load_config(), and LOG_ERROR.
00152 { 00153 int res = 0; 00154 00155 if (!load_config(0)) { 00156 res = ast_cdr_register(name, ast_module_info->description, custom_log); 00157 if (res) 00158 ast_log(LOG_ERROR, "Unable to register custom CDR handling\n"); 00159 return res; 00160 } else 00161 return AST_MODULE_LOAD_DECLINE; 00162 }
static int reload | ( | void | ) | [static] |
Definition at line 164 of file cdr_custom.c.
References load_config().
00165 { 00166 return load_config(1); 00167 }
static int unload_module | ( | void | ) | [static] |
Definition at line 145 of file cdr_custom.c.
References ast_cdr_unregister().
00146 { 00147 ast_cdr_unregister(name); 00148 return 0; 00149 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Customizable Comma Separated Values 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 = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, .reload = reload, } [static] |
Definition at line 173 of file cdr_custom.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 173 of file cdr_custom.c.
char format[1024] = "" [static] |
Definition at line 65 of file cdr_custom.c.
ast_mutex_t lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) [static] |
Definition at line 59 of file cdr_custom.c.
char master[PATH_MAX] [static] |
Definition at line 64 of file cdr_custom.c.
ast_mutex_t mf_lock = ((ast_mutex_t) PTHREAD_MUTEX_INITIALIZER ) [static] |
Definition at line 60 of file cdr_custom.c.
char* name = "cdr-custom" [static] |
Definition at line 62 of file cdr_custom.c.