[X2go-Commits] python-x2go.git - master (branch) updated: 0.1.1.4-211-g392629e

X2Go dev team git-admin at x2go.org
Wed Apr 18 15:24:50 CEST 2012


The branch, master has been updated
       via  392629ed845770798e10870494951c64f4e86aca (commit)
      from  98ba5f24c29ce9ac2ae4129b2ade74dbb515cd21 (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 392629ed845770798e10870494951c64f4e86aca
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Wed Apr 18 15:24:45 2012 +0200

    Handle detection of free TCP/IP X display port far more intelligently.

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

Summary of changes:
 debian/changelog |    1 +
 x2go/client.py   |   12 +++++++--
 x2go/defaults.py |    5 ++++
 x2go/xserver.py  |   66 +++++++++++++++++++++++++++++++++++++++++------------
 4 files changed, 66 insertions(+), 18 deletions(-)

The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index 87e643a..fa200d6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -109,6 +109,7 @@ python-x2go (0.1.2.0-0~x2go1) UNRELEASED; urgency=low
     - Re-use a left behind stray X-server that might have not get killed by
       a previous instance of Python X2Go Client. This trick is nasty, but works
       around faulty abortion of client implementations.
+    - Handle detection of free TCP/IP X display port far more intelligently.
   * Depend on python-xlib.
 
  -- Mike Gabriel <mike.gabriel at das-netzwerkteam.de>  Sat, 28 Sep 2012 01:44:21 +0100
diff --git a/x2go/client.py b/x2go/client.py
index 4ee4c00..a5c4e63 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -302,9 +302,15 @@ class X2goClient(object):
                 self.HOOK_no_known_xserver_found()
             else:
 
+                _last_display = None
                 if  type(start_xserver) is types.BooleanType:
-                    p_xs = self.client_xconfig.preferred_xserver
+                    p_xs_name = self.client_xconfig.preferred_xserver_names[0]
+                    _last_display = self.client_xconfig.get_xserver_config(p_xs_name)['last_display']
+                    self.client_xconfig.detect_unused_xdisplay_port(p_xs_name)
+                    p_xs = self.client_xconfig.get_xserver_config(p_xs_name)
                 elif type(start_xserver) is types.StringType:
+                    _last_display = self.client_xconfig.get_xserver_config(start_xserver)['last_display']
+                    self.client_xconfig.detect_unused_xdisplay_port(start_xserver)
                     p_xs = (start_xserver, self.client_xconfig.get_xserver_config(start_xserver))
 
                 if not self.client_xconfig.running_xservers:
@@ -314,12 +320,12 @@ class X2goClient(object):
 
                 else:
 
-                    if p_xs is not None:
+                    if p_xs is not None and _last_display is not None:
                         #
                         # FIXME: this trick is nasty, client implementation should rather cleanly shutdown launch X-server processes
                         # 
                         # re-use a left behind X-server instance of a previous/crashed run of Python X2Go Client
-                        os.environ.update({'DISPLAY': str(p_xs[1]['display'])})
+                        os.environ.update({'DISPLAY': str(_last_display)})
                     else:
                         # presume the running XServer listens on :0
                         os.environ.update({'DISPLAY': 'localhost:0'})
diff --git a/x2go/defaults.py b/x2go/defaults.py
index 095a162..f9b8bf6 100644
--- a/x2go/defaults.py
+++ b/x2go/defaults.py
@@ -243,6 +243,7 @@ if X2GOCLIENT_OS == 'Windows':
         },
         'Cygwin-X': {
             'display': 'localhost:40',
+            'last_display': 'localhost:40',
             'process_name': 'XWin.exe',
             'test_installed': os.path.join(os.environ['SystemDrive'], '\\', 'cygwin', 'bin', 'XWin.exe'),
             'run_command': os.path.join(os.environ['SystemDrive'], '\\', 'cygwin', 'bin', 'XWin.exe'),
@@ -250,6 +251,7 @@ if X2GOCLIENT_OS == 'Windows':
             },
         'VcXsrv': {
             'display': 'localhost:40',
+            'last_display': 'localhost:40',
             'process_name': 'vcxsrv.exe',
             'test_installed': os.path.join(os.environ['ProgramFiles'], 'VcXsrv', 'vcxsrv.exe'), 
             'run_command': os.path.join(os.environ['ProgramFiles'], 'VcXsrv', 'vcxsrv.exe'),
@@ -257,6 +259,7 @@ if X2GOCLIENT_OS == 'Windows':
             },
         'VcXsrv_shipped': {
             'display': 'localhost:40',
+            'last_display': 'localhost:40',
             'process_name': 'vcxsrv.exe',
             'test_installed': os.path.join(os.getcwd(), 'VcXsrv', 'vcxsrv.exe'), 
             'run_command': os.path.join(os.getcwd(), 'VcXsrv', 'vcxsrv.exe'),
@@ -264,6 +267,7 @@ if X2GOCLIENT_OS == 'Windows':
             },
         'VcXsrv_development': {
             'display': 'localhost:40',
+            'last_display': 'localhost:40',
             'process_name': 'vcxsrv.exe',
             'test_installed': os.path.join(os.getcwd(), '..', 'pyhoca-contrib', 'mswin', 'vcxsrv-mswin', 'VcXsrv-1.12.0.1', 'vcxsrv.exe'), 
             'run_command': os.path.join(os.getcwd(), '..', 'pyhoca-contrib', 'mswin', 'vcxsrv-mswin', 'VcXsrv-1.12.0.1', 'vcxsrv.exe'), 
@@ -271,6 +275,7 @@ if X2GOCLIENT_OS == 'Windows':
             },
         'Xming': {
             'display': 'localhost:40',
+            'last_display': 'localhost:40',
             'process_name': 'Xming.exe',
             'test_installed': os.path.join(os.environ['ProgramFiles'], 'Xming', 'Xming.exe'), 
             'run_command': os.path.join(os.environ['ProgramFiles'], 'Xming', 'Xming.exe'),
diff --git a/x2go/xserver.py b/x2go/xserver.py
index b2b5a37..859b1c8 100644
--- a/x2go/xserver.py
+++ b/x2go/xserver.py
@@ -175,7 +175,10 @@ class X2goClientXConfig(inifiles.X2goIniFile):
     @property
     def preferred_xserver(self):
         """\
-        Renders a list of preferred XServer names (most preferred on top).
+        Returns a tuple of (<xserver_name>, <xserver_config>).
+
+        return: (<xserver_name>, <xserver_config>)
+        rtype: C{tuple}
 
         """
         if self.xserver_launch_possible:
@@ -183,6 +186,53 @@ class X2goClientXConfig(inifiles.X2goIniFile):
         else:
             return None
 
+    @property
+    def preferred_xserver_names(self):
+        """\
+        Returns the list of preferred XServer names (most preferred first).
+
+        """
+        return self.installed_xservers
+
+    def detect_unused_xdisplay_port(self, xserver_name):
+        """\
+        Get an unused TCP/IP port for the to-be-launched X server.
+
+        @param xserver_name: name of the XServer application
+        @type xserver_name: C{str}
+
+        """
+        _default_display = self.get_xserver_config(xserver_name)['display']
+        _last_display = self.xserver_config(xserver_name)['last_display']
+
+        try:
+            _default_xserver_port = int(_display.split(":")[1].split(".")[0]) + 6000
+            _last_xserver_port = int(_last_display.split(":")[1].split(".")[0]) + 6000
+
+            # try the last used $DISPLAY first...
+            if utils.detect_unused_port(preferred_port=_last_xserver_port) == _last_xserver_port:
+                _detect_xserver_port = _last_xserver_port
+
+            # then try the default $DISPLAY...
+            elif utils.detect_unused_port(preferred_port=_default_xserver_port) == _default_xserver_port:
+                _detect_xserver_port = _default_xserver_port
+
+            # otherwise use a detection algorithm to find a free TCP/IP port
+            else:
+                _xserver_port = _default_xserver_port +1
+                while utils.detect_unused_port(preferred_port=_xserver_port) != _xserver_port:
+                        _xserver_port += 1
+                _detect_xserver_port = _xserver_port
+
+            # if the port changed, let's write it to our configuration file
+            if _detect_xserver_port != _last_xserver_port:
+                self.update_value(xserver_name, 'last_display', _last_display.replace(_last_xserver_port, _detect_xserver_port))
+                self.write_user_config = True
+                self.write()
+
+        except TypeError:
+            pass
+
 
 class X2goXServer(threading.Thread):
     """
@@ -227,20 +277,6 @@ class X2goXServer(threading.Thread):
 
         if self.xserver_config.has_key('display'):
 
-            try:
-                _configured_display_no = int(self.xserver_config['display'].split(":")[1].split(".")[0])
-                _xserver_port = _configured_display_no + 6000
-                while utils.detect_unused_port(preferred_port=_xserver_port) != _xserver_port:
-                    _xserver_port += 1
-                _display_no = _xserver_port - 6000
-
-                if _configured_display_no != _display_no:
-                    self.xserver_config['display'] = self.xserver_config['display'].replace(_configured_display_no, _display_no)
-                    self.xserver_config['parameters'] = self.xserver_config['parameters'].replace(_configured_display_no, _display_no)
-
-            except TypeError:
-                pass
-
             self.logger('setting DISPLAY environment variable to %s' % self.xserver_config['display'], loglevel=log.loglevel_NOTICE)
             os.environ.update({'DISPLAY': str(self.xserver_config['display'])})
         threading.Thread.__init__(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