Asterisk - The Open Source Telephony Project  18.5.0
Macros | Functions | Variables
cel_manager.c File Reference

Asterisk Channel Event records. More...

#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/cel.h"
#include "asterisk/module.h"
#include "asterisk/logger.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
#include "asterisk/config.h"
Include dependency graph for cel_manager.c:

Go to the source code of this file.

Macros

#define CEL_AMI_ENABLED_DEFAULT   0
 AMI CEL is off by default. More...
 
#define CEL_SHOW_USERDEF_DEFAULT   0
 show_user_def is off by default More...
 
#define MANAGER_BACKEND_NAME   "Manager Event Logging"
 

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 void manager_log (struct ast_event *event)
 
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 CEL 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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, .requires = "cel", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static unsigned char cel_show_user_def
 
static const char CONF_FILE [] = "cel.conf"
 
static const char DATE_FORMAT [] = "%Y-%m-%d %T"
 
static int enablecel
 

Detailed Description

Asterisk Channel Event records.

See also

Definition in file cel_manager.c.

Macro Definition Documentation

◆ CEL_AMI_ENABLED_DEFAULT

#define CEL_AMI_ENABLED_DEFAULT   0

AMI CEL is off by default.

Definition at line 211 of file cel_manager.c.

Referenced by load_config().

◆ CEL_SHOW_USERDEF_DEFAULT

#define CEL_SHOW_USERDEF_DEFAULT   0

show_user_def is off by default

Definition at line 216 of file cel_manager.c.

Referenced by load_config().

◆ MANAGER_BACKEND_NAME

#define MANAGER_BACKEND_NAME   "Manager Event Logging"

Definition at line 218 of file cel_manager.c.

Referenced by load_config(), and unload_module().

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 384 of file cel_manager.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 384 of file cel_manager.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 384 of file cel_manager.c.

◆ load_config()

static int load_config ( int  reload)
static

Definition at line 300 of file cel_manager.c.

References ast_category_browse(), ast_cel_backend_register(), ast_cel_backend_unregister(), ast_config_destroy(), ast_config_load, ast_log, ast_true(), ast_variable_browse(), CEL_AMI_ENABLED_DEFAULT, cel_show_user_def, CEL_SHOW_USERDEF_DEFAULT, CONF_FILE, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, enablecel, LOG_ERROR, LOG_NOTICE, LOG_WARNING, MANAGER_BACKEND_NAME, manager_log(), ast_variable::name, ast_variable::next, NULL, and ast_variable::value.

Referenced by load_module(), and reload().

301 {
302  const char *cat = NULL;
303  struct ast_config *cfg;
304  struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
305  struct ast_variable *v;
306  int newenablecel = CEL_AMI_ENABLED_DEFAULT;
307  int new_cel_show_user_def = CEL_SHOW_USERDEF_DEFAULT;
308 
309  cfg = ast_config_load(CONF_FILE, config_flags);
310  if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
311  return 0;
312  }
313 
314  if (cfg == CONFIG_STATUS_FILEINVALID) {
315  ast_log(LOG_WARNING, "Configuration file '%s' is invalid. CEL manager Module not activated.\n",
316  CONF_FILE);
317  enablecel = 0;
318  return -1;
319  } else if (!cfg) {
320  ast_log(LOG_WARNING, "Failed to load configuration file. CEL manager Module not activated.\n");
321  enablecel = 0;
322  return -1;
323  }
324 
325  while ((cat = ast_category_browse(cfg, cat))) {
326  if (strcasecmp(cat, "manager")) {
327  continue;
328  }
329 
330  for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
331  if (!strcasecmp(v->name, "enabled")) {
332  newenablecel = ast_true(v->value) ? 1 : 0;
333  } else if (!strcasecmp(v->name, "show_user_defined")) {
334  new_cel_show_user_def = ast_true(v->value) ? 1 : 0;
335  } else {
336  ast_log(LOG_NOTICE, "Unknown option '%s' specified "
337  "for cel_manager.\n", v->name);
338  }
339  }
340  }
341 
342  ast_config_destroy(cfg);
343 
344  cel_show_user_def = new_cel_show_user_def;
345  if (enablecel && !newenablecel) {
347  } else if (!enablecel && newenablecel) {
349  ast_log(LOG_ERROR, "Unable to register Asterisk Call Manager CEL handling\n");
350  }
351  }
352  enablecel = newenablecel;
353 
354  return 0;
355 }
struct ast_variable * next
static int reload(void)
Definition: cel_manager.c:372
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1216
int ast_cel_backend_register(const char *name, ast_cel_backend_cb backend_callback)
Register a CEL backend.
Definition: cel.c:1740
#define LOG_WARNING
Definition: logger.h:274
#define CONFIG_STATUS_FILEINVALID
Structure for variables, used for configurations and for channel variables.
#define CEL_AMI_ENABLED_DEFAULT
AMI CEL is off by default.
Definition: cel_manager.c:211
static const char CONF_FILE[]
Definition: cel_manager.c:208
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
Definition: extconf.c:3328
#define NULL
Definition: resample.c:96
#define CEL_SHOW_USERDEF_DEFAULT
show_user_def is off by default
Definition: cel_manager.c:216
#define ast_log
Definition: astobj2.c:42
#define ast_config_load(filename, flags)
Load a config file.
static unsigned char cel_show_user_def
Definition: cel_manager.c:221
static void manager_log(struct ast_event *event)
Definition: cel_manager.c:223
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
int ast_cel_backend_unregister(const char *name)
Unregister a CEL backend.
Definition: cel.c:1728
#define CONFIG_STATUS_FILEUNCHANGED
#define LOG_ERROR
Definition: logger.h:285
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
Definition: main/utils.c:1951
static int enablecel
Definition: cel_manager.c:213
#define LOG_NOTICE
Definition: logger.h:263
Structure used to handle boolean flags.
Definition: utils.h:199
#define MANAGER_BACKEND_NAME
Definition: cel_manager.c:218

