[py-svn] r37790 - in py/trunk/py/execnet: . testing

hpk at codespeak.net hpk at codespeak.net
Fri Feb 2 02:44:33 CET 2007


Author: hpk
Date: Fri Feb  2 02:44:31 2007
New Revision: 37790

Modified:
   py/trunk/py/execnet/register.py
   py/trunk/py/execnet/testing/test_gateway.py
Log:
fix Ssh remote sanitzing of FD 1 and 0 and factor
out the code in a function


Modified: py/trunk/py/execnet/register.py
==============================================================================
--- py/trunk/py/execnet/register.py	(original)
+++ py/trunk/py/execnet/register.py	Fri Feb  2 02:44:31 2007
@@ -97,33 +97,8 @@
         s = "\n".join([extra, 
             "import sys ; sys.path[:0] = %r" % (plist,), 
             "import os ; os.environ['PYTHONPATH'] = %r" % ppath, 
-            # redirect file descriptors 0 and 1 to /dev/null, to avoid
-            # complete confusion (this is independent from the sys.stdout
-            # and sys.stderr redirection that gateway.remote_exec() can do)
-            # note that we redirect fd 2 on win too, since for some reason that
-            # blocks there, while it works (sending to stderr if possible else
-            # ignoring) on *nix
-            str(py.code.Source("""
-                try:
-                    devnull = os.devnull
-                except AttributeError:
-                    if os.name == 'nt':
-                        devnull = 'NUL'
-                    else:
-                        devnull = '/dev/null'
-                sys.stdin  = os.fdopen(os.dup(0), 'rb', 0)
-                sys.stdout = os.fdopen(os.dup(1), 'wb', 0)
-                if os.name == 'nt':
-                    sys.stderr = os.fdopen(os.dup(2), 'wb', 0)
-                fd = os.open(devnull, os.O_RDONLY)
-                os.dup2(fd, 0)
-                os.close(fd)
-                fd = os.open(devnull, os.O_WRONLY)
-                os.dup2(fd, 1)
-                if os.name == 'nt':
-                    os.dup2(fd, 2)
-                os.close(fd)
-            """)),
+            str(py.code.Source(stdouterrin_setnull)), 
+            "stdouterrin_setnull()",
             ""
             ])
         super(PopenGateway, self)._remote_bootstrap_gateway(io, s)
@@ -176,6 +151,46 @@
             cmd += ' -i %s' % (identity,)
         cmdline.insert(0, cmd) 
         super(SshGateway, self).__init__(' '.join(cmdline))
+       
+    def _remote_bootstrap_gateway(self, io, s=""): 
+        extra = "\n".join([
+            str(py.code.Source(stdouterrin_setnull)), 
+            "stdouterrin_setnull()",
+            s, 
+        ])
+        super(SshGateway, self)._remote_bootstrap_gateway(io, extra)
+
+def stdouterrin_setnull():
+    # redirect file descriptors 0 and 1 to /dev/null, to avoid
+    # complete confusion (this is independent from the sys.stdout
+    # and sys.stderr redirection that gateway.remote_exec() can do)
+    # note that we redirect fd 2 on win too, since for some reason that
+    # blocks there, while it works (sending to stderr if possible else
+    # ignoring) on *nix
+    import sys, os
+    try:
+        devnull = os.devnull
+    except AttributeError:
+        if os.name == 'nt':
+            devnull = 'NUL'
+        else:
+            devnull = '/dev/null'
+    sys.stdin  = os.fdopen(os.dup(0), 'rb', 0)
+    sys.stdout = os.fdopen(os.dup(1), 'wb', 0)
+    if os.name == 'nt':
+        sys.stderr = os.fdopen(os.dup(2), 'wb', 0)
+    fd = os.open(devnull, os.O_RDONLY)
+    os.dup2(fd, 0)
+    os.close(fd)
+    fd = os.open(devnull, os.O_WRONLY)
+    os.dup2(fd, 1)
+    if os.name == 'nt':
+        os.dup2(fd, 2)
+    os.close(fd)
+
+# XXX
+# XXX unusued code below
+# XXX
 
 class ExecGateway(PopenGateway):
     def remote_exec_sync_stdcapture(self, lines, callback):
@@ -224,3 +239,4 @@
         callback = self.callbacks[answerid]
         del self.callbacks[answerid]
         callback(value)
+

Modified: py/trunk/py/execnet/testing/test_gateway.py
==============================================================================
--- py/trunk/py/execnet/testing/test_gateway.py	(original)
+++ py/trunk/py/execnet/testing/test_gateway.py	Fri Feb  2 02:44:31 2007
@@ -25,6 +25,20 @@
                                      (name, dottedname, olddottedname)) 
                 seen[name] = (dottedname, value) 
 
+def test_stdouterrin_setnull():
+    cap = py.io.StdCaptureFD()
+    from py.__.execnet.register import stdouterrin_setnull
+    stdouterrin_setnull()
+    import os
+    os.write(1, "hello")
+    if os.name == "nt":
+        os.write(2, "world")
+    os.read(0, 1)
+    out, err = cap.reset()
+    assert not out
+    assert not err
+
+
 class TestMessage:
     def test_wire_protocol(self):
         for cls in gateway.Message._types.values():
@@ -177,12 +191,12 @@
 
         # check that the both sides previous channels are really gone
         channel.waitclose(0.3)
-        assert channel.id not in self.gw._channelfactory._channels
         #assert c.id not in self.gw._channelfactory
         newchan = self.gw.remote_exec('''
                     assert %d not in channel.gateway._channelfactory._channels
                   ''' % (channel.id))
         newchan.waitclose(0.3)
+        assert channel.id not in self.gw._channelfactory._channels
 
     def test_channel_receiver_callback(self): 
         l = []
@@ -454,9 +468,6 @@
             py.test.skip("no known ssh target, use -S to set one")
         cls.gw = py.execnet.SshGateway(option.sshtarget) 
 
-    def test_confusion_from_os_write_stdout(self):
-        py.test.skip("writing to FD 1 with SshGateways not supported yet")
-
     def test_sshaddress(self):
         assert self.gw.remoteaddress == option.sshtarget
 



More information about the pytest-commit mailing list