]> granicus.if.org Git - icinga2/blob - lib/cli/internalsignalcommand.cpp
add some object locking to the Dump method (which could theoreticylly suffer from...
[icinga2] / lib / cli / internalsignalcommand.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "cli/internalsignalcommand.hpp"
4 #include "base/logger.hpp"
5 #include <signal.h>
6
7 using namespace icinga;
8 namespace po = boost::program_options;
9
10 REGISTER_CLICOMMAND("internal/signal", InternalSignalCommand);
11
12 String InternalSignalCommand::GetDescription() const
13 {
14         return "Send signal as Icinga user";
15 }
16
17 String InternalSignalCommand::GetShortDescription() const
18 {
19         return "Send signal as Icinga user";
20 }
21
22 ImpersonationLevel InternalSignalCommand::GetImpersonationLevel() const
23 {
24         return ImpersonateIcinga;
25 }
26
27 bool InternalSignalCommand::IsHidden() const
28 {
29         return true;
30 }
31
32 void InternalSignalCommand::InitParameters(boost::program_options::options_description& visibleDesc,
33         boost::program_options::options_description& hiddenDesc) const
34 {
35         visibleDesc.add_options()
36                 ("pid,p", po::value<int>(), "Target PID")
37                 ("sig,s", po::value<String>(), "Signal (POSIX string) to send")
38         ;
39 }
40
41 /**
42  * The entry point for the "internal signal" CLI command.
43  *
44  * @returns An exit status.
45  */
46 int InternalSignalCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
47 {
48 #ifndef _WIN32
49         String signal = vm["sig"].as<String>();
50
51         /* Thank POSIX */
52         if (signal == "SIGKILL")
53                 return kill(vm["pid"].as<int>(), SIGKILL);
54         if (signal == "SIGINT")
55                 return kill(vm["pid"].as<int>(), SIGINT);
56         if (signal == "SIGCHLD")
57                 return kill(vm["pid"].as<int>(), SIGCHLD);
58         if (signal == "SIGHUP")
59                 return kill(vm["pid"].as<int>(), SIGHUP);
60
61         Log(LogCritical, "cli") << "Unsupported signal \"" << signal << "\"";
62 #else
63         Log(LogCritical, "cli", "Unsupported action on Windows.");
64 #endif /* _Win32 */
65         return 1;
66 }
67