◆ load_module()

static int load_module ( void  )
static

Definition at line 363 of file cel_manager.c.

References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, and load_config().

Referenced by reload().

364 {
365  if (load_config(0)) {
367  }
368 
370 }
static int load_config(int reload)
Definition: cel_manager.c:300
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78

◆ manager_log()

static void manager_log ( struct ast_event event)
static

Definition at line 223 of file cel_manager.c.

References ast_cel_event_record::account_code, ast_cel_event_record::amaflag, ast_cel_event_record::application_data, ast_cel_event_record::application_name, AST_CEL_EVENT_RECORD_VERSION, ast_cel_fill_record(), AST_CEL_USER_DEFINED, ast_channel_amaflags2string(), ast_localtime(), ast_strftime(), ast_cel_event_record::caller_id_ani, ast_cel_event_record::caller_id_dnid, ast_cel_event_record::caller_id_name, ast_cel_event_record::caller_id_num, ast_cel_event_record::caller_id_rdnis, cel_show_user_def, ast_cel_event_record::channel_name, ast_cel_event_record::context, DATE_FORMAT, enablecel, EVENT_FLAG_CALL, ast_cel_event_record::event_name, ast_cel_event_record::event_time, ast_cel_event_record::event_type, ast_cel_event_record::extension, ast_cel_event_record::extra, ast_cel_event_record::linked_id, manager_event, NULL, ast_cel_event_record::peer, ast_cel_event_record::peer_account, ast_cel_event_record::unique_id, ast_cel_event_record::user_defined_name, ast_cel_event_record::user_field, and ast_cel_event_record::version.

Referenced by load_config().

