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")
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)
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])
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")
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)