summaryrefslogtreecommitdiff
path: root/meta/lib/oeqa/utils
diff options
context:
space:
mode:
Diffstat (limited to 'meta/lib/oeqa/utils')
-rw-r--r--meta/lib/oeqa/utils/sshcontrol.py41
1 files changed, 27 insertions, 14 deletions
diff --git a/meta/lib/oeqa/utils/sshcontrol.py b/meta/lib/oeqa/utils/sshcontrol.py
index 1539ff2a37..07257b8948 100644
--- a/meta/lib/oeqa/utils/sshcontrol.py
+++ b/meta/lib/oeqa/utils/sshcontrol.py
@@ -9,6 +9,7 @@
import subprocess
import time
import os
+import select
class SSHControl(object):
@@ -50,32 +51,44 @@ class SSHControl(object):
if self.host:
sshconn = self._internal_run(cmd)
else:
- raise Exception("Remote IP hasn't been set: '%s'" % actualcmd)
+ raise Exception("Remote IP/host hasn't been set, I can't run ssh without one.")
+ # run the command forever
if timeout == 0:
- self._out = sshconn.communicate()[0]
- self._ret = sshconn.poll()
+ output = sshconn.communicate()[0]
else:
+ # use the default timeout
if timeout is None:
tdelta = self.timeout
+ # use the specified timeout
else:
tdelta = timeout
endtime = self._starttime + tdelta
- while sshconn.poll() is None and time.time() < endtime:
- time.sleep(1)
+ output = ''
+ eof = False
+ while time.time() < endtime and not eof:
+ if select.select([sshconn.stdout], [], [], 5)[0] != []:
+ data = os.read(sshconn.stdout.fileno(), 1024)
+ if not data:
+ sshconn.stdout.close()
+ eof = True
+ else:
+ output += data
+ endtime = time.time() + tdelta
+
# process hasn't returned yet
if sshconn.poll() is None:
- self._ret = 255
sshconn.terminate()
- sshconn.kill()
- self._out = sshconn.stdout.read()
- sshconn.stdout.close()
- self._out += "\n[!!! SSH command timed out after %d seconds and it was killed]" % tdelta
- else:
- self._out = sshconn.stdout.read()
- self._ret = sshconn.poll()
+ time.sleep(3)
+ try:
+ sshconn.kill()
+ except OSError:
+ pass
+ output += "\n[!!! SSH command killed - no output for %d seconds. Total running time: %d seconds." % (tdelta, time.time() - self._starttime)
+
+ self._ret = sshconn.poll()
# strip the last LF so we can test the output
- self._out = self._out.rstrip()
+ self._out = output.rstrip()
self.log("%s" % self._out)
self.log("[SSH command returned after %d seconds]: %s" % (time.time() - self._starttime, self._ret))
return (self._ret, self._out)