Ejemplo n.º 1
0
 def destroy(self):
     """
     For spring python. Just call stop_server().
     """
     logger.info("destroy : Entering, calling self.stop_server(), %s",
                 SolBase.get_current_pid_as_string())
     self.stop_server()
Ejemplo n.º 2
0
    def stop_server(self):
        """
        Stop server
        """

        with self.__stop_start_lock:
            logger.info("stop_server : stopping, %s",
                        SolBase.get_current_pid_as_string())
            try:
                # No more running
                self._is_running = False

                # Check
                if self._is_started is False:
                    logger.info(
                        "stop_server : already stopped, doing nothing, %s",
                        SolBase.get_current_pid_as_string())
                    return

                # Low level stop
                try:
                    gevent.with_timeout(
                        self._tcp_server_config.stop_server_timeout_ms,
                        self._stop_server)
                except Timeout:
                    logger.warning(
                        "Timeout while calling low level _stop_server, some socket may be stucked"
                    )

                # Stop
                self._is_started = False

                # Done
                logger.info("stop_server : stopped, %s",
                            SolBase.get_current_pid_as_string())
            except Exception as e:
                logger.error("stop_server : exception, ex=%s, %s",
                             SolBase.extostr(e),
                             SolBase.get_current_pid_as_string())
                raise
Ejemplo n.º 3
0
    def _on_connection(self, socket, address):
        """
        Callback called upon client connection.
        :param socket:  The client socket.
        :type socket: socket.socket
        :param address: The client remote address:
        :type address: str

        """
        logger.debug("_on_connection : address=%s %s", address,
                     SolBase.get_current_pid_as_string())

        # Register a new session
        # This will start the read/write loop on client.
        local_client = self._register_client(socket, address)

        # Check
        if local_client is None:
            logger.error("_on_connection : _register_client returned none")
Ejemplo n.º 4
0
    def setUp(self):
        """
        Setup
        """
        logger.info("*** SETUP in")

        SolBase.voodoo_init()
        self.run_idx = 0

        self.current_dir = dirname(
            abspath(__file__)) + SolBase.get_pathseparator()

        # Reset (teamcity broke the whole stuff)
        self.tc_stdin = sys.stdin
        self.tc_stdout = sys.stdout
        self.tc_stderr = sys.stderr
        sys.stdin = real_stdin
        sys.stdout = real_stdout
        sys.stderr = real_stderr

        # Log
        logger.info("Entering, %s", SolBase.get_current_pid_as_string())

        # Config
        self.test_timeout_ms = 30000
        self.stdout_timeout_ms = 5000
        self.std_err_timeout_ms = 500

        self.daemon_pid_file = "/tmp/Daemon.pid"

        self.daemon_std_out = "/tmp/Daemon.out.txt"
        self.daemon_std_err = "/tmp/Daemon.err.txt"

        # Clean
        self._clean_files()

        logger.info("*** SETUP out")
Ejemplo n.º 5
0
    def start_server(self):
        """
        Start

        """

        with self.__stop_start_lock:
            logger.info("start_server : starting")
            try:
                if self._is_started is True:
                    logger.warning(
                        "start_server : already started, doing nothing")
                    return False

                # Running
                self._is_running = True

                # Low level start
                self._start_server()

                # Start
                self._is_started = True

                # Done
                logger.info("start_server : started, %s",
                            SolBase.get_current_pid_as_string())

                # Exit
                return True
            except Exception as e:
                logger.error("start_server : exception, ex=%s",
                             SolBase.extostr(e))
                # Failed, not more running
                self._is_running = False

                # Raise
                raise
Ejemplo n.º 6
0
    def _godaemon(self):
        """
        daemonize us
        """

        logger.debug("Entering, pid=%s", os.getpid())

        # Limit
        self._set_limits()

        # Fork1
        logger.debug("fork1, %s", SolBase.get_current_pid_as_string())
        try:
            pid = gevent.fork()
            if pid > 0:
                # Exit first parent
                logger.debug("exit(0) first parent")
                sys.exit(0)
        except OSError as ex:
            logger.error("fork1 failed, exit(1) now : errno=%s, err=%s, ex=%s",
                         ex.errno, ex.strerror, SolBase.extostr(ex))
            sys.exit(1)
        logger.debug("fork1 done, %s", SolBase.get_current_pid_as_string())

        # Diverge from parent
        if self._changeDir:
            logger.debug("chdir now")
            os.chdir("/")

        # Set stuff
        logger.debug("setsid and umask")
        # noinspection PyArgumentList
        os.setsid()
        os.umask(0)

        # Fork2
        logger.debug("fork2, %s", SolBase.get_current_pid_as_string())
        try:
            pid = gevent.fork()
            if pid > 0:
                # exit from second parent
                logger.debug("exit(0) second parent")
                sys.exit(0)
        except OSError as ex:
            logger.error("fork2 failed, exit(2) now : errno=%s, err=%s, ex=%s",
                         ex.errno, ex.strerror, SolBase.extostr(ex))
            sys.exit(2)
        logger.debug("fork2 done, %s", SolBase.get_current_pid_as_string())

        # Redirect std
        self._redirect_all_std()

        # Go
        logger.debug("initializing _pidfile=%s", self._pidfile)

        # Register the method called at exit
        atexit.register(self._remove_pid_file)

        # Write pidfile
        pid = str(os.getpid())
        try:
            f = open(self._pidfile, "w")
            f.write("%s" % pid)
            f.close()

        except IOError as ex:
            logger.error(
                "pid file initialization failed, going exit(3), ex=%s",
                SolBase.extostr(ex))
            sys.exit(3)

            # Ok
        logger.debug("pid file set")

        # Finish
        logger.debug("registering gevent signal handler : SIGUSR1")
        signal(SIGUSR1, self._on_reload)
        logger.debug("registering gevent signal handler : SIGUSR2")
        signal(SIGUSR2, self._on_status)
        logger.debug("registering gevent signal handler : SIGTERM")
        signal(SIGTERM, self._exit_handler)

        logger.debug("registering gevent signal handler : done")

        # Fatality
        SolBase.voodoo_init()
        logger.debug("process started, pid=%s, pidfile=%s", os.getpid(),
                     self._pidfile)
