[X2go-Commits] python-x2go.git - master (branch) updated: 0.1.1.4-243-gf3de332
X2Go dev team
git-admin at x2go.org
Sat May 26 19:56:32 CEST 2012
The branch, master has been updated
via f3de332ae4b466bb329df00f31ca9eb92b44ba3c (commit)
from 63ac948ac2d787b9d82dc086d316f7c7b1246cf3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit f3de332ae4b466bb329df00f31ca9eb92b44ba3c
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Sat May 26 19:56:23 2012 +0200
Fix local folder sharing when the master session changes during runtime.
-----------------------------------------------------------------------
Summary of changes:
debian/changelog | 1 +
x2go/backends/control/_stdout.py | 26 +++++++++++++-------------
x2go/registry.py | 10 ++++++----
x2go/rforward.py | 2 +-
x2go/session.py | 9 ++++++---
5 files changed, 27 insertions(+), 21 deletions(-)
The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index 98d3ae5..3e16857 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -134,6 +134,7 @@ python-x2go (0.1.2.0-0~x2go1) UNRELEASED; urgency=low
- Catch session startup failures due to faulty port forwarding tunnels
and make the notifiable via hooks.
- Properly set setkbd value for x2gostartagent and x2goresume-session.
+ - Fix local folder sharing when the master session changes during runtime.
* Depend on python-xlib.
-- Mike Gabriel <mike.gabriel at das-netzwerkteam.de> Sat, 28 Sep 2012 01:44:21 +0100
diff --git a/x2go/backends/control/_stdout.py b/x2go/backends/control/_stdout.py
index 74c2350..e249cc4 100644
--- a/x2go/backends/control/_stdout.py
+++ b/x2go/backends/control/_stdout.py
@@ -174,6 +174,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
self.logger('sFTP-put: %s -> %s:%s' % (os.path.normpath(local_path), self.remote_peername(), remote_path), loglevel=log.loglevel_DEBUG)
try:
+ while self.sftp_client is None:
+ gevent.sleep(.1)
self.sftp_client.put(os.path.normpath(local_path), remote_path)
except x2go_exceptions.SSHException:
# react to connection dropped error for SSH connections
@@ -183,6 +185,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
self.logger('sFTP-write: opening remote file %s on host %s for writing' % (remote_path, self.remote_peername()), loglevel=log.loglevel_DEBUG)
try:
+ while self.sftp_client is None:
+ gevent.sleep(.1)
remote_fileobj = self.sftp_client.open(remote_path, 'w')
self.logger('sFTP-write: writing content: %s' % content, loglevel=log.loglevel_DEBUG_SFTPXFER)
remote_fileobj.write(content)
@@ -193,6 +197,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
def _x2go_sftp_remove(self, remote_path):
self.logger('sFTP-write: removing remote file %s on host %s' % (remote_path, self.remote_peername()), loglevel=log.loglevel_DEBUG)
+ while self.sftp_client is None:
+ gevent.sleep(.1)
self.sftp_client.remove(remote_path)
def _x2go_exec_command(self, cmd_line, loglevel=log.loglevel_INFO, timeout=20, **kwargs):
@@ -207,10 +213,12 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
cmd = " ".join(cmd_line)
else:
cmd = cmd_line
- if self.get_transport() is not None:
+ ssh_transport = self.get_transport()
+ if ssh_transport is not None:
timer = gevent.Timeout(timeout)
timer.start()
+ self.sftp_client = None
try:
self.logger("executing command on X2Go server ,,%s'': %s" % (self.profile_name, _rerewrite_blanks(cmd)), loglevel)
_retval = self.exec_command(_rewrite_password(cmd, user=self.get_transport().get_username(), password=self._session_password), **kwargs)
@@ -247,6 +255,7 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
finally:
self.locked = False
timer.cancel()
+ self.sftp_client = paramiko.SFTPClient.from_transport(ssh_transport)
else:
self.locked = False
@@ -448,12 +457,6 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
gevent.sleep(.1)
port = self.sshproxy_session.get_local_proxy_port()
- if not add_to_known_hosts and session_instance:
- self.set_missing_host_key_policy(checkhosts.X2goInteractiveAddPolicy(caller=self, session_instance=session_instance))
-
- if add_to_known_hosts:
- self.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-
# disable pub/priv key authentication if forced
if force_password_auth:
key_filename = None
@@ -538,16 +541,13 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
self.hostname = hostname
self.port = port
- # if we succeed, we immediately grab us an sFTP client session
- try:
- self.sftp_client = self.open_sftp()
- except:
- raise x2go_exceptions.X2goControlSessionException('could not invoke server-side SFTP subsystem')
-
# preparing reverse tunnels
ssh_transport = self.get_transport()
ssh_transport.reverse_tunnels = {}
+ # if we succeed, we use the same credentials to create a second transport for sFTP client access
+ self.sftp_client = paramiko.SFTPClient.from_transport(ssh_transport)
+
# mark Paramiko/SSH transport as X2goControlSession
ssh_transport._x2go_session_marker = True
self._session_password = password
diff --git a/x2go/registry.py b/x2go/registry.py
index 0b25e4d..7b174a1 100644
--- a/x2go/registry.py
+++ b/x2go/registry.py
@@ -344,16 +344,16 @@ class X2goSessionRegistry(object):
for _r_a_s in _running_associated_sessions:
if _r_a_s.is_desktop_session():
self.master_sessions[_profile_name] = _r_a_s
- _r_a_s.set_master_session()
+ _r_a_s.set_master_session(wait=1)
break
if not self.master_sessions.has_key(_profile_name):
_pubapp_associated_sessions = self.pubapp_sessions_of_profile_name(_profile_name, return_objects=True)
if _pubapp_associated_sessions:
self.master_sessions[_profile_name] = _pubapp_associated_sessions[0]
- _pubapp_associated_sessions[0].set_master_session()
+ _pubapp_associated_sessions[0].set_master_session(wait=1)
else:
self.master_sessions[_profile_name] = _running_associated_sessions[0]
- _running_associated_sessions[0].set_master_session()
+ _running_associated_sessions[0].set_master_session(wait=1)
return True
@@ -492,9 +492,10 @@ class X2goSessionRegistry(object):
# when starting a new session, we will try to use unused registered virgin sessions
# depending on your application layout, there should either be one or no such virgin session at all
- _virgin_sessions = self.virgin_sessions_of_profile_name(profile_name, return_objects=True)
+ _virgin_sessions = [ s for s in self.virgin_sessions_of_profile_name(profile_name, return_objects=True) if not s.activated ]
if _virgin_sessions and not session_name:
+ _virgin_sessions[0].activated = True
session_uuid = _virgin_sessions[0].get_uuid()
_params = self.client_instance.session_profiles.to_session_params(profile_id)
for _k in _params.keys():
@@ -508,6 +509,7 @@ class X2goSessionRegistry(object):
session_uuid = self.get_session_of_session_name(session_name)
if session_uuid is not None:
+ self(session_uuid).activated = True
_params = self.client_instance.session_profiles.to_session_params(profile_id)
for _k in _params.keys():
if _k in kwargs.keys():
diff --git a/x2go/rforward.py b/x2go/rforward.py
index dde9fd6..a138870 100644
--- a/x2go/rforward.py
+++ b/x2go/rforward.py
@@ -146,7 +146,7 @@ class X2goRevFwTunnel(threading.Thread):
timeout = Timeout(10)
timeout.start()
try:
- self.ssh_transport.cancel_port_forward('', self.server_port)
+ self.ssh_transport.global_request('cancel-tcpip-forward', (address, port), wait=True)
except:
pass
finally:
diff --git a/x2go/session.py b/x2go/session.py
index 35db50a..c2bd8e6 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -131,7 +131,7 @@ class X2goSession(object):
add_to_known_hosts=False,
known_hosts=None,
logger=None, loglevel=log.loglevel_DEFAULT,
- connected=False, virgin=True, running=None, suspended=None, terminated=None, faulty=None,
+ connected=False, activated=False, virgin=True, running=None, suspended=None, terminated=None, faulty=None,
client_instance=None,
**params):
"""\
@@ -191,6 +191,8 @@ class X2goSession(object):
@type known_hosts: C{str}
@param connected: manipulate session state »connected« by giving a pre-set value
@type connected: C{bool}
+ @param activated: normal leave this untouched, an activated session is a session that is about to be used
+ @type activated: C{bool}
@param virgin: manipulate session state »virgin« by giving a pre-set value
@type virgin: C{bool}
@param running: manipulate session state »running« by giving a pre-set value
@@ -218,6 +220,7 @@ class X2goSession(object):
self.uuid = uuid.uuid1()
self.connected = connected
+ self.activated = activated
self.virgin = virgin
self.running = running
self.suspended = suspended
@@ -481,14 +484,14 @@ class X2goSession(object):
return True
return self.master_session
- def set_master_session(self):
+ def set_master_session(self, wait=0):
"""\
Declare this as a master session of a connection channel.
"""
self.logger('Using session %s as master session for profile %s.' % (self.get_session_name(), self.get_profile_name()), loglevel=log.loglevel_NOTICE)
self.master_session = True
- gevent.spawn(self.share_all_local_folders)
+ gevent.spawn_later(wait, self.share_all_local_folders)
def unset_master_session(self):
"""\
hooks/post-receive
--
python-x2go.git (Python X2Go Client API)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "python-x2go.git" (Python X2Go Client API).
More information about the x2go-commits
mailing list