|
|
|
@ -1531,7 +1531,7 @@ static char *handle_cli_submit(struct ast_cli_entry *e, int cmd, struct ast_cli_
|
|
|
|
|
static struct ast_cli_entry cli_submit = AST_CLI_DEFINE(handle_cli_submit, "Posts all pending batched CDR data");
|
|
|
|
|
static struct ast_cli_entry cli_status = AST_CLI_DEFINE(handle_cli_status, "Display the CDR status");
|
|
|
|
|
|
|
|
|
|
static int do_reload(int reload)
|
|
|
|
|
static void do_reload(int reload)
|
|
|
|
|
{
|
|
|
|
|
struct ast_config *config;
|
|
|
|
|
struct ast_variable *v;
|
|
|
|
@ -1539,11 +1539,10 @@ static int do_reload(int reload)
|
|
|
|
|
int cfg_time;
|
|
|
|
|
int was_enabled;
|
|
|
|
|
int was_batchmode;
|
|
|
|
|
int res = 0;
|
|
|
|
|
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
|
|
|
|
|
|
|
|
|
|
if ((config = ast_config_load2("cdr.conf", "cdr", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
|
|
|
|
|
return 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_mutex_lock(&cdr_batch_lock);
|
|
|
|
@ -1562,7 +1561,7 @@ static int do_reload(int reload)
|
|
|
|
|
|
|
|
|
|
if (config == CONFIG_STATUS_FILEMISSING || config == CONFIG_STATUS_FILEINVALID) {
|
|
|
|
|
ast_mutex_unlock(&cdr_batch_lock);
|
|
|
|
|
return 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* don't run the next scheduled CDR posting while reloading */
|
|
|
|
@ -1623,7 +1622,6 @@ static int do_reload(int reload)
|
|
|
|
|
} else {
|
|
|
|
|
ast_cli_register(&cli_submit);
|
|
|
|
|
ast_register_atexit(ast_cdr_engine_term);
|
|
|
|
|
res = 0;
|
|
|
|
|
}
|
|
|
|
|
/* if this reload disabled the CDR and/or batch mode and there is a background thread,
|
|
|
|
|
kill it */
|
|
|
|
@ -1636,27 +1634,39 @@ static int do_reload(int reload)
|
|
|
|
|
ast_cond_destroy(&cdr_pending_cond);
|
|
|
|
|
ast_cli_unregister(&cli_submit);
|
|
|
|
|
ast_unregister_atexit(ast_cdr_engine_term);
|
|
|
|
|
res = 0;
|
|
|
|
|
/* if leaving batch mode, then post the CDRs in the batch,
|
|
|
|
|
and don't reschedule, since we are stopping CDR logging */
|
|
|
|
|
if (!batchmode && was_batchmode) {
|
|
|
|
|
ast_cdr_engine_term();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
res = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&cdr_batch_lock);
|
|
|
|
|
ast_config_destroy(config);
|
|
|
|
|
manager_event(EVENT_FLAG_SYSTEM, "Reload", "Module: CDR\r\nMessage: CDR subsystem reload requested\r\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
static void cdr_engine_shutdown(void)
|
|
|
|
|
{
|
|
|
|
|
if (cdr_thread != AST_PTHREADT_NULL) {
|
|
|
|
|
/* wake up the thread so it will exit */
|
|
|
|
|
pthread_cancel(cdr_thread);
|
|
|
|
|
pthread_kill(cdr_thread, SIGURG);
|
|
|
|
|
pthread_join(cdr_thread, NULL);
|
|
|
|
|
cdr_thread = AST_PTHREADT_NULL;
|
|
|
|
|
ast_cond_destroy(&cdr_pending_cond);
|
|
|
|
|
}
|
|
|
|
|
ast_cli_unregister(&cli_submit);
|
|
|
|
|
|
|
|
|
|
ast_cli_unregister(&cli_status);
|
|
|
|
|
ast_sched_context_destroy(sched);
|
|
|
|
|
sched = NULL;
|
|
|
|
|
ast_free(batch);
|
|
|
|
|
batch = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ast_cdr_engine_init(void)
|
|
|
|
|
{
|
|
|
|
|
int res;
|
|
|
|
|
|
|
|
|
|
sched = ast_sched_context_create();
|
|
|
|
|
if (!sched) {
|
|
|
|
|
ast_log(LOG_ERROR, "Unable to create schedule context.\n");
|
|
|
|
@ -1664,15 +1674,10 @@ int ast_cdr_engine_init(void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_cli_register(&cli_status);
|
|
|
|
|
do_reload(0);
|
|
|
|
|
ast_register_atexit(cdr_engine_shutdown);
|
|
|
|
|
|
|
|
|
|
res = do_reload(0);
|
|
|
|
|
if (res) {
|
|
|
|
|
ast_mutex_lock(&cdr_batch_lock);
|
|
|
|
|
res = init_batch();
|
|
|
|
|
ast_mutex_unlock(&cdr_batch_lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* \note This actually gets called a couple of times at shutdown. Once, before we start
|
|
|
|
@ -1684,7 +1689,8 @@ void ast_cdr_engine_term(void)
|
|
|
|
|
|
|
|
|
|
int ast_cdr_engine_reload(void)
|
|
|
|
|
{
|
|
|
|
|
return do_reload(1);
|
|
|
|
|
do_reload(1);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ast_cdr_data_add_structure(struct ast_data *tree, struct ast_cdr *cdr, int recur)
|
|
|
|
|