[X2go-Commits] python-x2go.git - master (branch) updated: 0.1.0.3-30-gd43d6a8

X2go dev team git-admin at x2go.org
Wed Jun 22 01:22:45 CEST 2011


The branch, master has been updated
       via  d43d6a81e68a9cf3d392ff232e481a599ff82119 (commit)
      from  982d86f3ccf7d17f6590036fd49a4e8bf127df6a (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 d43d6a81e68a9cf3d392ff232e481a599ff82119
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Wed Jun 22 01:22:33 2011 +0200

    Fix multiple notifications for the same session state change, reliably differentiate between found sessions after connect and newly started  sessions from another client.

-----------------------------------------------------------------------

Summary of changes:
 debian/changelog |    5 ++++-
 x2go/client.py   |    4 +++-
 x2go/registry.py |   30 +++++++++++++++++-------------
 x2go/session.py  |   37 +++++++++++++++++++++++--------------
 4 files changed, 47 insertions(+), 29 deletions(-)

The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index a3d162d..b5f5cab 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -12,8 +12,11 @@ python-x2go (0.1.1.0-0~x2go1) UNRELEASED; urgency=low
     - Explicitly tunnel over IPv4 for NX proxy.
     - Make cache more configurable (session list updates, desktop list updates).
     - Adds an auto_update_listdesktops_cache to X2goClient constructor argvs.
+    - Fix multiple notifications for the same session state change, reliably
+      differentiate between found sessions after connect and newly started 
+      sessions from another client.
 
- -- Mike Gabriel <mike at mimino.das-netzwerkteam.de>  Tue, 21 Jun 2011 19:48:12 +0200
+ -- Mike Gabriel <mike at mimino.das-netzwerkteam.de>  Wed, 22 Jun 2011 01:20:48 +0200
 
 python-x2go (0.1.0.3-0~x2go1) unstable; urgency=low
 
diff --git a/x2go/client.py b/x2go/client.py
index fa87e4c..0141d73 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -1056,7 +1056,9 @@ class X2goClient(object):
                                                                force_password_auth=force_password_auth,
                                                               )
         if self.auto_register_sessions:
-            self.session_registry.register_available_server_sessions(profile_name=self.get_session_profile_name(session_uuid))
+            self.session_registry.register_available_server_sessions(profile_name=self.get_session_profile_name(session_uuid),
+                                                                     newly_connected=True,
+                                                                    )
     __connect_session = connect_session
 
     def disconnect_session(self, session_uuid):
diff --git a/x2go/registry.py b/x2go/registry.py
index 033a631..1ddbac3 100644
--- a/x2go/registry.py
+++ b/x2go/registry.py
@@ -182,7 +182,7 @@ class X2goSessionRegistry(object):
             _session_summary['terminated'] = None
         return _session_summary
 
-    def update_status(self, session_uuid=None, profile_name=None, profile_id=None, session_list=None, force_update=False):
+    def update_status(self, session_uuid=None, profile_name=None, profile_id=None, session_list=None, force_update=False, newly_connected=False):
         """\
         Update the session status for L{X2goSession} that is represented by a given session UUID hash,
         profile name or profile ID.
@@ -216,7 +216,9 @@ class X2goSessionRegistry(object):
 
         for _session_uuid in session_uuids:
 
-            self(_session_uuid).update_status(session_list=session_list, force_update=force_update)
+            if not self(_session_uuid).update_status(session_list=session_list, force_update=force_update):
+                # skip this run, as nothing has changed since the last time...
+                return False
             _last_status = copy.deepcopy(self(_session_uuid)._last_status)
             _current_status = copy.deepcopy(self(_session_uuid)._current_status)
 
@@ -234,9 +236,12 @@ class X2goSessionRegistry(object):
                 if len(self.virgin_sessions_of_profile_name(profile_name)) > 1:
                     del self.registry[_session_uuid]
 
-            elif _last_status['running'] == False and _current_status['running'] == True and _current_status['faulty'] == False:
+            elif not _last_status['running'] and _current_status['running'] and not _current_status['faulty']:
                 # session has started
-                if _last_status['connected']:
+                if newly_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)
+                else:
                     if self(_session_uuid).has_terminal_session():
                         if _last_status['suspended']:
                             # from a suspended state
@@ -251,15 +256,12 @@ class X2goSessionRegistry(object):
                         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:
-                    # 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['connected'] == True and (_last_status['suspended'] == False and _current_status['suspended'] == True) and _current_status['faulty'] == False:
+            elif _last_status['connected'] and (not _last_status['suspended'] and _current_status['suspended']) and not _current_status['faulty']:
                 # session has been suspended
                 self(_session_uuid).session_cleanup()
                 self.client_instance.HOOK_on_session_has_been_suspended(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
-            elif _last_status['connected'] == True and (_last_status['terminated'] == False and _current_status['terminated'] == True) and _current_status['faulty'] == False:
+            elif _last_status['connected'] and (not _last_status['terminated'] and _current_status['terminated']) and not _current_status['faulty']:
                 # session has terminated
                 self.client_instance.HOOK_on_session_has_terminated(session_uuid=_session_uuid, profile_name=_profile_name, session_name=_session_name)
                 self(_session_uuid).session_cleanup()
@@ -267,7 +269,9 @@ class X2goSessionRegistry(object):
                 if len(self.virgin_sessions_of_profile_name(profile_name)) > 1:
                     del self.registry[_session_uuid]
 
-    def register_available_server_sessions(self, profile_name, session_list=None):
+        return True
+
+    def register_available_server_sessions(self, profile_name, session_list=None, newly_connected=False):
         """\
         Register server-side available X2go sessions with this L{X2goSessionRegistry} instance for a given profile name.
 
