diff options
Diffstat (limited to 'lite-xmlrpc.py')
-rwxr-xr-x | lite-xmlrpc.py | 80 |
1 files changed, 31 insertions, 49 deletions
diff --git a/lite-xmlrpc.py b/lite-xmlrpc.py index 7e9c69a8..3483ceb5 100755 --- a/lite-xmlrpc.py +++ b/lite-xmlrpc.py @@ -34,14 +34,10 @@ from ipalib import api from ipalib import config from ipa_server import conn from ipa_server.servercore import context -import ipalib.load_plugins from ipalib.util import xmlrpc_unmarshal import traceback import krbV - -PORT=8888 - class StoppableXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer): """Override of TIME_WAIT""" allow_reuse_address = True @@ -65,31 +61,25 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa return (args, kw) def _dispatch(self, method, params): - """Dispatches the XML-RPC method. + """ + Dispatches the XML-RPC method. Methods beginning with an '_' are considered private and will not be called. """ - + if method not in funcs: + logger.error('no such method %r', method) + raise Exception('method "%s" is not supported' % method) + func = funcs[method] krbccache = krbV.default_context().default_ccache().name - - func = None - try: - try: - # check to see if a matching function has been registered - func = funcs[method] - except KeyError: - raise Exception('method "%s" is not supported' % method) - (args, kw) = xmlrpc_unmarshal(*params) - # FIXME: don't hardcode host and port - context.conn = conn.IPAConn(api.env.ldaphost, api.env.ldapport, krbccache) - logger.info("calling %s" % method) - return func(*args, **kw) - finally: - # Clean up any per-request data and connections -# for k in context.__dict__.keys(): -# del context.__dict__[k] - pass + context.conn = conn.IPAConn( + api.env.ldap_host, + api.env.ldap_port, + krbccache, + ) + logger.info('calling %s', method) + (args, kw) = xmlrpc_unmarshal(*params) + return func(*args, **kw) def _marshaled_dispatch(self, data, dispatch_method = None): try: @@ -117,7 +107,7 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa def do_POST(self): clientIP, port = self.client_address - # Log client IP and Port + # Log client IP and Port logger.info('Client IP: %s - Port: %s' % (clientIP, port)) try: # get arguments @@ -127,14 +117,14 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa params, method = xmlrpclib.loads(data) # Log client request - logger.info('Client request: \n%s\n' % data) + logger.info('Client request: \n%s\n' % data) response = self._marshaled_dispatch( data, getattr(self, '_dispatch', None)) - # Log server response + # Log server response logger.info('Server response: \n%s\n' % response) - except Exception, e: + except Exception, e: # This should only happen if the module is buggy # internal error, report as HTTP server error print e @@ -154,37 +144,29 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa if __name__ == '__main__': - # Set up our logger - logger = logging.getLogger('xmlrpcserver') - hdlr = logging.FileHandler('xmlrpcserver.log') - formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") - hdlr.setFormatter(formatter) - logger.addHandler(hdlr) - logger.setLevel(logging.INFO) + api.bootstrap(context='server') + api.load_plugins() + api.finalize() + logger = api.logger # Set up the server - XMLRPCServer = StoppableXMLRPCServer(("",PORT), LoggingSimpleXMLRPCRequestHandler) - + XMLRPCServer = StoppableXMLRPCServer( + ('', api.env.lite_xmlrpc_port), + LoggingSimpleXMLRPCRequestHandler + ) XMLRPCServer.register_introspection_functions() - api.finalize() - - # Initialize our environment - config.set_default_env(api.env) - env_dict = config.read_config() - env_dict['server_context'] = True - api.env.update(env_dict) - # Get and register all the methods + for cmd in api.Command: - logger.info("registering %s" % cmd) + logger.debug('registering %s', cmd) XMLRPCServer.register_function(api.Command[cmd], cmd) - funcs = XMLRPCServer.funcs - print "Listening on port %d" % PORT + logger.info('Logging to file %r', api.env.log) + logger.info('Listening on port %d', api.env.lite_xmlrpc_port) try: XMLRPCServer.serve_forever() except KeyboardInterrupt: XMLRPCServer.server_close() - print "Server shutdown." + logger.info('Server shutdown.') |