import SocketServer
import errno
import logging
+import signal
from optparse import OptionParser
-
from ganeti import backend
from ganeti import logger
from ganeti import constants
from ganeti import http
from ganeti import utils
-_EXIT_GANETI_NODED = False
-
class NodeDaemonRequestHandler(http.HTTPRequestHandler):
"""The server implementation.
"""Handle a request.
"""
- global _EXIT_GANETI_NODED
-
if self.command.upper() != "PUT":
raise http.HTTPBadRequest()
try:
return method(self.post_data)
except errors.QuitGanetiException, err:
- _EXIT_GANETI_NODED = True
+ # Tell parent to quit
+ os.kill(self.server.noded_pid, signal.SIGTERM)
# the new block devices --------------------------
class NodeDaemonHttpServer(http.HTTPServer):
def __init__(self, server_address):
http.HTTPServer.__init__(self, server_address, NodeDaemonRequestHandler)
+ self.noded_pid = os.getpid()
+
+ def serve_forever(self):
+ """Handle requests until told to quit."""
+ sighandler = utils.SignalHandler([signal.SIGINT, signal.SIGTERM])
+ try:
+ while not sighandler.called:
+ self.handle_request()
+ # TODO: There could be children running at this point
+ finally:
+ sighandler.Reset()
class ForkingHTTPServer(SocketServer.ForkingMixIn, NodeDaemonHttpServer):
stderr_logging=not options.fork)
logging.info("ganeti node daemon startup")
- global _EXIT_GANETI_NODED
-
if options.fork:
- httpd = ForkingHTTPServer(('', port))
+ server = ForkingHTTPServer(('', port))
else:
- httpd = NodeDaemonHttpServer(('', port))
-
- # FIXME: updating _EXIT_GANETI_NODED doesn't work when forking
- while (not _EXIT_GANETI_NODED):
- httpd.handle_request()
+ server = NodeDaemonHttpServer(('', port))
+ server.serve_forever()
if __name__ == '__main__':
main()