Author: dlee
Date: Thu Feb  5 19:08:07 2015
New Revision: 431575

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431575
Log:
Address review feedback.

Basically use pre_apply_config to validate config properly.

Modified:
    team/dlee/amqp-cdr-cel/cdr/cdr_amqp.c
    team/dlee/amqp-cdr-cel/cel/cel_amqp.c
    team/dlee/amqp-cdr-cel/res/amqp/config.c

Modified: team/dlee/amqp-cdr-cel/cdr/cdr_amqp.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/amqp-cdr-cel/cdr/cdr_amqp.c?view=diff&rev=431575&r1=431574&r2=431575
==============================================================================
--- team/dlee/amqp-cdr-cel/cdr/cdr_amqp.c (original)
+++ team/dlee/amqp-cdr-cel/cdr/cdr_amqp.c Thu Feb  5 19:08:07 2015
@@ -37,7 +37,7 @@
                                <configOption name="loguniqueid">
                                        <synopsis>Determines whether to log the 
uniqueid for calls</synopsis>
                                        <description>
-                                               <para>Defaults is no.</para>
+                                               <para>Default is no.</para>
                                        </description>
                                </configOption>
                                <configOption name="loguserfield">
@@ -178,8 +178,38 @@
        return ao2_bump(conf);
 }
 
+static int setup_amqp(void);
+
 CONFIG_INFO_STANDARD(cfg_info, confs, conf_alloc,
-                    .files = ACO_FILES(&conf_file));
+       .files = ACO_FILES(&conf_file),
+       .pre_apply_config = setup_amqp,
+);
+
+static int setup_amqp(void)
+{
+       struct cdr_amqp_conf *conf = aco_pending_config(&cfg_info);
+
+       if (!conf) {
+               return 0;
+       }
+
+       if (!conf->global) {
+               ast_log(LOG_ERROR, "Invalid cdr_amqp.conf\n");
+               return -1;
+       }
+
+       /* Refresh the AMQP connection */
+       ao2_cleanup(conf->global->amqp);
+       conf->global->amqp = ast_amqp_get_connection(conf->global->connection);
+
+       if (!conf->global->amqp) {
+               ast_log(LOG_ERROR, "Could not get AMQP connection %s\n",
+                       conf->global->connection);
+               return -1;
+       }
+
+       return 0;
+}
 
 /*!
  * \brief CDR handler for AMQP.
@@ -202,15 +232,8 @@
        };
 
        conf = ao2_global_obj_ref(confs);
-       if (!conf || !conf->global) {
-               ast_log(LOG_ERROR, "Error obtaining config from 
cdr_amqp.conf\n");
-               return -1;
-       }
-
-       if (!conf->global->amqp) {
-               ast_log(LOG_ERROR, "No AMQP connection; discarding CDR\n");
-               return -1;
-       }
+
+       ast_assert(conf && conf->global && conf->global->amqp);
 
        json = ast_json_pack("{"
                /* clid, src, dst, dcontext */
@@ -301,16 +324,6 @@
        conf = ao2_global_obj_ref(confs);
        if (!conf || !conf->global) {
                ast_log(LOG_ERROR, "Error obtaining config from 
cdr_amqp.conf\n");
-               return -1;
-       }
-
-       /* Refresh the AMQP connection */
-       ao2_cleanup(conf->global->amqp);
-       conf->global->amqp = ast_amqp_get_connection(conf->global->connection);
-
-       if (!conf->global->amqp) {
-               ast_log(LOG_ERROR, "Could not get AMQP connection %s\n",
-                       conf->global->connection);
                return -1;
        }
 

Modified: team/dlee/amqp-cdr-cel/cel/cel_amqp.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/amqp-cdr-cel/cel/cel_amqp.c?view=diff&rev=431575&r1=431574&r2=431575
==============================================================================
--- team/dlee/amqp-cdr-cel/cel/cel_amqp.c (original)
+++ team/dlee/amqp-cdr-cel/cel/cel_amqp.c Thu Feb  5 19:08:07 2015
@@ -163,8 +163,38 @@
        return ao2_bump(conf);
 }
 
