anope- supernets anope source code & configuration |
git clone git://git.acid.vegas/anope.git |
Log | Files | Refs | Archive | README |
os_module.cpp (4912B)
1 /* OperServ core functions 2 * 3 * (C) 2003-2022 Anope Team 4 * Contact us at team@anope.org 5 * 6 * Please read COPYING and README for further details. 7 * 8 * Based on the original code of Epona by Lara. 9 * Based on the original code of Services by Andy Church. 10 */ 11 12 #include "module.h" 13 14 class CommandOSModLoad : public Command 15 { 16 public: 17 CommandOSModLoad(Module *creator) : Command(creator, "operserv/modload", 1, 1) 18 { 19 this->SetDesc(_("Load a module")); 20 this->SetSyntax(_("\037modname\037")); 21 } 22 23 void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override 24 { 25 const Anope::string &mname = params[0]; 26 27 ModuleReturn status = ModuleManager::LoadModule(mname, source.GetUser()); 28 if (status == MOD_ERR_OK) 29 { 30 Log(LOG_ADMIN, source, this) << "to load module " << mname; 31 source.Reply(_("Module \002%s\002 loaded."), mname.c_str()); 32 } 33 else if (status == MOD_ERR_EXISTS) 34 source.Reply(_("Module \002%s\002 is already loaded."), mname.c_str()); 35 else 36 source.Reply(_("Unable to load module \002%s\002."), mname.c_str()); 37 38 return; 39 } 40 41 bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override 42 { 43 this->SendSyntax(source); 44 source.Reply(" "); 45 source.Reply(_("This command loads the module named \037modname\037 from the modules\n" 46 "directory.")); 47 return true; 48 } 49 }; 50 51 class CommandOSModReLoad : public Command 52 { 53 public: 54 CommandOSModReLoad(Module *creator) : Command(creator, "operserv/modreload", 1, 1) 55 { 56 this->SetDesc(_("Reload a module")); 57 this->SetSyntax(_("\037modname\037")); 58 } 59 60 void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override 61 { 62 const Anope::string &mname = params[0]; 63 64 Module *m = ModuleManager::FindModule(mname); 65 if (!m) 66 { 67 source.Reply(_("Module \002%s\002 isn't loaded."), mname.c_str()); 68 return; 69 } 70 71 if (!m->handle || m->GetPermanent()) 72 { 73 source.Reply(_("Unable to remove module \002%s\002."), m->name.c_str()); 74 return; 75 } 76 77 Module *protocol = ModuleManager::FindFirstOf(PROTOCOL); 78 if (m->type == PROTOCOL && m != protocol) 79 { 80 source.Reply(_("You can not reload this module directly, instead reload %s."), protocol ? protocol->name.c_str() : "(unknown)"); 81 return; 82 } 83 84 /* Unrecoverable */ 85 bool fatal = m->type == PROTOCOL; 86 ModuleReturn status = ModuleManager::UnloadModule(m, source.GetUser()); 87 88 if (status != MOD_ERR_OK) 89 { 90 source.Reply(_("Unable to remove module \002%s\002."), mname.c_str()); 91 return; 92 } 93 94 status = ModuleManager::LoadModule(mname, source.GetUser()); 95 if (status == MOD_ERR_OK) 96 { 97 Log(LOG_ADMIN, source, this) << "to reload module " << mname; 98 source.Reply(_("Module \002%s\002 reloaded."), mname.c_str()); 99 } 100 else 101 { 102 if (fatal) 103 { 104 Anope::QuitReason = "Unable to reload module " + mname; 105 Anope::Quitting = true; 106 } 107 else 108 source.Reply(_("Unable to load module \002%s\002."), mname.c_str()); 109 } 110 111 return; 112 } 113 114 bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override 115 { 116 this->SendSyntax(source); 117 source.Reply(" "); 118 source.Reply(_("This command reloads the module named \037modname\037.")); 119 return true; 120 } 121 }; 122 123 class CommandOSModUnLoad : public Command 124 { 125 public: 126 CommandOSModUnLoad(Module *creator) : Command(creator, "operserv/modunload", 1, 1) 127 { 128 this->SetDesc(_("Un-Load a module")); 129 this->SetSyntax(_("\037modname\037")); 130 } 131 132 void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override 133 { 134 const Anope::string &mname = params[0]; 135 136 Module *m = ModuleManager::FindModule(mname); 137 if (!m) 138 { 139 source.Reply(_("Module \002%s\002 isn't loaded."), mname.c_str()); 140 return; 141 } 142 143 if (!m->handle || m->GetPermanent() || m->type == PROTOCOL) 144 { 145 source.Reply(_("Unable to remove module \002%s\002."), m->name.c_str()); 146 return; 147 } 148 149 Log(this->owner) << "Trying to unload module [" << mname << "]"; 150 151 ModuleReturn status = ModuleManager::UnloadModule(m, source.GetUser()); 152 153 if (status == MOD_ERR_OK) 154 { 155 Log(LOG_ADMIN, source, this) << "to unload module " << mname; 156 source.Reply(_("Module \002%s\002 unloaded."), mname.c_str()); 157 } 158 else 159 source.Reply(_("Unable to remove module \002%s\002."), mname.c_str()); 160 161 return; 162 } 163 164 bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override 165 { 166 this->SendSyntax(source); 167 source.Reply(" "); 168 source.Reply(_("This command unloads the module named \037modname\037.")); 169 return true; 170 } 171 }; 172 173 class OSModule : public Module 174 { 175 CommandOSModLoad commandosmodload; 176 CommandOSModReLoad commandosmodreload; 177 CommandOSModUnLoad commandosmodunload; 178 179 public: 180 OSModule(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), 181 commandosmodload(this), commandosmodreload(this), commandosmodunload(this) 182 { 183 this->SetPermanent(true); 184 185 } 186 }; 187 188 MODULE_INIT(OSModule)