[X2Go-Commits] [python-x2go] 03/03: Fully rework backend concept in Python X2Go. Breaks compatibility with earlier versions of Python X2Go concerning backends (probably not really used by third-party products, if at all).

git-admin at x2go.org git-admin at x2go.org
Fri Jan 17 15:05:57 CET 2014


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch brokerclient
in repository python-x2go.

commit 1ea5f9222b6ac026c7e3edd54d21836fb1252653
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Thu Jan 9 12:17:50 2014 +0100

    Fully rework backend concept in Python X2Go. Breaks compatibility with earlier versions of Python X2Go concerning backends (probably not really used by third-party products, if at all).
---
 debian/changelog                                   |    3 +
 x2go/backends/control/__init__.py                  |    6 -
 x2go/backends/control/{_stdout.py => plain.py}     |   21 ++-
 x2go/backends/info/__init__.py                     |    9 --
 x2go/backends/info/{_stdout.py => plain.py}        |   16 +-
 x2go/backends/printing/__init__.py                 |    9 --
 x2go/backends/printing/{_file.py => file.py}       |   11 +-
 x2go/backends/printing/{_gconf.py => gconf.py}     |    4 +-
 x2go/backends/printing/{_winreg.py => winreg.py}   |    6 +-
 x2go/backends/profiles/gconf.py                    |    5 +-
 .../profiles/{httpsbroker.py => httpbroker.py}     |   48 +++++-
 .../profiles/{httpsbroker.py => sshbroker.py}      |    6 +-
 x2go/backends/profiles/winreg.py                   |    5 +-
 x2go/backends/proxy/__init__.py                    |    6 -
 x2go/backends/proxy/base.py                        |    4 +-
 x2go/backends/proxy/{_nx3.py => nx3.py}            |   12 +-
 x2go/backends/settings/__init__.py                 |    9 --
 x2go/backends/settings/{_file.py => file.py}       |   14 +-
 x2go/backends/settings/{_gconf.py => gconf.py}     |   10 +-
 x2go/backends/settings/{_winreg.py => winreg.py}   |    6 +-
 x2go/backends/terminal/__init__.py                 |    6 -
 x2go/backends/terminal/{_stdout.py => plain.py}    |   21 ++-
 x2go/client.py                                     |  160 +++-----------------
 x2go/defaults.py                                   |   94 +++++-------
 x2go/inifiles.py                                   |    2 +-
 x2go/printqueue.py                                 |    9 +-
 x2go/registry.py                                   |   42 +++--
 x2go/session.py                                    |   52 +++----
 x2go/utils.py                                      |   14 ++
 29 files changed, 236 insertions(+), 374 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index a83c949..62c2adc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,9 @@ python-x2go (0.5.0.0-0x2go1) UNRELEASED; urgency=low
   * New upstream version (0.5.0.0):
     - Split up session profile backend into generic and storage specific
       parts.
+    - Fully rework backend concept in Python X2Go. Breaks compatibility
+      with earlier versions of Python X2Go concerning backends (probably
+      not really used by third-party products, if at all).
 
  -- Mike Gabriel <mike.gabriel at das-netzwerkteam.de>  Sun, 05 Jan 2014 16:35:57 +0100
 
diff --git a/x2go/backends/control/__init__.py b/x2go/backends/control/__init__.py
index ef47b28..bf089e0 100644
--- a/x2go/backends/control/__init__.py
+++ b/x2go/backends/control/__init__.py
@@ -16,9 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_CONTROLSESSION_DEFAULT
-
-from _stdout import X2GoControlSessionSTDOUT
-
-X2GoControlSession = eval(BACKEND_CONTROLSESSION_DEFAULT)
diff --git a/x2go/backends/control/_stdout.py b/x2go/backends/control/plain.py
similarity index 99%
rename from x2go/backends/control/_stdout.py
rename to x2go/backends/control/plain.py
index afb6bc1..5aa4785 100644
--- a/x2go/backends/control/_stdout.py
+++ b/x2go/backends/control/plain.py
@@ -18,9 +18,9 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-X2GoControlSessionSTDOUT class - core functions for handling your individual X2Go sessions.
+L{X2GoControlSession} class - core functions for handling your individual X2Go sessions.
 
-This backend handles X2Go server implementations that respond via server-side STDOUT.
+This backend handles X2Go server implementations that respond via server-side PLAIN text output.
 
 """
 __NAME__ = 'x2gocontrolsession-pylib'
@@ -50,10 +50,7 @@ import x2go.x2go_exceptions as x2go_exceptions
 import x2go.defaults as defaults
 import x2go.checkhosts as checkhosts
 
-from x2go.backends.terminal import X2GoTerminalSession as _X2GoTerminalSession
-from x2go.backends.info import X2GoServerSessionInfo as _X2GoServerSessionInfo
-from x2go.backends.info import X2GoServerSessionList as _X2GoServerSessionList
-from x2go.backends.proxy import X2GoProxy as _X2GoProxy
+from x2go.defaults import BACKENDS as _BACKENDS
 
 import x2go._paramiko
 x2go._paramiko.monkey_patch_paramiko()
@@ -105,7 +102,7 @@ def _rewrite_password(cmd, user=None, password=None):
     return cmd
 
 
-class X2GoControlSessionSTDOUT(paramiko.SSHClient):
+class X2GoControlSession(paramiko.SSHClient):
     """\
     In the Python X2Go concept, X2Go sessions fall into two parts: a control session and one to many terminal sessions.
 
@@ -121,10 +118,10 @@ class X2GoControlSessionSTDOUT(paramiko.SSHClient):
                  known_hosts=None,
                  forward_sshagent=False,
                  unique_hostkey_aliases=False,
-                 terminal_backend=_X2GoTerminalSession,
-                 info_backend=_X2GoServerSessionInfo,
-                 list_backend=_X2GoServerSessionList,
-                 proxy_backend=_X2GoProxy,
+                 terminal_backend=_BACKENDS['X2GoTerminalSession']['default'],
+                 info_backend=_BACKENDS['X2GoServerSessionInfo']['default'],
+                 list_backend=_BACKENDS['X2GoServerSessionList']['default'],
+                 proxy_backend=_BACKENDS['X2GoProxy']['default'],
                  client_rootdir=os.path.join(defaults.LOCAL_HOME, defaults.X2GO_CLIENT_ROOTDIR),
                  sessions_rootdir=os.path.join(defaults.LOCAL_HOME, defaults.X2GO_SESSIONS_ROOTDIR),
                  ssh_rootdir=os.path.join(defaults.LOCAL_HOME, defaults.X2GO_SSH_ROOTDIR),
@@ -151,7 +148,7 @@ class X2GoControlSessionSTDOUT(paramiko.SSHClient):
             (unique-by-design) profile ID
         @type unique_hostkey_aliases: C{bool}
         @param terminal_backend: X2Go terminal session backend to use
-        @type terminal_backend: C{class}
+        @type terminal_backend: C{str}
         @param info_backend: backend for handling storage of server session information
         @type info_backend: C{X2GoServerSessionInfo*} instance
         @param list_backend: backend for handling storage of session list information
diff --git a/x2go/backends/info/__init__.py b/x2go/backends/info/__init__.py
index 02630ec..bf089e0 100644
--- a/x2go/backends/info/__init__.py
+++ b/x2go/backends/info/__init__.py
@@ -16,12 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_SERVERSESSIONINFO_DEFAULT
-from x2go.defaults import BACKEND_SERVERSESSIONLIST_DEFAULT
-
-from _stdout import X2GoServerSessionInfoSTDOUT
-from _stdout import X2GoServerSessionListSTDOUT
-
-X2GoServerSessionInfo = eval(BACKEND_SERVERSESSIONINFO_DEFAULT)
-X2GoServerSessionList = eval(BACKEND_SERVERSESSIONLIST_DEFAULT)
diff --git a/x2go/backends/info/_stdout.py b/x2go/backends/info/plain.py
similarity index 96%
rename from x2go/backends/info/_stdout.py
rename to x2go/backends/info/plain.py
index 39801b7..d2694fc 100644
--- a/x2go/backends/info/_stdout.py
+++ b/x2go/backends/info/plain.py
@@ -22,7 +22,7 @@ X2GoServerSessionList and X2GoServerSessionInfo classes - data handling for
 X2Go server sessions.
 
 This backend handles X2Go server implementations that respond with session infos 
