From 58f3d7074fa1c00e3cfcfe47ec405fcfa31851a3 Mon Sep 17 00:00:00 2001 From: Ari Brown Date: Thu, 25 Jul 2024 08:51:47 -0400 Subject: [PATCH] fixed watch, ensured flushing of everything --- minerva/remote.py | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/minerva/remote.py b/minerva/remote.py index f3fb7aa..b773fe9 100644 --- a/minerva/remote.py +++ b/minerva/remote.py @@ -1,10 +1,19 @@ from fabric import Connection import os +import sys import threading import select import tempfile import io + +def flush_data(data, pipe, display=None): + pipe.write(data) + pipe.flush() + if display: + display.write(data) + display.flush() + # Bare machine, not necessarily associated with AWS class Remote: def __init__(self, @@ -77,8 +86,13 @@ class Remote: channel.shutdown_write() # read stdout/stderr to prevent read block hangs - out.write(channel.recv(len(channel.in_buffer))) - err.write(channel.recv_stderr(len(channel.in_stderr_buffer))) + flush_data(channel.recv(len(channel.in_buffer)), + out, + (watch and sys.stdout.buffer)) + + flush_data(channel.recv_stderr(len(channel.in_stderr_buffer)), + err, + (watch and sys.stderr.buffer)) timeout = 60 @@ -96,21 +110,16 @@ class Remote: break for c in readq: if c.recv_ready(): - data = channel.recv(len(c.in_buffer)) - out.write(data) - out.flush() + flush_data(channel.recv(len(c.in_buffer)), + out, + (watch and sys.stdout.buffer)) got_chunk = True - if watch: - sys.stdout.write(data) if c.recv_stderr_ready(): - data = channel.recv_stderr(len(c.in_stderr_buffer)) - err.write(data) - err.flush() + flush_data(channel.recv_stderr(len(c.in_stderr_buffer)), + err, + (watch and sys.stderr.buffer)) got_chunk = True - - if watch: - sys.stderr.write(data) # for c """ @@ -144,7 +153,6 @@ class Remote: thread.start() if not disown: - print("joining") thread.join() return (open(out.name, "rb"), open(err.name, "rb"), thread)