X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2Fssh.py;h=108c1e4e1ee4a7a5e18a019ff9059ece93aa8a0c;hb=f5a1d81c2f3c532543b6cd6a457942dbf610f5f3;hp=4bed173bbb359005c71294c5d427a8e1328d3dcd;hpb=cc85afad85339d2cc8f035ce63ff21220d8e6b96;p=csit.git diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py index 4bed173bbb..108c1e4e1e 100644 --- a/resources/libraries/python/ssh.py +++ b/resources/libraries/python/ssh.py @@ -22,7 +22,6 @@ from paramiko import RSAKey from paramiko.ssh_exception import SSHException from scp import SCPClient from robot.api import logger -from robot.utils.asserts import assert_equal __all__ = ["exec_cmd", "exec_cmd_no_error"] @@ -244,7 +243,7 @@ class SSH(object): command = 'sudo -S {c}'.format(c=command) return self.exec_command(command, timeout) - def interactive_terminal_open(self, time_out=30): + def interactive_terminal_open(self, time_out=45): """Open interactive terminal on a new channel on the connected Node. :param time_out: Timeout in seconds. @@ -264,7 +263,7 @@ class SSH(object): chan.set_combine_stderr(True) buf = '' - while not buf.endswith((":~$ ", "~]$ ", "~]# ")): + while not buf.endswith((":~# ", ":~$ ", "~]$ ", "~]# ")): try: chunk = chan.recv(self.__MAX_RECV_BUF) if not chunk: @@ -325,7 +324,8 @@ class SSH(object): """ chan.close() - def scp(self, local_path, remote_path, get=False, timeout=30): + def scp(self, local_path, remote_path, get=False, timeout=30, + wildcard=False): """Copy files from local_path to remote_path or vice versa. connect() method has to be called first! @@ -336,10 +336,12 @@ class SSH(object): path to remote file which should be downloaded. :param get: scp operation to perform. Default is put. :param timeout: Timeout value in seconds. + :param wildcard: If path has wildcard characters. Default is false. :type local_path: str :type remote_path: str :type get: bool :type timeout: int + :type wildcard: bool """ if not get: logger.trace('SCP {0} to {1}:{2}'.format( @@ -350,7 +352,11 @@ class SSH(object): self._ssh.get_transport().getpeername(), remote_path, local_path)) # SCPCLient takes a paramiko transport as its only argument - scp = SCPClient(self._ssh.get_transport(), socket_timeout=timeout) + if not wildcard: + scp = SCPClient(self._ssh.get_transport(), socket_timeout=timeout) + else: + scp = SCPClient(self._ssh.get_transport(), sanitize=lambda x: x, + socket_timeout=timeout) start = time() if not get: scp.put(local_path, remote_path) @@ -370,7 +376,7 @@ def exec_cmd(node, cmd, timeout=600, sudo=False): raise TypeError('Node parameter is None') if cmd is None: raise TypeError('Command parameter is None') - if len(cmd) == 0: + if not cmd: raise ValueError('Empty command parameter') ssh = SSH() @@ -393,14 +399,29 @@ def exec_cmd(node, cmd, timeout=600, sudo=False): return ret_code, stdout, stderr -def exec_cmd_no_error(node, cmd, timeout=600, sudo=False): +def exec_cmd_no_error(node, cmd, timeout=600, sudo=False, message=None): """Convenience function to ssh/exec/return out & err. Verifies that return code is zero. - Returns (stdout, stderr). + :param node: DUT node. + :param cmd: Command to be executed. + :param timeout: Timeout value in seconds. Default: 600. + :param sudo: Sudo privilege execution flag. Default: False. + :param message: Error message in case of failure. Default: None. + :type node: dict + :type cmd: str + :type timeout: int + :type sudo: bool + :type message: str + :returns: Stdout, Stderr. + :rtype: tuple(str, str) + :raise RuntimeError: If bash return code is not 0. """ - (ret_code, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo) - assert_equal(ret_code, 0, 'Command execution failed: "{}"\n{}'. - format(cmd, stderr)) + ret_code, stdout, stderr = exec_cmd(node, cmd, timeout=timeout, sudo=sudo) + msg = ('Command execution failed: "{cmd}"\n{stderr}'. + format(cmd=cmd, stderr=stderr) if message is None else message) + if ret_code != 0: + raise RuntimeError(msg) + return stdout, stderr