-via server-side STDOUT.
+via server-side PLAIN text output.
 
 """
 __NAME__ = 'x2goserversessioninfo-pylib'
@@ -34,17 +34,17 @@ import re
 
 import x2go.defaults as defaults
 
-class X2GoServerSessionInfoSTDOUT(object):
+class X2GoServerSessionInfo(object):
     """\
     L{X2GoServerSessionInfo} is used to store all information
     that is retrieved from the connected X2Go server on 
-    C{X2GoTerminalSessionBACKEND.start()} resp. C{X2GoTerminalSessionBACKEND.resume()}.
+    C{X2GoTerminalSession.start()} resp. C{X2GoTerminalSession.resume()}.
 
     """
     def __str__(self):
         return self.name
     def __repr__(self):
-        result = 'X2GoServerSessionInfoSTDOUT('
+        result = 'X2GoServerSessionInfo('
         for p in dir(self):
             if '__' in p or not p in self.__dict__ or type(p) is types.InstanceType: continue
             result += p + '=' + str(self.__dict__[p]) +','
@@ -279,14 +279,14 @@ class X2GoServerSessionInfoSTDOUT(object):
     """ Class constructor, identical to L{clear()} method. """
 
 
-class X2GoServerSessionListSTDOUT(object):
+class X2GoServerSessionList(object):
     """\
-    L{X2GoServerSessionListSTDOUT} is used to store all information
+    L{X2GoServerSessionList} is used to store all information
     that is retrieved from a connected X2Go server on a
-    C{X2GoControlSessionBACKEND.list_sessions()} call.
+    C{X2GoControlSession.list_sessions()} call.
 
     """
-    def __init__(self, x2go_output=None, info_backend=X2GoServerSessionInfoSTDOUT):
+    def __init__(self, x2go_output=None, info_backend=X2GoServerSessionInfo):
         """\
         @param x2go_output: X2Go server's C{x2golistsessions} command output, each 
             session separated by a newline character. Session values are separated 
diff --git a/x2go/backends/printing/__init__.py b/x2go/backends/printing/__init__.py
index c3493c5..bf089e0 100644
--- a/x2go/backends/printing/__init__.py
+++ b/x2go/backends/printing/__init__.py
@@ -16,12 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_CLIENTPRINTING_DEFAULT
-
-from _file import X2GoClientPrintingFILE
-from _winreg import X2GoClientPrintingWINREG
-from _gconf import X2GoClientPrintingGCONF
-
-X2GoClientPrinting = eval(BACKEND_CLIENTPRINTING_DEFAULT)
-
diff --git a/x2go/backends/printing/_file.py b/x2go/backends/printing/file.py
similarity index 96%
rename from x2go/backends/printing/_file.py
rename to x2go/backends/printing/file.py
index 716809a..1747ef6 100644
--- a/x2go/backends/printing/_file.py
+++ b/x2go/backends/printing/file.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-L{X2GoClientPrintingFILE} class is one of Python X2Go's public API classes. 
+L{X2GoClientPrinting} class is one of Python X2Go's public API classes. 
 
 Retrieve an instance of this class from your L{X2GoClient} instance.
 Use this class in your Python X2Go based applications to access the »printing« 
@@ -58,13 +58,13 @@ _print_property_map = {
         },
 }
 
-class X2GoClientPrintingFILE(inifiles.X2GoIniFile):
+class X2GoClientPrinting(inifiles.X2GoIniFile):
     """\
-    L{X2GoClientPrintingFILE} provides access to the X2Go ini-like file
+    L{X2GoClientPrinting} provides access to the X2Go ini-like file
     »printing« as stored in C{~/.x2goclient/printing} resp. globally
     C{/etc/x2goclient/printing}.
 
-    An instance of L{X2GoClientPrintingFILE} is created on each incoming
+    An instance of L{X2GoClientPrinting} is created on each incoming
     print job. This facilitates that on every print job the print action
     for this job is derived from the »printing« configuration file.
 
@@ -73,9 +73,8 @@ class X2GoClientPrintingFILE(inifiles.X2GoIniFile):
     """
     config_files = []
     _print_action = None
-    defaultValues = _X2GO_CLIENTPRINTING_DEFAULTS
 
