[X2Go-Commits] python-x2go.git - twofactorauth (branch) updated: f305e1f4d7f9465d52990a1938e4323cccc7bf86
X2Go dev team
git-admin at x2go.org
Sat Sep 14 15:55:55 CEST 2013
The branch, twofactorauth has been updated
via f305e1f4d7f9465d52990a1938e4323cccc7bf86 (commit)
from 76ef55a968c001b62890acb37bad29cf203fe0bd (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 | 16 ++++++++++++++--
x2go/cache.py | 11 +++++++++++
x2go/client.py | 25 ++++++++++++-------------
x2go/registry.py | 32 +++++++++++++++++---------------
x2go/session.py | 10 ++++++----
6 files changed, 61 insertions(+), 34 deletions(-)
The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index d20d79d..3776aa4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,7 @@ python-x2go (0.0.36-0~nwt1) lucid maverick testing unstable; urgency=low
* fixed non-starting sshfs issue
* made XServer VcXsrv known to Python X2go (relevant for Windows)
* catching forward tunnel setup failure by session and client hook method
+ * improved handling of network failures (i.e. when triggering disconnect events)
-- Mike Gabriel <mike.gabriel at das-netzwerkteam.de> Thu, 20 Jan 2011 23:00:00 +0100
diff --git a/x2go/backends/control/_stdout.py b/x2go/backends/control/_stdout.py
index dd9af27..370b9ff 100644
--- a/x2go/backends/control/_stdout.py
+++ b/x2go/backends/control/_stdout.py
@@ -139,6 +139,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
utils.touch_file(self.known_hosts)
self.load_host_keys(self.known_hosts)
+ self.session_died = False
+
def __del__(self):
self.disconnect()
@@ -182,10 +184,13 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
_retval = self.exec_command(_rewrite_password(cmd, user=self.get_transport().get_username(), password=self._session_password), **kwargs)
self.locked = False
except AttributeError:
+ self.session_died = True
raise x2go_exceptions.X2goControlSessionException('the X2go control session has died unexpectedly')
except EOFError:
+ self.session_died = True
raise x2go_exceptions.X2goControlSessionException('the X2go control session has died unexpectedly')
except gevent.timeout.Timeout:
+ self.session_died = True
raise x2go_exceptions.X2goControlSessionException('the X2go control session command timed out')
finally:
self.locked = False
@@ -392,6 +397,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
ssh_transport._x2go_session_marker = True
self._session_password = password
+ if self.get_transport():
+ self.session_died = False
return (self.get_transport() is not None)
def dissociate(self, terminal_session):
@@ -414,7 +421,8 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
t_names = self.associated_terminals.keys()
for t_obj in self.associated_terminals.values():
try:
- t_obj.suspend()
+ if not self.session_died:
+ t_obj.suspend()
except x2go_exceptions.X2goTerminalSessionException:
pass
except x2go_exceptions.X2goControlSessionException:
@@ -436,10 +444,14 @@ class X2goControlSessionSTDOUT(paramiko.SSHClient):
try:
if self.get_transport() is not None:
+ still_active = self.get_transport().is_active()
self.get_transport().close()
+ return still_active
+ return False
except AttributeError:
# if the Paramiko _transport object has not yet been initialized, ignore it
- pass
+ # but state that this method call did not close the SSH client, but was already closed
+ return False
def is_alive(self):
if self._x2go_exec_command('echo', loglevel=log.loglevel_DEBUG):
diff --git a/x2go/cache.py b/x2go/cache.py
index 2a41b8c..57dc8b7 100644
--- a/x2go/cache.py
+++ b/x2go/cache.py
@@ -60,8 +60,19 @@ class X2goListSessionsCache(object):
self.client_instance = client_instance
+ def delete(self, profile_name):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ try: del self.x2go_listsessions_cache[profile_name]
+ except KeyError: pass
+
def check_cache(self):
+ """\
+ STILL UNDOCUMENTED
+ """
for profile_name in self.x2go_listsessions_cache.keys():
if profile_name not in self.client_instance.client_connected_profiles(return_profile_names=True):
del self.x2go_listsessions_cache[profile_name]
diff --git a/x2go/client.py b/x2go/client.py
index d5b2078..855187d 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -1192,8 +1192,8 @@ class X2goClient(object):
return self.session_registry(session_uuid).is_alive()
except x2go_exceptions.X2goControlSessionException:
profile_name = self.get_session_profile_name(session_uuid)
- self.HOOK_on_control_session_death(profile_name)
- self.disconnect_profile(profile_name)
+ if self.disconnect_profile(profile_name):
+ self.HOOK_on_control_session_death(profile_name)
return False
__server_is_alive = server_is_alive
@@ -1494,10 +1494,12 @@ class X2goClient(object):
@param profile_name: the X2go session profile name
@type profile_name: C{str}
"""
+ _retval = False
for s in self.session_registry.registered_sessions_of_profile_name(profile_name, return_objects=True):
- s.disconnect()
+ _retval = s.disconnect() | _retval
if self.use_listsessions_cache:
- self.__update_cache_all_profiles()
+ self.listsessions_cache.delete(profile_name)
+ return _retval
__disconnect_profile = disconnect_profile
def update_sessionregistry_status_by_profile_name(self, profile_name, session_list=None):
@@ -1515,9 +1517,8 @@ class X2goClient(object):
try:
self.session_registry.update_status(profile_name=profile_name, session_list=session_list)
except x2go_exceptions.X2goControlSessionException:
- self.disconnect_profile(profile_name)
- self.HOOK_on_control_session_death(profile_name)
- return False
+ if self.disconnect_profile(profile_name):
+ self.HOOK_on_control_session_death(profile_name)
__update_sessionregistry_status_by_profile_name = update_sessionregistry_status_by_profile_name
@@ -1550,9 +1551,8 @@ class X2goClient(object):
try:
self.listsessions_cache.update(profile_name)
except x2go_exceptions.X2goControlSessionException:
- self.disconnect_profile(profile_name)
- self.HOOK_on_control_session_death(profile_name)
- return False
+ if self.disconnect_profile(profile_name):
+ self.HOOK_on_control_session_death(profile_name)
__update_cache_by_profile_name = update_cache_by_profile_name
def update_cache_by_session_uuid(self, session_uuid):
@@ -1589,9 +1589,8 @@ class X2goClient(object):
try:
self.session_registry.register_available_server_sessions(profile_name, session_list=session_list)
except x2go_exceptions.X2goControlSessionException:
- self.disconnect_profile(profile_name)
- self.HOOK_on_control_session_death(profile_name)
- return False
+ if self.disconnect_profile(profile_name):
+ self.HOOK_on_control_session_death(profile_name)
__register_available_server_sessions_by_profile_name = register_available_server_sessions_by_profile_name
def register_available_server_sessions_by_session_uuid(self, session_uuid):
diff --git a/x2go/registry.py b/x2go/registry.py
index cb3a343..7a17017 100644
--- a/x2go/registry.py
+++ b/x2go/registry.py
@@ -179,23 +179,25 @@ class X2goSessionRegistry(object):
elif _last_status['running'] == False and _current_status['running'] == True:
# session has started
- if self(_session_uuid).has_terminal_session():
- if _last_status['suspended']:
- # from a suspended state
- self.client_instance.HOOK_on_session_has_resumed_by_me(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+ if _last_status['connected']:
+ if self(_session_uuid).has_terminal_session():
+ if _last_status['suspended']:
+ # from a suspended state
+ self.client_instance.HOOK_on_session_has_resumed_by_me(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+ else:
+ # as a new session
+ self.client_instance.HOOK_on_session_has_started_by_me(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
else:
- # as a new session
- self.client_instance.HOOK_on_session_has_started_by_me(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+ if _last_status['suspended']:
+ # from a suspended state
+ self.client_instance.HOOK_on_session_has_resumed_by_other(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+ else:
+ # as a new session
+ self.client_instance.HOOK_on_session_has_started_by_other(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
else:
- if not _last_status['connected']:
- # from a suspended state
- self.client_instance.HOOK_on_found_session_running_after_connect(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
- elif _last_status['suspended']:
- # from a suspended state
- self.client_instance.HOOK_on_session_has_resumed_by_other(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
- else:
- # as a new session
- self.client_instance.HOOK_on_session_has_started_by_other(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+ # from a suspended state
+ self.client_instance.HOOK_on_found_session_running_after_connect(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
+
elif _last_status['suspended'] == False and _current_status['suspended'] == True:
# session has been suspended
self(_session_uuid).session_cleanup()
diff --git a/x2go/session.py b/x2go/session.py
index 158fc6a..4978727 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -520,11 +520,11 @@ class X2goSession(object):
STILL UNDOCUMENTED
"""
- self.control_session.disconnect()
self.connected = False
self.running = None
self.suspended = None
self.terminated = None
+ return self.control_session.disconnect()
__disconnect = disconnect
def set_print_action(self, print_action, **kwargs):
@@ -564,9 +564,11 @@ class X2goSession(object):
STILL UNDOCUMENTED
"""
- if not self.is_alive():
- self._X2goSession__disconnect()
- return self.control_session.list_sessions(raw=raw)
+ try:
+ return self.control_session.list_sessions(raw=raw)
+ except x2go_exceptions.X2goControlSessionException:
+ self._X2goSession_disconnect()
+ return None
__list_sessions = list_sessions
def update_status(self, session_list=None):
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