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@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@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).