aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-07 15:52:55 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-07 15:52:55 +0000
commita995706a85e2c86e169547f953b34fc977943246 (patch)
treee9cc86a13740264ee7195729ea4e9ca0e8976852 /main
parent74ec4f4279138f5806df6fdb3cc2d58cd7e1560c (diff)
Move ModuleLoad and ModuleCheck manager commands from loader.c to manager.c. Previously they would get registered twice because of the way manager.c operates.
(closes issue #11699) Reported by: caio1982 Patches: manager_module_commands1.diff uploaded by caio1982 (license 22) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@96858 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/loader.c109
-rw-r--r--main/manager.c98
2 files changed, 100 insertions, 107 deletions
diff --git a/main/loader.c b/main/loader.c
index 3d9455dad..1d0797720 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -80,11 +80,6 @@ static char buildopt_sum[33] = AST_BUILDOPT_SUM;
static unsigned int embedding = 1; /* we always start out by registering embedded modules,
since they are here before we dlopen() any
*/
-/* Forward declaration */
-static int manager_moduleload(struct mansession *s, const struct message *m);
-static char mandescr_moduleload[];
-static int manager_modulecheck(struct mansession *s, const struct message *m);
-static char mandescr_modulecheck[];
struct ast_module {
const struct ast_module_info *info;
@@ -747,7 +742,6 @@ static struct load_order_entry *add_to_load_order(const char *resource, struct l
return order;
}
-
int load_modules(unsigned int preload_only)
{
struct ast_config *cfg;
@@ -910,14 +904,12 @@ done:
}
AST_LIST_UNLOCK(&module_list);
-
- ast_manager_register2("ModuleLoad", EVENT_FLAG_SYSTEM, manager_moduleload, "Module management", mandescr_moduleload);
- ast_manager_register2("ModuleCheck", EVENT_FLAG_SYSTEM, manager_modulecheck, "Check if module is loaded", mandescr_modulecheck);
-
+
/* Tell manager clients that are aggressive at logging in that we're done
loading modules. If there's a DNS problem in chan_sip, we might not
even reach this */
manager_event(EVENT_FLAG_SYSTEM, "ModuleLoadReport", "ModuleLoadStatus: Done\r\nModuleSelection: %s\r\nModuleCount: %d\r\n", preload_only ? "Preload" : "All", modulecount);
+
return res;
}
@@ -1012,100 +1004,3 @@ void ast_module_unref(struct ast_module *mod)
ast_atomic_fetchadd_int(&mod->usecount, -1);
ast_update_use_count();
}
-
-static char mandescr_modulecheck[] =
-"Description: Checks if Asterisk module is loaded\n"
-"Variables: \n"
-" ActionID: <id> Action ID for this transaction. Will be returned.\n"
-" Module: <name> Asterisk module name (not including extension)\n"
-"\n"
-"Will return Success/Failure\n"
-"For success returns, the module revision number is included.\n";
-
-/* Manager function to check if module is loaded */
-static int manager_modulecheck(struct mansession *s, const struct message *m)
-{
- int res;
- const char *module = astman_get_header(m, "Module");
- const char *id = astman_get_header(m,"ActionID");
- char idText[BUFSIZ];
- const char *version;
- char filename[BUFSIZ/2];
- char *cut;
-
- snprintf(filename, sizeof(filename), module);
- if ((cut = strchr(filename, '.'))) {
- *cut = '\0';
- } else {
- cut = filename + strlen(filename);
- }
- sprintf(cut, ".so");
- ast_log(LOG_DEBUG, "**** ModuleCheck .so file %s\n", filename);
- res = ast_module_check(filename);
- if (!res) {
- astman_send_error(s, m, "Module not loaded");
- return 0;
- }
- sprintf(cut, ".c");
- ast_log(LOG_DEBUG, "**** ModuleCheck .c file %s\n", filename);
- version = ast_file_version_find(filename);
-
- if (!ast_strlen_zero(id))
- snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
- astman_append(s, "Response: Success\r\n%s", idText);
- astman_append(s, "Version: %s\r\n\r\n", version ? version : "");
- return 0;
-}
-
-
-static char mandescr_moduleload[] =
-"Description: Loads, unloads or reloads an Asterisk module in a running system.\n"
-"Variables: \n"
-" ActionID: <id> Action ID for this transaction. Will be returned.\n"
-" Module: <name> Asterisk module name (including .so extension)\n"
-" or subsystem identifier:\n"
-" cdr, enum, dnsmgr, extconfig, manager, rtp, http\n"
-" LoadType: load | unload | reload\n"
-" The operation to be done on module\n"
-" If no module is specified for a reload loadtype, all modules are reloaded";
-
-static int manager_moduleload(struct mansession *s, const struct message *m)
-{
- int res;
- const char *module = astman_get_header(m, "Module");
- const char *loadtype = astman_get_header(m, "LoadType");
-
- if (!loadtype || strlen(loadtype) == 0)
- astman_send_error(s, m, "Incomplete ModuleLoad action.");
- if ((!module || strlen(module) == 0) && strcasecmp(loadtype, "reload") != 0)
- astman_send_error(s, m, "Need module name");
-
- if (!strcasecmp(loadtype, "load")) {
- res = ast_load_resource(module);
- if (res)
- astman_send_error(s, m, "Could not load module.");
- else
- astman_send_ack(s, m, "Module loaded.");
- } else if (!strcasecmp(loadtype, "unload")) {
- res = ast_unload_resource(module, AST_FORCE_SOFT);
- if (res)
- astman_send_error(s, m, "Could not unload module.");
- else
- astman_send_ack(s, m, "Module unloaded.");
- } else if (!strcasecmp(loadtype, "reload")) {
- if (module != NULL) {
- res = ast_module_reload(module);
- if (res == 0)
- astman_send_error(s, m, "No such module.");
- else if (res == 1)
- astman_send_error(s, m, "Module does not support reload action.");
- else
- astman_send_ack(s, m, "Module reloaded.");
- } else {
- ast_module_reload(NULL); /* Reload all modules */
- astman_send_ack(s, m, "All modules reloaded");
- }
- } else
- astman_send_error(s, m, "Incomplete ModuleLoad action.");
- return 0;
-}
diff --git a/main/manager.c b/main/manager.c
index f57d35b68..99fe49c4d 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -55,6 +55,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/manager.h"
+#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/callerid.h"
#include "asterisk/lock.h"
@@ -2360,6 +2361,101 @@ static int action_coreshowchannels(struct mansession *s, const struct message *m
return 0;
}
+static char mandescr_modulecheck[] =
+"Description: Checks if Asterisk module is loaded\n"
+"Variables: \n"
+" ActionID: <id> Action ID for this transaction. Will be returned.\n"
+" Module: <name> Asterisk module name (not including extension)\n"
+"\n"
+"Will return Success/Failure\n"
+"For success returns, the module revision number is included.\n";
+
+/* Manager function to check if module is loaded */
+static int manager_modulecheck(struct mansession *s, const struct message *m)
+{
+ int res;
+ const char *module = astman_get_header(m, "Module");
+ const char *id = astman_get_header(m,"ActionID");
+ char idText[BUFSIZ];
+ const char *version;
+ char filename[BUFSIZ/2];
+ char *cut;
+
+ snprintf(filename, sizeof(filename), module);
+ if ((cut = strchr(filename, '.'))) {
+ *cut = '\0';
+ } else {
+ cut = filename + strlen(filename);
+ }
+ sprintf(cut, ".so");
+ ast_log(LOG_DEBUG, "**** ModuleCheck .so file %s\n", filename);
+ res = ast_module_check(filename);
+ if (!res) {
+ astman_send_error(s, m, "Module not loaded");
+ return 0;
+ }
+ sprintf(cut, ".c");
+ ast_log(LOG_DEBUG, "**** ModuleCheck .c file %s\n", filename);
+ version = ast_file_version_find(filename);
+
+ if (!ast_strlen_zero(id))
+ snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
+ astman_append(s, "Response: Success\r\n%s", idText);
+ astman_append(s, "Version: %s\r\n\r\n", version ? version : "");
+ return 0;
+}
+
+static char mandescr_moduleload[] =
+"Description: Loads, unloads or reloads an Asterisk module in a running system.\n"
+"Variables: \n"
+" ActionID: <id> Action ID for this transaction. Will be returned.\n"
+" Module: <name> Asterisk module name (including .so extension)\n"
+" or subsystem identifier:\n"
+" cdr, enum, dnsmgr, extconfig, manager, rtp, http\n"
+" LoadType: load | unload | reload\n"
+" The operation to be done on module\n"
+" If no module is specified for a reload loadtype, all modules are reloaded";
+
+static int manager_moduleload(struct mansession *s, const struct message *m)
+{
+ int res;
+ const char *module = astman_get_header(m, "Module");
+ const char *loadtype = astman_get_header(m, "LoadType");
+
+ if (!loadtype || strlen(loadtype) == 0)
+ astman_send_error(s, m, "Incomplete ModuleLoad action.");
+ if ((!module || strlen(module) == 0) && strcasecmp(loadtype, "reload") != 0)
+ astman_send_error(s, m, "Need module name");
+
+ if (!strcasecmp(loadtype, "load")) {
+ res = ast_load_resource(module);
+ if (res)
+ astman_send_error(s, m, "Could not load module.");
+ else
+ astman_send_ack(s, m, "Module loaded.");
+ } else if (!strcasecmp(loadtype, "unload")) {
+ res = ast_unload_resource(module, AST_FORCE_SOFT);
+ if (res)
+ astman_send_error(s, m, "Could not unload module.");
+ else
+ astman_send_ack(s, m, "Module unloaded.");
+ } else if (!strcasecmp(loadtype, "reload")) {
+ if (module != NULL) {
+ res = ast_module_reload(module);
+ if (res == 0)
+ astman_send_error(s, m, "No such module.");
+ else if (res == 1)
+ astman_send_error(s, m, "Module does not support reload action.");
+ else
+ astman_send_ack(s, m, "Module reloaded.");
+ } else {
+ ast_module_reload(NULL); /* Reload all modules */
+ astman_send_ack(s, m, "All modules reloaded");
+ }
+ } else
+ astman_send_error(s, m, "Incomplete ModuleLoad action.");
+ return 0;
+}
/*
* Done with the action handlers here, we start with the code in charge
@@ -3393,6 +3489,8 @@ static int __init_manager(int reload)
ast_manager_register2("CoreStatus", EVENT_FLAG_SYSTEM, action_corestatus, "Show PBX core status variables", mandescr_corestatus);
ast_manager_register2("Reload", EVENT_FLAG_CONFIG, action_reload, "Send a reload event", mandescr_reload);
ast_manager_register2("CoreShowChannels", EVENT_FLAG_SYSTEM, action_coreshowchannels, "List currently active channels", mandescr_coreshowchannels);
+ ast_manager_register2("ModuleLoad", EVENT_FLAG_SYSTEM, manager_moduleload, "Module management", mandescr_moduleload);
+ ast_manager_register2("ModuleCheck", EVENT_FLAG_SYSTEM, manager_modulecheck, "Check if module is loaded", mandescr_modulecheck);
ast_cli_register_multiple(cli_manager, sizeof(cli_manager) / sizeof(struct ast_cli_entry));
ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);