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: %s" % err) os._exit(1) server.register_instance(self) try: server.serve_forever() finally: server.server_close() self.shutdown()
def run_component(component_cls, listen_all, location, daemon, pidfile_name, to_file, cfile, argv=None, register=True, state_name=False, cls_kwargs={}, extra_getopt='', time_out=10, protocol='xmlrpc/ssl', certfile=None, keyfile=None, ca=None): # default settings level = logging.INFO logging.getLogger().setLevel(level) Bcfg2.Logger.setup_logging(component_cls.implementation, to_console=True, to_syslog=True, to_file=to_file, level=level) if daemon: child_pid = os.fork() if child_pid != 0: return os.setsid() child_pid = os.fork() if child_pid != 0: os._exit(0) redirect_file = open("/dev/null", "w+") os.dup2(redirect_file.fileno(), sys.__stdin__.fileno()) os.dup2(redirect_file.fileno(), sys.__stdout__.fileno()) os.dup2(redirect_file.fileno(), sys.__stderr__.fileno()) os.chdir(os.sep) pidfile = open(pidfile_name or "/dev/null", "w") fprint(os.getpid(), pidfile) pidfile.close() component = component_cls(cfile=cfile, **cls_kwargs) up = urlparse(location) port = tuple(up[1].split(':')) port = (port[0], int(port[1])) try: server = XMLRPCServer(listen_all, port, keyfile=keyfile, certfile=certfile, register=register, timeout=time_out, ca=ca, protocol=protocol) except: logger.error("Server startup failed") os._exit(1) server.register_instance(component) try: server.serve_forever() finally: server.server_close() component.shutdown()
class Core(BaseCore): """ The built-in server core """ name = 'bcfg2-server' def __init__(self, setup): BaseCore.__init__(self, setup) self.server = None self.context = \ daemon.DaemonContext(uid=self.setup['daemon_uid'], gid=self.setup['daemon_gid'], pidfile=PidFile(self.setup['daemon'])) 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: Bcfg2.Statistics.stats.add_value(method, time.time() - method_start) except xmlrpclib.Fault: raise except Exception: err = sys.exc_info()[1] if getattr(err, "log", True): self.logger.error(err, exc_info=True) raise xmlrpclib.Fault(getattr(err, "fault_code", 1), str(err)) return result def _daemonize(self): self.context.open() self.logger.info("%s daemonized" % self.name) def _run(self): hostname, port = urlparse(self.setup['location'])[1].split(':') server_address = socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4] try: self.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: # pylint: disable=W0702 err = sys.exc_info()[1] self.logger.error("Server startup failed: %s" % err) self.context.close() return False self.server.register_instance(self) return True def _block(self): try: self.server.serve_forever() finally: self.server.server_close() self.context.close() self.shutdown()
class Core(BaseCore): """ The built-in server core """ name = 'bcfg2-server' def __init__(self, setup): BaseCore.__init__(self, setup) #: The :class:`Bcfg2.SSLServer.XMLRPCServer` instance powering #: this server core self.server = None if self.setup['daemon']: #: The :class:`daemon.DaemonContext` used to drop #: privileges, write the PID file (with :class:`PidFile`), #: and daemonize this core. self.context = \ daemon.DaemonContext(uid=self.setup['daemon_uid'], gid=self.setup['daemon_gid'], pidfile=PIDLockFile(self.setup['daemon'])) else: self.context = daemon.DaemonContext(uid=self.setup['daemon_uid'], gid=self.setup['daemon_gid']) __init__.__doc__ = BaseCore.__init__.__doc__.split('.. -----')[0] def _dispatch(self, method, args, dispatch_dict): """ Dispatch XML-RPC method calls :param method: XML-RPC method name :type method: string :param args: Paramaters to pass to the method :type args: tuple :param dispatch_dict: A dict of method name -> function that can be used to provide custom mappings :type dispatch_dict: dict :returns: The return value of the method call :raises: :exc:`xmlrpclib.Fault` """ 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: return method_func(*args) finally: Bcfg2.Statistics.stats.add_value(method, time.time() - method_start) except xmlrpclib.Fault: raise except Exception: err = sys.exc_info()[1] if getattr(err, "log", True): self.logger.error(err, exc_info=True) raise xmlrpclib.Fault(getattr(err, "fault_code", 1), str(err)) def _daemonize(self): """ Open :attr:`context` to drop privileges, write the PID file, and daemonize the server core. """ self.context.open() self.logger.info("%s daemonized" % self.name) return True def _run(self): """ Create :attr:`server` to start the server listening. """ hostname, port = urlparse(self.setup['location'])[1].split(':') server_address = socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4] try: self.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: # pylint: disable=W0702 err = sys.exc_info()[1] self.logger.error("Server startup failed: %s" % err) self.context.close() return False self.server.register_instance(self) return True def _block(self): """ Enter the blocking infinite loop. """ try: self.server.serve_forever() finally: self.server.server_close() self.context.close() self.shutdown()