def _raise_for_status(self): if self.returncode is None: self._get_exitstatus() if self.check_status: if self.returncode in (None, -1): # command either died due to a signal, or the connection # was lost transport = self.client.get_transport() if transport is None or not transport.is_active(): # look like we lost the connection raise ConnectionLostError(command=self.command, node=self.hostname) # connection seems healthy still, assuming it was a # signal; sadly SSH does not tell us which signal raise CommandCrashedError(command=self.command) if self.returncode != 0: raise CommandFailedError(command=self.command, exitstatus=self.returncode, node=self.hostname, label=self.label)
def run( client, args, stdin=None, stdout=None, stderr=None, logger=None, check_status=True, wait=True, name=None, label=None, timeout=None, cwd=None, # omit_sudo is used by vstart_runner.py omit_sudo=False): """ Run a command remotely. If any of 'args' contains shell metacharacters that you want to pass unquoted, pass it as an instance of Raw(); otherwise it will be quoted with pipes.quote() (single quote, and single quotes enclosed in double quotes). :param client: SSHConnection to run the command with :param args: command to run :type args: list of string :param stdin: Standard input to send; either a string, a file-like object, None, or `PIPE`. `PIPE` means caller is responsible for closing stdin, or command may never exit. :param stdout: What to do with standard output. Either a file-like object, a `logging.Logger`, `PIPE`, or `None` for copying to default log. `PIPE` means caller is responsible for reading, or command may never exit. :param stderr: What to do with standard error. See `stdout`. :param logger: If logging, write stdout/stderr to "out" and "err" children of this logger. Defaults to logger named after this module. :param check_status: Whether to raise CommandFailedError on non-zero exit status, and . Defaults to True. All signals and connection loss are made to look like SIGHUP. :param wait: Whether to wait for process to exit. If False, returned ``r.exitstatus`` s a `gevent.event.AsyncResult`, and the actual status is available via ``.get()``. :param name: Human readable name (probably hostname) of the destination host :param label: Can be used to label or describe what the command is doing. :param timeout: timeout value for args to complete on remote channel of paramiko :param cwd: Directory in which the command should be executed. """ try: transport = client.get_transport() if transport: (host, port) = transport.getpeername()[0:2] else: raise ConnectionLostError(command=quote(args), node=name) except socket.error: raise ConnectionLostError(command=quote(args), node=name) if name is None: name = host if timeout: log.info("Running command with timeout %d", timeout) r = RemoteProcess(client, args, check_status=check_status, hostname=name, label=label, timeout=timeout, wait=wait, logger=logger, cwd=cwd) r.execute() r.setup_stdin(stdin) r.setup_output_stream(stderr, 'stderr') r.setup_output_stream(stdout, 'stdout') if wait: r.wait() return r