diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded index cb72b4cf3531ecaa3fba4adc3f9dfbe6bba90ad3..0cbe68844bd22ead5fbe36530015c8c41c21d8da 100755 --- a/daemons/ganeti-noded +++ b/daemons/ganeti-noded @@ -27,8 +27,6 @@ import os import sys import traceback -import BaseHTTPServer -import simplejson import errno import logging @@ -41,78 +39,39 @@ from ganeti import constants from ganeti import objects from ganeti import errors from ganeti import ssconf +from ganeti import http from ganeti import utils _EXIT_GANETI_NODED = False -class ServerObject(BaseHTTPServer.BaseHTTPRequestHandler): +class NodeDaemonRequestHandler(http.HTTPRequestHandler): """The server implementation. This class holds all methods exposed over the RPC interface. """ - def do_PUT(self): - """Handle a post request. + def HandleRequest(self): + """Handle a request. """ + global _EXIT_GANETI_NODED + + if self.command.upper() != "PUT": + raise http.HTTPBadRequest() + path = self.path if path.startswith("/"): path = path[1:] - logging.debug("ServerObject: received call '%s'", path) - mname = "perspective_%s" % path - if not hasattr(self, mname): - self.send_error(404) - return False - method = getattr(self, mname) - try: - body_length = int(self.headers.get('Content-Length', '0')) - except ValueError: - self.send_error(400, 'No Content-Length header or invalid format') - return False + method = getattr(self, "perspective_%s" % path, None) + if method is None: + raise httperror.HTTPNotFound() try: - body = self.rfile.read(body_length) - except socket.error, err: - logger.Error("Socket error while reading: %s" % str(err)) - return - try: - params = simplejson.loads(body) - logging.debug("ServerObject: method parameters: %s", params) - result = method(params) - payload = simplejson.dumps(result) + return method(self.post_data) except errors.QuitGanetiException, err: - global _EXIT_GANETI_NODED _EXIT_GANETI_NODED = True - if isinstance(err.args, tuple) and len(err.args) == 2: - if err.args[0]: - self.send_error(500, "Error: %s" % str(err[1])) - else: - payload = simplejson.dumps(err.args[1]) - else: - self.log_message('QuitGanetiException Usage Error') - self.send_error(500, "Error: %s" % str(err)) - except Exception, err: - self.send_error(500, "Error: %s" % str(err)) - return False - self.send_response(200) - self.send_header('Content-Length', str(len(payload))) - self.end_headers() - self.wfile.write(payload) - return True - - def log_message(self, format, *args): - """Log a request to the log. - - This is the same as the parent, we just log somewhere else. - - """ - msg = ("%s - - [%s] %s" % - (self.address_string(), - self.log_date_time_string(), - format % args)) - logging.debug(msg) # the new block devices -------------------------- @@ -573,6 +532,11 @@ class ServerObject(BaseHTTPServer.BaseHTTPRequestHandler): new_file_storage_dir) +class NodeDaemonHttpServer(http.HTTPServer): + def __init__(self, server_address): + http.HTTPServer.__init__(self, server_address, NodeDaemonRequestHandler) + + def ParseOptions(): """Parse the command line options. @@ -639,7 +603,7 @@ def main(): global _EXIT_GANETI_NODED - httpd = BaseHTTPServer.HTTPServer(('', port), ServerObject) + httpd = NodeDaemonHttpServer(('', port)) while (not _EXIT_GANETI_NODED): httpd.handle_request()