diff options
Diffstat (limited to 'src/lib/Bcfg2/Server/BuiltinCore.py')
-rw-r--r-- | src/lib/Bcfg2/Server/BuiltinCore.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/lib/Bcfg2/Server/BuiltinCore.py b/src/lib/Bcfg2/Server/BuiltinCore.py new file mode 100644 index 000000000..c844e06d3 --- /dev/null +++ b/src/lib/Bcfg2/Server/BuiltinCore.py @@ -0,0 +1,102 @@ +""" the core of the builtin bcfg2 server """ + +import os +import sys +import time +import socket +import logging +from Bcfg2.Server.Core import BaseCore +from Bcfg2.Bcfg2Py3k import xmlrpclib, urlparse + +logger = logging.getLogger() + +class NoExposedMethod (Exception): + """There is no method exposed with the given name.""" + + +class Core(BaseCore): + name = 'bcfg2-server' + + def _resolve_exposed_method(self, method_name): + """Resolve an exposed method. + + Arguments: + method_name -- name of the method to resolve + + """ + try: + func = getattr(self, method_name) + except AttributeError: + raise NoExposedMethod(method_name) + if not getattr(func, "exposed", False): + raise NoExposedMethod(method_name) + return func + + def _dispatch(self, method, args, dispatch_dict): + """Custom XML-RPC dispatcher for components. + + method -- XML-RPC method name + args -- tuple of paramaters to method + + """ + if method in dispatch_dict: + method_func = dispatch_dict[method] + else: + try: + method_func = self._resolve_exposed_method(method) + except NoExposedMethod: + self.logger.error("Unknown method %s" % (method)) + raise xmlrpclib.Fault(xmlrpclib.METHOD_NOT_FOUND, + "Unknown method %s" % method) + + try: + method_start = time.time() + try: + result = method_func(*args) + finally: + method_done = time.time() + except xmlrpclib.Fault: + raise + except Exception: + e = sys.exc_info()[1] + if getattr(e, "log", True): + self.logger.error(e, exc_info=True) + raise xmlrpclib.Fault(getattr(e, "fault_code", 1), str(e)) + return result + + def run(self): + if self.setup['daemon']: + self._daemonize() + + hostname, port = urlparse(self.setup['location'])[1].split(':') + server_address = socket.getaddrinfo(hostname, + port, + socket.AF_UNSPEC, + socket.SOCK_STREAM)[0][4] + try: + server = XMLRPCServer(self.setup['listen_all'], + server_address, + keyfile=self.setup['key'], + certfile=self.setup['cert'], + register=False, + timeout=1, + ca=self.setup['ca'], + protocol=self.setup['protocol']) + except: + err = sys.exc_info()[1] + self.logger.error("Server startup failed") + os._exit(1) + server.register_instance(self) + + try: + server.serve_forever() + finally: + server.server_close() + self.shutdown() + + def methodHelp(self, method_name): + try: + func = self._resolve_exposed_method(method_name) + except NoExposedMethod: + return "" + return func.__doc__ |