Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()