Author: gtjoseph
Date: Mon Dec 15 11:08:24 2014
New Revision: 429593

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=429593
Log:
res_pjsip_config_wizard: Allow streamlined config of common pjsip scenarios

res_pjsip_config_wizard
------------------
 * This is a new module that adds streamlined configuration capability for
   chan_pjsip.  It's targetted at users who have lots of basic configuration
   scenarios like 'phone' or 'agent' or 'trunk'.  Additional information
   can be found in the sample configuration file at
   config/samples/pjsip_wizard.conf.sample.

Tested-by: George Joseph

Review: https://reviewboard.asterisk.org/r/4190/
........

Merged revisions 429592 from http://svn.asterisk.org/svn/asterisk/branches/13

Added:
    trunk/configs/samples/pjsip_wizard.conf.sample
      - copied unchanged from r429592, 
branches/13/configs/samples/pjsip_wizard.conf.sample
    trunk/res/res_pjsip_config_wizard.c
      - copied unchanged from r429592, branches/13/res/res_pjsip_config_wizard.c
Modified:
    trunk/   (props changed)
    trunk/CHANGES
    trunk/res/res_pjsip_phoneprov_provider.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/CHANGES
URL: 
http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=429593&r1=429592&r2=429593
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Mon Dec 15 11:08:24 2014
@@ -78,6 +78,14 @@
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.1.0 to Asterisk 13.2.0 ------------
 ------------------------------------------------------------------------------
+
+res_pjsip_config_wizard
+------------------
+ * This is a new module that adds streamlined configuration capability for
+   chan_pjsip.  It's targetted at users who have lots of basic configuration
+   scenarios like 'phone' or 'agent' or 'trunk'.  Additional information
+   can be found in the sample configuration file at
+   config/samples/pjsip_wizard.conf.sample.
 
 ARI
 ------------------

Modified: trunk/res/res_pjsip_phoneprov_provider.c
URL: 
http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_phoneprov_provider.c?view=diff&rev=429593&r1=429592&r2=429593
==============================================================================
--- trunk/res/res_pjsip_phoneprov_provider.c (original)
+++ trunk/res/res_pjsip_phoneprov_provider.c Mon Dec 15 11:08:24 2014
@@ -135,6 +135,11 @@
 static void phoneprov_destroy(void *obj)
 {
        struct phoneprov *pp = obj;
+       char *mac = ast_var_find(pp->vars, "MAC");
+
+       if (mac) {
+               ast_phoneprov_delete_extension(AST_MODULE, mac);
+       }
 
        ast_var_list_destroy(pp->vars);
 }
@@ -196,7 +201,7 @@
        struct ast_variable *var;
 
        AST_VAR_LIST_TRAVERSE(pp->vars, pvar) {
-               var = ast_variable_new(pvar->name, pvar->value, NULL);
+               var = ast_variable_new(pvar->name, pvar->value, "");
                if (!var) {
                        ast_variables_destroy(head);
                        return -1;
@@ -228,7 +233,7 @@
        /* We need to use res_pjsip's sorcery instance instead of our own to
         * get endpoint and auth.
         */
-       endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+       endpoint = ast_sorcery_retrieve_by_id(sorcery, "endpoint",
                endpoint_name);
        if (!endpoint) {
                ast_log(LOG_ERROR, "phoneprov %s contained invalid endpoint 
%s.\n", id,
@@ -250,7 +255,7 @@
                        endpoint->id.self.name.str, vars);
        }
 
-       transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), 
"transport",
+       transport = ast_sorcery_retrieve_by_id(sorcery, "transport",
                endpoint->transport);
        if (!transport) {
                ast_log(LOG_ERROR, "Endpoint %s contained invalid transport 
%s.\n", endpoint_name,
@@ -264,7 +269,7 @@
        }
        auth_name = AST_VECTOR_GET(&endpoint->inbound_auths, 0);
 
-       auth = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "auth", 
auth_name);
+       auth = ast_sorcery_retrieve_by_id(sorcery, "auth", auth_name);
        if (!auth) {
                ast_log(LOG_ERROR, "phoneprov %s contained invalid auth %s.\n", 
id, auth_name);
                return -1;
@@ -283,68 +288,8 @@
 /*! \brief Callback that loads the users from phoneprov sections */
 static int load_users(void)
 {
-       struct phoneprov *pp;
-       struct ao2_container *c;
-       struct ao2_iterator i;
-       int user_count = 0;
-       char port_string[6];
-
-       c = ast_sorcery_retrieve_by_fields(sorcery, "phoneprov", 
AST_RETRIEVE_FLAG_MULTIPLE, NULL);
-       if (!c) {
-               ast_log(LOG_ERROR, "Retrieve by regex failed to allocate a 
container.\n");
-               return -1;
-       }
-       if (ao2_container_count(c) == 0) {
-               ast_log(LOG_ERROR, "Unable to find any phoneprov users.\n");
-               ao2_cleanup(c);
-               return -1;
-       }
-
-       i = ao2_iterator_init(c, 0);
-       while ((pp = ao2_iterator_next(&i))) {
-               const char *endpoint_name;
-               const char *id = ast_sorcery_object_get_id(pp);
-
-               endpoint_name = ast_var_find(pp->vars, "endpoint");
-               if (endpoint_name) {
-                       if (load_endpoint(id, endpoint_name, pp->vars, 
port_string)) {
-                               goto cleanup;
-                       }
-               }
-
-               if (!ast_var_find(pp->vars,
-                       
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_USERNAME))) {
-                       assign_and_insert(
-                               
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_USERNAME), id,
-                               pp->vars);
-               }
-
-               if (!ast_var_find(pp->vars,
-                       
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_LABEL))) {
-                       
assign_and_insert(ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_LABEL),
-                               id, pp->vars);
-               }
-
-               if (!ast_var_find(pp->vars,
-                       
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_SERVER_PORT))) {
-                       assign_and_insert("SERVER_PORT", S_OR(port_string, 
"5060"), pp->vars);
-               }
-
-               if (!ast_var_find(pp->vars,
-                       
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_PROFILE))) {
-                       ast_log(LOG_ERROR, "phoneprov %s didn't contain a 
PROFILE entry.\n", id);
-               } else if (!ast_phoneprov_add_extension(AST_MODULE, pp->vars)) {
-                       user_count++;
-               }
-               ao2_ref(pp, -1);
-       }
-
-cleanup:
-       ao2_iterator_destroy(&i);
-       ao2_cleanup(pp);
-       ao2_cleanup(c);
-
-       return user_count > 0 ? 0 : -1;
+       ast_sorcery_reload_object(sorcery, "phoneprov");
+       return 0;
 }
 
 /*! \brief Callback that validates the phoneprov object */
