diff --git a/CHANGES b/CHANGES index 1ca66903935331ff068b63f4cef106df6de9ecb9..2b86234fbcc4db9612e1521a3ca6338549958661 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,11 @@ chan_pjsip more information. Defaults to 'no' as setting it to 'yes' can result in many unnecessary messages being sent to the caller. +res_pjsip +------------------ + * A new CLI command has been added: "pjsip show settings", which shows + both the global and system configuration settings. + res_ari_channels ------------------ * Two new events, 'ChannelHold' and 'ChannelUnhold', have been added to the @@ -35,7 +40,6 @@ func_holdintercept the channel wanted to place someone on hold. This allows external applications to implement their own custom hold/unhold logic. - ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 13.2.0 to Asterisk 13.3.0 ------------ ------------------------------------------------------------------------------ diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 6fc14774f953dedcbc60a0a40261a119b78a17dd..448d57ddbcf2594050aee0e6e9b92569983ff75a 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -37,6 +37,7 @@ #include "asterisk/sorcery.h" #include "asterisk/file.h" #include "asterisk/cli.h" +#include "asterisk/res_pjsip_cli.h" /*** MODULEINFO <depend>pjproject</depend> @@ -2141,7 +2142,39 @@ static char *cli_show_endpoint_identifiers(struct ast_cli_entry *e, int cmd, str #undef ENDPOINT_IDENTIFIER_FORMAT } +static char *cli_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct ast_sip_cli_context context; + + switch (cmd) { + case CLI_INIT: + e->command = "pjsip show settings"; + e->usage = "Usage: pjsip show settings\n" + " Show global and system configuration options\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + context.output_buffer = ast_str_create(256); + if (!context.output_buffer) { + ast_cli(a->fd, "Could not allocate output buffer.\n"); + return CLI_FAILURE; + } + + if (sip_cli_print_global(&context) || sip_cli_print_system(&context)) { + ast_free(context.output_buffer); + ast_cli(a->fd, "Error retrieving settings.\n"); + return CLI_FAILURE; + } + + ast_cli(a->fd, "%s", ast_str_buffer(context.output_buffer)); + ast_free(context.output_buffer); + return CLI_SUCCESS; +} + static struct ast_cli_entry cli_commands[] = { + AST_CLI_DEFINE(cli_show_settings, "Show global and system configuration options"), AST_CLI_DEFINE(cli_show_endpoint_identifiers, "List registered endpoint identifiers") }; diff --git a/res/res_pjsip/config_global.c b/res/res_pjsip/config_global.c index 682e3c0b14f1a8fa6679087940632397acea8474..2aa15838f4e8f12b30676bee43d79db686dfe2a2 100644 --- a/res/res_pjsip/config_global.c +++ b/res/res_pjsip/config_global.c @@ -25,6 +25,7 @@ #include "include/res_pjsip_private.h" #include "asterisk/sorcery.h" #include "asterisk/ast_version.h" +#include "asterisk/res_pjsip_cli.h" #define DEFAULT_MAX_FORWARDS 70 #define DEFAULT_KEEPALIVE_INTERVAL 0 @@ -213,6 +214,24 @@ static const struct ast_sorcery_instance_observer observer_callbacks_global = { .object_type_loaded = global_loaded_observer, }; +int sip_cli_print_global(struct ast_sip_cli_context *context) +{ + struct global_config *cfg = get_global_cfg(); + + if (!cfg) { + cfg = ast_sorcery_alloc(ast_sip_get_sorcery(), "global", NULL); + if (!cfg) { + return -1; + } + } + + ast_str_append(&context->output_buffer, 0, "\nGlobal Settings:\n\n"); + ast_sip_cli_print_sorcery_objectset(cfg, context, 0); + + ao2_ref(cfg, -1); + return 0; +} + int ast_sip_destroy_sorcery_global(void) { struct ast_sorcery *sorcery = ast_sip_get_sorcery(); diff --git a/res/res_pjsip/config_system.c b/res/res_pjsip/config_system.c index a41af90ed2b540cc690ae52ae054d5344192682f..473eca8187dafe8a5dd555b5d9376a7411787e10 100644 --- a/res/res_pjsip/config_system.c +++ b/res/res_pjsip/config_system.c @@ -26,6 +26,7 @@ #include "include/res_pjsip_private.h" #include "asterisk/threadpool.h" #include "asterisk/dns.h" +#include "asterisk/res_pjsip_cli.h" #define TIMER_T1_MIN 100 #define DEFAULT_TIMER_T1 500 @@ -112,6 +113,40 @@ static int system_apply(const struct ast_sorcery *system_sorcery, void *obj) return 0; } +static struct system_config *get_system_cfg(void) +{ + struct system_config *cfg; + struct ao2_container *systems; + systems = ast_sorcery_retrieve_by_fields(system_sorcery, "system", + AST_RETRIEVE_FLAG_MULTIPLE | AST_RETRIEVE_FLAG_ALL, NULL); + + if (!systems) { + return NULL; + } + + cfg = ao2_find(systems, NULL, 0); + ao2_ref(systems, -1); + return cfg; +} + +int sip_cli_print_system(struct ast_sip_cli_context *context) +{ + struct system_config *cfg = get_system_cfg(); + + if (!cfg) { + cfg = ast_sorcery_alloc(system_sorcery, "system", NULL); + if (!cfg) { + return -1; + } + } + + ast_str_append(&context->output_buffer, 0, "\nSystem Settings:\n\n"); + ast_sip_cli_print_sorcery_objectset(cfg, context, 0); + + ao2_ref(cfg, -1); + return 0; +} + int ast_sip_initialize_system(void) { RAII_VAR(struct ao2_container *, system_configs, NULL, ao2_cleanup); diff --git a/res/res_pjsip/include/res_pjsip_private.h b/res/res_pjsip/include/res_pjsip_private.h index 11d2887713ef221da8e19322bd2f90cde2f0b553..bf428d5c5134f3a2553404e2c691208d4a81eaa3 100644 --- a/res/res_pjsip/include/res_pjsip_private.h +++ b/res/res_pjsip/include/res_pjsip_private.h @@ -19,6 +19,7 @@ struct ao2_container; struct ast_threadpool_options; +struct ast_sip_cli_context; /*! * \internal @@ -270,6 +271,24 @@ char *ast_sip_global_default_outbound_endpoint(void); int ast_sip_initialize_cli(void); void ast_sip_destroy_cli(void); +/*! + * \internal + * \brief Add res_pjsip global configuration options to the cli context. + * + * \param context context to add options to + * \retval 0 Success, -1 on failure + */ +int sip_cli_print_global(struct ast_sip_cli_context *context); + +/*! + * \internal + * \brief Add res_pjsip system configuration options to the cli context. + * + * \param context context to add options to + * \retval 0 Success, -1 on failure + */ +int sip_cli_print_system(struct ast_sip_cli_context *context); + /*! * \internal * \brief Used by res_pjsip.so to register a service without adding a self reference