Switch RAPI to default ganeti logging and Daemonize it with ganeti.utils
authorOleksiy Mishchenko <oleksiy@google.com>
Thu, 17 Apr 2008 08:08:24 +0000 (08:08 +0000)
committerOleksiy Mishchenko <oleksiy@google.com>
Thu, 17 Apr 2008 08:08:24 +0000 (08:08 +0000)
Reviewed-by: insmah

daemons/ganeti-rapi
lib/constants.py
lib/rapi/RESTHTTPServer.py

index 78552c6..834c957 100755 (executable)
 """
 
 import glob
-import logging
 import optparse
 import sys
 import os
 
-import ganeti.rapi.RESTHTTPServer
+from ganeti import constants
+from ganeti import utils
+from ganeti.rapi import RESTHTTPServer
 
 RELEASE_VERSION = 0.01
 API_PORT = 5080
@@ -59,6 +60,10 @@ def ParseOptions():
   parser.add_option("-C", "--ssl-cert", dest="ssl_cert",
                     help="SSL certificate",
                     default=None, type="string")
+  parser.add_option("-f", "--foreground", dest="fork",
+                    help="Don't detach from the current terminal",
+                    default=True, action="store_false")
+
   options, args = parser.parse_args()
 
   if len(args) != 1 or args[0] not in ("start", "stop"):
@@ -128,34 +133,9 @@ def StartAPI(options):
   Return:
     Exit code.
   """
-  # do the UNIX double-fork magic
-  try:
-    pid = os.fork()
-    if pid > 0:
-      # exit first parent
-      sys.exit(0)
-  except OSError, e:
-    print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
-    return 1
-
-  # decouple from parent environment
-  os.chdir("/")
-  os.setsid()
-  os.umask(0)
-
-  # do second fork
-  try:
-    pid = os.fork()
-    if pid > 0:
-      # exit from second parent, print eventual PID before
-      print "Ganeti-RAPI PID: %d port: %d" % (pid, options.port)
-      return 0
-  except OSError, e:
-    print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
-    return 1
-
-  # start the daemon main loop
-  ganeti.rapi.RESTHTTPServer.start(options)
+  if options.fork:
+    utils.Daemonize(logfile=constants.LOG_RAPISERVER)
+  RESTHTTPServer.start(options)
 
 
 def StopAPI(options):
index 07a6ddf..c46ec5b 100644 (file)
@@ -51,6 +51,7 @@ MASTER_SCRIPT = "ganeti-master"
 LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti"
 LOG_OS_DIR = LOG_DIR + "/os"
 LOG_NODESERVER = LOG_DIR + "/node-daemon.log"
+LOG_RAPISERVER = LOG_DIR + "/rapi-daemon.log"
 LOG_WATCHER = LOG_DIR + "/watcher.log"
 
 OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
index bcc1cd4..148f08c 100644 (file)
@@ -21,31 +21,15 @@ import exceptions
 import SocketServer
 import BaseHTTPServer
 import OpenSSL
-import logging
-import logging.handlers
 
+from ganeti import constants
+from ganeti import logger
 from ganeti.rapi import resources
 
 """RESTfull HTTPS Server module.
 
 """
 
-def OpenLog():
-  """Set up logging to the syslog.
-
-  """
-  log = logging.getLogger('ganeti-rapi')
-  slh = logging.handlers.SysLogHandler('/dev/log',
-                            logging.handlers.SysLogHandler.LOG_DAEMON)
-  fmt = logging.Formatter('ganeti-rapi[%(process)d]:%(levelname)s: %(message)s')
-  slh.setFormatter(fmt)
-  log.addHandler(slh)
-  log.setLevel(logging.INFO)
-  log.debug("Logging initialized")
-
-  return log
-
-
 class RESTHTTPServer(BaseHTTPServer.HTTPServer):
   """The class to provide HTTP/HTTPS server.
 
@@ -60,6 +44,8 @@ class RESTHTTPServer(BaseHTTPServer.HTTPServer):
       HandlerClass - HTTPRequestHandler object
       options - Command-line options
     """
+    logger.SetupLogging(debug=options.debug, program='ganeti-rapi')
+
     BaseHTTPServer.HTTPServer.__init__(self, server_address, HandlerClass)
     if options.ssl:
       # Set up SSL
@@ -89,8 +75,6 @@ class RESTRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
     self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
     self.map = resources.Mapper()
-    self.log = OpenLog()
-    self.log.debug("Request handler setup.")
 
   def handle_one_request(self):
     """Handle a single REST request. """
@@ -98,7 +82,7 @@ class RESTRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     try:
       self.raw_requestline = self.rfile.readline()
     except OpenSSL.SSL.Error, ex:
-      self.log.exception("Error in SSL: %s" % str(ex))
+      logger.Error("Error in SSL: %s" % str(ex))
     if not self.raw_requestline:
       self.close_connection = 1
       return
@@ -133,13 +117,12 @@ class RESTRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     every message.
 
     """
-    level = logging.INFO
+    logX = logger.Info
     # who is calling?
     origin = inspect.stack()[1][0].f_code.co_name
     if origin == "log_error":
-      level = logging.ERROR
-
-    self.log.log(level, "%s - - %s\n" %
+      logX = logger.Error
+    logX("%s - - %s" %
                      (self.address_string(),
                       format%args))