cli: Error reporting for query filter parsing
[ganeti-local] / lib / daemon.py
index 302097a..6d6bd74 100644 (file)
@@ -1,7 +1,7 @@
 #
 #
 
-# Copyright (C) 2006, 2007, 2008, 2010 Google Inc.
+# Copyright (C) 2006, 2007, 2008, 2010, 2011 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -40,6 +40,7 @@ from ganeti import errors
 from ganeti import netutils
 from ganeti import ssconf
 from ganeti import runtime
+from ganeti import compat
 
 
 class SchedulerBreakout(Exception):
@@ -539,6 +540,17 @@ def _BeautifyError(err):
     return "%s" % str(err)
 
 
+def _HandleSigHup(reopen_cb, signum, frame): # pylint: disable-msg=W0613
+  """Handler for SIGHUP.
+
+  @param reopen_cb: Callback function for reopening log files
+
+  """
+  assert callable(reopen_cb)
+  logging.info("Reopening log files after receiving SIGHUP")
+  reopen_cb()
+
+
 def GenericMain(daemon_name, optionparser,
                 check_fn, prepare_fn, exec_fn,
                 multithreaded=False, console_logging=False,
@@ -620,7 +632,8 @@ def GenericMain(daemon_name, optionparser,
                             metavar="SSL_CERT_PATH")
 
   # Disable the use of fork(2) if the daemon uses threads
-  utils.no_fork = multithreaded
+  if multithreaded:
+    utils.DisableFork()
 
   options, args = optionparser.parse_args()
 
@@ -655,24 +668,27 @@ def GenericMain(daemon_name, optionparser,
   else:
     wpipe = None
 
+  log_reopen_fn = \
+    utils.SetupLogging(constants.DAEMONS_LOGFILES[daemon_name], daemon_name,
+                       debug=options.debug,
+                       stderr_logging=not options.fork,
+                       multithreaded=multithreaded,
+                       syslog=options.syslog,
+                       console_logging=console_logging)
+
+  # Reopen log file(s) on SIGHUP
+  signal.signal(signal.SIGHUP, compat.partial(_HandleSigHup, log_reopen_fn))
+
   utils.WritePidFile(utils.DaemonPidFileName(daemon_name))
   try:
     try:
-      utils.SetupLogging(logfile=constants.DAEMONS_LOGFILES[daemon_name],
-                         debug=options.debug,
-                         stderr_logging=not options.fork,
-                         multithreaded=multithreaded,
-                         program=daemon_name,
-                         syslog=options.syslog,
-                         console_logging=console_logging)
+      logging.info("%s daemon startup", daemon_name)
       if callable(prepare_fn):
         prep_results = prepare_fn(options, args)
       else:
         prep_results = None
-      logging.info("%s daemon startup", daemon_name)
     except Exception, err:
-      if wpipe is not None:
-        os.write(wpipe, _BeautifyError(err))
+      utils.WriteErrorToFD(wpipe, _BeautifyError(err))
       raise
 
     if wpipe is not None:
@@ -682,4 +698,4 @@ def GenericMain(daemon_name, optionparser,
 
     exec_fn(options, args, prep_results)
   finally:
-    utils.RemovePidFile(daemon_name)
+    utils.RemoveFile(utils.DaemonPidFileName(daemon_name))