2012-04-19 20:58:29 +02:00
/*
* InspIRCd - - Internet Relay Chat Daemon
2007-07-16 17:30:04 +00:00
*
2024-06-07 10:37:56 +01:00
* Copyright ( C ) 2013 , 2017 , 2019 - 2023 Sadie Powell < sadie @ witchery . services >
2020-01-11 22:02:47 +00:00
* Copyright ( C ) 2012 , 2014 - 2016 Attila Molnar < attilamolnar @ hush . com >
2024-06-07 10:37:56 +01:00
* Copyright ( C ) 2012 Robby < robby @ chatbelgie . be >
2020-01-11 22:02:47 +00:00
* Copyright ( C ) 2009 - 2010 Daniel De Graaf < danieldg @ inspircd . org >
2021-02-26 06:58:13 +00:00
* Copyright ( C ) 2009 Robin Burchell < robin + git @ viroteck . net >
2012-04-19 20:58:29 +02:00
* Copyright ( C ) 2007 - 2008 Dennis Friis < peavey @ inspircd . org >
2024-06-07 10:37:56 +01:00
* Copyright ( C ) 2007 - 2008 Craig Edwards < brain @ inspircd . org >
2024-06-21 10:36:09 +01:00
* Copyright ( C ) 2007 John Brooks < john @ jbrooks . io >
2007-07-16 17:30:04 +00:00
*
2012-04-19 20:58:29 +02:00
* This file is part of InspIRCd . InspIRCd is free software : you can
* redistribute it and / or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation , version 2.
2007-07-16 17:30:04 +00:00
*
2012-04-19 20:58:29 +02:00
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE . See the GNU General Public License for more
* details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
2007-07-16 17:30:04 +00:00
*/
2012-04-19 20:58:29 +02:00
2007-07-16 17:30:04 +00:00
# include "inspircd.h"
2021-10-01 05:15:29 +01:00
class CommandGLoadModule final
: public Command
2007-07-16 17:30:04 +00:00
{
2022-01-25 13:59:42 +00:00
public :
2021-01-19 07:05:51 +00:00
CommandGLoadModule ( Module * Creator )
2022-12-01 05:14:58 +00:00
: Command ( Creator , " GLOADMODULE " , 1 )
2007-07-16 17:30:04 +00:00
{
2020-04-14 21:30:50 +01:00
access_needed = CmdAccess : : OPERATOR ;
2020-04-14 16:41:31 +01:00
syntax = { " <modulename> [<servermask>] " } ;
2007-07-16 17:30:04 +00:00
}
2019-01-25 02:52:11 +00:00
CmdResult Handle ( User * user , const Params & parameters ) override
2007-07-16 17:30:04 +00:00
{
2008-05-05 00:18:01 +00:00
std : : string servername = parameters . size ( ) > 1 ? parameters [ 1 ] : " * " ;
2007-07-16 17:30:04 +00:00
2022-09-03 22:52:53 +01:00
if ( InspIRCd : : Match ( ServerInstance - > Config - > ServerName , servername ) )
2007-07-16 17:30:04 +00:00
{
2022-09-03 22:52:53 +01:00
if ( ServerInstance - > Modules . Load ( parameters [ 0 ] ) )
2007-08-25 11:26:44 +00:00
{
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " NEW MODULE '{}' GLOBALLY LOADED BY '{}' " , parameters [ 0 ] , user - > nick ) ;
2021-01-19 07:05:51 +00:00
user - > WriteRemoteNumeric ( RPL_LOADEDMODULE , parameters [ 0 ] , " Module successfully loaded. " ) ;
2007-08-25 11:26:44 +00:00
}
else
{
2021-01-29 18:15:32 +00:00
user - > WriteRemoteNumeric ( ERR_CANTLOADMODULE , parameters [ 0 ] , ServerInstance - > Modules . LastError ( ) ) ;
2007-08-25 11:26:44 +00:00
}
2007-07-16 17:30:04 +00:00
}
2007-08-25 11:26:44 +00:00
else
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " MODULE '{}' GLOBAL LOAD BY '{}' (not loaded here) " , parameters [ 0 ] , user - > nick ) ;
2007-08-25 11:26:44 +00:00
2020-10-26 23:40:24 +00:00
return CmdResult : : SUCCESS ;
2007-07-16 17:30:04 +00:00
}
2009-09-03 15:53:15 +00:00
2019-01-25 02:52:11 +00:00
RouteDescriptor GetRouting ( User * user , const Params & parameters ) override
2009-09-03 15:53:15 +00:00
{
return ROUTE_BROADCAST ;
}
2007-07-16 17:30:04 +00:00
} ;
2021-10-01 05:15:29 +01:00
class CommandGUnloadModule final
: public Command
2007-07-16 17:30:04 +00:00
{
2022-01-25 13:59:42 +00:00
public :
2021-01-19 07:05:51 +00:00
CommandGUnloadModule ( Module * Creator )
2022-12-01 05:14:58 +00:00
: Command ( Creator , " GUNLOADMODULE " , 1 )
2007-07-16 17:30:04 +00:00
{
2020-04-14 21:30:50 +01:00
access_needed = CmdAccess : : OPERATOR ;
2020-04-14 16:41:31 +01:00
syntax = { " <modulename> [<servermask>] " } ;
2007-07-16 17:30:04 +00:00
}
2019-01-25 02:52:11 +00:00
CmdResult Handle ( User * user , const Params & parameters ) override
2007-07-16 17:30:04 +00:00
{
2022-06-26 17:01:54 +01:00
if ( InspIRCd : : Match ( parameters [ 0 ] , " core_* " , ascii_case_insensitive_map ) )
2013-04-07 17:02:37 +01:00
{
2021-01-19 07:05:51 +00:00
user - > WriteRemoteNumeric ( ERR_CANTUNLOADMODULE , parameters [ 0 ] , " You cannot unload core commands! " ) ;
2020-10-26 23:40:24 +00:00
return CmdResult : : FAILURE ;
2013-04-07 17:02:37 +01:00
}
2008-05-05 00:18:01 +00:00
std : : string servername = parameters . size ( ) > 1 ? parameters [ 1 ] : " * " ;
2007-08-25 11:26:44 +00:00
2022-09-03 22:52:53 +01:00
if ( InspIRCd : : Match ( ServerInstance - > Config - > ServerName , servername ) )
2007-07-16 17:30:04 +00:00
{
2019-02-07 12:16:33 +00:00
Module * m = ServerInstance - > Modules . Find ( parameters [ 0 ] ) ;
2012-11-16 23:13:12 +01:00
if ( m )
2007-08-25 11:26:44 +00:00
{
2019-02-07 12:16:33 +00:00
if ( ServerInstance - > Modules . Unload ( m ) )
2012-11-16 23:13:12 +01:00
{
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " MODULE '{}' GLOBALLY UNLOADED BY '{}' " , parameters [ 0 ] , user - > nick ) ;
2017-09-05 17:54:40 +01:00
user - > WriteRemoteNumeric ( RPL_UNLOADEDMODULE , parameters [ 0 ] , " Module successfully unloaded. " ) ;
2012-11-16 23:13:12 +01:00
}
else
{
2021-01-29 18:15:32 +00:00
user - > WriteRemoteNumeric ( ERR_CANTUNLOADMODULE , parameters [ 0 ] , ServerInstance - > Modules . LastError ( ) ) ;
2012-11-16 23:13:12 +01:00
}
2007-08-25 11:26:44 +00:00
}
else
2016-02-25 16:40:50 +01:00
user - > WriteRemoteNumeric ( ERR_CANTUNLOADMODULE , parameters [ 0 ] , " No such module " ) ;
2007-07-16 17:30:04 +00:00
}
else
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " MODULE '{}' GLOBAL UNLOAD BY '{}' (not unloaded here) " , parameters [ 0 ] , user - > nick ) ;
2007-08-25 11:26:44 +00:00
2020-10-26 23:40:24 +00:00
return CmdResult : : SUCCESS ;
2007-07-16 17:30:04 +00:00
}
2009-09-03 15:53:15 +00:00
2019-01-25 02:52:11 +00:00
RouteDescriptor GetRouting ( User * user , const Params & parameters ) override
2009-09-03 15:53:15 +00:00
{
return ROUTE_BROADCAST ;
}
2007-07-16 17:30:04 +00:00
} ;
2021-10-01 05:15:29 +01:00
class CommandGReloadModule final
: public Command
2007-07-16 17:30:04 +00:00
{
2022-01-25 13:59:42 +00:00
public :
2021-01-19 07:05:51 +00:00
CommandGReloadModule ( Module * Creator )
: Command ( Creator , " GRELOADMODULE " , 1 )
2007-07-16 17:30:04 +00:00
{
2020-04-14 21:30:50 +01:00
access_needed = CmdAccess : : OPERATOR ;
2020-04-14 16:41:31 +01:00
syntax = { " <modulename> [<servermask>] " } ;
2007-07-16 17:30:04 +00:00
}
2019-01-25 02:52:11 +00:00
CmdResult Handle ( User * user , const Params & parameters ) override
2007-07-16 17:30:04 +00:00
{
2008-05-05 00:18:01 +00:00
std : : string servername = parameters . size ( ) > 1 ? parameters [ 1 ] : " * " ;
2007-07-16 17:30:04 +00:00
2022-09-03 22:52:53 +01:00
if ( InspIRCd : : Match ( ServerInstance - > Config - > ServerName , servername ) )
2007-07-16 17:30:04 +00:00
{
2019-02-07 12:16:33 +00:00
Module * m = ServerInstance - > Modules . Find ( parameters [ 0 ] ) ;
2010-02-16 01:07:57 +00:00
if ( m )
2014-03-26 17:24:51 +01:00
{
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " MODULE '{}' GLOBALLY RELOADED BY '{}' " , parameters [ 0 ] , user - > nick ) ;
2015-11-26 13:36:44 +01:00
ServerInstance - > Parser . CallHandler ( " RELOADMODULE " , parameters , user ) ;
2014-03-26 17:24:51 +01:00
}
2010-02-16 01:07:57 +00:00
else
{
2021-04-19 19:58:03 +01:00
user - > WriteRemoteNumeric ( ERR_CANTUNLOADMODULE , parameters [ 0 ] , " Could not find a loaded module by that name " ) ;
2020-10-26 23:40:24 +00:00
return CmdResult : : FAILURE ;
2010-02-16 01:07:57 +00:00
}
2007-07-16 17:30:04 +00:00
}
2007-08-25 11:26:44 +00:00
else
2023-01-23 11:09:17 +00:00
ServerInstance - > SNO . WriteToSnoMask ( ' a ' , " MODULE '{}' GLOBAL RELOAD BY '{}' (not reloaded here) " , parameters [ 0 ] , user - > nick ) ;
2007-07-16 17:30:04 +00:00
2020-10-26 23:40:24 +00:00
return CmdResult : : SUCCESS ;
2007-07-16 17:30:04 +00:00
}
2009-09-03 15:53:15 +00:00
2019-01-25 02:52:11 +00:00
RouteDescriptor GetRouting ( User * user , const Params & parameters ) override
2009-09-03 15:53:15 +00:00
{
return ROUTE_BROADCAST ;
}
2007-07-16 17:30:04 +00:00
} ;
2021-10-01 04:37:03 +01:00
class ModuleGlobalLoad final
: public Module
2007-07-16 17:30:04 +00:00
{
2022-01-25 13:59:42 +00:00
private :
2021-01-19 07:05:51 +00:00
CommandGLoadModule cmdgloadmodule ;
CommandGUnloadModule cmdgunloadmodule ;
CommandGReloadModule cmdgreloadmodule ;
2008-06-11 11:35:23 +00:00
2022-01-25 13:59:42 +00:00
public :
2009-09-26 14:13:13 +00:00
ModuleGlobalLoad ( )
2020-04-11 14:00:48 +01:00
: Module ( VF_VENDOR | VF_COMMON , " Adds the /GLOADMODULE, /GRELOADMODULE, and /GUNLOADMODULE commands which allows server operators to load, reload, and unload modules on remote servers. " )
2021-01-29 18:15:32 +00:00
, cmdgloadmodule ( this )
2021-01-19 07:05:51 +00:00
, cmdgunloadmodule ( this )
, cmdgreloadmodule ( this )
2012-10-13 03:12:29 +02:00
{
}
2007-07-16 17:30:04 +00:00
} ;
MODULE_INIT ( ModuleGlobalLoad )