Ejemplo n.º 1
0
    def run(self):
        log = get_logger("[CLIENT_DATA_THREAD]")
        log("START")

        try:
            with closing(self.client_sock):
                ins, _, _ = select.select([self.client_sock], [], [])
                if ins:
                    msg = read_json(ins[0])
                    app_env = msg["app_env"]
                    app_sock = connect(
                        self.app_servers[app_env], wait_time=3, max_attempts=10
                    )
                    with closing(app_sock):
                        write_json(msg, app_sock)
                        redirect_map = {
                            app_sock: self.client_sock,
                            self.client_sock: app_sock,
                        }

                        while True:
                            ins, _, _ = select.select(redirect_map.keys(), [], [])
                            if not fd_redirect_list(ins, redirect_map):
                                break
        finally:
            log("DONE")
Ejemplo n.º 2
0
    def run(self, cmd):
        # unbuffered STDIN
        sys.stdin = os.fdopen(sys.stdin.fileno(), "rb", 0)
        data_sock = connect(self.data_path)
        ctl_sock = connect(self.ctl_path)

        with closing(data_sock), closing(ctl_sock):
            redirect_map = {data_sock: sys.stdout, sys.stdin: data_sock}
            try:
                write_json(
                    {
                        "command": cmd,
                        "app_env": self.app_env,
                        "client_id": self.client_id,
                    },
                    data_sock,
                )
                self._redirect_until_socket_breaks(redirect_map)
            except KeyboardInterrupt:
                write_json(
                    {
                        "command_ctl": "QUIT",
                        "signal": signal.SIGINT,
                        "app_env": self.app_env,
                        "client_id": self.client_id,
                    },
                    ctl_sock,
                )
                self._redirect_until_socket_breaks(redirect_map, ignore_sigint=True)
Ejemplo n.º 3
0
    def command_worker(self, cmd, client_sock, ctl_queue):
        with closing(client_sock):
            p2cr, p2cw = os.pipe()
            c2pr, c2pw = os.pipe()
            child = multiprocessing.Process(
                target=self._command_worker_target,
                kwargs=dict(cmd=cmd, p2cr=p2cr, c2pw=c2pw),
            )
            child.start()

            self.log("waiting on child", logging.WARN)
            close([p2cr, c2pw])

            try:
                if self.child_wait_sigterm_handler(
                    client_sock, child.pid, ctl_queue, p2cw, c2pr
                ):
                    self.log("child is gone, returning", logging.WARN)
                    return
                try:
                    pid, status = os.waitpid(child.pid, 0)
                except OSError:
                    self.log("child is gone", logging.WARN)
                    return

                exit_code = os.WEXITSTATUS(status)
                c = "GREEN" if exit_code == 0 else "RED"
                self.log(
                    colour("child returned with status %s" % exit_code, c), logging.WARN
                )
            finally:
                self.log("EXITING PARENT command_worker PROCESS")
                close([p2cw, c2pr])
Ejemplo n.º 4
0
    def run(self):
        log = get_logger("[CLIENT_CTL_THREAD]")
        log("START")

        try:
            with closing(self.client_sock):
                ins, _, _ = select.select([self.client_sock], [], [])
                if ins:
                    try:
                        msg = read_json(ins[0])
                    except ValueError:
                        # could be empty string if client disconnects
                        return
                    self.send_msg(msg)
        finally:
            log("DONE")
Ejemplo n.º 5
0
 def send_msg(self, msg):
     app_sock = connect(
         self.app_servers[msg["app_env"]], wait_time=1, max_attempts=5
     )
     with closing(app_sock):
         write_json(msg, app_sock)