diff options
author | Adam <Adam@anope.org> | 2010-10-02 21:09:11 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2010-10-02 21:09:11 -0400 |
commit | 90f0a7c92ac34bc70c0905c20aaf3f7e8a85f289 (patch) | |
tree | a2bf75cc912ed3803157d10761dbea2c2475ffb1 /modules | |
parent | 0d684191e99a689c80560018dd52e6d8fd5dc549 (diff) |
Added os_modreload. Also allow unloading database and encryption modules since there isn't a reason we cant allow reloading them. Soon os_modreload will allow reloading the protocol modules.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/core/os_modload.cpp | 16 | ||||
-rw-r--r-- | modules/core/os_modreload.cpp | 112 | ||||
-rw-r--r-- | modules/core/os_modunload.cpp | 22 |
3 files changed, 144 insertions, 6 deletions
diff --git a/modules/core/os_modload.cpp b/modules/core/os_modload.cpp index b35cf0730..385353993 100644 --- a/modules/core/os_modload.cpp +++ b/modules/core/os_modload.cpp @@ -31,11 +31,21 @@ class CommandOSModLoad : public Command return MOD_CONT; } - int status = ModuleManager::LoadModule(mname, u); - if (status != MOD_ERR_OK) + ModuleReturn status = ModuleManager::LoadModule(mname, u); + if (status == MOD_ERR_OK) { - u->SendMessage(OperServ, OPER_MODULE_LOAD_FAIL, mname.c_str()); + ircdproto->SendGlobops(OperServ, "%s loaded module %s", u->nick.c_str(), mname.c_str()); + u->SendMessage(OperServ, OPER_MODULE_LOADED, mname.c_str()); + + /* If a user is loading this module, then the core databases have already been loaded + * so trigger the event manually + */ + m = FindModule(mname); + if (m) + m->OnPostLoadDatabases(); } + else + u->SendMessage(OperServ, OPER_MODULE_LOAD_FAIL, mname.c_str()); return MOD_CONT; } diff --git a/modules/core/os_modreload.cpp b/modules/core/os_modreload.cpp new file mode 100644 index 000000000..5cb8c60e8 --- /dev/null +++ b/modules/core/os_modreload.cpp @@ -0,0 +1,112 @@ +/* OperServ core functions + * + * (C) 2003-2010 Anope Team + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + */ + +/*************************************************************************/ + +#include "module.h" + +class CommandOSModReLoad : public Command +{ + public: + CommandOSModReLoad() : Command("MODRELOAD", 1, 1, "operserv/modload") + { + } + + CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms) + { + Anope::string mname = params[0]; + + Module *m = FindModule(mname); + if (!m) + { + u->SendMessage(OperServ, OPER_MODULE_ISNT_LOADED, mname.c_str()); + return MOD_CONT; + } + + if (!m->handle) + { + u->SendMessage(OperServ, OPER_MODULE_REMOVE_FAIL, m->name.c_str()); + return MOD_CONT; + } + + if (m->GetPermanent() || m->type == PROTOCOL) // TODO: make protocol modules reloadable + { + u->SendMessage(OperServ, OPER_MODULE_NO_UNLOAD); + return MOD_CONT; + } + + /* Unrecoverable */ + bool fatal = m->type == PROTOCOL; + ModuleReturn status = ModuleManager::UnloadModule(m, u); + + if (status != MOD_ERR_OK) + { + u->SendMessage(OperServ, OPER_MODULE_REMOVE_FAIL, mname.c_str()); + return MOD_CONT; + } + + status = ModuleManager::LoadModule(mname, u); + if (status == MOD_ERR_OK) + { + ircdproto->SendGlobops(OperServ, "%s reloaded module %s", u->nick.c_str(), mname.c_str()); + u->SendMessage(OperServ, OPER_MODULE_RELOADED, mname.c_str()); + + /* If a user is loading this module, then the core databases have already been loaded + * so trigger the event manually + */ + m = FindModule(mname); + if (m) + m->OnPostLoadDatabases(); + } + else + { + if (fatal) + throw FatalException("Unable to reload module " + mname); + else + u->SendMessage(OperServ, OPER_MODULE_LOAD_FAIL, mname.c_str()); + } + + return MOD_CONT; + } + + bool OnHelp(User *u, const Anope::string &subcommand) + { + u->SendMessage(OperServ, OPER_HELP_MODRELOAD); + return true; + } + + void OnSyntaxError(User *u, const Anope::string &subcommand) + { + SyntaxError(OperServ, u, "MODLOAD", OPER_MODULE_RELOAD_SYNTAX); + } + + void OnServHelp(User *u) + { + u->SendMessage(OperServ, OPER_HELP_CMD_MODRELOAD); + } +}; + +class OSModReLoad : public Module +{ + CommandOSModReLoad commandosmodreload; + + public: + OSModReLoad(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator) + { + this->SetAuthor("Anope"); + this->SetType(CORE); + this->SetPermanent(true); + + this->AddCommand(OperServ, &commandosmodreload); + } +}; + +MODULE_INIT(OSModReLoad) diff --git a/modules/core/os_modunload.cpp b/modules/core/os_modunload.cpp index cf00676c4..f8bbe0461 100644 --- a/modules/core/os_modunload.cpp +++ b/modules/core/os_modunload.cpp @@ -23,7 +23,6 @@ class CommandOSModUnLoad : public Command CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms) { Anope::string mname = params[0]; - int status; Module *m = FindModule(mname); if (!m) @@ -31,12 +30,29 @@ class CommandOSModUnLoad : public Command u->SendMessage(OperServ, OPER_MODULE_ISNT_LOADED, mname.c_str()); return MOD_CONT; } + + if (!m->handle) + { + u->SendMessage(OperServ, OPER_MODULE_REMOVE_FAIL, m->name.c_str()); + return MOD_CONT; + } + + if (m->GetPermanent() || m->type == PROTOCOL) + { + u->SendMessage(OperServ, OPER_MODULE_NO_UNLOAD); + return MOD_CONT; + } Log() << "Trying to unload module [" << mname << "]"; - status = ModuleManager::UnloadModule(m, u); + ModuleReturn status = ModuleManager::UnloadModule(m, u); - if (status != MOD_ERR_OK) + if (status == MOD_ERR_OK) + { + u->SendMessage(OperServ, OPER_MODULE_UNLOADED, mname.c_str()); + ircdproto->SendGlobops(OperServ, "%s unloaded module %s", u->nick.c_str(), mname.c_str()); + } + else u->SendMessage(OperServ, OPER_MODULE_REMOVE_FAIL, mname.c_str()); return MOD_CONT; |