mirror of
https://github.com/Icinga/icinga2.git
synced 2025-08-21 09:38:16 +02:00
In contrast to the regular `kill` binary, `icinga2 internal signal` drops permissions before sending the signal. This is important as the PID file can be written by the Icinga user, dropping the permissions prevents that user from using this to send signals to processes it is not supposed to signal. SIGUSR1 wasn't among the list of signals supported by `icinga2 internal signal`, so it is added there.
69 lines
1.7 KiB
C++
69 lines
1.7 KiB
C++
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
|
|
|
|
#include "cli/internalsignalcommand.hpp"
|
|
#include "base/logger.hpp"
|
|
#include <signal.h>
|
|
|
|
using namespace icinga;
|
|
namespace po = boost::program_options;
|
|
|
|
REGISTER_CLICOMMAND("internal/signal", InternalSignalCommand);
|
|
|
|
String InternalSignalCommand::GetDescription() const
|
|
{
|
|
return "Send signal as Icinga user";
|
|
}
|
|
|
|
String InternalSignalCommand::GetShortDescription() const
|
|
{
|
|
return "Send signal as Icinga user";
|
|
}
|
|
|
|
ImpersonationLevel InternalSignalCommand::GetImpersonationLevel() const
|
|
{
|
|
return ImpersonateIcinga;
|
|
}
|
|
|
|
bool InternalSignalCommand::IsHidden() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void InternalSignalCommand::InitParameters(boost::program_options::options_description& visibleDesc,
|
|
boost::program_options::options_description& hiddenDesc) const
|
|
{
|
|
visibleDesc.add_options()
|
|
("pid,p", po::value<int>(), "Target PID")
|
|
("sig,s", po::value<String>(), "Signal (POSIX string) to send")
|
|
;
|
|
}
|
|
|
|
/**
|
|
* The entry point for the "internal signal" CLI command.
|
|
*
|
|
* @returns An exit status.
|
|
*/
|
|
int InternalSignalCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
|
|
{
|
|
#ifndef _WIN32
|
|
String signal = vm["sig"].as<String>();
|
|
|
|
/* Thank POSIX */
|
|
if (signal == "SIGKILL")
|
|
return kill(vm["pid"].as<int>(), SIGKILL);
|
|
if (signal == "SIGINT")
|
|
return kill(vm["pid"].as<int>(), SIGINT);
|
|
if (signal == "SIGCHLD")
|
|
return kill(vm["pid"].as<int>(), SIGCHLD);
|
|
if (signal == "SIGHUP")
|
|
return kill(vm["pid"].as<int>(), SIGHUP);
|
|
if (signal == "SIGUSR1")
|
|
return kill(vm["pid"].as<int>(), SIGUSR1);
|
|
|
|
Log(LogCritical, "cli") << "Unsupported signal \"" << signal << "\"";
|
|
#else
|
|
Log(LogCritical, "cli", "Unsupported action on Windows.");
|
|
#endif /* _Win32 */
|
|
return 1;
|
|
}
|