1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
/* OperServ core functions
*
* (C) 2003-2025 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 CommandOSQuit final
: public Command
{
public:
CommandOSQuit(Module *creator) : Command(creator, "operserv/quit", 0, 1)
{
this->SetDesc(_("Terminate services WITHOUT saving"));
if (Config->GetModule(this->owner).Get<bool>("requirename"))
this->SetSyntax(_("\037network-name\037"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const auto requirename = Config->GetModule(this->owner).Get<bool>("requirename");
const auto networkname = Config->GetBlock("networkinfo").Get<Anope::string>("networkname");
if (requirename && (params.empty() || !params[0].equals_cs(networkname)))
{
OnSyntaxError(source, source.command);
return;
}
Log(LOG_ADMIN, source, this);
Anope::QuitReason = source.command + " command received from " + source.GetNick();
Anope::Quitting = true;
return;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(_("Causes services to do an immediate shutdown; databases are\n"
"\002not\002 saved. This command should not be used unless\n"
"damage to the in-memory copies of the databases is feared\n"
"and they should not be saved."));
return true;
}
};
class CommandOSRestart final
: public Command
{
public:
CommandOSRestart(Module *creator) : Command(creator, "operserv/restart", 0, 1)
{
this->SetDesc(_("Save databases and restart services"));
if (Config->GetModule(this->owner).Get<bool>("requirename"))
this->SetSyntax(_("\037network-name\037"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const auto requirename = Config->GetModule(this->owner).Get<bool>("requirename");
const auto networkname = Config->GetBlock("networkinfo").Get<Anope::string>("networkname");
if (requirename && (params.empty() || !params[0].equals_cs(networkname)))
{
OnSyntaxError(source, source.command);
return;
}
Log(LOG_ADMIN, source, this);
Anope::QuitReason = source.command + " command received from " + source.GetNick();
Anope::Quitting = Anope::Restarting = true;
Anope::SaveDatabases();
return;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
this->SendSyntax(source);
source.Reply(_("Causes services to save all databases and then restart\n"
"(i.e. exit and immediately re-run the executable)."));
return true;
}
};
class CommandOSShutdown final
: public Command
{
public:
CommandOSShutdown(Module *creator) : Command(creator, "operserv/shutdown", 0, 1)
{
this->SetDesc(_("Terminate services with save"));
if (Config->GetModule(this->owner).Get<bool>("requirename"))
this->SetSyntax(_("\037network-name\037"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const auto requirename = Config->GetModule(this->owner).Get<bool>("requirename");
const auto networkname = Config->GetBlock("networkinfo").Get<Anope::string>("networkname");
if (requirename && (params.empty() || !params[0].equals_cs(networkname)))
{
OnSyntaxError(source, source.command);
return;
}
Log(LOG_ADMIN, source, this);
Anope::QuitReason = source.command + " command received from " + source.GetNick();
Anope::Quitting = true;
Anope::SaveDatabases();
return;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(_("Causes services to save all databases and then shut down."));
return true;
}
};
class OSShutdown final
: public Module
{
CommandOSQuit commandosquit;
CommandOSRestart commandosrestart;
CommandOSShutdown commandosshutdown;
public:
OSShutdown(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
commandosquit(this), commandosrestart(this), commandosshutdown(this)
{
}
};
MODULE_INIT(OSShutdown)
|