From 7e20228f4abf509e883093b79bf1f842b092f63b Mon Sep 17 00:00:00 2001 From: Peter Mikus Date: Wed, 9 May 2018 06:16:31 +0000 Subject: FIX: SSH connect issue error: [Errno 9] Bad file descriptor Change-Id: I4c5278d41e979f6af43054e3b5890fb154555494 Signed-off-by: Peter Mikus --- resources/libraries/python/ssh.py | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) (limited to 'resources/libraries/python/ssh.py') diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py index fe4404b053..5ff1b2d769 100644 --- a/resources/libraries/python/ssh.py +++ b/resources/libraries/python/ssh.py @@ -92,11 +92,11 @@ class SSH(object): format(self._ssh.get_transport().getpeername())) logger.debug('Connections: {0}'. format(str(SSH.__existing_connections))) - except RuntimeError as exc: + except: if attempts > 0: self._reconnect(attempts-1) else: - raise exc + raise def disconnect(self, node): """Close SSH connection to the node. @@ -236,8 +236,8 @@ class SSH(object): def interactive_terminal_open(self, time_out=30): """Open interactive terminal on a new channel on the connected Node. - FIXME: Convert or document other possible exceptions, such as - socket.error or SSHException. + :param time_out: Timeout in seconds. + :returns: SSH channel with opened terminal. .. warning:: Interruptingcow is used here, and it uses signal(SIGALRM) to let the operating system interrupt program @@ -245,10 +245,6 @@ class SSH(object): handlers only apply to the main thread, so you cannot use this from other threads. You must not use this in a program that uses SIGALRM itself (this includes certain profilers) - - :param time_out: Timeout in seconds. - :returns: SSH channel with opened terminal. - :raise IOError: If receive attempt results in socket.timeout. """ chan = self._ssh.get_transport().open_session() chan.get_pty() @@ -268,8 +264,7 @@ class SSH(object): break except socket.timeout: logger.error('Socket timeout: {0}'.format(buf)) - # TODO: Find out which exception would callers appreciate here. - raise IOError('Socket timeout: {0}'.format(buf)) + raise Exception('Socket timeout: {0}'.format(buf)) return chan def interactive_terminal_exec_command(self, chan, cmd, prompt): @@ -277,19 +272,18 @@ class SSH(object): interactive_terminal_open() method has to be called first! + :param chan: SSH channel with opened terminal. + :param cmd: Command to be executed. + :param prompt: Command prompt, sequence of characters used to + indicate readiness to accept commands. + :returns: Command output. + .. warning:: Interruptingcow is used here, and it uses signal(SIGALRM) to let the operating system interrupt program execution. This has the following limitations: Python signal handlers only apply to the main thread, so you cannot use this from other threads. You must not use this in a program that uses SIGALRM itself (this includes certain profilers) - - :param chan: SSH channel with opened terminal. - :param cmd: Command to be executed. - :param prompt: Command prompt, sequence of characters used to - indicate readiness to accept commands. - :returns: Command output. - :raise IOError: If receive attempt results in socket.timeout. """ chan.sendall('{c}\n'.format(c=cmd)) buf = '' @@ -305,9 +299,8 @@ class SSH(object): except socket.timeout: logger.error('Socket timeout during execution of command: ' '{0}\nBuffer content:\n{1}'.format(cmd, buf)) - # TODO: Find out which exception would callers appreciate here. - raise IOError('Socket timeout during execution of command: ' - '{0}\nBuffer content:\n{1}'.format(cmd, buf)) + raise Exception('Socket timeout during execution of command: ' + '{0}\nBuffer content:\n{1}'.format(cmd, buf)) tmp = buf.replace(cmd.replace('\n', ''), '') for item in prompt: tmp.replace(item, '') @@ -360,7 +353,6 @@ class SSH(object): def exec_cmd(node, cmd, timeout=600, sudo=False): """Convenience function to ssh/exec/return rc, out & err. - FIXME: Document :param, :type, :raise and similar. Returns (rc, stdout, stderr). """ if node is None: @@ -400,4 +392,4 @@ def exec_cmd_no_error(node, cmd, timeout=600, sudo=False): (ret_code, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo) assert_equal(ret_code, 0, 'Command execution failed: "{}"\n{}'. format(cmd, stderr)) - return stdout, stderr + return stdout, stderr \ No newline at end of file -- cgit 1.2.3-korg