Ejemplo n.º 7
0
    def _start_server(self):
        """
        Low level start
        """

        # Allocate a server, and provide a connection callback
        logger.info("listen_addr=%s", self._tcp_server_config.listen_addr)
        logger.info("listen_port=%s", self._tcp_server_config.listen_port)
        logger.info("ssl_enable=%s", self._tcp_server_config.ssl_enable)
        logger.info("ssl_key_file=%s", self._tcp_server_config.ssl_key_file)
        logger.info("ssl_certificate_file=%s",
                    self._tcp_server_config.ssl_certificate_file)

        logger.info("child_process_count=%s",
                    self._tcp_server_config.child_process_count)

        logger.info("ssl_handshake_timeout_ms=%s",
                    self._tcp_server_config.ssl_handshake_timeout_ms)

        logger.info("onstop_call_client_stopsynch=%s",
                    self._tcp_server_config.onstop_call_client_stopsynch)

        logger.info("socket_absolute_timeout_ms=%s",
                    self._tcp_server_config.socket_absolute_timeout_ms)
        logger.info("socket_relative_timeout_ms=%s",
                    self._tcp_server_config.socket_relative_timeout_ms)
        logger.info("socket_min_checkinterval_ms=%s",
                    self._tcp_server_config.socket_min_checkinterval_ms)

        logger.info("_effective_control_interval_ms=%s",
                    self._effective_control_interval_ms)

        logger.info("stop_client_timeout_ms=%s",
                    self._tcp_server_config.stop_client_timeout_ms)
        logger.info("stop_server_timeout_ms=%s",
                    self._tcp_server_config.stop_server_timeout_ms)

        logger.info("client_factory=%s",
                    self._tcp_server_config.client_factory)

        if self._tcp_server_config.ssl_enable is False:
            # No SSL
            logger.info("Starting in TCP/CLEAR mode")
            self._server = StreamServerNoClose(
                (self._tcp_server_config.listen_addr,
                 self._tcp_server_config.listen_port), self._on_connection)
        else:
            # SSL ON
            logger.info("Starting in TCP/SSL mode")
            self._server = StreamServerNoClose(
                (self._tcp_server_config.listen_addr,
                 self._tcp_server_config.listen_port),
                self._on_connection,
                # SSL enabling
                keyfile=self._tcp_server_config.ssl_key_file,
                certfile=self._tcp_server_config.ssl_certificate_file,
                # SSL handshake after accept
                do_handshake_on_connect=True,
                # TLS
                ssl_version=PROTOCOL_TLSv1,
                # Cipher
                # ciphers="RC4-MD5",
                # Args
            )

            self._server.min_delay = 0.0
            self._server.max_delay = 0.0

        # Startup
        if self._tcp_server_config.child_process_count <= 0:
            # Normal start-up
            logger.info("Starting in NON-FORKED mode")
            self._server.start()
        else:
            # Child process startup : prestart
            logger.info("Pre-starting in FORKED mode, subprocess=%s",
                        self._tcp_server_config.child_process_count)
            # GEVENT_RC1 fix : pre_start => init_socket
            self._server.init_socket()

            # Let's rock
            logger.info("Forking gevent")
            for idx in range(self._tcp_server_config.child_process_count):
                # Fork gevent hub
                # GEVENT_RC1 fix : hub.fork => os.fork
                _fork_pid = gevent.fork()

                logger.info("Forking gevent hub done, idx=%s, forkPid=%s, %s",
                            idx, _fork_pid,
                            SolBase.get_current_pid_as_string())

                # Check it
                if _fork_pid == 0:
                    # We are in a child => exit this loop
                    SolBase.set_master_process(False)
                    break
                else:
                    # Master on
                    SolBase.set_master_process(True)

                    # Store child pid
                    logger.info("Storing child _fork_pid=%s", _fork_pid)
                    self._fork_pid_list.append(int(_fork_pid))

            # Start accepting now (parent and all sub-processes)
            logger.info("Accepting now, %s",
                        SolBase.get_current_pid_as_string())
            self._server.start_accepting()