From 691e3cfd576e09d28f1da0df3f112d5c56980362 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 23 Feb 2018 17:01:46 +0100 Subject: [PATCH] Fix Windows reload --- lib/base/application.cpp | 3 ++- lib/cli/daemoncommand.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 1c1aa6776..6f0f9d660 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -431,7 +431,8 @@ pid_t Application::StartReloadProcess() args.push_back("--reload-internal"); args.push_back(Convert::ToString(Utility::GetPid())); #else /* _WIN32 */ - args.push_back("--validate"); + args.push_back("--restart-service"); + args.push_back("icinga2"); #endif /* _WIN32 */ Process::Ptr process = new Process(Process::PrepareCommand(new Array(std::move(args)))); diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 40f723f2b..199fa67ff 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -162,6 +162,9 @@ void DaemonCommand::InitParameters(boost::program_options::options_description& #ifndef _WIN32 hiddenDesc.add_options() ("reload-internal", po::value(), "used internally to implement config reload: do not call manually, send SIGHUP instead"); +#else + hiddenDesc.add_options() + ("restart-service", po::value(), "tries to restart the Icinga 2 service"); #endif /* _WIN32 */ } @@ -212,6 +215,42 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector(); + + SC_HANDLE handleService = OpenService(handleManager, service.c_str(), SERVICE_START | SERVICE_STOP); + if (!handleService) { + Log(LogCritical, "cli") << "Failed to open service handle of '" << service << "'. Error code: " << GetLastError(); + return EXIT_FAILURE; + } + + SERVICE_STATUS serviceStatus; + if (!ControlService(handleService, SERVICE_CONTROL_STOP, &serviceStatus)) { + DWORD error = GetLastError(); + if (error = ERROR_SERVICE_NOT_ACTIVE) + Log(LogInformation, "cli") << "Service '" << service << "' is not running."; + else { + Log(LogCritical, "cli") << "Failed to stop service. Error code: " << GetLastError(); + return EXIT_FAILURE; + } + } + + if (!StartService(handleService, 0, NULL)) { + Log(LogCritical, "cli") << "Failed to start up service '" << service << "'. Error code: " << GetLastError(); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; + } +#endif /* _WIN32 */ + if (vm.count("validate")) { Log(LogInformation, "cli", "Finished validating the configuration file(s)."); return EXIT_SUCCESS;