<h1>Project "FreeSWITCH Source" received a push.</h1>
<h2>branch: master updated</h2>
<pre>
via: bab7a2392f955facbb91d0f30512682e2b38773e (commit)
from: 12c13e115b96e9e036bd65655c1f12a72a83510e (commit)
</pre>= COMMIT LOG ===========================================================
<div class="highlight"><pre>committer: Daniel Swarbrick
comments:
refactor config parsing
<span style="color: #000080; font-weight: bold">diff --git a/conf/autoload_configs/cdr_pg_csv.conf.xml b/conf/autoload_configs/cdr_pg_csv.conf.xml</span>
<span style="color: #000080; font-weight: bold">index 2f2efa9..427bf2d 100644</span>
<span style="color: #A00000">--- a/conf/autoload_configs/cdr_pg_csv.conf.xml</span>
<span style="color: #00A000">+++ b/conf/autoload_configs/cdr_pg_csv.conf.xml</span>
<span style="color: #800080; font-weight: bold">@@ -1,19 +1,23 @@</span>
<configuration name="cdr_pg_csv.conf" description="CDR PG CSV Format">
<settings>
<span style="color: #A00000">- <!-- Log a-leg (a), b-leg (b) or both (ab) --></span>
<span style="color: #A00000">- <param name="legs" value="a"/></span>
<!-- See parameters for PQconnectdb() at http://www.postgresql.org/docs/8.4/static/libpq-connect.html -->
<param name="db-info" value="host=localhost dbname=cdr connect_timeout=10" />
<!-- CDR table name -->
<!--<param name="db-table" value="cdr"/>-->
<span style="color: #A00000">- <param name="default-template" value="example"/></span>
<span style="color: #A00000">- <!-- 'cdr-pg-csv' will always be appended to log-base --></span>
<span style="color: #A00000">- <!--<param name="log-base" value="/var/log"/>--></span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+ <!-- Log a-leg (a), b-leg (b) or both (ab) --></span>
<span style="color: #00A000">+ <param name="legs" value="a"/></span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+ <!-- Directory in which to spool failed SQL inserts --></span>
<span style="color: #00A000">+ <!-- <param name="spool-dir" value="$${base_dir}/log/cdr-pg-csv"/> --></span>
<!-- Disk spool format if DB connection/insert fails - csv (default) or sql -->
<param name="spool-format" value="csv"/>
<param name="rotate-on-hup" value="true"/>
<span style="color: #00A000">+</span>
<!-- This is like the info app but after the call is hung up -->
<!--<param name="debug" value="true"/>-->
<span style="color: #00A000">+</span>
<span style="color: #00A000">+ <param name="default-template" value="example"/></span>
</settings>
<templates>
<template name="example">"${local_ip_v4}","${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}","${sip_hangup_disposition}","${ani}"</template>
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c b/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c</span>
<span style="color: #000080; font-weight: bold">index 5227161..1ec56bd 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c</span>
<span style="color: #800080; font-weight: bold">@@ -37,18 +37,27 @@</span>
#include <switch.h>
#include <libpq-fe.h>
<span style="color: #00A000">+SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_pg_csv_load);</span>
<span style="color: #00A000">+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_pg_csv_shutdown);</span>
<span style="color: #00A000">+SWITCH_MODULE_DEFINITION(mod_cdr_pg_csv, mod_cdr_pg_csv_load, mod_cdr_pg_csv_shutdown, NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
typedef enum {
        CDR_LEG_A = (1 << 0),
        CDR_LEG_B = (1 << 1)
} cdr_leg_t;
<span style="color: #A00000">-struct cdr_fd {</span>
<span style="color: #00A000">+typedef enum {</span>
<span style="color: #00A000">+        SPOOL_FORMAT_CSV,</span>
<span style="color: #00A000">+        SPOOL_FORMAT_SQL</span>
<span style="color: #00A000">+} spool_format_t;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+typedef struct {</span>
        int fd;
        char *path;
        int64_t bytes;
        switch_mutex_t *mutex;
<span style="color: #A00000">-};</span>
<span style="color: #A00000">-typedef struct cdr_fd cdr_fd_t;</span>
<span style="color: #00A000">+} cdr_fd_t;</span>
const char *default_template =
        "\"${local_ip_v4}\",\"${caller_id_name}\",\"${caller_id_number}\",\"${destination_number}\",\"${context}\",\"${start_stamp}\","
<span style="color: #800080; font-weight: bold">@@ -59,23 +68,59 @@ static struct {</span>
        switch_memory_pool_t *pool;
        switch_hash_t *fd_hash;
        switch_hash_t *template_hash;
<span style="color: #A00000">-        char *log_dir;</span>
<span style="color: #A00000">-        char *default_template;</span>
        int shutdown;
<span style="color: #A00000">-        int rotate;</span>
<span style="color: #A00000">-        int debug;</span>
<span style="color: #A00000">-        cdr_leg_t legs;</span>
        char *db_info;
        char *db_table;
<span style="color: #A00000">-        char *spool_format;</span>
        PGconn *db_connection;
        int db_online;
<span style="color: #00A000">+        cdr_leg_t legs;</span>
<span style="color: #00A000">+        char *spool_dir;</span>
<span style="color: #00A000">+        spool_format_t spool_format;</span>
<span style="color: #00A000">+        int rotate;</span>
<span style="color: #00A000">+        int debug;</span>
<span style="color: #00A000">+        char *default_template;</span>
        switch_mutex_t *db_mutex;
} globals = { 0 };
<span style="color: #A00000">-SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_pg_csv_load);</span>
<span style="color: #A00000">-SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_pg_csv_shutdown);</span>
<span style="color: #A00000">-SWITCH_MODULE_DEFINITION(mod_cdr_pg_csv, mod_cdr_pg_csv_load, mod_cdr_pg_csv_shutdown, NULL);</span>
<span style="color: #00A000">+static switch_xml_config_enum_item_t config_opt_cdr_leg_enum[] = {</span>
<span style="color: #00A000">+ {"a", CDR_LEG_A},</span>
<span style="color: #00A000">+ {"b", CDR_LEG_B},</span>
<span style="color: #00A000">+ {"ab", CDR_LEG_A | CDR_LEG_B},</span>
<span style="color: #00A000">+ {NULL, 0}</span>
<span style="color: #00A000">+};</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_xml_config_enum_item_t config_opt_spool_format_enum[] = {</span>
<span style="color: #00A000">+ {"csv", SPOOL_FORMAT_CSV},</span>
<span style="color: #00A000">+ {"sql", SPOOL_FORMAT_SQL},</span>
<span style="color: #00A000">+ {NULL, 0}</span>
<span style="color: #00A000">+};</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_status_t config_validate_spool_dir(switch_xml_config_item_t *item, const char *newvalue, switch_config_callback_type_t callback_type, switch_bool_t changed)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        if ((callback_type == CONFIG_LOAD || callback_type == CONFIG_RELOAD)) {</span>
<span style="color: #00A000">+                if (zstr(newvalue)) {</span>
<span style="color: #00A000">+                        globals.spool_dir = switch_core_sprintf(globals.pool, "%s%scdr-pg-csv", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR);</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static switch_xml_config_item_t config_settings[] = {</span>
<span style="color: #00A000">+        /* key, type, flags, ptr, default_value, data, syntax, helptext */</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM_STRING_STRDUP("db-info", CONFIG_RELOADABLE, &globals.db_info, "dbname=cdr", NULL, NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM_STRING_STRDUP("db-table", CONFIG_RELOADABLE, &globals.db_table, "cdr", NULL, NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM_STRING_STRDUP("default-template", CONFIG_RELOADABLE, &globals.default_template, "default", NULL, NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM("legs", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &globals.legs, (void *) CDR_LEG_A, &config_opt_cdr_leg_enum, "a|b|ab", NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM("spool-format", SWITCH_CONFIG_ENUM, CONFIG_RELOADABLE, &globals.spool_format, (void *) SPOOL_FORMAT_CSV, &config_opt_spool_format_enum, "csv|sql", "Disk spool format to use if SQL insert fails."),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM("rotate-on-hup", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE, &globals.rotate, SWITCH_FALSE, NULL, NULL, NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM("debug", SWITCH_CONFIG_BOOL, CONFIG_RELOADABLE, &globals.debug, SWITCH_FALSE, NULL, NULL, NULL),</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        /* key, type, flags, ptr, defaultvalue, function, functiondata, syntax, helptext */</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM_CALLBACK("spool-dir", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &globals.spool_dir, NULL, config_validate_spool_dir, NULL, NULL, NULL),</span>
<span style="color: #00A000">+        SWITCH_CONFIG_ITEM_END()</span>
<span style="color: #00A000">+};</span>
<span style="color: #00A000">+</span>
static off_t fd_size(int fd)
{
<span style="color: #800080; font-weight: bold">@@ -363,12 +408,12 @@ static switch_status_t insert_cdr(const char * const template, const char * cons</span>
        switch_mutex_unlock(globals.db_mutex);
        /* SQL INSERT failed for whatever reason. Spool the attempted query to disk */
<span style="color: #A00000">-        if (!strcasecmp(globals.spool_format, "sql")) {</span>
<span style="color: #A00000">-                path = switch_mprintf("%s%scdr-spool.sql", globals.log_dir, SWITCH_PATH_SEPARATOR);</span>
<span style="color: #00A000">+        if (globals.spool_format == SPOOL_FORMAT_SQL) {</span>
<span style="color: #00A000">+                path = switch_mprintf("%s%scdr-spool.sql", globals.spool_dir, SWITCH_PATH_SEPARATOR);</span>
                assert(path);
                spool_cdr(path, sql);
        } else {
<span style="color: #A00000">-                path = switch_mprintf("%s%scdr-spool.csv", globals.log_dir, SWITCH_PATH_SEPARATOR);</span>
<span style="color: #00A000">+                path = switch_mprintf("%s%scdr-spool.csv", globals.spool_dir, SWITCH_PATH_SEPARATOR);</span>
                assert(path);
                spool_cdr(path, cdr);
        }
<span style="color: #800080; font-weight: bold">@@ -402,8 +447,8 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)</span>
                }
        }
<span style="color: #A00000">-        if (switch_dir_make_recursive(globals.log_dir, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #A00000">-                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", globals.log_dir);</span>
<span style="color: #00A000">+        if (switch_dir_make_recursive(globals.spool_dir, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", globals.spool_dir);</span>
                return SWITCH_STATUS_FALSE;
        }
<span style="color: #800080; font-weight: bold">@@ -485,7 +530,6 @@ static switch_state_handler_table_t state_handlers = {</span>
};
<span style="color: #A00000">-</span>
static switch_status_t load_config(switch_memory_pool_t *pool)
{
        char *cf = "cdr_pg_csv.conf";
<span style="color: #800080; font-weight: bold">@@ -509,40 +553,11 @@ static switch_status_t load_config(switch_memory_pool_t *pool)</span>
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding default template.\n");
        globals.legs = CDR_LEG_A;
<span style="color: #A00000">-        if ((xml = switch_xml_open_cfg(cf, &cfg, NULL))) {</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                if ((settings = switch_xml_child(cfg, "settings"))) {</span>
<span style="color: #A00000">-                        for (param = switch_xml_child(settings, "param"); param; param = param->next) {</span>
<span style="color: #A00000">-                                char *var = (char *) switch_xml_attr_soft(param, "name");</span>
<span style="color: #A00000">-                                char *val = (char *) switch_xml_attr_soft(param, "value");</span>
<span style="color: #A00000">-                                if (!strcasecmp(var, "debug")) {</span>
<span style="color: #A00000">-                                        globals.debug = switch_true(val);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "legs")) {</span>
<span style="color: #A00000">-                                        globals.legs = 0;</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                                        if (strchr(val, 'a')) {</span>
<span style="color: #A00000">-                                                globals.legs |= CDR_LEG_A;</span>
<span style="color: #A00000">-                                        }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                                        if (strchr(val, 'b')) {</span>
<span style="color: #A00000">-                                                globals.legs |= CDR_LEG_B;</span>
<span style="color: #A00000">-                                        }</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "log-base")) {</span>
<span style="color: #A00000">-                                        globals.log_dir = switch_core_sprintf(pool, "%s%scdr-pg-csv", val, SWITCH_PATH_SEPARATOR);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "rotate-on-hup")) {</span>
<span style="color: #A00000">-                                        globals.rotate = switch_true(val);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "db-info")) {</span>
<span style="color: #A00000">-                                        globals.db_info = switch_core_strdup(pool, val);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "db-table") || !strcasecmp(var, "g-table")) {</span>
<span style="color: #A00000">-                                        globals.db_table = switch_core_strdup(pool, val);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "default-template")) {</span>
<span style="color: #A00000">-                                        globals.default_template = switch_core_strdup(pool, val);</span>
<span style="color: #A00000">-                                } else if (!strcasecmp(var, "spool-format")) {</span>
<span style="color: #A00000">-                                        globals.spool_format = switch_core_strdup(pool, val);</span>
<span style="color: #A00000">-                                }</span>
<span style="color: #A00000">-                        }</span>
<span style="color: #A00000">-                }</span>
<span style="color: #00A000">+        if (switch_xml_config_parse_module_settings("cdr_pg_csv.conf", SWITCH_FALSE, config_settings) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        if ((xml = switch_xml_open_cfg(cf, &cfg, NULL))) {</span>
                if ((settings = switch_xml_child(cfg, "templates"))) {
                        for (param = switch_xml_child(settings, "template"); param; param = param->next) {
                                char *var = (char *) switch_xml_attr(param, "name");
<span style="color: #800080; font-weight: bold">@@ -558,26 +573,6 @@ static switch_status_t load_config(switch_memory_pool_t *pool)</span>
                switch_xml_free(xml);
        }
<span style="color: #A00000">-        if (!globals.log_dir) {</span>
<span style="color: #A00000">-                globals.log_dir = switch_core_sprintf(pool, "%s%scdr-pg-csv", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR);</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-        if (zstr(globals.db_info)) {</span>
<span style="color: #A00000">-                globals.db_info = switch_core_strdup(pool, "dbname=cdr");</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-        if (zstr(globals.db_table)) {</span>
<span style="color: #A00000">-                globals.db_table = switch_core_strdup(pool, "cdr");</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-        if (zstr(globals.default_template)) {</span>
<span style="color: #A00000">-                globals.default_template = switch_core_strdup(pool, "default");</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-        if (zstr(globals.spool_format)) {</span>
<span style="color: #A00000">-                globals.spool_format = switch_core_strdup(pool, "csv");</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-</span>
        return status;
}
<span style="color: #800080; font-weight: bold">@@ -588,8 +583,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_pg_csv_load)</span>
        load_config(pool);
<span style="color: #A00000">-        if ((status = switch_dir_make_recursive(globals.log_dir, SWITCH_DEFAULT_DIR_PERMS, pool)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #A00000">-                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", globals.log_dir);</span>
<span style="color: #00A000">+        if ((status = switch_dir_make_recursive(globals.spool_dir, SWITCH_DEFAULT_DIR_PERMS, pool)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", globals.spool_dir);</span>
                return status;
        }
</pre></div>
========================================================================<pre>
Summary of changes:
conf/autoload_configs/cdr_pg_csv.conf.xml | 14 ++-
.../event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c | 141 ++++++++++----------
2 files changed, 77 insertions(+), 78 deletions(-)
</pre>
<p>this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email<br />
For more info, see <a href="http://blog.chomperstomp.com/?p=630">http://blog.chomperstomp.com/?p=630</a>
-- <br />
FreeSWITCH Source</p>