224 {
225  struct ast_tm timeresult;
226  char start_time[80] = "";
227  char user_defined_header[160];
228  const char *event_name;
229  struct ast_cel_event_record record = {
231  };
232 
233  if (!enablecel) {
234  return;
235  }
236 
237  if (ast_cel_fill_record(event, &record)) {
238  return;
239  }
240 
241  ast_localtime(&record.event_time, &timeresult, NULL);
242  ast_strftime(start_time, sizeof(start_time), DATE_FORMAT, &timeresult);
243 
244  event_name = record.event_name;
245  user_defined_header[0] = '\0';
246  if (record.event_type == AST_CEL_USER_DEFINED) {
247  if (cel_show_user_def) {
248  snprintf(user_defined_header, sizeof(user_defined_header),
249  "UserDefType: %s\r\n", record.user_defined_name);
250  } else {
251  event_name = record.user_defined_name;
252  }
253  }
254 
256  "EventName: %s\r\n"
257  "AccountCode: %s\r\n"
258  "CallerIDnum: %s\r\n"
259  "CallerIDname: %s\r\n"
260  "CallerIDani: %s\r\n"
261  "CallerIDrdnis: %s\r\n"
262  "CallerIDdnid: %s\r\n"
263  "Exten: %s\r\n"
264  "Context: %s\r\n"
265  "Channel: %s\r\n"
266  "Application: %s\r\n"
267  "AppData: %s\r\n"
268  "EventTime: %s\r\n"
269  "AMAFlags: %s\r\n"
270  "UniqueID: %s\r\n"
271  "LinkedID: %s\r\n"
272  "Userfield: %s\r\n"
273  "Peer: %s\r\n"
274  "PeerAccount: %s\r\n"
275  "%s"
276  "Extra: %s\r\n",
277  event_name,
278  record.account_code,
279  record.caller_id_num,
280  record.caller_id_name,
281  record.caller_id_ani,
282  record.caller_id_rdnis,
283  record.caller_id_dnid,
284  record.extension,
285  record.context,
286  record.channel_name,
287  record.application_name,
288  record.application_data,
289  start_time,
291  record.unique_id,
292  record.linked_id,
293  record.user_field,
294  record.peer,
295  record.peer_account,
296  user_defined_header,
297  record.extra);
298 }
const char * account_code
Definition: cel.h:161
const char * caller_id_name
Definition: cel.h:151
Helper struct for getting the fields out of a CEL event.
Definition: cel.h:136
const char * linked_id
Definition: cel.h:164
const char * user_defined_name
Definition: cel.h:150
const char * application_data
Definition: cel.h:160
const char * application_name
Definition: cel.h:159
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
const char * extension
Definition: cel.h:156
#define EVENT_FLAG_CALL
Definition: manager.h:72
const char * ast_channel_amaflags2string(enum ama_flags flags)
Convert the enum representation of an AMA flag to a string representation.
Definition: channel.c:4418
const char * caller_id_num
Definition: cel.h:152
#define NULL
Definition: resample.c:96
const char * extra
Definition: cel.h:168
static unsigned char cel_show_user_def
Definition: cel_manager.c:221
const char * context
Definition: cel.h:157
uint32_t version
struct ABI version
Definition: cel.h:146
enum ast_cel_event_type event_type
Definition: cel.h:147
static int enablecel
Definition: cel_manager.c:213
const char * caller_id_rdnis
Definition: cel.h:154
const char * peer
Definition: cel.h:167
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
const char * caller_id_ani
Definition: cel.h:153
const char * user_field
Definition: cel.h:166
#define AST_CEL_EVENT_RECORD_VERSION
struct ABI version
Definition: cel.h:141
const char * peer_account
Definition: cel.h:162
static const char DATE_FORMAT[]
Definition: cel_manager.c:206
const char * unique_id
Definition: cel.h:163
a user-defined event, the event name field should be set
Definition: cel.h:69
const char * caller_id_dnid
Definition: cel.h:155
const char * channel_name
Definition: cel.h:158
const char * event_name
Definition: cel.h:149
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:248
struct timeval event_time
Definition: cel.h:148
int ast_cel_fill_record(const struct ast_event *event, struct ast_cel_event_record *r)
Fill in an ast_cel_event_record from a CEL event.
Definition: cel.c:819

◆ reload()

static int reload ( void  )
static

Definition at line 372 of file cel_manager.c.

References AST_MODFLAG_LOAD_ORDER, AST_MODPRI_CDR_DRIVER, AST_MODULE_INFO(), AST_MODULE_SUPPORT_CORE, ASTERISK_GPL_KEY, load_config(), load_module(), and unload_module().

373 {
374  return load_config(1);
375 }
static int load_config(int reload)
Definition: cel_manager.c:300

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 357 of file cel_manager.c.

References ast_cel_backend_unregister(), and MANAGER_BACKEND_NAME.

Referenced by reload().

358 {
360  return 0;
361 }
int ast_cel_backend_unregister(const char *name)
Unregister a CEL backend.
Definition: cel.c:1728
#define MANAGER_BACKEND_NAME
Definition: cel_manager.c:218

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Asterisk Manager Interface CEL 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 = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload, .load_pri = AST_MODPRI_CDR_DRIVER, .requires = "cel", }
static

Definition at line 384 of file cel_manager.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 384 of file cel_manager.c.

◆ cel_show_user_def

unsigned char cel_show_user_def
static

TRUE if we should set the EventName header to USER_DEFINED on user events.

Definition at line 221 of file cel_manager.c.

Referenced by load_config(), and manager_log().

◆ CONF_FILE

const char CONF_FILE[] = "cel.conf"
static

Definition at line 208 of file cel_manager.c.

Referenced by load_config().

◆ DATE_FORMAT

const char DATE_FORMAT[] = "%Y-%m-%d %T"
static

Definition at line 206 of file cel_manager.c.

Referenced by manager_log().

◆ enablecel

int enablecel
static

Definition at line 213 of file cel_manager.c.

Referenced by load_config(), and manager_log().