[X2Go-Commits] python-x2go.git - brokerclient (branch) updated: 0.2.0.10-83-g2e69094

X2Go dev team git-admin at x2go.org
Tue Jan 7 16:21:32 CET 2014


The branch, brokerclient has been updated
       via  2e69094ec995acd4f217f0af6e9f2b24e673f555 (commit)
      from  8d835dcdec07d7f620a25cbcd4aafd88a1a044c7 (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:
 x2go/session.py |  123 ++++++++++++++++++++++++++++---------------------------
 1 file changed, 62 insertions(+), 61 deletions(-)

The diff of changes is:
diff --git a/x2go/session.py b/x2go/session.py
index 31d7aea..5027a64 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -568,6 +568,10 @@ class X2goSession(object):
         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
 
+        # retrieve an up-to-date list of sharable local folders from the client instance
+        if self.client_instance:
+            self.share_local_folders = self.client_instance.get_profile_config(self.profile_name, 'export').keys()
+
         i = 0
         while i < max_wait:
             i += 1
@@ -2116,10 +2120,6 @@ class X2goSession(object):
         @raise X2goSessionException: if the session could not be suspended
 
         """
-        _store_shared_folders = {}
-        for folder in self.shared_folders:
-            _store_shared_folders.update({ folder: True })
-
         self._lock.acquire()
         try:
             _retval = self._suspend()
@@ -2452,14 +2452,11 @@ class X2goSession(object):
 
         if self.has_terminal_session():
             if self.is_folder_sharing_available() and self.is_master_session():
-                # append local_path to list of shared folders before mounting
-                self.shared_folders.append(local_path)
                 if self.terminal_session.share_local_folder(local_path=local_path):
+                    self.shared_folders.append(local_path)
                     if update_exported_folders:
                         self._update_restore_exported_folders()
                     return True
-                # if we failed remove the local_path element again...
-                self.shared_folders.remove(local_path)
                 return False
         else:
             raise x2go_exceptions.X2goSessionException('this X2goSession object does not have any associated terminal')
@@ -2477,23 +2474,23 @@ class X2goSession(object):
         @rtype: C{bool}
 
         """
-        _retval = False
+        retval = False
         if self.is_running() and not self.faulty  and self._SUPPORTED_FOLDERSHARING and self.share_local_folders and self.allow_share_local_folders and self.has_terminal_session():
             if self.is_master_session():
                 if self.is_folder_sharing_available():
-                    if self.control_session.get_transport().reverse_tunnels[self.terminal_session.get_session_name()]['sshfs'][1] is not None:
-                        _retval = True
-                        for _folder in self.share_local_folders:
-                            try:
-                                _retval = self.share_local_folder(_folder, update_exported_folders=False) and _retval
-                            except x2go_exceptions.X2goUserException, e:
-                                self.logger('%s' % str(e), loglevel=log.loglevel_WARN)
-                        if update_exported_folders:
-                            self._update_restore_exported_folders()
+                    retval = True
+                    for _folder in self.share_local_folders:
+                        try:
+                            retval = self.share_local_folder(_folder, update_exported_folders=False) and retval
+                        except x2go_exceptions.X2goUserException, e:
+                            retval = False
+                            self.logger('%s' % str(e), loglevel=log.loglevel_WARN)
+                    if update_exported_folders:
+                        self._update_restore_exported_folders()
 
                 else:
                     self.HOOK_foldersharing_not_available()
-        return _retval
+        return retval
     __share_all_local_folders = share_all_local_folders
 
     def unshare_all_local_folders(self, force_all=False, update_exported_folders=True):
@@ -2516,15 +2513,17 @@ class X2goSession(object):
         if self.has_terminal_session():
             if self.is_folder_sharing_available() and self.is_master_session():
                 if force_all:
-                    self.shared_folders = []
                     retval = self.terminal_session.unshare_all_local_folders()
+                    if retval:
+                        self.shared_folders = []
                     return retval
                 else:
-                    _shared_folders = copy.deepcopy(self.shared_folders)
-                    self.shared_folders = []
-                    retval = 0
-                    for _shared_folder in _shared_folders:
-                        retval = retval | self.terminal_session.unshare_local_folder(_shared_folder)
+                    retval = True
+                    for _shared_folder in self.shared_folders:
+                        if self.terminal_session.unshare_local_folder(_shared_folder):
+                            self.shared_folders.remove(_shared_folder)
+                        else:
+                            retval = False
                     if update_exported_folders:
                         self._update_restore_exported_folders()
                     return retval
@@ -2551,20 +2550,18 @@ class X2goSession(object):
         @raise X2goSessionException: if this L{X2goSession} does not have an associated terminal session
 
         """
+        retval = False
         if self.has_terminal_session():
             if self.is_folder_sharing_available() and self.is_master_session() and local_path in self.shared_folders:
-                # update shared_folders before(!) unmounting...
-                self.shared_folders.remove(local_path)
-                _retval = self.terminal_session.unshare_local_folder(local_path=local_path)
-                # unmounting failed? Re-add local_patch to shared_folders for now...
-                if not _retval:
-                    self.shared_folders.append(local_path)
-                if _retval and update_exported_folders:
+                if self.terminal_session.unshare_local_folder(local_path=local_path):
+                    self.shared_folders.remove(local_path)
+                    retval = True
+                if retval and update_exported_folders:
                     self._update_restore_exported_folders()
         else:
             raise x2go_exceptions.X2goSessionException('this X2goSession object does not have any associated terminal')
 
-        return _retval
+        return retval
     __unshare_local_folder = unshare_local_folder
 
     def get_shared_folders(self, check_list_mounts=False, mounts=None):
@@ -2586,39 +2583,43 @@ class X2goSession(object):
             unshared_folders = []
             if mounts is None:
                 mounts = self.list_mounts()
+            _defacto_mounts = [ unicode(m.split('|')[1].split('/')[-1]) for m in mounts ]
 
+            _expected_mounts = {}
             for shared_folder in self.shared_folders:
 
-                _found = False
-
-                for mount in mounts:
-                    if _found: continue
-                    mount = mount.split('|')[1]
-                    if _X2GOCLIENT_OS == 'Windows':
-
-                        _driveletter, _path = os.path.splitdrive(shared_folder)
-                        _mount_point = '_windrive_%s%s' % (_driveletter[0], _path.replace('\\', '_'))
-                        _mount_point = _mount_point.replace(' ', '_')
-
-                        if mount.lower().endswith(_mount_point.lower()):
-                            _found = True
-
-                    else:
-                        _mount_point = shared_folder.replace('/', '_')
-                        _mount_point = _mount_point.replace(' ', '_')
-                        if mount.endswith(_mount_point):
-                            _found = True
+                if _X2GOCLIENT_OS == 'Windows':
 
-                if not _found:
-                    unshared_folders.append(shared_folder)
+                    _driveletter, _path = os.path.splitdrive(shared_folder)
+                    _mount_point = '_windrive_%s%s' % (_driveletter[0], _path.replace('\\', '_'))
+                    _mount_point = _mount_point.replace(' ', '_')
 
-            for unshared_folder in unshared_folders:
-                try:
-                    self.shared_folders.remove(unshared_folder)
-                    self._update_restore_exported_folders()
-                    self.logger('Detected server-side unsharing of client-side folder for profile %s: %s:' % (self.get_profile_name(), shared_folder), loglevel=log.loglevel_INFO)
-                except IndexError:
-                    pass
+                else:
+                    _mount_point = shared_folder.replace('/', '_')
+                    _mount_point = _mount_point.replace(' ', '_')
+
+                _expected_mounts[unicode(_mount_point)] = shared_folder
+
+            ### such a feature as below would be nice but the mapping between a mountpoint and the related
+            ### local folder path is not bijective
+            #
+            # add any new found mount reported by the server
+            #for m in _defacto_mounts:
+            #    if m not in _expected_mounts.keys():
+            #        self.shared_folders.append(_expected_mounts[m])
+
+            unshared_folders = False
+            for m in _expected_mounts.keys():
+                if m not in _defacto_mounts:
+                    try:
+                        self.shared_folders.remove(_expected_mounts[m])
+                        unshared_folders = True
+                        self.logger('Detected server-side unsharing of client-side folder for profile %s: %s:' % (self.get_profile_name(), _expected_mounts[m]), loglevel=log.loglevel_INFO)
+                    except IndexError:
+                        pass
+
+            if unshared_folders:
+                self._update_restore_exported_folders()
 
         return [ unicode(s) for s in self.shared_folders ]
     __get_shared_folders = get_shared_folders


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