diff options
author | Jenkins2 <jenkins2@gerrit.asterisk.org> | 2018-02-19 06:43:27 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2018-02-19 06:43:27 -0600 |
commit | 15886d583374d19472ce3cf8dfcef0d73b78a7a5 (patch) | |
tree | 2125f7ec98eaa40484c2e59d58102154108274a1 /main | |
parent | cd222e3afa94de07b2f19a1b1390cb4b22037c00 (diff) | |
parent | cb4cfb8c4309fdb1efa487615d52236497847a1d (diff) |
Merge "manager: Add AMI event Load/Unload"
Diffstat (limited to 'main')
-rw-r--r-- | main/loader.c | 140 |
1 files changed, 125 insertions, 15 deletions
diff --git a/main/loader.c b/main/loader.c index 6b29f0e96..08d9552ff 100644 --- a/main/loader.c +++ b/main/loader.c @@ -87,6 +87,40 @@ </syntax> </managerEventInstance> </managerEvent> + <managerEvent language="en_US" name="Load"> + <managerEventInstance class="EVENT_FLAG_SYSTEM"> + <synopsis>Raised when a module has been loaded in Asterisk.</synopsis> + <syntax> + <parameter name="Module"> + <para>The name of the module that was loaded</para> + </parameter> + <parameter name="Status"> + <para>The result of the load request.</para> + <enumlist> + <enum name="Failure"><para>Module could not be loaded properly</para></enum> + <enum name="Success"><para>Module loaded and configured</para></enum> + <enum name="Decline"><para>Module is not configured</para></enum> + </enumlist> + </parameter> + </syntax> + </managerEventInstance> + </managerEvent> + <managerEvent language="en_US" name="Unload"> + <managerEventInstance class="EVENT_FLAG_SYSTEM"> + <synopsis>Raised when a module has been unloaded in Asterisk.</synopsis> + <syntax> + <parameter name="Module"> + <para>The name of the module that was unloaded</para> + </parameter> + <parameter name="Status"> + <para>The result of the unload request.</para> + <enumlist> + <enum name="Success"><para>Module unloaded successfully</para></enum> + </enumlist> + </parameter> + </syntax> + </managerEventInstance> + </managerEvent> ***/ #ifndef RTLD_NOW @@ -161,6 +195,27 @@ struct ast_module { static AST_DLLIST_HEAD_STATIC(module_list, ast_module); + +struct load_results_map { + int result; + const char *name; +}; + +static const struct load_results_map load_results[] = { + { AST_MODULE_LOAD_SUCCESS, "Success" }, + { AST_MODULE_LOAD_DECLINE, "Decline" }, + { AST_MODULE_LOAD_SKIP, "Skip" }, + { AST_MODULE_LOAD_PRIORITY, "Priority" }, + { AST_MODULE_LOAD_FAILURE, "Failure" }, +}; +#define AST_MODULE_LOAD_UNKNOWN_STRING "Unknown" /* Status string for unknown load status */ + +static void publish_load_message_type(const char* type, const char *name, const char *status); +static void publish_reload_message(const char *name, enum ast_module_reload_result result); +static void publish_load_message(const char *name, enum ast_module_load_result result); +static void publish_unload_message(const char *name, const char* status); + + /* * module_list is cleared by its constructor possibly after * we start accumulating built-in modules, so we need to @@ -1007,6 +1062,7 @@ int ast_unload_resource(const char *resource_name, enum ast_module_unload_mode f unload_dynamic_module(mod); ast_test_suite_event_notify("MODULE_UNLOAD", "Message: %s", resource_name); ast_update_use_count(); + publish_unload_message(resource_name, "Success"); } return res; @@ -1196,29 +1252,30 @@ static void queue_reload_request(const char *module) /*! * \since 12 * \internal - * \brief Publish a \ref stasis message regarding the reload result + * \brief Publish a \ref stasis message regarding the type. */ -static void publish_reload_message(const char *name, enum ast_module_reload_result result) +static void publish_load_message_type(const char* type, const char *name, const char *status) { RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); RAII_VAR(struct ast_json_payload *, payload, NULL, ao2_cleanup); RAII_VAR(struct ast_json *, json_object, NULL, ast_json_unref); RAII_VAR(struct ast_json *, event_object, NULL, ast_json_unref); - char res_buffer[8]; + + ast_assert(type != NULL); + ast_assert(!ast_strlen_zero(name)); + ast_assert(!ast_strlen_zero(status)); if (!ast_manager_get_generic_type()) { return; } - snprintf(res_buffer, sizeof(res_buffer), "%u", result); - event_object = ast_json_pack("{s: s, s: s}", - "Module", S_OR(name, "All"), - "Status", res_buffer); - json_object = ast_json_pack("{s: s, s: i, s: o}", - "type", "Reload", + event_object = ast_json_pack("{s:s, s:s}", + "Module", name, + "Status", status); + json_object = ast_json_pack("{s:s, s:i, s:o}", + "type", type, "class_type", EVENT_FLAG_SYSTEM, "event", ast_json_ref(event_object)); - if (!json_object) { return; } @@ -1236,6 +1293,54 @@ static void publish_reload_message(const char *name, enum ast_module_reload_resu stasis_publish(ast_manager_get_topic(), message); } +static const char* loadresult2str(enum ast_module_load_result result) +{ + int i; + for (i = 0; i < ARRAY_LEN(load_results); i++) { + if (load_results[i].result == result) { + return load_results[i].name; + } + } + + ast_log(LOG_WARNING, "Failed to find correct load result status. result %d\n", result); + return AST_MODULE_LOAD_UNKNOWN_STRING; +} + +/*! + * \internal + * \brief Publish a \ref stasis message regarding the load result + */ +static void publish_load_message(const char *name, enum ast_module_load_result result) +{ + const char *status; + + status = loadresult2str(result); + + publish_load_message_type("Load", name, status); +} + +/*! + * \internal + * \brief Publish a \ref stasis message regarding the unload result + */ +static void publish_unload_message(const char *name, const char* status) +{ + publish_load_message_type("Unload", name, status); +} + +/*! + * \since 12 + * \internal + * \brief Publish a \ref stasis message regarding the reload result + */ +static void publish_reload_message(const char *name, enum ast_module_reload_result result) +{ + char res_buffer[8]; + + snprintf(res_buffer, sizeof(res_buffer), "%u", result); + publish_load_message_type("Reload", S_OR(name, "All"), res_buffer); +} + enum ast_module_reload_result ast_module_reload(const char *name) { struct ast_module *cur; @@ -1462,10 +1567,7 @@ static enum ast_module_load_result load_resource(const char *resource_name, unsi res |= ast_vector_string_split(&mod->optional_modules, mod->info->optional_modules, ",", 0, strcasecmp); res |= ast_vector_string_split(&mod->enhances, mod->info->enhances, ",", 0, strcasecmp); if (res) { - ast_log(LOG_WARNING, "Failed to initialize dependency structures for module '%s'.\n", resource_name); - unload_dynamic_module(mod); - - return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE; + goto prestart_error; } } @@ -1484,12 +1586,20 @@ static enum ast_module_load_result load_resource(const char *resource_name, unsi res = start_resource(mod); } + if (ast_fully_booted && !ast_shutdown_final()) { + publish_load_message(resource_name, res); + } + return res; prestart_error: ast_log(LOG_WARNING, "Module '%s' could not be loaded.\n", resource_name); unload_dynamic_module(mod); - return required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE; + res = required ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_DECLINE; + if (ast_fully_booted && !ast_shutdown_final()) { + publish_load_message(resource_name, res); + } + return res; } int ast_load_resource(const char *resource_name) |