def _parse_fork_request(self, conn, client_addr, request): if request.startswith("fork-env "): while not request.endswith("end\n"): request += osutils.read_bytes_from_socket(conn) command, env = request[9:].split("\n", 1) else: command = request[5:].strip() env = "end\n" # No env set. try: command_argv = self.command_to_argv(command) env = self.parse_env(env) except Exception as e: # TODO: Log the traceback? self.log(client_addr, "command or env parsing failed: %r" % (str(e),)) conn.sendall("FAILURE\ncommand or env parsing failed: %r" % (str(e),)) else: return command_argv, env return None, None
def serve_one_connection(self, conn, client_addr): request = '' while '\n' not in request: request += osutils.read_bytes_from_socket(conn) # telnet likes to use '\r\n' rather than '\n', and it is nice to have # an easy way to debug. request = request.replace('\r\n', '\n') self.log(client_addr, 'request: %r' % (request,)) if request == 'hello\n': conn.sendall('ok\nyep, still alive\n') self.log_information() conn.close() elif request == 'quit\n': self._should_terminate.set() conn.sendall('ok\nquit command requested... exiting\n') conn.close() elif request.startswith('child_connect_timeout '): try: value = int(request.split(' ', 1)[1]) except ValueError as e: conn.sendall('FAILURE: %r\n' % (e,)) else: self._child_connect_timeout = value conn.sendall('ok\n') conn.close() elif request.startswith('fork ') or request.startswith('fork-env '): command_argv, env = self._parse_fork_request(conn, client_addr, request) if command_argv is not None: # See [Decision #7] # TODO: Do we want to limit the number of children? And/or # prefork additional instances? (the design will need to # change if we prefork and run arbitrary commands.) self.fork_one_request(conn, client_addr, command_argv, env) # We don't close the conn like other code paths, since we use # it again later. else: conn.close() else: self.log(client_addr, 'FAILURE: unknown request: %r' % (request,)) # See [Decision #8] conn.sendall('FAILURE\nunknown request: %r\n' % (request,)) conn.close()
def serve_one_connection(self, conn, client_addr): request = "" while "\n" not in request: request += osutils.read_bytes_from_socket(conn) # telnet likes to use '\r\n' rather than '\n', and it is nice to have # an easy way to debug. request = request.replace("\r\n", "\n") self.log(client_addr, "request: %r" % (request,)) if request == "hello\n": conn.sendall("ok\nyep, still alive\n") self.log_information() conn.close() elif request == "quit\n": self._should_terminate.set() conn.sendall("ok\nquit command requested... exiting\n") conn.close() elif request.startswith("child_connect_timeout "): try: value = int(request.split(" ", 1)[1]) except ValueError as e: conn.sendall("FAILURE: %r\n" % (e,)) else: self._child_connect_timeout = value conn.sendall("ok\n") conn.close() elif request.startswith("fork ") or request.startswith("fork-env "): command_argv, env = self._parse_fork_request(conn, client_addr, request) if command_argv is not None: # See [Decision #7] # TODO: Do we want to limit the number of children? And/or # prefork additional instances? (the design will need to # change if we prefork and run arbitrary commands.) self.fork_one_request(conn, client_addr, command_argv, env) # We don't close the conn like other code paths, since we use # it again later. else: conn.close() else: self.log(client_addr, "FAILURE: unknown request: %r" % (request,)) # See [Decision #8] conn.sendall("FAILURE\nunknown request: %r\n" % (request,)) conn.close()
def _parse_fork_request(self, conn, client_addr, request): if request.startswith('fork-env '): while not request.endswith('end\n'): request += osutils.read_bytes_from_socket(conn) command, env = request[9:].split('\n', 1) else: command = request[5:].strip() env = 'end\n' # No env set. try: command_argv = self.command_to_argv(command) env = self.parse_env(env) except Exception as e: # TODO: Log the traceback? self.log(client_addr, 'command or env parsing failed: %r' % (str(e),)) conn.sendall('FAILURE\ncommand or env parsing failed: %r' % (str(e),)) else: return command_argv, env return None, None
def _read_bytes(self, desired_count): return osutils.read_bytes_from_socket(self.socket, self._report_activity)
def _read_bytes(self, count): """See SmartClientMedium.read_bytes.""" if not self._connected: raise errors.MediumNotConnected(self) return osutils.read_bytes_from_socket(self._socket, self._report_activity)
def _read_bytes(self, desired_count): return osutils.read_bytes_from_socket( self.socket, self._report_activity)
def _read_bytes(self, count): """See SmartClientMedium.read_bytes.""" if not self._connected: raise errors.MediumNotConnected(self) return osutils.read_bytes_from_socket( self._socket, self._report_activity)