changeset 36526:7cc4a9b9732a

wireprotoserver: support logging SSH server I/O to a file descriptor We will soon introduce a debug command and tests for low-level I/O behavior of the SSH wire protocol. To facilitate this, we need to instrument the SSH server so it can log its I/O as events occur. We teach the SSH server to convert its stdout and stderr file objects into file object proxies. We configure these proxies to log to a file descriptor whose file number is specified via a config option. The idea is to have a future debug command start the SSH server process with access to an extra file descriptor that can be used by the server process to log I/O. Monitoring only the write I/O will be more robust than monitoring both writes and reads from the client process because read operations are not deterministic. This will matter for tests that capture raw I/O activity. Differential Revision: https://phab.mercurial-scm.org/D2463
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 25 Feb 2018 11:16:09 -0800
parents 3158052720ae
children 44dc34b8d17b
files mercurial/wireprotoserver.py
diffstat 1 files changed, 8 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/wireprotoserver.py	Sat Feb 24 12:24:03 2018 -0800
+++ b/mercurial/wireprotoserver.py	Sun Feb 25 11:16:09 2018 -0800
@@ -588,12 +588,19 @@
                                          state)
 
 class sshserver(object):
-    def __init__(self, ui, repo):
+    def __init__(self, ui, repo, logfh=None):
         self._ui = ui
         self._repo = repo
         self._fin = ui.fin
         self._fout = ui.fout
 
+        # Log write I/O to stdout and stderr if configured.
+        if logfh:
+            self._fout = util.makeloggingfileobject(
+                logfh, self._fout, 'o', logdata=True)
+            ui.ferr = util.makeloggingfileobject(
+                logfh, ui.ferr, 'e', logdata=True)
+
         hook.redirect(True)
         ui.fout = repo.ui.fout = ui.ferr