def flush_buf(self): msg = self.messenger stdios = [msg.o_stdout, msg.o_stderr] r, _, _ = select.select(stdios, [], [], 0) # Not blocking. if msg.o_stdout in r: # Send message from stdout data = os.read(msg.o_stdout, 16384) msg.write_msg(remote_interface.StdOut(data)) if msg.o_stderr in r: # Send message from stdout data = os.read(msg.o_stderr, 16384) msg.write_msg(remote_interface.StdErr(data))
def query_master(self, *args, **kargs): """Read CmdRespond from master.""" # First of all, dump stdio to master. Otherwise it can block on # logging.info() function. msg = self.messenger stdios = [msg.o_stdout, msg.o_stderr] r, _, _ = select.select(stdios, [], [], 0) # Not blocking. if msg.o_stdout in r: # Send message from stdout data = os.read(msg.o_stdout, 16384) msg.write_msg(remote_interface.StdOut(data)) if msg.o_stderr in r: # Send message from stdout data = os.read(msg.o_stderr, 16384) msg.write_msg(remote_interface.StdErr(data)) # Sent actual request. cmd = remote_interface.CmdQuery(args, kargs) msg.write_msg(cmd) succ, data = msg.read_msg() assert succ assert isinstance(data, remote_interface.CmdRespond) return data.respond
def cmd_loop(self): """ Wait for commands from master and receive results and outputs from commands. """ try: while (not self._exit): stdios = [self.stdin, self.o_stdout, self.o_stderr] r_pipes = [cmd.r_pipe for cmd in self.cmds.values() if cmd.r_pipe is not None] stdouts = [cmd.stdout_pipe for cmd in self.cmds.values() if cmd.stdout_pipe is not None] stderrs = [cmd.stderr_pipe for cmd in self.cmds.values() if cmd.stderr_pipe is not None] r, _, _ = select.select( stdios + r_pipes + stdouts + stderrs, [], []) if self.stdin in r: # command from controller cmd = CmdSlave(self.read_msg()[1]) self.cmds[cmd.cmd_id] = cmd try: # There is hidden bug. We can bump into condition when # we running some function-command. That function dump # some data to stdio. But, stdio is out of # consideration at this point. It can stuck. cmd(self) self.write_msg(cmd.basecmd) except Exception: err_msg = traceback.format_exc() self.write_msg( remote_interface.CommanderError(err_msg)) if self.o_stdout in r: # Send message from stdout msg = os.read(self.o_stdout, 16384) self.write_msg(remote_interface.StdOut(msg)) if self.o_stderr in r: # Send message from stdout msg = os.read(self.o_stderr, 16384) self.write_msg(remote_interface.StdErr(msg)) # test all commands for io for cmd in self.cmds.values(): if cmd.stdout_pipe in r: # command stdout data = os.read(cmd.stdout_pipe, 16384) if data != "": # pipe is not closed on another side. self.write_msg(remote_interface.StdOut(data, cmd.cmd_id)) else: os.close(cmd.stdout_pipe) cmd.stdout_pipe = None if cmd.stderr_pipe in r: # command stderr data = os.read(cmd.stderr_pipe, 16384) if data != "": # pipe is not closed on another side. self.write_msg(remote_interface.StdErr(data, cmd.cmd_id)) else: os.close(cmd.stderr_pipe) cmd.stderr_pipe = None if cmd.r_pipe in r: # command results if cmd.work(): cmd.finish(self) self.write_msg(cmd.basecmd) except Exception: err_msg = traceback.format_exc() self.write_msg(remote_interface.CommanderError(err_msg))