]> granicus.if.org Git - icinga2/commitdiff
Fix Windows reload 6116/head
authorJean Flach <jean-marcel.flach@icinga.com>
Fri, 23 Feb 2018 16:01:46 +0000 (17:01 +0100)
committerJean Flach <jean-marcel.flach@icinga.com>
Fri, 23 Feb 2018 16:01:46 +0000 (17:01 +0100)
lib/base/application.cpp
lib/cli/daemoncommand.cpp

index 1c1aa6776143905895a06b85cdc69f02eed060b2..6f0f9d6606a97b97f15403ae1c880ff2d70c1cfe 100644 (file)
@@ -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))));
index 40f723f2b35eeb6dfe7406791a55e384900aa27f..199fa67ff713c6b409268c5eaac9f01a28865456 100644 (file)
@@ -162,6 +162,9 @@ void DaemonCommand::InitParameters(boost::program_options::options_description&
 #ifndef _WIN32
        hiddenDesc.add_options()
                ("reload-internal", po::value<int>(), "used internally to implement config reload: do not call manually, send SIGHUP instead");
+#else
+       hiddenDesc.add_options()
+               ("restart-service", po::value<std::string>(), "tries to restart the Icinga 2 service");
 #endif /* _WIN32 */
 }
 
@@ -212,6 +215,42 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
        if (!DaemonUtility::LoadConfigFiles(configs, newItems, Application::GetObjectsPath(), Application::GetVarsPath()))
                return EXIT_FAILURE;
 
+#ifdef _WIN32
+       if (vm.count("restart-service")) {
+               SC_HANDLE handleManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+               if (!handleManager) {
+                       Log(LogCritical, "cli") << "Failed to open service manager. Error code: " << GetLastError();
+                       return EXIT_FAILURE;
+               }
+
+               std::string service = vm["restart-service"].as<std::string>();
+
+               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;