@@ -291,6 +295,7 @@ class X2goSessionRegistry(object):
 
             # make sure the session registry gets updated before registering new session
             # (if the server name has changed, this will kick out obsolete X2goSessions)
+            print "STATUS UPDATE PROFILE: %s" % profile_name
             self.update_status(profile_name=profile_name, session_list=session_list)
             for session_name in session_list.keys():
                 if session_name not in _session_names:
@@ -324,12 +329,11 @@ class X2goSessionRegistry(object):
                     # this if clause catches problems when x2golistsessions commands give weird results
                     if not self.has_session_of_session_name(session_name):
                         session_uuid = self.register(server, profile_id, profile_name,
-                                                     session_name=session_name,
-                                                     virgin=False, running=False, suspended=True, terminated=None,
+                                                     session_name=session_name,                                                     virgin=False,
                                                      **kwargs
                                                     )
                         self(session_uuid).connected = True
-                        self.update_status(session_uuid=session_uuid, session_list=session_list, force_update=True)
+                        self.update_status(session_uuid=session_uuid, force_update=True, newly_connected=newly_connected)
 
     def register(self, server, profile_id, profile_name,
                  session_name=None,
diff --git a/x2go/session.py b/x2go/session.py
index 0767340..f94d9fe 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -114,7 +114,7 @@ class X2goSession(object):
                  add_to_known_hosts=False,
                  known_hosts=None,
                  logger=None, loglevel=log.loglevel_DEFAULT,
-                 virgin=True, running=None, suspended=None, terminated=None, faulty=None,
+                 connected=False, virgin=True, running=None, suspended=None, terminated=None, faulty=None,
                  client_instance=None,
                  **params):
         """\
@@ -168,6 +168,8 @@ class X2goSession(object):
         @type add_to_known_hosts: C{bool}
         @param known_hosts: the underlying Paramiko/SSH systems C{known_hosts} file
         @type known_hosts: C{str}
+        @param connected: manipulate session state »connected« by giving a pre-set value
+        @type connected: 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
@@ -193,7 +195,7 @@ class X2goSession(object):
         self._keep = None
 
         self.uuid = uuid.uuid1()
-        self.connected = False
+        self.connected = connected
 
         self.virgin = virgin
         self.running = running
@@ -207,16 +209,6 @@ class X2goSession(object):
         self.session_name = session_name
         self.server = server
 
-        self._current_status = {
-            'timestamp': time.time(),
-            'server': self.server,
-            'virgin': self.virgin,
-            'connected': self.connected,
-            'running': self.running,
-            'suspended': self.suspended,
-            'terminated': self.terminated,
-            'faulty': self.faulty,
-        }
         self._last_status = None
 
         self.printing = printing
@@ -264,6 +256,17 @@ class X2goSession(object):
         self.known_hosts = known_hosts
         self.use_sshproxy = use_sshproxy
 
+        self._current_status = {
+            'timestamp': time.time(),
+            'server': self.server,
+            'virgin': self.virgin,
+            'connected': self.connected,
+            'running': self.running,
+            'suspended': self.suspended,
+            'terminated': self.terminated,
+            'faulty': self.faulty,
+        }
+
         self.init_control_session()
         self.terminal_session = None
 
@@ -726,8 +729,10 @@ class X2goSession(object):
                 self.disconnect()
 
             _dummy = self.get_server_hostname()
+
         if self.connected:
             self.update_status()
+
         return self.connected
     __connect = connect
 
@@ -868,7 +873,7 @@ class X2goSession(object):
             # skip this session status update if not longer than a second ago...
             if  _status_update_timedelta < 1:
                 self.logger('status update interval too short (%s), skipping status about this time...' % _status_update_timedelta, loglevel=log.loglevel_DEBUG)
-                return
+                return False
 
         e = None
         self._last_status = copy.deepcopy(self._current_status)
@@ -890,7 +895,7 @@ class X2goSession(object):
                 self.running = _session_info.is_running()
                 self.suspended = _session_info.is_suspended()
                 if not self.virgin:
-                    self.terminated = not (_session_info.is_running() or _session_info.is_suspended())
+                    self.terminated = not (self.running or self.suspended)
                 else:
                     self.terminated = None
             except KeyError:
@@ -898,6 +903,8 @@ class X2goSession(object):
                 self.suspended = False
                 if not self.virgin:
                     self.terminated = True
+            self.faulty = not (self.running or self.suspended or self.terminated or self.virgin)
+
 
         self._current_status = {
             'timestamp': time.time(),
@@ -913,6 +920,8 @@ class X2goSession(object):
         if (not self.connected or self.faulty) and e:
             raise e
 
+        return True
+
     __update_status = update_status
 
     def resume(self, session_name=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