:rtype: tuple(int, str, str)
:raise SSHTimeout: If command is not finished in timeout time.
"""
- start = time()
stdout = StringIO.StringIO()
stderr = StringIO.StringIO()
try:
logger.trace('exec_command on {0}: {1}'
.format(self._ssh.get_transport().getpeername(), cmd))
+ start = time()
chan.exec_command(cmd)
while not chan.exit_status_ready() and timeout is not None:
if chan.recv_ready():
if time() - start > timeout:
raise SSHTimeout(
- 'Timeout exception.\n'
- 'Current contents of stdout buffer: {0}\n'
- 'Current contents of stderr buffer: {1}\n'
- .format(stdout.getvalue(), stderr.getvalue())
+ 'Timeout exception during execution of command: {0}\n'
+ 'Current contents of stdout buffer: {1}\n'
+ 'Current contents of stderr buffer: {2}\n'
+ .format(cmd, stdout.getvalue(), stderr.getvalue())
)
sleep(0.1)
logger.trace('exec_command on {0} took {1} seconds'.format(
self._ssh.get_transport().getpeername(), end-start))
- logger.trace('chan_recv/_stderr took {} seconds'.format(time()-end))
-
logger.trace('return RC {}'.format(return_code))
logger.trace('return STDOUT {}'.format(stdout.getvalue()))
logger.trace('return STDERR {}'.format(stderr.getvalue()))
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:
logger.error('Channel exit status ready')
break
except socket.timeout:
+ logger.error('Socket timeout: {0}'.format(buf))
raise Exception('Socket timeout: {0}'.format(buf))
return chan
logger.error('Channel exit status ready')
break
except socket.timeout:
- raise Exception('Socket timeout: {0}'.format(buf))
+ logger.error('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, '')
"""
chan.close()
- def scp(self, local_path, remote_path, get=False):
+ def scp(self, local_path, remote_path, get=False, timeout=10):
"""Copy files from local_path to remote_path or vice versa.
connect() method has to be called first!
:param remote_path: Remote path where to place uploaded file; or
path to remote file which should be downloaded.
:param get: scp operation to perform. Default is put.
+ :param timeout: Timeout value in seconds.
:type local_path: str
:type remote_path: str
:type get: bool
+ :type timeout: int
"""
if not get:
logger.trace('SCP {0} to {1}:{2}'.format(
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=10)
+ scp = SCPClient(self._ssh.get_transport(), socket_timeout=timeout)
start = time()
if not get:
scp.put(local_path, remote_path)