@@ -352,6 +297,8 @@
 {
        struct phoneprov *pp = obj;
        const char *id = ast_sorcery_object_get_id(pp);
+       const char *endpoint_name;
+       char port_string[6];
 
        if (!ast_var_find(pp->vars,
                ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_MAC))) {
@@ -365,30 +312,63 @@
                return -1;
        }
 
-       return 0;
+       endpoint_name = ast_var_find(pp->vars, "endpoint");
+       if (endpoint_name) {
+               if (load_endpoint(id, endpoint_name, pp->vars, port_string)) {
+                       return -1;
+               }
+       }
+
+       if (!ast_var_find(pp->vars,
+               ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_USERNAME))) 
{
+               assign_and_insert(
+                       
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_USERNAME), id,
+                       pp->vars);
+       }
+
+       if (!ast_var_find(pp->vars,
+               ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_LABEL))) {
+               
assign_and_insert(ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_LABEL),
+                       id, pp->vars);
+       }
+
+       if (!ast_var_find(pp->vars,
+               
ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_SERVER_PORT))) {
+               assign_and_insert("SERVER_PORT", S_OR(port_string, "5060"), 
pp->vars);
+       }
+
+       if (!ast_var_find(pp->vars,
+               ast_phoneprov_std_variable_lookup(AST_PHONEPROV_STD_PROFILE))) {
+               ast_log(LOG_ERROR, "phoneprov %s didn't contain a PROFILE 
entry.\n", id);
+       }
+
+       if (!ast_phoneprov_add_extension(AST_MODULE, pp->vars)) {
+               return 0;
+       }
+
+       return -1;
 }
 
 static int load_module(void)
 {
        CHECK_PJSIP_MODULE_LOADED();
 
-       if (!(sorcery = ast_sorcery_open())) {
-               ast_log(LOG_ERROR, "Unable to open a sorcery instance.\n");
-               return AST_MODULE_LOAD_DECLINE;
-       }
-
-       ast_sorcery_apply_default(sorcery, "phoneprov", "config", 
"pjsip.conf,criteria=type=phoneprov");
+       sorcery = ast_sip_get_sorcery();
+
+       ast_sorcery_apply_config(sorcery, "res_pjsip_phoneprov_provider");
+       ast_sorcery_apply_default(sorcery, "phoneprov", "config",
+               "pjsip.conf,criteria=type=phoneprov");
 
        ast_sorcery_object_register(sorcery, "phoneprov", phoneprov_alloc, NULL,
                users_apply_handler);
-       ast_sorcery_object_field_register(sorcery, "phoneprov", "type", "", 
OPT_NOOP_T, 0, 0);
+
+       ast_sorcery_object_field_register(sorcery, "phoneprov", "type", "", 
OPT_NOOP_T, 0,
+               0);
        ast_sorcery_object_fields_register(sorcery, "phoneprov", "^", 
aco_handler,
                fields_handler);
-       ast_sorcery_reload_object(sorcery, "phoneprov");
 
        if (ast_phoneprov_provider_register(AST_MODULE, load_users)) {
                ast_log(LOG_ERROR, "Unable to register pjsip phoneprov 
provider.\n");
-               ast_sorcery_unref(sorcery);
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -398,15 +378,18 @@
 static int unload_module(void)
 {
        ast_phoneprov_provider_unregister(AST_MODULE);
-       ast_sorcery_unref(sorcery);
 
        return 0;
 }
 
 static int reload_module(void)
 {
-       unload_module();
-       load_module();
+       ast_phoneprov_provider_unregister(AST_MODULE);
+
+       if (ast_phoneprov_provider_register(AST_MODULE, load_users)) {
+               ast_log(LOG_ERROR, "Unable to register pjsip phoneprov 
provider.\n");
+               return AST_MODULE_LOAD_DECLINE;
+       }
 
        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