diff options
-rw-r--r-- | meta/lib/oeqa/core/target/ssh.py | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py index d473469384..8b5c450a05 100644 --- a/meta/lib/oeqa/core/target/ssh.py +++ b/meta/lib/oeqa/core/target/ssh.py | |||
@@ -92,7 +92,10 @@ class OESSHTarget(OETarget): | |||
92 | processTimeout = self.timeout | 92 | processTimeout = self.timeout |
93 | 93 | ||
94 | status, output = self._run(sshCmd, processTimeout, ignore_status, raw) | 94 | status, output = self._run(sshCmd, processTimeout, ignore_status, raw) |
95 | self.logger.debug('Command: %s\nStatus: %d Output: %s\n' % (command, status, output)) | 95 | if len(output) > (64 * 1024): |
96 | self.logger.debug('Command: %s\nStatus: %d Output length: %s\n' % (command, status, len(output))) | ||
97 | else: | ||
98 | self.logger.debug('Command: %s\nStatus: %d Output: %s\n' % (command, status, output)) | ||
96 | 99 | ||
97 | return (status, output) | 100 | return (status, output) |
98 | 101 | ||
@@ -211,17 +214,18 @@ def SSHCall(command, logger, timeout=None, raw=False, **opts): | |||
211 | def run(): | 214 | def run(): |
212 | nonlocal output | 215 | nonlocal output |
213 | nonlocal process | 216 | nonlocal process |
214 | output_raw = b'' | 217 | output_raw = bytearray() |
215 | starttime = time.time() | 218 | starttime = time.time() |
219 | progress = time.time() | ||
216 | process = subprocess.Popen(command, **options) | 220 | process = subprocess.Popen(command, **options) |
217 | has_timeout = False | 221 | has_timeout = False |
222 | appendline = None | ||
218 | if timeout: | 223 | if timeout: |
219 | endtime = starttime + timeout | 224 | endtime = starttime + timeout |
220 | eof = False | 225 | eof = False |
221 | os.set_blocking(process.stdout.fileno(), False) | 226 | os.set_blocking(process.stdout.fileno(), False) |
222 | while not has_timeout and not eof: | 227 | while not has_timeout and not eof: |
223 | try: | 228 | try: |
224 | logger.debug('Waiting for process output: time: %s, endtime: %s' % (time.time(), endtime)) | ||
225 | if select.select([process.stdout], [], [], 5)[0] != []: | 229 | if select.select([process.stdout], [], [], 5)[0] != []: |
226 | # wait a bit for more data, tries to avoid reading single characters | 230 | # wait a bit for more data, tries to avoid reading single characters |
227 | time.sleep(0.2) | 231 | time.sleep(0.2) |
@@ -229,9 +233,9 @@ def SSHCall(command, logger, timeout=None, raw=False, **opts): | |||
229 | if not data: | 233 | if not data: |
230 | eof = True | 234 | eof = True |
231 | else: | 235 | else: |
232 | output_raw += data | 236 | output_raw.extend(data) |
233 | # ignore errors to capture as much as possible | 237 | # ignore errors to capture as much as possible |
234 | logger.debug('Partial data from SSH call:\n%s' % data.decode('utf-8', errors='ignore')) | 238 | #logger.debug('Partial data from SSH call:\n%s' % data.decode('utf-8', errors='ignore')) |
235 | endtime = time.time() + timeout | 239 | endtime = time.time() + timeout |
236 | except InterruptedError: | 240 | except InterruptedError: |
237 | logger.debug('InterruptedError') | 241 | logger.debug('InterruptedError') |
@@ -244,6 +248,10 @@ def SSHCall(command, logger, timeout=None, raw=False, **opts): | |||
244 | logger.debug('SSHCall has timeout! Time: %s, endtime: %s' % (time.time(), endtime)) | 248 | logger.debug('SSHCall has timeout! Time: %s, endtime: %s' % (time.time(), endtime)) |
245 | has_timeout = True | 249 | has_timeout = True |
246 | 250 | ||
251 | if time.time() >= (progress + 60): | ||
252 | logger.debug('Waiting for process output at time: %s with datasize: %s' % (time.time(), len(output_raw))) | ||
253 | progress = time.time() | ||
254 | |||
247 | process.stdout.close() | 255 | process.stdout.close() |
248 | 256 | ||
249 | # process hasn't returned yet | 257 | # process hasn't returned yet |
@@ -256,17 +264,29 @@ def SSHCall(command, logger, timeout=None, raw=False, **opts): | |||
256 | logger.debug('OSError when killing process') | 264 | logger.debug('OSError when killing process') |
257 | pass | 265 | pass |
258 | endtime = time.time() - starttime | 266 | endtime = time.time() - starttime |
259 | lastline = ("\nProcess killed - no output for %d seconds. Total" | 267 | appendline = ("\nProcess killed - no output for %d seconds. Total" |
260 | " running time: %d seconds." % (timeout, endtime)) | 268 | " running time: %d seconds." % (timeout, endtime)) |
261 | logger.debug('Received data from SSH call:\n%s ' % lastline) | 269 | logger.debug('Received data from SSH call:\n%s ' % appendline) |
262 | output += lastline | ||
263 | process.wait() | 270 | process.wait() |
264 | 271 | ||
272 | if raw: | ||
273 | output = bytes(output_raw) | ||
274 | if appendline: | ||
275 | output += bytes(appendline, "utf-8") | ||
276 | else: | ||
277 | output = output_raw.decode('utf-8', errors='ignore') | ||
278 | if appendline: | ||
279 | output += appendline | ||
265 | else: | 280 | else: |
266 | output_raw = process.communicate()[0] | 281 | output = output_raw = process.communicate()[0] |
267 | 282 | if not raw: | |
268 | output = output_raw if raw else output_raw.decode('utf-8', errors='ignore') | 283 | output = output_raw.decode('utf-8', errors='ignore') |
269 | logger.debug('Data from SSH call:\n%s' % output.rstrip()) | 284 | |
285 | if len(output) < (64 * 1024): | ||
286 | if output.rstrip(): | ||
287 | logger.debug('Data from SSH call:\n%s' % output.rstrip()) | ||
288 | else: | ||
289 | logger.debug('No output from SSH call') | ||
270 | 290 | ||
271 | # timout or not, make sure process exits and is not hanging | 291 | # timout or not, make sure process exits and is not hanging |
272 | if process.returncode == None: | 292 | if process.returncode == None: |