This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository python-x2go. commit cea41b3ca3dc7be6baa68eecead6d7c3877d2669 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Wed Jun 25 01:19:20 2014 +0200 Newly understand our own Paramiko/SSH forwarding tunnel code. Become aware of handling multiple connects on the same tunnel. --- debian/changelog | 2 ++ x2go/forward.py | 51 ++++++++++++++++++++++++++------------------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/debian/changelog b/debian/changelog index 8e0a24c..f63c5e7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -74,6 +74,8 @@ python-x2go (0.5.0.0-0x2go1) UNRELEASED; urgency=low good idea. NX should handle that instead (and does). - Better control the startup bootstrap of the Telekinesis client subsystem. + - Newly understand our own Paramiko/SSH forwarding tunnel code. Become + aware of handling multiple connects on the same tunnel. * debian/control: + Add dependencies: python-requests, python-simplejson. * python-x2go.spec: diff --git a/x2go/forward.py b/x2go/forward.py index 89f5df9..b633a50 100644 --- a/x2go/forward.py +++ b/x2go/forward.py @@ -43,7 +43,10 @@ class X2GoFwServer(StreamServer): through an external proxy command launched by a C{X2GoProxy*} backend. """ - def __init__ (self, listener, remote_host, remote_port, ssh_transport, session_instance=None, session_name=None, subsystem=None, logger=None, loglevel=log.loglevel_DEFAULT,): + def __init__ (self, listener, + remote_host, remote_port, + ssh_transport, session_instance=None, session_name=None, + subsystem=None, logger=None, loglevel=log.loglevel_DEFAULT,): """\ @param listener: listen on TCP/IP socket C{(<IP>, <Port>)} @type listener: C{tuple} @@ -75,7 +78,7 @@ class X2GoFwServer(StreamServer): self.chan = None self.is_active = False self.failed = False - self.keepalive = False + self.keepalive = None self.listener = listener self.chain_host = remote_host self.chain_port = remote_port @@ -88,6 +91,10 @@ class X2GoFwServer(StreamServer): StreamServer.__init__(self, self.listener, self.x2go_forward_tunnel_handle) + def start(self): + self.keepalive = True + return StreamServer.start(self) + def x2go_forward_tunnel_handle(self, fw_socket, address): """\ Handle for SSH/Paramiko forwarding tunnel. @@ -107,12 +114,7 @@ class X2GoFwServer(StreamServer): _count = 0 _maxwait = 20 - while not _success and _count < _maxwait: - - # it is recommended here to have passed on the session instance to this object... - if self.session_instance: - if not self.session_instance.is_connected(): - break + while not _success and _count < _maxwait and self.keepalive: _count += 1 try: @@ -122,35 +124,34 @@ class X2GoFwServer(StreamServer): chan_peername = self.chan.getpeername() _success = True except Exception, e: - self.logger('incoming request to %s:%d failed on attempt %d of %d: %s' % (self.chain_host, - self.chain_port, - _count, - _maxwait, - repr(e)), - loglevel=log.loglevel_WARN) + if self.keepalive: + self.logger('incoming request to %s:%d failed on attempt %d of %d: %s' % (self.chain_host, + self.chain_port, + _count, + _maxwait, + repr(e)), + loglevel=log.loglevel_WARN) gevent.sleep(.4) if not _success: - self.logger('incoming request to %s:%d failed after %d attempts' % (self.chain_host, - self.chain_port, - _count), - loglevel=log.loglevel_ERROR) - if self.session_instance: - self.session_instance.set_session_name(self.session_name) - self.session_instance.HOOK_forwarding_tunnel_setup_failed(chain_host=self.chain_host, chain_port=self.chain_port, subsystem=self.subsystem) + if self.keepalive: + self.logger('incoming request to %s:%d failed after %d attempts' % (self.chain_host, + self.chain_port, + _count), + loglevel=log.loglevel_ERROR) + if self.session_instance: + self.session_instance.set_session_name(self.session_name) + self.session_instance.HOOK_forwarding_tunnel_setup_failed(chain_host=self.chain_host, chain_port=self.chain_port, subsystem=self.subsystem) self.failed = True else: - self.logger('connected! Tunnel open %r -> %r (on master connection %r -> %r)' % ( self.listener, (self.chain_host, self.chain_port), self.fw_socket.getpeername(), chan_peername), loglevel=log.loglevel_INFO) - # once we are here, we can presume the tunnel to be active... self.is_active = True - self.keepalive = True try: while self.keepalive: r, w, x = select.select([self.fw_socket, self.chan], [], []) @@ -169,7 +170,6 @@ class X2GoFwServer(StreamServer): except socket.error: pass - self.is_active = False self.logger('Tunnel closed from %r' % (chan_peername,), loglevel=log.loglevel_INFO) @@ -216,6 +216,7 @@ class X2GoFwServer(StreamServer): Stop the forwarding tunnel. """ + self.is_active = False self.close_socket() StreamServer.stop(self) -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/python-x2go.git