write progress/status messages to stderr, not stdout
This should leave stdout clean for use in `foo | wormhole send --text=-` and `wormhole rx CODE >foo`, although the forms that want interactive code entry probably won't work that way. closes #99
This commit is contained in:
parent
64cdd426c0
commit
72dfb6eb1c
|
@ -42,7 +42,7 @@ class TwistedReceiver:
|
||||||
self._transit_receiver = None
|
self._transit_receiver = None
|
||||||
|
|
||||||
def _msg(self, *args, **kwargs):
|
def _msg(self, *args, **kwargs):
|
||||||
print(*args, file=self.args.stdout, **kwargs)
|
print(*args, file=self.args.stderr, **kwargs)
|
||||||
|
|
||||||
@inlineCallbacks
|
@inlineCallbacks
|
||||||
def go(self):
|
def go(self):
|
||||||
|
@ -201,7 +201,7 @@ class TwistedReceiver:
|
||||||
|
|
||||||
def _handle_text(self, them_d, w):
|
def _handle_text(self, them_d, w):
|
||||||
# we're receiving a text message
|
# we're receiving a text message
|
||||||
self._msg(them_d["message"])
|
print(them_d["message"], file=self.args.stdout)
|
||||||
self._send_data({"answer": {"message_ack": "ok"}}, w)
|
self._send_data({"answer": {"message_ack": "ok"}}, w)
|
||||||
|
|
||||||
def _handle_file(self, them_d):
|
def _handle_file(self, them_d):
|
||||||
|
@ -283,7 +283,7 @@ class TwistedReceiver:
|
||||||
self._msg(u"Receiving (%s).." % record_pipe.describe())
|
self._msg(u"Receiving (%s).." % record_pipe.describe())
|
||||||
|
|
||||||
with self.args.timing.add("rx file"):
|
with self.args.timing.add("rx file"):
|
||||||
progress = tqdm(file=self.args.stdout,
|
progress = tqdm(file=self.args.stderr,
|
||||||
disable=self.args.hide_progress,
|
disable=self.args.hide_progress,
|
||||||
unit="B", unit_scale=True, total=self.xfersize)
|
unit="B", unit_scale=True, total=self.xfersize)
|
||||||
hasher = hashlib.sha256()
|
hasher = hashlib.sha256()
|
||||||
|
|
|
@ -74,7 +74,7 @@ class Sender:
|
||||||
other_cmd += " -0"
|
other_cmd += " -0"
|
||||||
|
|
||||||
print(u"On the other computer, please run: %s" % other_cmd,
|
print(u"On the other computer, please run: %s" % other_cmd,
|
||||||
file=args.stdout)
|
file=args.stderr)
|
||||||
|
|
||||||
if args.code:
|
if args.code:
|
||||||
w.set_code(args.code)
|
w.set_code(args.code)
|
||||||
|
@ -83,10 +83,10 @@ class Sender:
|
||||||
code = yield w.get_code(args.code_length)
|
code = yield w.get_code(args.code_length)
|
||||||
|
|
||||||
if not args.zeromode:
|
if not args.zeromode:
|
||||||
print(u"Wormhole code is: %s" % code, file=args.stdout)
|
print(u"Wormhole code is: %s" % code, file=args.stderr)
|
||||||
# flush stdout so the code is displayed immediately
|
# flush stderr so the code is displayed immediately
|
||||||
args.stdout.flush()
|
args.stderr.flush()
|
||||||
print(u"", file=args.stdout)
|
print(u"", file=args.stderr)
|
||||||
|
|
||||||
yield w.establish_key()
|
yield w.establish_key()
|
||||||
def on_slow_connection():
|
def on_slow_connection():
|
||||||
|
@ -176,14 +176,14 @@ class Sender:
|
||||||
args = self._args
|
args = self._args
|
||||||
text = args.text
|
text = args.text
|
||||||
if text == "-":
|
if text == "-":
|
||||||
print(u"Reading text message from stdin..", file=args.stdout)
|
print(u"Reading text message from stdin..", file=args.stderr)
|
||||||
text = sys.stdin.read()
|
text = sys.stdin.read()
|
||||||
if not text and not args.what:
|
if not text and not args.what:
|
||||||
text = six.moves.input("Text to send: ")
|
text = six.moves.input("Text to send: ")
|
||||||
|
|
||||||
if text is not None:
|
if text is not None:
|
||||||
print(u"Sending text message (%s)" % naturalsize(len(text)),
|
print(u"Sending text message (%s)" % naturalsize(len(text)),
|
||||||
file=args.stdout)
|
file=args.stderr)
|
||||||
offer = { "message": text }
|
offer = { "message": text }
|
||||||
fd_to_send = None
|
fd_to_send = None
|
||||||
return offer, fd_to_send
|
return offer, fd_to_send
|
||||||
|
@ -204,12 +204,12 @@ class Sender:
|
||||||
}
|
}
|
||||||
print(u"Sending %s file named '%s'"
|
print(u"Sending %s file named '%s'"
|
||||||
% (naturalsize(filesize), basename),
|
% (naturalsize(filesize), basename),
|
||||||
file=args.stdout)
|
file=args.stderr)
|
||||||
fd_to_send = open(what, "rb")
|
fd_to_send = open(what, "rb")
|
||||||
return offer, fd_to_send
|
return offer, fd_to_send
|
||||||
|
|
||||||
if os.path.isdir(what):
|
if os.path.isdir(what):
|
||||||
print(u"Building zipfile..", file=args.stdout)
|
print(u"Building zipfile..", file=args.stderr)
|
||||||
# We're sending a directory. Create a zipfile in a tempdir and
|
# We're sending a directory. Create a zipfile in a tempdir and
|
||||||
# send that.
|
# send that.
|
||||||
fd_to_send = tempfile.SpooledTemporaryFile()
|
fd_to_send = tempfile.SpooledTemporaryFile()
|
||||||
|
@ -239,7 +239,7 @@ class Sender:
|
||||||
"numfiles": num_files,
|
"numfiles": num_files,
|
||||||
}
|
}
|
||||||
print(u"Sending directory (%s compressed) named '%s'"
|
print(u"Sending directory (%s compressed) named '%s'"
|
||||||
% (naturalsize(filesize), basename), file=args.stdout)
|
% (naturalsize(filesize), basename), file=args.stderr)
|
||||||
return offer, fd_to_send
|
return offer, fd_to_send
|
||||||
|
|
||||||
raise TypeError("'%s' is neither file nor directory" % args.what)
|
raise TypeError("'%s' is neither file nor directory" % args.what)
|
||||||
|
@ -248,7 +248,7 @@ class Sender:
|
||||||
def _handle_answer(self, them_answer):
|
def _handle_answer(self, them_answer):
|
||||||
if self._fd_to_send is None:
|
if self._fd_to_send is None:
|
||||||
if them_answer["message_ack"] == "ok":
|
if them_answer["message_ack"] == "ok":
|
||||||
print(u"text message sent", file=self._args.stdout)
|
print(u"text message sent", file=self._args.stderr)
|
||||||
returnValue(None) # terminates this function
|
returnValue(None) # terminates this function
|
||||||
raise TransferError("error sending text: %r" % (them_answer,))
|
raise TransferError("error sending text: %r" % (them_answer,))
|
||||||
|
|
||||||
|
@ -270,11 +270,11 @@ class Sender:
|
||||||
record_pipe = yield ts.connect()
|
record_pipe = yield ts.connect()
|
||||||
self._timing.add("transit connected")
|
self._timing.add("transit connected")
|
||||||
# record_pipe should implement IConsumer, chunks are just records
|
# record_pipe should implement IConsumer, chunks are just records
|
||||||
stdout = self._args.stdout
|
stderr = self._args.stderr
|
||||||
print(u"Sending (%s).." % record_pipe.describe(), file=stdout)
|
print(u"Sending (%s).." % record_pipe.describe(), file=stderr)
|
||||||
|
|
||||||
hasher = hashlib.sha256()
|
hasher = hashlib.sha256()
|
||||||
progress = tqdm(file=stdout, disable=self._args.hide_progress,
|
progress = tqdm(file=stderr, disable=self._args.hide_progress,
|
||||||
unit="B", unit_scale=True,
|
unit="B", unit_scale=True,
|
||||||
total=filesize)
|
total=filesize)
|
||||||
def _count_and_hash(data):
|
def _count_and_hash(data):
|
||||||
|
@ -290,7 +290,7 @@ class Sender:
|
||||||
|
|
||||||
expected_hash = hasher.digest()
|
expected_hash = hasher.digest()
|
||||||
expected_hex = bytes_to_hexstr(expected_hash)
|
expected_hex = bytes_to_hexstr(expected_hash)
|
||||||
print(u"File sent.. waiting for confirmation", file=stdout)
|
print(u"File sent.. waiting for confirmation", file=stderr)
|
||||||
with self._timing.add("get ack") as t:
|
with self._timing.add("get ack") as t:
|
||||||
ack_bytes = yield record_pipe.receive_record()
|
ack_bytes = yield record_pipe.receive_record()
|
||||||
record_pipe.close()
|
record_pipe.close()
|
||||||
|
@ -303,5 +303,5 @@ class Sender:
|
||||||
if ack[u"sha256"] != expected_hex:
|
if ack[u"sha256"] != expected_hex:
|
||||||
t.detail(datahash="failed")
|
t.detail(datahash="failed")
|
||||||
raise TransferError("Transfer failed (bad remote hash)")
|
raise TransferError("Transfer failed (bad remote hash)")
|
||||||
print(u"Confirmation received. Transfer complete.", file=stdout)
|
print(u"Confirmation received. Transfer complete.", file=stderr)
|
||||||
t.detail(ack="ok")
|
t.detail(ack="ok")
|
||||||
|
|
|
@ -367,18 +367,11 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
|
|
||||||
self.maxDiff = None # show full output for assertion failures
|
self.maxDiff = None # show full output for assertion failures
|
||||||
|
|
||||||
if mode != "slow-text":
|
key_established = ""
|
||||||
self.failUnlessEqual(send_stderr, "",
|
if mode == "slow-text":
|
||||||
(send_stdout, send_stderr))
|
key_established = "Key established, waiting for confirmation...\n"
|
||||||
self.failUnlessEqual(receive_stderr, "",
|
|
||||||
(receive_stdout, receive_stderr))
|
self.assertEqual(send_stdout, "")
|
||||||
else:
|
|
||||||
self.assertEqual(send_stderr,
|
|
||||||
"Key established, waiting for confirmation...\n",
|
|
||||||
(send_stdout, send_stderr))
|
|
||||||
self.assertEqual(receive_stderr,
|
|
||||||
"Key established, waiting for confirmation...\n",
|
|
||||||
(receive_stdout, receive_stderr))
|
|
||||||
|
|
||||||
# check sender
|
# check sender
|
||||||
if mode == "text" or mode == "slow-text":
|
if mode == "text" or mode == "slow-text":
|
||||||
|
@ -386,53 +379,58 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
"On the other computer, please run: "
|
"On the other computer, please run: "
|
||||||
"wormhole receive{NL}"
|
"wormhole receive{NL}"
|
||||||
"Wormhole code is: {code}{NL}{NL}"
|
"Wormhole code is: {code}{NL}{NL}"
|
||||||
|
"{KE}"
|
||||||
"text message sent{NL}").format(bytes=len(message),
|
"text message sent{NL}").format(bytes=len(message),
|
||||||
code=send_cfg.code,
|
code=send_cfg.code,
|
||||||
NL=NL)
|
NL=NL,
|
||||||
self.failUnlessEqual(send_stdout, expected)
|
KE=key_established)
|
||||||
|
self.failUnlessEqual(send_stderr, expected)
|
||||||
elif mode == "file":
|
elif mode == "file":
|
||||||
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
||||||
.format(size=naturalsize(len(message)),
|
.format(size=naturalsize(len(message)),
|
||||||
name=send_filename,
|
name=send_filename,
|
||||||
NL=NL), send_stdout)
|
NL=NL), send_stderr)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
"wormhole receive{NL}"
|
"wormhole receive{NL}"
|
||||||
"Wormhole code is: {code}{NL}{NL}"
|
"Wormhole code is: {code}{NL}{NL}"
|
||||||
.format(code=send_cfg.code, NL=NL),
|
.format(code=send_cfg.code, NL=NL),
|
||||||
send_stdout)
|
send_stderr)
|
||||||
self.failUnlessIn("File sent.. waiting for confirmation{NL}"
|
self.failUnlessIn("File sent.. waiting for confirmation{NL}"
|
||||||
"Confirmation received. Transfer complete.{NL}"
|
"Confirmation received. Transfer complete.{NL}"
|
||||||
.format(NL=NL), send_stdout)
|
.format(NL=NL), send_stderr)
|
||||||
elif mode == "directory":
|
elif mode == "directory":
|
||||||
self.failUnlessIn("Sending directory", send_stdout)
|
self.failUnlessIn("Sending directory", send_stderr)
|
||||||
self.failUnlessIn("named 'testdir'", send_stdout)
|
self.failUnlessIn("named 'testdir'", send_stderr)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
"wormhole receive{NL}"
|
"wormhole receive{NL}"
|
||||||
"Wormhole code is: {code}{NL}{NL}"
|
"Wormhole code is: {code}{NL}{NL}"
|
||||||
.format(code=send_cfg.code, NL=NL), send_stdout)
|
.format(code=send_cfg.code, NL=NL), send_stderr)
|
||||||
self.failUnlessIn("File sent.. waiting for confirmation{NL}"
|
self.failUnlessIn("File sent.. waiting for confirmation{NL}"
|
||||||
"Confirmation received. Transfer complete.{NL}"
|
"Confirmation received. Transfer complete.{NL}"
|
||||||
.format(NL=NL), send_stdout)
|
.format(NL=NL), send_stderr)
|
||||||
|
|
||||||
# check receiver
|
# check receiver
|
||||||
if mode == "text" or mode == "slow-text":
|
if mode == "text" or mode == "slow-text":
|
||||||
self.failUnlessEqual(receive_stdout, message+NL)
|
self.assertEqual(receive_stdout, message+NL)
|
||||||
|
self.assertEqual(receive_stderr, key_established)
|
||||||
elif mode == "file":
|
elif mode == "file":
|
||||||
|
self.failUnlessEqual(receive_stdout, "")
|
||||||
self.failUnlessIn("Receiving file ({size:s}) into: {name}"
|
self.failUnlessIn("Receiving file ({size:s}) into: {name}"
|
||||||
.format(size=naturalsize(len(message)),
|
.format(size=naturalsize(len(message)),
|
||||||
name=receive_filename), receive_stdout)
|
name=receive_filename), receive_stderr)
|
||||||
self.failUnlessIn("Received file written to ", receive_stdout)
|
self.failUnlessIn("Received file written to ", receive_stderr)
|
||||||
fn = os.path.join(receive_dir, receive_filename)
|
fn = os.path.join(receive_dir, receive_filename)
|
||||||
self.failUnless(os.path.exists(fn))
|
self.failUnless(os.path.exists(fn))
|
||||||
with open(fn, "r") as f:
|
with open(fn, "r") as f:
|
||||||
self.failUnlessEqual(f.read(), message)
|
self.failUnlessEqual(f.read(), message)
|
||||||
elif mode == "directory":
|
elif mode == "directory":
|
||||||
|
self.failUnlessEqual(receive_stdout, "")
|
||||||
want = (r"Receiving directory \(\d+ \w+\) into: {name}/"
|
want = (r"Receiving directory \(\d+ \w+\) into: {name}/"
|
||||||
.format(name=receive_dirname))
|
.format(name=receive_dirname))
|
||||||
self.failUnless(re.search(want, receive_stdout),
|
self.failUnless(re.search(want, receive_stderr),
|
||||||
(want, receive_stdout))
|
(want, receive_stderr))
|
||||||
self.failUnlessIn("Received files written to {name}"
|
self.failUnlessIn("Received files written to {name}"
|
||||||
.format(name=receive_dirname), receive_stdout)
|
.format(name=receive_dirname), receive_stderr)
|
||||||
fn = os.path.join(receive_dir, receive_dirname)
|
fn = os.path.join(receive_dir, receive_dirname)
|
||||||
self.failUnless(os.path.exists(fn), fn)
|
self.failUnless(os.path.exists(fn), fn)
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
|
@ -547,62 +545,60 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
|
|
||||||
self.maxDiff = None # show full output for assertion failures
|
self.maxDiff = None # show full output for assertion failures
|
||||||
|
|
||||||
self.failUnlessEqual(send_stderr, "",
|
self.assertEqual(send_stdout, "")
|
||||||
(send_stdout, send_stderr))
|
self.assertEqual(receive_stdout, "")
|
||||||
self.failUnlessEqual(receive_stderr, "",
|
|
||||||
(receive_stdout, receive_stderr))
|
|
||||||
|
|
||||||
# check sender
|
# check sender
|
||||||
if mode == "file":
|
if mode == "file":
|
||||||
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
||||||
.format(size=naturalsize(size),
|
.format(size=naturalsize(size),
|
||||||
name=send_filename,
|
name=send_filename,
|
||||||
NL=NL), send_stdout)
|
NL=NL), send_stderr)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
"wormhole receive{NL}"
|
"wormhole receive{NL}"
|
||||||
"Wormhole code is: {code}{NL}{NL}"
|
"Wormhole code is: {code}{NL}{NL}"
|
||||||
.format(code=send_cfg.code, NL=NL),
|
.format(code=send_cfg.code, NL=NL),
|
||||||
send_stdout)
|
send_stderr)
|
||||||
self.failIfIn("File sent.. waiting for confirmation{NL}"
|
self.failIfIn("File sent.. waiting for confirmation{NL}"
|
||||||
"Confirmation received. Transfer complete.{NL}"
|
"Confirmation received. Transfer complete.{NL}"
|
||||||
.format(NL=NL), send_stdout)
|
.format(NL=NL), send_stderr)
|
||||||
elif mode == "directory":
|
elif mode == "directory":
|
||||||
self.failUnlessIn("Sending directory", send_stdout)
|
self.failUnlessIn("Sending directory", send_stderr)
|
||||||
self.failUnlessIn("named 'testdir'", send_stdout)
|
self.failUnlessIn("named 'testdir'", send_stderr)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
"wormhole receive{NL}"
|
"wormhole receive{NL}"
|
||||||
"Wormhole code is: {code}{NL}{NL}"
|
"Wormhole code is: {code}{NL}{NL}"
|
||||||
.format(code=send_cfg.code, NL=NL), send_stdout)
|
.format(code=send_cfg.code, NL=NL), send_stderr)
|
||||||
self.failIfIn("File sent.. waiting for confirmation{NL}"
|
self.failIfIn("File sent.. waiting for confirmation{NL}"
|
||||||
"Confirmation received. Transfer complete.{NL}"
|
"Confirmation received. Transfer complete.{NL}"
|
||||||
.format(NL=NL), send_stdout)
|
.format(NL=NL), send_stderr)
|
||||||
|
|
||||||
# check receiver
|
# check receiver
|
||||||
if mode == "file":
|
if mode == "file":
|
||||||
self.failIfIn("Received file written to ", receive_stdout)
|
self.failIfIn("Received file written to ", receive_stderr)
|
||||||
if failmode == "noclobber":
|
if failmode == "noclobber":
|
||||||
self.failUnlessIn("Error: "
|
self.failUnlessIn("Error: "
|
||||||
"refusing to overwrite existing 'testfile'{NL}"
|
"refusing to overwrite existing 'testfile'{NL}"
|
||||||
.format(NL=NL), receive_stdout)
|
.format(NL=NL), receive_stderr)
|
||||||
else:
|
else:
|
||||||
self.failUnlessIn("Error: "
|
self.failUnlessIn("Error: "
|
||||||
"insufficient free space (0B) for file ({size:d}B){NL}"
|
"insufficient free space (0B) for file ({size:d}B){NL}"
|
||||||
.format(NL=NL, size=size), receive_stdout)
|
.format(NL=NL, size=size), receive_stderr)
|
||||||
elif mode == "directory":
|
elif mode == "directory":
|
||||||
self.failIfIn("Received files written to {name}"
|
self.failIfIn("Received files written to {name}"
|
||||||
.format(name=receive_name), receive_stdout)
|
.format(name=receive_name), receive_stderr)
|
||||||
#want = (r"Receiving directory \(\d+ \w+\) into: {name}/"
|
#want = (r"Receiving directory \(\d+ \w+\) into: {name}/"
|
||||||
# .format(name=receive_name))
|
# .format(name=receive_name))
|
||||||
#self.failUnless(re.search(want, receive_stdout),
|
#self.failUnless(re.search(want, receive_stderr),
|
||||||
# (want, receive_stdout))
|
# (want, receive_stderr))
|
||||||
if failmode == "noclobber":
|
if failmode == "noclobber":
|
||||||
self.failUnlessIn("Error: "
|
self.failUnlessIn("Error: "
|
||||||
"refusing to overwrite existing 'testdir'{NL}"
|
"refusing to overwrite existing 'testdir'{NL}"
|
||||||
.format(NL=NL), receive_stdout)
|
.format(NL=NL), receive_stderr)
|
||||||
else:
|
else:
|
||||||
self.failUnlessIn("Error: "
|
self.failUnlessIn("Error: "
|
||||||
"insufficient free space (0B) for directory ({size:d}B){NL}"
|
"insufficient free space (0B) for directory ({size:d}B){NL}"
|
||||||
.format(NL=NL, size=size), receive_stdout)
|
.format(NL=NL, size=size), receive_stderr)
|
||||||
|
|
||||||
if failmode == "noclobber":
|
if failmode == "noclobber":
|
||||||
fn = os.path.join(receive_dir, receive_name)
|
fn = os.path.join(receive_dir, receive_name)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user