+static int setup_amqp(void);
+
 CONFIG_INFO_STANDARD(cfg_info, confs, conf_alloc,
-                    .files = ACO_FILES(&conf_file));
+       .files = ACO_FILES(&conf_file),
+       .pre_apply_config = setup_amqp,
+);
+
+static int setup_amqp(void)
+{
+       struct cel_amqp_conf *conf = aco_pending_config(&cfg_info);
+
+       if (!conf) {
+               return 0;
+       }
+
+       if (!conf->global) {
+               ast_log(LOG_ERROR, "Invalid cdr_amqp.conf\n");
+               return -1;
+       }
+
+       /* Refresh the AMQP connection */
+       ao2_cleanup(conf->global->amqp);
+       conf->global->amqp = ast_amqp_get_connection(conf->global->connection);
+
+       if (!conf->global->amqp) {
+               ast_log(LOG_ERROR, "Could not get AMQP connection %s\n",
+                       conf->global->connection);
+               return -1;
+       }
+
+       return 0;
+}
 
 /*!
  * \brief CEL handler for AMQP.
@@ -189,15 +219,8 @@
        };
 
        conf = ao2_global_obj_ref(confs);
-       if (!conf || !conf->global) {
-               ast_log(LOG_ERROR, "Error obtaining config from 
cel_amqp.conf\n");
-               return;
-       }
-
-       if (!conf->global->amqp) {
-               ast_log(LOG_ERROR, "No AMQP connection; discarding CEL\n");
-               return;
-       }
+
+       ast_assert(conf && conf->global && conf->global->amqp);
 
        /* Extract the data from the CEL */
        if (ast_cel_fill_record(event, &record) != 0) {

Modified: team/dlee/amqp-cdr-cel/res/amqp/config.c
URL: 
http://svnview.digium.com/svn/asterisk/team/dlee/amqp-cdr-cel/res/amqp/config.c?view=diff&rev=431575&r1=431574&r2=431575
==============================================================================
--- team/dlee/amqp-cdr-cel/res/amqp/config.c (original)
+++ team/dlee/amqp-cdr-cel/res/amqp/config.c Thu Feb  5 19:08:07 2015
@@ -105,8 +105,75 @@
        return ao2_bump(conf);
 }
 
+static int validate_connections(void);
+
 CONFIG_INFO_STANDARD(cfg_info, confs, conf_alloc,
-                    .files = ACO_FILES(&conf_file));
+       .files = ACO_FILES(&conf_file),
+       .pre_apply_config = validate_connections,
+);
+
+static int validate_connection_cb(void *obj, void *arg, int flags)
+{
+        struct amqp_conf_connection *cxn_conf = obj;
+       int *validation_res = arg;
+
+       /* Copy the URL, so we can copy it non-destructively */
+       cxn_conf->parsed_url = ast_strdup(cxn_conf->url);
+       if (!cxn_conf->parsed_url) {
+               *validation_res = -1;
+               return -1;
+       }
+
+       amqp_default_connection_info(&cxn_conf->connection_info);
+       if (amqp_parse_url(cxn_conf->parsed_url, &cxn_conf->connection_info) != 
AMQP_STATUS_OK) {
+               ast_log(LOG_ERROR, "%s: invalid url %s\n",
+                       cxn_conf->name, cxn_conf->url);
+               *validation_res = -1;
+               return -1;
+       }
+
+       /* While this could be intentional, this is probably an error */
+       if (strlen(cxn_conf->connection_info.vhost) == 0) {
+               ast_log(LOG_WARNING, "%s: vhost in url is blank\n",
+                       cxn_conf->url);
+       }
+
+       if (cxn_conf->max_frame_bytes < AMQP_FRAME_MIN_SIZE) {
+               ast_log(LOG_WARNING, "%s: invalid max_frame_bytes %d\n",
+                       cxn_conf->name, cxn_conf->max_frame_bytes);
+               cxn_conf->max_frame_bytes = AMQP_FRAME_MIN_SIZE;
+       }
+
+       if (cxn_conf->heartbeat_seconds < 0) {
+               ast_log(LOG_WARNING, "%s: invalid heartbeat_seconds %d\n",
+                       cxn_conf->name, cxn_conf->heartbeat_seconds);
+               cxn_conf->heartbeat_seconds = 0;
+       }
+
+       return 0;
+}
+
+static int validate_connections(void)
+{
+       int validation_res = 0;
+
+       struct amqp_conf *conf = aco_pending_config(&cfg_info);
+       if (!conf) {
+               ast_log(LOG_ERROR, "Error obtaining config from amqp.conf\n");
+               return 0;
+       }
+
+       if (!conf->general->enabled) {
+               ast_log(LOG_NOTICE, "AMQP disabled\n");
+               return 0;
+       }
+
+       ast_debug(3, "Building %d AMQP connections\n",
+               ao2_container_count(conf->connections));
+       ao2_callback(conf->connections, OBJ_NODATA, validate_connection_cb, 
&validation_res);
+
+       return validation_res;
+}
 
 static void amqp_conf_connection_dtor(void *obj)
 {
@@ -137,11 +204,6 @@
        }
 
        if (ast_string_field_set(cxn_conf, name, cat) != 0) {
-               return NULL;
-       }
-
-       if (aco_set_defaults(&connection_option, "connection", cxn_conf) != 0) {
-               ast_log(LOG_ERROR, "Error setting defaults on %s\n", cat);
                return NULL;
        }
 
