[X2Go-Commits] python-x2go.git - build-baikal (branch) updated: 0.1.1.4-243-gf3de332
X2Go dev team
git-admin at x2go.org
Wed Jan 8 15:31:04 CET 2014
The branch, build-baikal 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 -----------------------------------------------------------------
-----------------------------------------------------------------------
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