-    def __init__(self, config_files=_X2GO_PRINTING_CONFIGFILES, defaults=None, client_instance=None, logger=None, loglevel=log.loglevel_DEFAULT):
+    def __init__(self, config_files=_X2GO_PRINTING_CONFIGFILES, defaults=_X2GO_CLIENTPRINTING_DEFAULTS, client_instance=None, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
         @param config_files: a list of configuration files names (e.g. a global filename and a user's home 
             directory filename)
diff --git a/x2go/backends/printing/_gconf.py b/x2go/backends/printing/gconf.py
similarity index 95%
rename from x2go/backends/printing/_gconf.py
rename to x2go/backends/printing/gconf.py
index 86a3b79..75bdaf3 100644
--- a/x2go/backends/printing/_gconf.py
+++ b/x2go/backends/printing/gconf.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-L{X2GoClientPrintingGCONF} class is one of Python X2Go's public API classes. 
+L{X2GoClientPrinting} class is one of Python X2Go's public API classes. 
 
 Retrieve an instance of this class from your L{X2GoClient} instance.
 Use this class in your Python X2Go based applications to access the »printing« 
@@ -38,7 +38,7 @@ import x2go.inifiles as inifiles
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoClientPrintingGCONF(inifiles.X2GoIniFile):
+class X2GoClientPrinting(object):
     """\
     L{X2GoClientPrintingGCONF} provides access to the GCONF based configuration
     of the X2Go client printing setup.
diff --git a/x2go/backends/printing/_winreg.py b/x2go/backends/printing/winreg.py
similarity index 92%
rename from x2go/backends/printing/_winreg.py
rename to x2go/backends/printing/winreg.py
index 33e8868..a730e74 100644
--- a/x2go/backends/printing/_winreg.py
+++ b/x2go/backends/printing/winreg.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-L{X2GoClientPrintingWINREG} class is one of Python X2Go's public API classes. 
+L{X2GoClientPrinting} class is one of Python X2Go's public API classes. 
 
 Retrieve an instance of this class from your L{X2GoClient} instance.
 Use this class in your Python X2Go based applications to access the »printing« 
@@ -38,9 +38,9 @@ import x2go.inifiles as inifiles
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoClientPrintingWINREG(inifiles.X2GoIniFile):
+class X2GoClientPrinting(object):
     """\
-    L{X2GoClientPrintingWINREG} provides access to the Windows registry based configuration
+    L{X2GoClientPrinting} provides access to the Windows registry based configuration
     of the X2Go client printing setup.
 
     An instance of L{X2GoClientPrintingWINREG} is created on each incoming
diff --git a/x2go/backends/profiles/gconf.py b/x2go/backends/profiles/gconf.py
index 1c74b1b..cf2ef86 100644
--- a/x2go/backends/profiles/gconf.py
+++ b/x2go/backends/profiles/gconf.py
@@ -27,14 +27,13 @@ applications.
 __NAME__ = 'x2gosessionprofiles-pylib'
 
 # Python X2Go modules
-from x2go.defaults import X2GO_SESSIONPROFILES_CONFIGFILES
 from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS
-import x2go.inifiles as inifiles
 import x2go.log as log
+import x2go.backends.profiles.base as base
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoSessionProfilesGCONF(inifiles.X2GoIniFile):
+class X2GoSessionProfiles(base.X2GoSessionProfiles):
 
     defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
     _non_profile_sections = ('embedded')
diff --git a/x2go/backends/profiles/httpsbroker.py b/x2go/backends/profiles/httpbroker.py
similarity index 53%
copy from x2go/backends/profiles/httpsbroker.py
copy to x2go/backends/profiles/httpbroker.py
index cc5ac90..0d27cb4 100644
--- a/x2go/backends/profiles/httpsbroker.py
+++ b/x2go/backends/profiles/httpbroker.py
@@ -27,21 +27,19 @@ applications.
 __NAME__ = 'x2gosessionprofiles-pylib'
 
 # Python X2Go modules
-from x2go.defaults import X2GO_SESSIONPROFILES_CONFIGFILES
 from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS
-import x2go.inifiles as inifiles
+import x2go.backends.profiles.base as base
 import x2go.log as log
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoSessionProfilesHTTPSBROKER(inifiles.X2GoIniFile):
+class X2GoSessionProfiles(base.X2GoSessionProfiles):
 
     defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
-    _non_profile_sections = ('embedded')
 
     def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
-        Retrieve X2Go session profiles from a HTTPS session broker.
+        Retrieve X2Go session profiles from a HTTP(S) session broker.
 
         @param session_profile_defaults: a default session profile
         @type session_profile_defaults: C{dict}
@@ -53,4 +51,42 @@ class X2GoSessionProfilesHTTPSBROKER(inifiles.X2GoIniFile):
         @type loglevel: C{int}
 
         """
-        raise X2GoNotImplementedYetException('HTTPSBROKER backend support is not implemented yet')
+        base.X2GoSessionProfiles.__init__(self, session_profile_defaults=session_profile_defaults, logger=logger, loglevel=loglevel)
+
+    def _populate_session_profiles(self):
+        """\
+        Populate the set of session profiles by loading the session
+        profile configuration from a file in INI format.
+
+        @return: a set of session profiles
+        @rtype: C{dict}
+
+        """
+        session_profiles = LOAD
+
+        for session_profile in session_profiles:
+            for key, default_value in self.defaultSessionProfile.iteritems():
+                if not self.iniConfig.has_option(session_profile, key):
+                    self._storeValue(session_profile, key, default_value)
+            # update cached meta type session profile information
+            self.get_profile_metatype(session_profile)
+
+        return session_profiles
+
+    def _write(self):
+        print "BROKER CLIENT: WRITING SESSION PROFILES IS NOT SUPPORTED"
+
+    def _delete_profile(self, profile_id):
+        print "BROKER CLIENT: DELETING SESSION PROFILES IS NOT SUPPORTED"
+
+    def _update_value(self, profile_id, option, value):
+        print "BROKER CLIENT: MODIFYING SESSION PROFILES IS NOT SUPPORTED"
+
+    def _get_profile_parameter(self, profile_id, option, key_type):
+        print "TODO"
+
+    def _get_profile_options(self, profile_id):
+        print "TODO"
+
+    def _get_profile_ids(self):
+        print "TODO"
diff --git a/x2go/backends/profiles/httpsbroker.py b/x2go/backends/profiles/sshbroker.py
similarity index 92%
rename from x2go/backends/profiles/httpsbroker.py
rename to x2go/backends/profiles/sshbroker.py
index cc5ac90..32bc8c3 100644
--- a/x2go/backends/profiles/httpsbroker.py
+++ b/x2go/backends/profiles/sshbroker.py
@@ -29,19 +29,19 @@ __NAME__ = 'x2gosessionprofiles-pylib'
 # Python X2Go modules
 from x2go.defaults import X2GO_SESSIONPROFILES_CONFIGFILES
 from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS
-import x2go.inifiles as inifiles
+import x2go.backends.profiles.base as base
 import x2go.log as log
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoSessionProfilesHTTPSBROKER(inifiles.X2GoIniFile):
+class X2GoSessionProfiles(base.X2GoSessionProfiles):
 
     defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
     _non_profile_sections = ('embedded')
 
     def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
-        Retrieve X2Go session profiles from a HTTPS session broker.
+        Retrieve X2Go session profiles from a SSH session broker.
 
         @param session_profile_defaults: a default session profile
         @type session_profile_defaults: C{dict}
diff --git a/x2go/backends/profiles/winreg.py b/x2go/backends/profiles/winreg.py
index 4bd91ae..8cd9c54 100644
--- a/x2go/backends/profiles/winreg.py
+++ b/x2go/backends/profiles/winreg.py
@@ -27,14 +27,13 @@ applications.
 __NAME__ = 'x2gosessionprofiles-pylib'
 
 # Python X2Go modules
-from x2go.defaults import X2GO_SESSIONPROFILES_CONFIGFILES
 from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS
-import x2go.inifiles as inifiles
+import x2go.backends.profiles.base as base
 import x2go.log as log
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoSessionProfilesWINREG(inifiles.X2GoIniFile):
+class X2GoSessionProfilesWINREG(base.X2GoSessionProfiles):
 
     defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
     _non_profile_sections = ('embedded')
diff --git a/x2go/backends/proxy/__init__.py b/x2go/backends/proxy/__init__.py
index f4c4c37..bf089e0 100644
--- a/x2go/backends/proxy/__init__.py
+++ b/x2go/backends/proxy/__init__.py
@@ -16,9 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_PROXY_DEFAULT
-
-from _nx3 import X2GoProxyNX3
-
-X2GoProxy = eval(BACKEND_PROXY_DEFAULT)
diff --git a/x2go/backends/proxy/base.py b/x2go/backends/proxy/base.py
index 3554be4..c0042bf 100644
--- a/x2go/backends/proxy/base.py
+++ b/x2go/backends/proxy/base.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-X2GoProxyBASE class - proxying your connection through NX3 and others.
+X2GoProxy class - proxying your connection through NX3 and others.
 
 """
 __NAME__ = 'x2goproxy-pylib'
@@ -47,7 +47,7 @@ from x2go.defaults import LOCAL_HOME as _LOCAL_HOME
 from x2go.defaults import X2GO_SESSIONS_ROOTDIR as _X2GO_SESSIONS_ROOTDIR
 
 
-class X2GoProxyBASE(threading.Thread):
+class X2GoProxy(threading.Thread):
     """\
     X2GoProxy is an abstract class for X2Go proxy connections.
 
diff --git a/x2go/backends/proxy/_nx3.py b/x2go/backends/proxy/nx3.py
similarity index 93%
rename from x2go/backends/proxy/_nx3.py
rename to x2go/backends/proxy/nx3.py
index a8d1044..75ed19b 100644
--- a/x2go/backends/proxy/_nx3.py
+++ b/x2go/backends/proxy/nx3.py
@@ -28,15 +28,15 @@ import os
 
 # Python X2Go modules
 import x2go.log as log
-import base
+import x2go.backends.proxy.base as base
 
 from x2go.defaults import X2GOCLIENT_OS as _X2GOCLIENT_OS
 
-class X2GoProxyNX3(base.X2GoProxyBASE):
+class X2GoProxy(base.X2GoProxy):
     """\
-    X2GoNX3Proxy is a NX version 3 based X2Go proxy connection class.
+    This L{X2GoProxy} class is a NX version 3 based X2Go proxy connection class.
 
-    It basically fills L{X2GoProxyBASE} variables with sensible content. Its 
+    It basically fills L{x2go.backends.proxy.X2GoProxy} variables with sensible content. Its
     methods mostly wrap around the corresponding methods of the parent class.
 
     """
@@ -45,7 +45,7 @@ class X2GoProxyNX3(base.X2GoProxyBASE):
         For available parameters refer to L{X2GoProxyBASE} class documentation.
 
         """
-        base.X2GoProxyBASE.__init__(self, *args, **kwargs)
+        base.X2GoProxy.__init__(self, *args, **kwargs)
 
         # setting some default environment variables, nxproxy paths etc.
         if _X2GOCLIENT_OS == "Windows":
@@ -136,7 +136,7 @@ class X2GoProxyNX3(base.X2GoProxyBASE):
         self.logger('NX3 Proxy mode is server, cookie=%s, host=127.0.0.1, port=%s.' % (self.session_info.cookie, self.session_info.graphics_port,), loglevel=log.loglevel_DEBUG)
         self.logger('NX3 proxy writes session log to %s.' % os.path.join(self.session_info.local_container, 'session.log'), loglevel=log.loglevel_DEBUG)
 
-        p, p_ok = base.X2GoProxyBASE.start_proxy(self)
+        p, p_ok = base.X2GoProxy.start_proxy(self)
 
         if self.ok():
             self.logger('NX3 proxy is up and running.', loglevel=log.loglevel_INFO)
diff --git a/x2go/backends/settings/__init__.py b/x2go/backends/settings/__init__.py
index 8b9dbaf..bf089e0 100644
--- a/x2go/backends/settings/__init__.py
+++ b/x2go/backends/settings/__init__.py
@@ -16,12 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_CLIENTSETTINGS_DEFAULT
-
-from _file import X2GoClientSettingsFILE
-from _gconf import X2GoClientSettingsGCONF
-from _winreg import X2GoClientSettingsWINREG
-
-X2GoClientSettings = eval(BACKEND_CLIENTSETTINGS_DEFAULT)
-
diff --git a/x2go/backends/settings/_file.py b/x2go/backends/settings/file.py
similarity index 77%
rename from x2go/backends/settings/_file.py
rename to x2go/backends/settings/file.py
index 2d7e094..c484440 100644
--- a/x2go/backends/settings/_file.py
+++ b/x2go/backends/settings/file.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-X2GoClientSettings class - managing x2goclient settings file (incl. LDAP-Support).
+X2GoClientSettings class - managing x2goclient settings file.
 
 The L{X2GoClientSettings} class one of Python X2Go's a public API classes.
 Use this class (indirectly by retrieving it from an L{X2GoClient} instance)
@@ -35,20 +35,18 @@ from x2go.defaults import X2GO_CLIENTSETTINGS_DEFAULTS as _X2GO_CLIENTSETTINGS_D
 import x2go.inifiles as inifiles
 
 
-class X2GoClientSettingsFILE(inifiles.X2GoIniFile):
+class X2GoClientSettings(inifiles.X2GoIniFile):
     """\
     Configuration file based settings for L{X2GoClient} instances.
 
     """
-    defaultValues = _X2GO_CLIENTSETTINGS_DEFAULTS
-
-    def __init__(self, config_files=_X2GO_SETTINGS_CONFIGFILES, defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
+    def __init__(self, config_files=_X2GO_SETTINGS_CONFIGFILES, defaults=_X2GO_CLIENTSETTINGS_DEFAULTS, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
-        Constructs an L{X2GoClientSettingsFILE} instance. This is normally done from within an L{X2GoClient} instance.
-        You can retrieve this L{X2GoClientSettingsFILE} instance with the L{X2GoClient.get_client_settings()} 
+        Constructs an L{X2GoClientSettings} instance. This is normally done from within an L{X2GoClient} instance.
+        You can retrieve this L{X2GoClientSettings} instance with the L{X2GoClient.get_client_settings()} 
         method.
 
-        On construction the L{X2GoClientSettingsFILE} object is filled with values from the configuration files::
+        On construction the L{X2GoClientSettings} object is filled with values from the configuration files::
 
             /etc/x2goclient/settings
             ~/.x2goclient/settings
diff --git a/x2go/backends/settings/_gconf.py b/x2go/backends/settings/gconf.py
similarity index 80%
rename from x2go/backends/settings/_gconf.py
rename to x2go/backends/settings/gconf.py
index 1d9fb04..379b409 100644
--- a/x2go/backends/settings/_gconf.py
+++ b/x2go/backends/settings/gconf.py
@@ -18,7 +18,7 @@
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 
 """\
-X2GoClientSettings class - managing x2goclient settings file (incl. LDAP-Support).
+X2GoClientSettings class - managing x2goclient settings file.
 
 The L{X2GoClientSettings} class one of Python X2Go's a public API classes.
 Use this class (indirectly by retrieving it from an L{X2GoClient} instance)
@@ -36,7 +36,7 @@ import x2go.inifiles as inifiles
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoClientSettingsGCONF(inifiles.X2GoIniFile):
+class X2GoClientSettings(object):
     """\
     Configure settings for L{X2GoClient} instances with the GConf daemon.
 
@@ -45,11 +45,11 @@ class X2GoClientSettingsGCONF(inifiles.X2GoIniFile):
 
     def __init__(self, config_files=_X2GO_SETTINGS_CONFIGFILES, defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
-        Constructs an L{X2GoClientSettingsGCONF} instance. This is normally done from within an L{X2GoClient} instance.
-        You can retrieve this L{X2GoClientSettingsGCONF} instance with the L{X2GoClient.get_client_settings()} 
+        Constructs an L{X2GoClientSettings} instance. This is normally done from within an L{X2GoClient} instance.
+        You can retrieve this L{X2GoClientSettings} instance with the L{X2GoClient.get_client_settings()} 
         method.
 
-        On construction the L{X2GoClientSettingsGCONF} object is filled with values as found in GConf::
+        On construction the L{X2GoClientSettings} object is filled with values as found in GConf::
 
             <GConf paths, FIXME: give proper locations here>
 
diff --git a/x2go/backends/settings/_winreg.py b/x2go/backends/settings/winreg.py
similarity index 88%
rename from x2go/backends/settings/_winreg.py
rename to x2go/backends/settings/winreg.py
index e301499..877d2b3 100644
--- a/x2go/backends/settings/_winreg.py
+++ b/x2go/backends/settings/winreg.py
@@ -36,7 +36,7 @@ import x2go.inifiles as inifiles
 
 from x2go.x2go_exceptions import X2GoNotImplementedYetException
 
-class X2GoClientSettingsWINREG(inifiles.X2GoIniFile):
+class X2GoClientSettings(inifiles.X2GoIniFile):
     """\
     Windows registry based settings for L{X2GoClient} instances.
 
@@ -45,8 +45,8 @@ class X2GoClientSettingsWINREG(inifiles.X2GoIniFile):
 
     def __init__(self, config_files=_X2GO_SETTINGS_CONFIGFILES, defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
         """\
-        Constructs an L{X2GoClientSettingsWINREG} instance. This is normally done from within an L{X2GoClient} instance.
-        You can retrieve this L{X2GoClientSettingsWINREG} instance with the L{X2GoClient.get_client_settings()} 
+        Constructs an L{X2GoClientSettings} instance. This is normally done from within an L{X2GoClient} instance.
+        You can retrieve this L{X2GoClientSettings} instance with the L{X2GoClient.get_client_settings()} 
         method.
 
         On construction the L{X2GoClientSettings} object is filled with values from the Windows registry::
diff --git a/x2go/backends/terminal/__init__.py b/x2go/backends/terminal/__init__.py
index 5dc174b..bf089e0 100644
--- a/x2go/backends/terminal/__init__.py
+++ b/x2go/backends/terminal/__init__.py
@@ -16,9 +16,3 @@
 # along with this program; if not, write to the
 # Free Software Foundation, Inc.,
 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-
-from x2go.defaults import BACKEND_TERMINALSESSION_DEFAULT
-
-from _stdout import X2GoTerminalSessionSTDOUT
-
-X2GoTerminalSession = eval(BACKEND_TERMINALSESSION_DEFAULT)
diff --git a/x2go/backends/terminal/_stdout.py b/x2go/backends/terminal/plain.py
similarity index 98%
rename from x2go/backends/terminal/_stdout.py
rename to x2go/backends/terminal/plain.py
index b645177..ef1898d 100644
--- a/x2go/backends/terminal/_stdout.py
+++ b/x2go/backends/terminal/plain.py
@@ -21,7 +21,7 @@
 X2GoTerminalSession class - core functions for handling your individual X2Go sessions.
 
 This backend handles X2Go server implementations that respond with session infos 
-via server-side STDOUT and use NX3 as graphical proxy.
+via server-side PLAIN text output.
 
 """
 __NAME__ = 'x2goterminalsession-pylib'
@@ -54,10 +54,7 @@ from x2go.defaults import X2GO_SESSIONS_ROOTDIR as _X2GO_SESSIONS_ROOTDIR
 from x2go.defaults import X2GO_GENERIC_APPLICATIONS as _X2GO_GENERIC_APPLICATIONS
 from x2go.defaults import X2GO_DESKTOPSESSIONS as _X2GO_DESKTOPSESSIONS
 
-from x2go.backends.info import X2GoServerSessionInfo as _X2GoServerSessionInfo
-from x2go.backends.info import X2GoServerSessionList as _X2GoServerSessionList
-from x2go.backends.proxy import X2GoProxy as _X2GoProxy
-from x2go.backends.printing import X2GoClientPrinting as _X2GoClientPrinting
+from x2go.defaults import BACKENDS as _BACKENDS
 
 _local_color_depth = utils.local_color_depth()
 
@@ -183,7 +180,7 @@ class X2GoSessionParams(object):
         self.rewrite_session_type()
 
 
-class X2GoTerminalSessionSTDOUT(object):
+class X2GoTerminalSession(object):
     """\
     Class for managing X2Go terminal sessions on a remote X2Go server via Paramiko/SSH.
 
@@ -217,10 +214,10 @@ class X2GoTerminalSessionSTDOUT(object):
                  rootdir=None,
                  profile_name='UNKNOWN', profile_id=utils._genSessionProfileId(),
                  print_action=None, print_action_args={},
-                 info_backend=_X2GoServerSessionInfo,
-                 list_backend=_X2GoServerSessionList,
-                 proxy_backend=_X2GoProxy, proxy_options={},
-                 printing_backend=_X2GoClientPrinting,
+                 info_backend=_BACKENDS['X2GoServerSessionInfo']['default'],
+                 list_backend=_BACKENDS['X2GoServerSessionList']['default'],
+                 proxy_backend=_BACKENDS['X2GoProxy']['default'], proxy_options={},
+                 printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
                  client_rootdir=os.path.join(_LOCAL_HOME, _X2GO_CLIENT_ROOTDIR),
                  sessions_rootdir=os.path.join(_LOCAL_HOME, _X2GO_SESSIONS_ROOTDIR),
                  session_instance=None,
@@ -371,12 +368,12 @@ class X2GoTerminalSessionSTDOUT(object):
         self.set_session_title = set_session_title
         self.session_title = session_title
         self.session_window = None
-        self.proxy_backend = proxy_backend
+        self.proxy_backend = utils._get_backend_class(proxy_backend, "X2GoProxy")
 
         self.snd_port = snd_port
         self.print_action = print_action
         self.print_action_args = print_action_args
-        self.printing_backend = printing_backend
+        self.printing_backend = utils._get_backend_class(printing_backend, "X2GoClientPrinting")
         self.session_instance = session_instance
         if self.session_instance:
             self.client_instance = self.session_instance.client_instance
diff --git a/x2go/client.py b/x2go/client.py
index 632d470..debba28 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -144,16 +144,7 @@ from defaults import X2GO_PRINTING_FILENAME as _X2GO_PRINTING_FILENAME
 from defaults import X2GO_XCONFIG_FILENAME as _X2GO_XCONFIG_FILENAME
 from defaults import PUBAPP_MAX_NO_SUBMENUS as _PUBAPP_MAX_NO_SUBMENUS
 
-from defaults import BACKENDS_CONTROLSESSION as _BACKENDS_CONTROLSESSION
-from defaults import BACKENDS_TERMINALSESSION as _BACKENDS_TERMINALSESSION
-from defaults import BACKENDS_SERVERSESSIONINFO as _BACKENDS_SERVERSESSIONINFO
-from defaults import BACKENDS_SERVERSESSIONLIST as _BACKENDS_SERVERSESSIONLIST
-from defaults import BACKENDS_PROXY as _BACKENDS_PROXY
-from defaults import BACKENDS_SESSIONPROFILES as _BACKENDS_SESSIONPROFILES
-from defaults import BACKENDS_CLIENTSETTINGS as _BACKENDS_CLIENTSETTINGS
-from defaults import BACKENDS_CLIENTPRINTING as _BACKENDS_CLIENTPRINTING
-
-from defaults import BACKEND_SESSIONPROFILES_DEFAULT as _BACKEND_SESSIONPROFILES_DEFAULT
+from defaults import BACKENDS as _BACKENDS
 
 import x2go.backends.control as control
 import x2go.backends.terminal as terminal
@@ -183,14 +174,14 @@ class X2GoClient(object):
     lang = 'en'
 
     def __init__(self,
-                 control_backend=control.X2GoControlSession,
-                 terminal_backend=terminal.X2GoTerminalSession,
-                 info_backend=info.X2GoServerSessionInfo,
-                 list_backend=info.X2GoServerSessionList,
-                 proxy_backend=proxy.X2GoProxy,
-                 profiles_backend=_BACKEND_SESSIONPROFILES_DEFAULT,
-                 settings_backend=settings.X2GoClientSettings,
-                 printing_backend=printing.X2GoClientPrinting,
+                 control_backend=_BACKENDS['X2GoControlSession']['default'],
+                 terminal_backend=_BACKENDS['X2GoTerminalSession']['default'],
+                 info_backend=_BACKENDS['X2GoServerSessionInfo']['default'],
+                 list_backend=_BACKENDS['X2GoServerSessionList']['default'],
+                 proxy_backend=_BACKENDS['X2GoProxy']['default'],
+                 profiles_backend=_BACKENDS['X2GoSessionProfiles']['default'],
+                 settings_backend=_BACKENDS['X2GoClientSettings']['default'],
+                 printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
                  client_rootdir=None,
                  sessions_rootdir=None,
                  ssh_rootdir=None,
@@ -209,21 +200,21 @@ class X2GoClient(object):
                  logger=None, loglevel=log.loglevel_DEFAULT):
         """\
         @param control_backend: X2Go control session backend to use
-        @type control_backend: C{class}
+        @type control_backend: C{str}
         @param terminal_backend: X2Go terminal session backend to use
-        @type terminal_backend: C{class}
+        @type terminal_backend: C{str}
         @param info_backend: X2Go session info backend to use
-        @type info_backend: C{class}
+        @type info_backend: C{str}
         @param list_backend: X2Go session list backend to use
-        @type list_backend: C{class}
+        @type list_backend: C{str}
         @param proxy_backend: X2Go proxy backend to use
-        @type proxy_backend: C{class}
+        @type proxy_backend: C{str}
         @param profiles_backend: X2Go session profiles backend to use
-        @type profiles_backend: C{class}
+        @type profiles_backend: C{str}
         @param settings_backend: X2Go client settings backend to use
-        @type settings_backend: C{class}
+        @type settings_backend: C{str}
         @param printing_backend: X2Go client printing backend to use
-        @type printing_backend: C{class}
+        @type printing_backend: C{str}
         @param client_rootdir: client base dir (default: ~/.x2goclient)
         @type client_rootdir: C{str}
         @param sessions_rootdir: sessions base dir (default: ~/.x2go)
@@ -272,16 +263,14 @@ class X2GoClient(object):
         if self.logger.tag is None:
             self.logger.tag = self._logger_tag
 
-        self.control_backend = control_backend
-        self.terminal_backend = terminal_backend
-        self.info_backend = info_backend
-        self.list_backend = list_backend
-        self.proxy_backend = proxy_backend
-        self.profiles_backend = self._get_backend_class(profiles_backend, "X2GoSessionProfiles")
-        self.settings_backend = settings_backend
-        self.printing_backend = printing_backend
-
-        self._detect_backend_classes()
+        self.control_backend = utils._get_backend_class(control_backend, "X2GoControlSession")
+        self.terminal_backend = utils._get_backend_class(terminal_backend, "X2GoTerminalSession")
+        self.info_backend = utils._get_backend_class(info_backend, "X2GoServerSessionInfo")
+        self.list_backend = utils._get_backend_class(list_backend, "X2GoServerSessionList")
+        self.proxy_backend = utils._get_backend_class(proxy_backend, "X2GoProxy")
+        self.profiles_backend = utils._get_backend_class(profiles_backend, "X2GoSessionProfiles")
+        self.settings_backend = utils._get_backend_class(settings_backend, "X2GoClientSettings")
+        self.printing_backend = utils._get_backend_class(printing_backend, "X2GoClientPrinting")
 
         self.client_rootdir = client_rootdir or os.path.normpath(os.path.join(_LOCAL_HOME, _X2GO_CLIENT_ROOTDIR))
         self.sessions_rootdir = sessions_rootdir or os.path.normpath(os.path.join(_LOCAL_HOME, _X2GO_SESSIONS_ROOTDIR))
@@ -373,10 +362,6 @@ class X2GoClient(object):
         self.auto_update_listdesktops_cache = auto_update_listdesktops_cache
         self.auto_update_listmounts_cache = auto_update_listmounts_cache
 
-    def _get_backend_class(self, backend, class_name):
-        exec("from {backend} import {class_name} as _this_class".format(backend=backend, class_name=class_name))
-        return _this_class
-
     def HOOK_profile_auto_connect(self, profile_name='UNKNOWN'):
         """\
         HOOK method: called if a session demands to auto connect the session profile.
@@ -727,101 +712,6 @@ class X2GoClient(object):
         """
         self.logger('HOOK_sshfs_not_available: the remote X2Go server (%s) denies SSHFS access for session %s. This will result in client-side folder sharing, printing and the MIME box feature being unavailable' % (session_name, profile_name), loglevel=log.loglevel_WARN)
 
-    def _detect_backend_classes(self):
-        """\
-        Detect backend classes from the command line
-
-        @raise X2GoBackendException: if a given backend name is unknown."
-
-        """
-        # CONTROL session backend
-        if type(self.control_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_CONTROLSESSION[self.control_backend]
-            except KeyError:
-                if self.control_backend in _BACKENDS_CONTROLSESSION.values():
-                   _classname = self.control_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown control session backend name %s' % self.control_backend)
-            self.control_backend = eval('control.%s' % _classname)
-
-        # TERMINAL session backend
-        if type(self.terminal_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_TERMINALSESSION[self.terminal_backend]
-            except KeyError:
-                if self.terminal_backend in _BACKENDS_TERMINALSESSION.values():
-                   _classname = self.terminal_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown terminal session backend name %s' % self.terminal_backend)
-            self.terminal_backend = eval('terminal.%s' % _classname)
-
-        # PROXY session backend
-        if type(self.proxy_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_PROXY[self.proxy_backend]
-            except KeyError:
-                if self.proxy_backend in _BACKENDS_PROXY.values():
-                   _classname = self.proxy_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown proxy backend name %s' % self.proxy_backend)
-            self.proxy_backend = eval('proxy.%s' % _classname)
-
-        # server session info backend
-        if type(self.info_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_SERVERSESSIONINFO[self.info_backend]
-            except KeyError:
-                if self.info_backend in _BACKENDS_SERVERSESSIONINFO.values():
-                   _classname = self.info_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown server session info backend name %s' % self.info_backend)
-            self.info_backend = eval('info.%s' % _classname)
-
-        # server session list backend
-        if type(self.list_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_SERVERSESSIONLIST[self.list_backend]
-            except KeyError:
-                if self.list_backend in _BACKENDS_SERVERSESSIONLIST.values():
-                   _classname = self.list_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown server session info backend name %s' % self.list_backend)
-            self.list_backend = eval('info.%s' % _classname)
-
-        # session profiles backend
-        if type(self.profiles_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_SESSIONPROFILES[self.profiles_backend]
-            except KeyError:
-                if self.profiles_backend in _BACKENDS_SESSIONPROFILES.values():
-                   _classname = self.profiles_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown session profiles backend name %s' % self.profiles_backend)
-            self.profiles_backend = eval('profiles.%s' % _classname)
-
-        # client settings backend
-        if type(self.settings_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_CLIENTSETTINGS[self.settings_backend]
-            except KeyError:
-                if self.settings_backend in _BACKENDS_CLIENTSETTINGS.values():
-                   _classname = self.settings_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown client settings backend name %s' % self.settings_backend)
-            self.settings_backend = eval('settings.%s' % _classname)
-
-        # client printing backend
-        if type(self.printing_backend) is types.StringType:
-            try:
-                _classname = _BACKENDS_CLIENTPRINTING[self.printing_backend]
-            except KeyError:
-                if self.printing_backend in _BACKENDS_CLIENTPRINTING.values():
-                   _classname = self.printing_backend
-                else:
-                    raise x2go_exceptions.X2GoBackendException('unknown client printing backend name %s' % self.printing_backend)
-            self.printing_backend = eval('printing.%s' % _classname)
-
     def get_client_rootdir(self):
         """\
         Retrieve the settings root directory of this L{X2GoClient} instance.
diff --git a/x2go/defaults.py b/x2go/defaults.py
index e5e444e..4cea579 100644
--- a/x2go/defaults.py
+++ b/x2go/defaults.py
@@ -92,61 +92,51 @@ else:
     raise OSNotSupportedException('Platform %s is not supported' % platform.system())
 
 ##
-## control and terminal session backend as well as session info and proxy backend defaults
+## backends of Python X2Go
 ##
 
-BACKENDS_CONTROLSESSION = {
-    'STDOUT': 'X2GoControlSessionSTDOUT',
-}
-BACKENDS_TERMINALSESSION = {
-    'STDOUT': 'X2GoTerminalSessionSTDOUT',
-}
-BACKENDS_SERVERSESSIONINFO = {
-    'STDOUT': 'X2GoServerSessionInfoSTDOUT',
-}
-BACKENDS_SERVERSESSIONLIST = {
-    'STDOUT': 'X2GoServerSessionListSTDOUT',
-}
-BACKENDS_PROXY = {
-    'NX3': 'X2GoProxyNX3',
-}
-
-BACKEND_CONTROLSESSION_DEFAULT =  'X2GoControlSessionSTDOUT'
-BACKEND_TERMINALSESSION_DEFAULT = 'X2GoTerminalSessionSTDOUT'
-BACKEND_SERVERSESSIONINFO_DEFAULT = 'X2GoServerSessionInfoSTDOUT'
-BACKEND_SERVERSESSIONLIST_DEFAULT = 'X2GoServerSessionListSTDOUT'
-BACKEND_PROXY_DEFAULT = 'X2GoProxyNX3'
-
-##
-## profile backend defaults
-##
-
-BACKENDS_SESSIONPROFILES = {
-    'FILE': 'x2go.backends.profiles.file',
-    'GCONF': 'x2go.backends.profiles.gconf',
-    'HTTPBROKER': 'x2go.backends.profiles.httpbroker',
-    'SSHBROKER': 'x2go.backends.profiles.sshbroker',
-    'WINREG': 'x2go.backends.profiles.winreg',
-}
-"""Python X2Go backends for storing session profiles."""
-BACKENDS_CLIENTSETTINGS = {
-    'FILE': 'X2GoClientSettingsFILE',
-    'GCONF': 'X2GoClientSettingsGCONF',
-    'HTTPSBROKER': 'X2GoClientSettingsHTTPSBROKER',
-    'WINREG': 'X2GoClientSettingsWINREG',
-}
-"""Python X2Go backends for storing client settings."""
-BACKENDS_CLIENTPRINTING = {
-    'FILE': 'X2GoClientPrintingFILE',
-    'GCONF': 'X2GoClientPrintingGCONF',
-    'HTTPSBROKER': 'X2GoClientPrintingHTTPSBROKER',
-    'WINREG': 'X2GoClientPrintingWINREG',
+BACKENDS = {
+    'X2GoControlSession': {
+        'default': 'PLAIN',
+        'PLAIN': 'x2go.backends.control.plain',
+    },
+    'X2GoTerminalSession': {
+        'default': 'PLAIN',
+        'PLAIN': 'x2go.backends.terminal.plain',
+    },
+    'X2GoServerSessionInfo': {
+        'default': 'PLAIN',
+        'PLAIN': 'x2go.backends.info.plain',
+    },
+    'X2GoServerSessionList': {
+        'default': 'PLAIN',
+        'PLAIN': 'x2go.backends.info.plain',
+    },
+    'X2GoProxy': {
+        'default': 'NX3',
+        'NX3': 'x2go.backends.proxy.nx3',
+    },
+    'X2GoSessionProfiles': {
+        'default': 'FILE',
+        'FILE': 'x2go.backends.profiles.file',
+        'GCONF': 'x2go.backends.profiles.gconf',
+        'HTTPBROKER': 'x2go.backends.profiles.httpbroker',
+        'SSHBROKER': 'x2go.backends.profiles.sshbroker',
+        'WINREG': 'x2go.backends.profiles.winreg',
+    },
+    'X2GoClientSettings': {
+        'default': 'FILE',
+        'FILE': 'x2go.backends.settings.file',
+        'GCONF': 'x2go.backends.settings.gconf',
+        'WINREG': 'x2go.backends.settings.winreg',
+    },
+    'X2GoClientPrinting': {
+        'default': 'FILE',
+        'FILE': 'x2go.backends.printing.file',
+        'GCONF': 'x2go.backends.printing.gconf',
+        'WINREG': 'x2go.backends.printing.winreg',
+    }
 }
-"""Python X2Go backends for storing print settings."""
-
-BACKEND_SESSIONPROFILES_DEFAULT = BACKENDS_SESSIONPROFILES['FILE']
-BACKEND_CLIENTSETTINGS_DEFAULT = 'X2GoClientSettingsFILE'
-BACKEND_CLIENTPRINTING_DEFAULT = 'X2GoClientPrintingFILE'
 
 ##
 ## X2Go Printing
diff --git a/x2go/inifiles.py b/x2go/inifiles.py
index 6390d92..e363bee 100644
--- a/x2go/inifiles.py
+++ b/x2go/inifiles.py
@@ -228,7 +228,7 @@ class X2GoIniFile(object):
         @param key: the ini file key in the given section
         @type key: C{str}
 
-        @return: a Python variable type 
+        @return: a Python variable type
         @rtype: class
 
         """
diff --git a/x2go/printqueue.py b/x2go/printqueue.py
index 2a15cba..3971cc9 100644
--- a/x2go/printqueue.py
+++ b/x2go/printqueue.py
@@ -38,11 +38,8 @@ import defaults
 import utils
 import log
 
-# we hide the default values from epydoc (that's why we transform them to _UNDERSCORE variables)
-from backends.printing import X2GoClientPrinting as _X2GoClientPrinting
-
 from defaults import X2GO_PRINTING_FILENAME as _X2GO_PRINTING_FILENAME
-
+from defaults import BACKENDS as _BACKENDS
 
 class X2GoPrintQueue(threading.Thread):
     """\
@@ -63,7 +60,7 @@ class X2GoPrintQueue(threading.Thread):
                  print_action=None,
                  print_action_args={},
                  client_instance=None,
-                 printing_backend=_X2GoClientPrinting,
+                 printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
                  logger=None,
                  loglevel=log.loglevel_DEFAULT):
         """\
@@ -100,7 +97,7 @@ class X2GoPrintQueue(threading.Thread):
         if self.spool_dir: self.spool_dir = os.path.normpath(self.spool_dir)
         self.client_instance = client_instance
         self.client_rootdir = client_instance.get_client_rootdir()
-        self.printing_backend = printing_backend
+        self.printing_backend = utils._get_backend_class(printing_backend, "X2GoClientPrinting")
         if print_action is not None:
             self.set_print_action(print_action, client_instance=self.client_instance, logger=logger, **print_action_args)
         threading.Thread.__init__(self)
diff --git a/x2go/registry.py b/x2go/registry.py
index 6c1acfc..66ad62f 100644
--- a/x2go/registry.py
+++ b/x2go/registry.py
@@ -36,21 +36,15 @@ import utils
 import session
 import x2go_exceptions
 
-# import the default terminal session backend
-from x2go.backends.control import X2GoControlSession as _X2GoControlSession
-from x2go.backends.terminal import X2GoTerminalSession as _X2GoTerminalSession
-from x2go.backends.info import X2GoServerSessionInfo as _X2GoServerSessionInfo
-from x2go.backends.info import X2GoServerSessionList as _X2GoServerSessionList
-from x2go.backends.proxy import X2GoProxy as _X2GoProxy
-from x2go.backends.settings import X2GoClientSettings as _X2GoClientSettings
-from x2go.backends.printing import X2GoClientPrinting as _X2GoClientPrinting
-
 from defaults import LOCAL_HOME as _LOCAL_HOME
 from defaults import X2GO_CLIENT_ROOTDIR as _X2GO_CLIENT_ROOTDIR
 from defaults import X2GO_SESSIONS_ROOTDIR as _X2GO_SESSIONS_ROOTDIR
 from defaults import X2GO_SESSIONPROFILE_DEFAULTS as _X2GO_SESSIONPROFILE_DEFAULTS
 from defaults import X2GO_SSH_ROOTDIR as _X2GO_SSH_ROOTDIR
 
+from defaults import BACKENDS as _BACKENDS
+
+
 class X2GoSessionRegistry(object):
     """\
     This class is utilized by L{X2GoClient} instances to maintain a good overview on
@@ -462,13 +456,13 @@ class X2GoSessionRegistry(object):
 
     def register(self, server, profile_id, profile_name,
                  session_name=None,
-                 control_backend=_X2GoControlSession,
-                 terminal_backend=_X2GoTerminalSession,
-                 info_backend=_X2GoServerSessionInfo,
-                 list_backend=_X2GoServerSessionList,
-                 proxy_backend=_X2GoProxy,
-                 settings_backend=_X2GoClientSettings,
-                 printing_backend=_X2GoClientPrinting,
+                 control_backend=_BACKENDS['X2GoControlSession']['default'],
+                 terminal_backend=_BACKENDS['X2GoTerminalSession']['default'],
+                 info_backend=_BACKENDS['X2GoServerSessionInfo']['default'],
+                 list_backend=_BACKENDS['X2GoServerSessionList']['default'],
+                 proxy_backend=_BACKENDS['X2GoProxy']['default'],
+                 settings_backend=_BACKENDS['X2GoClientSettings']['default'],
+                 printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
                  client_rootdir=os.path.join(_LOCAL_HOME,_X2GO_CLIENT_ROOTDIR),
                  sessions_rootdir=os.path.join(_LOCAL_HOME,_X2GO_SESSIONS_ROOTDIR),
                  ssh_rootdir=os.path.join(_LOCAL_HOME,_X2GO_SSH_ROOTDIR),
@@ -488,26 +482,26 @@ class X2GoSessionRegistry(object):
         @param session_name: session name (if available)
         @type session_name: C{str}
         @param control_backend: X2Go control session backend to use
-        @type control_backend: C{class}
+        @type control_backend: C{str}
         @param terminal_backend: X2Go terminal session backend to use
-        @type terminal_backend: C{class}
+        @type terminal_backend: C{str}
         @param info_backend: X2Go session info backend to use
-        @type info_backend: C{class}
+        @type info_backend: C{str}
         @param list_backend: X2Go session list backend to use
-        @type list_backend: C{class}
+        @type list_backend: C{str}
         @param proxy_backend: X2Go proxy backend to use
-        @type proxy_backend: C{class}
+        @type proxy_backend: C{str}
         @param settings_backend: X2Go client settings backend to use
-        @type settings_backend: C{class}
+        @type settings_backend: C{str}
         @param printing_backend: X2Go client printing backend to use
-        @type printing_backend: C{class}
+        @type printing_backend: C{str}
         @param client_rootdir: client base dir (default: ~/.x2goclient)
         @type client_rootdir: C{str}
         @param sessions_rootdir: sessions base dir (default: ~/.x2go)
         @type sessions_rootdir: C{str}
         @param ssh_rootdir: ssh base dir (default: ~/.ssh)
         @type ssh_rootdir: C{str}
-        @param keep_controlsession_alive: On last L{X2GoSession.disconnect()} keep the associated C{X2GoControlSession*} instance alive?
+        @param keep_controlsession_alive: On last L{X2GoSession.disconnect()} keep the associated C{X2GoControlSession} instance alive?
         @ŧype keep_controlsession_alive: C{bool}
         @param add_to_known_hosts: Auto-accept server host validity?
         @type add_to_known_hosts: C{bool}
diff --git a/x2go/session.py b/x2go/session.py
index 10f28fb..ec2cdc9 100644
--- a/x2go/session.py
+++ b/x2go/session.py
@@ -70,20 +70,14 @@ import utils
 import session
 import x2go_exceptions
 
-from x2go.backends.control import X2GoControlSession as _X2GoControlSession
-from x2go.backends.terminal import X2GoTerminalSession as _X2GoTerminalSession
-from x2go.backends.info import X2GoServerSessionInfo as _X2GoServerSessionInfo
-from x2go.backends.info import X2GoServerSessionList as _X2GoServerSessionList
-from x2go.backends.proxy import X2GoProxy as _X2GoProxy
-from x2go.backends.settings import X2GoClientSettings as _X2GoClientSettings
-from x2go.backends.printing import X2GoClientPrinting as _X2GoClientPrinting
-
 from defaults import X2GOCLIENT_OS as _X2GOCLIENT_OS
 from defaults import LOCAL_HOME as _LOCAL_HOME
 from defaults import X2GO_CLIENT_ROOTDIR as _X2GO_CLIENT_ROOTDIR
 from defaults import X2GO_SESSIONS_ROOTDIR as _X2GO_SESSIONS_ROOTDIR
 from defaults import X2GO_SSH_ROOTDIR as _X2GO_SSH_ROOTDIR
 
+from defaults import BACKENDS as _BACKENDS
+
 from defaults import SUPPORTED_SOUND, SUPPORTED_PRINTING, SUPPORTED_FOLDERSHARING, SUPPORTED_MIMEBOX
 
 _X2GO_SESSION_PARAMS = ('use_sshproxy', 'sshproxy_reuse_authinfo',
@@ -148,13 +142,13 @@ class X2GoSession(object):
                  allow_share_local_folders=False,
                  share_local_folders=[],
                  restore_shared_local_folders=False,
-                 control_backend=_X2GoControlSession,
-                 terminal_backend=_X2GoTerminalSession,
-                 info_backend=_X2GoServerSessionInfo,
-                 list_backend=_X2GoServerSessionList,
-                 proxy_backend=_X2GoProxy,
-                 settings_backend=_X2GoClientSettings,
-                 printing_backend=_X2GoClientPrinting,
+                 control_backend=_BACKENDS['X2GoControlSession']['default'],
+                 terminal_backend=_BACKENDS['X2GoTerminalSession']['default'],
+                 info_backend=_BACKENDS['X2GoServerSessionInfo']['default'],
+                 list_backend=_BACKENDS['X2GoServerSessionList']['default'],
+                 proxy_backend=_BACKENDS['X2GoProxy']['default'],
+                 settings_backend=_BACKENDS['X2GoClientSettings']['default'],
+                 printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
                  client_rootdir=os.path.join(_LOCAL_HOME, _X2GO_CLIENT_ROOTDIR),
                  sessions_rootdir=os.path.join(_LOCAL_HOME, _X2GO_SESSIONS_ROOTDIR),
                  ssh_rootdir=os.path.join(_LOCAL_HOME, _X2GO_SSH_ROOTDIR),
@@ -200,19 +194,19 @@ class X2GoSession(object):
         @param restore_shared_local_folders: store actual list of shared local folders after session has been suspended or terminated
         @type restore_shared_local_folders: C{bool}
         @param control_backend: X2Go control session backend to use
-        @type control_backend: C{class}
+        @type control_backend: C{str}
         @param terminal_backend: X2Go terminal session backend to use
-        @type terminal_backend: C{class}
+        @type terminal_backend: C{str}
         @param info_backend: X2Go session info backend to use
-        @type info_backend: C{class}
+        @type info_backend: C{str}
         @param list_backend: X2Go session list backend to use
-        @type list_backend: C{class}
+        @type list_backend: C{str}
         @param proxy_backend: X2Go proxy backend to use
-        @type proxy_backend: C{class}
+        @type proxy_backend: C{str}
         @param settings_backend: X2Go client settings backend to use
-        @type settings_backend: C{class}
+        @type settings_backend: C{str}
         @param printing_backend: X2Go client printing backend to use
-        @type printing_backend: C{class}
+        @type printing_backend: C{str}
         @param client_rootdir: client base dir (default: ~/.x2goclient)
         @type client_rootdir: C{str}
         @param sessions_rootdir: sessions base dir (default: ~/.x2go)
@@ -285,13 +279,13 @@ class X2GoSession(object):
         self.allow_mimebox = allow_mimebox
         self.mimebox_extensions = mimebox_extensions
         self.mimebox_action = mimebox_action
-        self.control_backend = control_backend
-        self.terminal_backend = terminal_backend
-        self.info_backend = info_backend
-        self.list_backend = list_backend
-        self.proxy_backend = proxy_backend
-        self.settings_backend = settings_backend
-        self.printing_backend = printing_backend
+        self.control_backend = utils._get_backend_class(control_backend, "X2GoControlSession")
+        self.terminal_backend = utils._get_backend_class(terminal_backend, "X2GoTerminalSession")
+        self.info_backend = utils._get_backend_class(info_backend, "X2GoServerSessionInfo")
+        self.list_backend = utils._get_backend_class(list_backend, "X2GoServerSessionList")
+        self.proxy_backend = utils._get_backend_class(proxy_backend, "X2GoProxy")
+        self.settings_backend = utils._get_backend_class(settings_backend, "X2GoClientSettings")
+        self.printing_backend = utils._get_backend_class(printing_backend, "X2GoClientPrinting")
         self.client_rootdir = client_rootdir
         self.sessions_rootdir = sessions_rootdir
         self.ssh_rootdir = ssh_rootdir
diff --git a/x2go/utils.py b/x2go/utils.py
index 39f5442..3f24786 100644
--- a/x2go/utils.py
+++ b/x2go/utils.py
@@ -41,6 +41,8 @@ from defaults import X2GO_SESSIONPROFILE_DEFAULTS as _X2GO_SESSIONPROFILE_DEFAUL
 from defaults import X2GO_MIMEBOX_ACTIONS as _X2GO_MIMEBOX_ACTIONS
 from defaults import pack_methods_nx3
 
+from defaults import BACKENDS as _BACKENDS
+
 if _X2GOCLIENT_OS != 'Windows':
     import Xlib
     from defaults import X_DISPLAY as _X_DISPLAY
@@ -819,3 +821,15 @@ class ProgressStatus(object):
             return self.status
         else:
             raise StopIteration
+
+def _get_backend_class(backend, class_name):
+    if type(backend) not in (types.StringType, types.UnicodeType): return backend
+    backend = backend.upper()
+    available_backends = [ k for k in _BACKENDS[class_name].keys() if k != 'default' ]
+    # if for backend is given 'default' use the default backend module
+    if backend == 'default': backend = _BACKENDS[class_name]['default']
+    if backend in available_backends:
+        exec("from {backend} import {class_name} as _this_class".format(backend=_BACKENDS[class_name][backend], class_name=class_name))
+    else:
+        raise x2go_exceptions.X2GoBackendException('unknown backend name %s for class %s' % (backend, class_name))
+    return _this_class

--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/python-x2go.git



More information about the x2go-commits mailing list