]> granicus.if.org Git - icinga2/commitdiff
icinga2 daemon --close-stdio: keep console log open during first config validation
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Mon, 5 Aug 2019 16:30:45 +0000 (18:30 +0200)
committerAlexander A. Klimov <alexander.klimov@icinga.com>
Mon, 5 Aug 2019 16:30:45 +0000 (18:30 +0200)
refs #7394

lib/cli/daemoncommand.cpp

index 8091c403ef42138a158f25d5d7d1bcd9004bee7c..4975536ac18b82061a4ba5e7387f7a8b4f625e0a 100644 (file)
@@ -193,11 +193,13 @@ static Atomic<bool> l_AllowedToWork (false);
  * Do the actual work (config loading, ...)
  *
  * @param configs Files to read config from
+ * @param closeConsoleLog Whether to close the console log after config loading
+ * @param stderrFile Where to log errors
  *
  * @return Exit code
  */
 static inline
-int RunWorker(const std::vector<std::string>& configs)
+int RunWorker(const std::vector<std::string>& configs, bool closeConsoleLog = false, const String& stderrFile = String())
 {
        Log(LogInformation, "cli", "Loading configuration file(s).");
 
@@ -216,6 +218,11 @@ int RunWorker(const std::vector<std::string>& configs)
                Log(LogNotice, "cli")
                        << "Waiting for the umbrella process to let us doing the actual work";
 
+               if (closeConsoleLog) {
+                       CloseStdIO(stderrFile);
+                       Logger::DisableConsoleLog();
+               }
+
                while (!l_AllowedToWork.load()) {
                        Utility::Sleep(0.2);
                }
@@ -397,10 +404,12 @@ static void NotifyWatchdog()
  * Starts seemless worker process doing the actual work (config loading, ...)
  *
  * @param configs Files to read config from
+ * @param closeConsoleLog Whether to close the console log after config loading
+ * @param stderrFile Where to log errors
  *
  * @return The worker's PID on success, -1 on failure (if the worker couldn't load its config)
  */
-static pid_t StartUnixWorker(const std::vector<std::string>& configs)
+static pid_t StartUnixWorker(const std::vector<std::string>& configs, bool closeConsoleLog = false, const String& stderrFile = String())
 {
        Log(LogNotice, "cli")
                << "Spawning seemless worker process doing the actual work";
@@ -461,7 +470,7 @@ static pid_t StartUnixWorker(const std::vector<std::string>& configs)
                                        _exit(EXIT_FAILURE);
                                }
 
-                               _exit(RunWorker(configs));
+                               _exit(RunWorker(configs, closeConsoleLog, stderrFile));
                        } catch (...) {
                                _exit(EXIT_FAILURE);
                        }
@@ -604,7 +613,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
        });
 #endif /* _WIN32 */
 
-       if (vm.count("daemonize") || vm.count("close-stdio")) {
+       if (vm.count("daemonize")) {
                // After disabling the console log, any further errors will go to the configured log only.
                // Let's try to make this clear and say good bye.
                Log(LogInformation, "cli", "Closing console log.");
@@ -638,13 +647,28 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
                (void)sigaction(SIGHUP, &sa, nullptr);
        }
 
+       bool closeConsoleLog = !vm.count("daemonize") && vm.count("close-stdio");
+
+       String errorLog;
+       if (vm.count("errorlog"))
+               errorLog = vm["errorlog"].as<std::string>();
+
        // The PID of the current seemless worker
-       pid_t currentWorker = StartUnixWorker(configs);
+       pid_t currentWorker = StartUnixWorker(configs, closeConsoleLog, errorLog);
 
        if (currentWorker == -1) {
                return EXIT_FAILURE;
        }
 
+       if (closeConsoleLog) {
+               // After disabling the console log, any further errors will go to the configured log only.
+               // Let's try to make this clear and say good bye.
+               Log(LogInformation, "cli", "Closing console log.");
+
+               CloseStdIO(errorLog);
+               Logger::DisableConsoleLog();
+       }
+
        // Immediately allow the first (non-reload) worker to continue working beyond config validation
        (void)kill(currentWorker, SIGUSR2);