@@ -176,47 +238,8 @@
        }
 }
 
-static int validate_connection_cb(void *obj, void *arg, int flags)
-{
-        struct amqp_conf_connection *cxn_conf = obj;
-
-       /* Copy the URL, so we can copy it non-destructively */
-       cxn_conf->parsed_url = ast_strdup(cxn_conf->url);
-       if (!cxn_conf->parsed_url) {
-               return -1;
-       }
-
-       amqp_default_connection_info(&cxn_conf->connection_info);
-       if (amqp_parse_url(cxn_conf->parsed_url, &cxn_conf->connection_info) != 
AMQP_STATUS_OK) {
-               ast_log(LOG_ERROR, "%s: invalid url %s\n",
-                       cxn_conf->name, cxn_conf->url);
-               return -1;
-       }
-
-       if (strlen(cxn_conf->connection_info.vhost) == 0) {
-               ast_log(LOG_WARNING, "%s: vhost in url is blank\n",
-                       cxn_conf->url);
-       }
-
-       if (cxn_conf->max_frame_bytes < AMQP_FRAME_MIN_SIZE) {
-               ast_log(LOG_WARNING, "%s: invalid max_frame_bytes %d\n",
-                       cxn_conf->name, cxn_conf->max_frame_bytes);
-               cxn_conf->max_frame_bytes = AMQP_FRAME_MIN_SIZE;
-       }
-
-       if (cxn_conf->heartbeat_seconds < 0) {
-               ast_log(LOG_WARNING, "%s: invalid heartbeat_seconds %d\n",
-                       cxn_conf->name, cxn_conf->heartbeat_seconds);
-               cxn_conf->heartbeat_seconds = 0;
-       }
-
-       return 0;
-}
-
 static int process_config(int reload)
 {
-       RAII_VAR(struct amqp_conf *, conf, NULL, ao2_cleanup);
-
        switch (aco_process_config(&cfg_info, reload)) {
        case ACO_PROCESS_ERROR:
                return -1;
@@ -224,20 +247,6 @@
        case ACO_PROCESS_UNCHANGED:
                break;
        }
-
-       conf = amqp_config_get();
-       if (!conf) {
-               ast_log(LOG_ERROR, "Error obtaining config from amqp.conf\n");
-       }
-
-       if (!conf->general->enabled) {
-               ast_log(LOG_NOTICE, "AMQP disabled\n");
-               return 0;
-       }
-
-       ast_debug(3, "Building %d AMQP connections\n",
-               ao2_container_count(conf->connections));
-       ao2_callback(conf->connections, OBJ_NODATA, validate_connection_cb, 
NULL);
 
        return 0;
 }


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to