diff options
author | Stefan Stanacar <stefanx.stanacar@intel.com> | 2013-11-03 14:27:16 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-11-08 17:24:51 +0000 |
commit | beea86fa9637fd629719980e14beea758847b8f3 (patch) | |
tree | 411aca6b792699d71e0d775789ebab70de5da963 /meta/lib | |
parent | 80b065ff46322ec0cad039dfd9eb2d010168dba6 (diff) | |
download | openembedded-core-beea86fa9637fd629719980e14beea758847b8f3.tar.gz openembedded-core-beea86fa9637fd629719980e14beea758847b8f3.tar.bz2 openembedded-core-beea86fa9637fd629719980e14beea758847b8f3.zip |
lib/oeqa/utils: sshcontrol: make timeout depend on output
Instead of running the commands with a fixed timeout,
we should kill the command if there is no output
for timeout seconds.
Also changed some strings/comments.
Signed-off-by: Stefan Stanacar <stefanx.stanacar@intel.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Diffstat (limited to 'meta/lib')
-rw-r--r-- | meta/lib/oeqa/utils/sshcontrol.py | 41 |
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) |