[X2Go-Commits] [x2gobroker] 05/05: Enable basic/random load-balancing for UCCS broker frontend. Make UCCS frontend aware of host session profile options of the form "host=<fqdn> (<ipaddr>:<port>).

git-admin at x2go.org git-admin at x2go.org
Fri Nov 28 15:00:50 CET 2014


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

x2go pushed a commit to branch master
in repository x2gobroker.

commit bae0d29c2fd7cb317f39271590aa5f82619a21b9
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date:   Fri Nov 28 15:00:39 2014 +0100

    Enable basic/random load-balancing for UCCS broker frontend. Make UCCS frontend aware of host session profile options of the form "host=<fqdn> (<ipaddr>:<port>).
---
 bin/x2gobroker-ssh                |  Bin 10461 -> 10328 bytes
 debian/changelog                  |    3 +
 x2gobroker/brokers/base_broker.py |  123 +++++++++++++++++++++++++------------
 x2gobroker/web/uccs.py            |   27 +++++---
 4 files changed, 104 insertions(+), 49 deletions(-)

diff --git a/bin/x2gobroker-ssh b/bin/x2gobroker-ssh
index 03444ca..10f24a3 100755
Binary files a/bin/x2gobroker-ssh and b/bin/x2gobroker-ssh differ
diff --git a/debian/changelog b/debian/changelog
index 4659fe8..edd9382 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -199,6 +199,9 @@ x2gobroker (0.0.3.0-0x2go1) UNRELEASED; urgency=low
     - Properly set (/var)/run/x2gobroker directory permissions when started
       via systemd.
     - Fix privilege check for the broker daemon's log directory.
+    - Enable basic/random load-balancing for UCCS broker frontend. Make UCCS
+      frontend aware of host session profile options of the form
+      "host=<fqdn> (<ipaddr>:<port>).
   * debian/control:
     + Provide separate bin:package for SSH brokerage: x2gobroker-ssh.
     + Replace LDAP support with session brokerage support in LONG_DESCRIPTION.
diff --git a/x2gobroker/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py
index fc5082c..880e1d7 100644
--- a/x2gobroker/brokers/base_broker.py
+++ b/x2gobroker/brokers/base_broker.py
@@ -243,6 +243,19 @@ class X2GoBroker(object):
         """
         return []
 
+    def get_profile_ids_for_user(self, username):
+        """\
+        Retrieve the list of session profile IDs for a given user.
+
+        @param username: query profile id list for this user
+        @type username: C{unicode}
+
+        @return: list of profile IDs
+        @rtype: C{list}
+
+        """
+        return [ id for id in self.get_profile_ids() if self.check_profile_acls(username, self.get_profile_acls(id)) ]
+
     def get_profile_defaults(self):
         """\
         Get the session profile defaults, i.e. profile options that all
@@ -992,23 +1005,41 @@ class X2GoBroker(object):
 
         return remote_agent
 
-    def list_profiles(self, username):
+    def get_profile_for_user(self, profile_id, username, broker_frontend=None):
         """\
-        Retrieve a list of available session profiles for the authenticated user.
-
-        @param username: query session list for this user
+        Expect a profile id and perform some checks and preparations to
+        make it ready for exporting to a broker client:
+
+          - drop internal host=<hostname> and sshport=<port> keys from the
+            profile, broker clients cannot handle those
+          - replace BROKER_USER by the name of the authenticated user
+          - test if autologin is possible
+          - fix rootless session profile option for non-desktop sessions
+          - perform an ACL check (return C{None} if it fails)
+          - query a remote agent (if configured) to check if we have
+            running / suspended sessions on the remote X2Go Server
+
+        @param profile_id: ID of a valid session profile
+        @type profile_id: C{unicode}
+        @param username: prepare session profile for this (authenticated) user
         @type username: C{unicode}
+        @param broker_frontend: some broker frontend (e.g. UCCS) require special treatment
+            by this method
+        @type broker_frontend: C{unicode}
 
-        return: list of profile dictionaries
+        return: session profile as a dictionary (ready for sending out to a broker client)
         rtype: C{dict}
 
         """
-        list_of_profiles = {}
-        for profile_id in self.get_profile_ids():
-            profile = self.get_profile(profile_id)
+        profile = self.get_profile(profile_id)
+
+        acls = self.get_profile_acls(profile_id)
+        if self.check_profile_acls(username, acls):
 
             for key in profile.keys():
-                if key.startswith('host='):
+                if key.startswith('host=') and broker_frontend != 'uccs':
+                    del profile[key]
+                if key.startswith('sshport=') and broker_frontend != 'uccs':
                     del profile[key]
                 if key == 'user' and profile[key] == 'BROKER_USER':
                     profile[key] = unicode(username)
@@ -1021,40 +1052,54 @@ class X2GoBroker(object):
             if profile['command'] in x2gobroker.defaults.X2GO_DESKTOP_SESSIONS:
                 profile['rootless'] = False
 
-            acls = self.get_profile_acls(profile_id)
+            remote_agent = self.get_remote_agent(profile_id)
+            agent_query_mode = ( remote_agent == u'LOCAL') and u'LOCAL' or u'SSH'
+            if remote_agent:
+                success, running_sessions, suspended_sessions = x2gobroker.agent.has_sessions(username, remote_agent=remote_agent)
+                try:
+                    success, running_sessions, suspended_sessions = x2gobroker.agent.has_sessions(username, remote_agent=remote_agent)
+                    if running_sessions:
+                        logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(running_sessions)))
+                    if suspended_sessions:
+                        logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(suspended_sessions)))
+                    suspended_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], suspended_sessions)
+                    running_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], running_sessions)
+                    if suspended_matching_hostnames:
+                        profile['status'] = u'S'
+                        profile['host'] = [suspended_matching_hostnames[0]]
+                    elif running_matching_hostnames:
+                        profile['status'] = u'R'
+                        profile['host'] = [running_matching_hostnames[0]]
+                    else:
+                        profile['host'] = [profile['host'][0]]
+
+                    if profile.has_key('status') and profile['status']:
+                        logger_broker.debug('base_broker.X2GoBroker.list_profiles(): marking session profile {name} as {status}'.format(name=profile['name'], status=profile['status']))
 
-            if self.check_profile_acls(username, acls):
+                except x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException:
+                    pass
+            else:
+                profile['host'] = [profile['host'][0]]
 
-                remote_agent = self.get_remote_agent(profile_id)
-                agent_query_mode = ( remote_agent == u'LOCAL') and u'LOCAL' or u'SSH'
-                if remote_agent:
+            return profile
+        else:
+            return None
 
-                    success, running_sessions, suspended_sessions = x2gobroker.agent.has_sessions(username, remote_agent=remote_agent)
-                    try:
-                        success, running_sessions, suspended_sessions = x2gobroker.agent.has_sessions(username, remote_agent=remote_agent)
-                        if running_sessions:
-                            logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(running_sessions)))
-                        if suspended_sessions:
-                            logger_broker.debug('base_broker.X2GoBroker.list_profiles(): found running sessions on host(s): {hosts}'.format(hosts=', '.join(suspended_sessions)))
-                        suspended_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], suspended_sessions)
-                        running_matching_hostnames = x2gobroker.utils.matching_hostnames(profile['host'], running_sessions)
-                        if suspended_matching_hostnames:
-                            profile['status'] = u'S'
-                            profile['host'] = [suspended_matching_hostnames[0]]
-                        elif running_matching_hostnames:
-                            profile['status'] = u'R'
-                            profile['host'] = [running_matching_hostnames[0]]
-                        else:
-                            profile['host'] = [profile['host'][0]]
-
-                        if profile.has_key('status') and profile['status']:
-                            logger_broker.debug('base_broker.X2GoBroker.list_profiles(): marking session profile {name} as {status}'.format(name=profile['name'], status=profile['status']))
-
-                    except x2gobroker.x2gobroker_exceptions.X2GoBrokerAgentException:
-                        pass
-                else:
-                    profile['host'] = [profile['host'][0]]
+    def list_profiles(self, username):
+        """\
+        Retrieve a list of available session profiles for the authenticated user.
+
+        @param username: query session profile list for this user
+        @type username: C{unicode}
 
+        return: list of profile dictionaries
+        rtype: C{dict}
+
+        """
+        list_of_profiles = {}
+        for profile_id in self.get_profile_ids_for_user(username):
+            profile = self.get_profile_for_user(profile_id, username)
+            if profile:
                 list_of_profiles.update({profile_id: profile, })
 
         return list_of_profiles
diff --git a/x2gobroker/web/uccs.py b/x2gobroker/web/uccs.py
index dd138e1..deea684 100644
--- a/x2gobroker/web/uccs.py
+++ b/x2gobroker/web/uccs.py
@@ -21,6 +21,7 @@ import re
 import base64
 import datetime
 import types
+import random
 import tornado.web
 
 # Python X2Go Broker modules
@@ -141,33 +142,39 @@ class X2GoBrokerWebAPI(tornado.web.RequestHandler):
 
         output = ''
 
-        profiles = self.broker_backend.list_profiles(username)
+        profile_ids = self.broker_backend.get_profile_ids_for_user(username)
         urlbase = self.broker_backend.get_global_value('my-uccs-url-base').rstrip('/')
         ms = x2gobroker.uccsjson.ManagementServer('{urlbase}/uccs/{backend}/'.format(urlbase=urlbase, backend=backend), 'X2Go Session Broker')
 
-        profile_ids = profiles.keys()
         profile_ids.sort()
 
         for profile_id in profile_ids:
 
-            hosts = profiles[profile_id][u'host']
+            profile = self.broker_backend.get_profile_for_user(profile_id, username, broker_frontend='uccs')
+            hosts = profile[u'host']
             if type(hosts) == types.UnicodeType:
                 hosts = [hosts]
 
-            if profiles[profile_id][u'directrdp']:
+            if profile[u'directrdp']:
                 ts = x2gobroker.uccsjson.RDPServer(
                         host='{hostname}'.format(hostname=hosts[0]),
-                        name=profiles[profile_id][u'name'],
-                        username=profiles[profile_id][u'user'],
+                        name=profile[u'name'],
+                        username=profile[u'user'],
                 )
                 ts.set_domain('LOCAL')
             else:
+                _hostname = random.choice(hosts)
+                _port = profile[u'sshport']
+                if profile.has_key('sshport={hostname}'.format(hostname=_hostname)):
+                    _port = profile['sshport={hostname}'.format(hostname=_hostname)]
+                if profile.has_key('host={hostname}'.format(hostname=_hostname)):
+                    _hostname = profile['host={hostname}'.format(hostname=_hostname)]
                 ts = x2gobroker.uccsjson.X2GoServer(
-                        host='{hostname}:{port}'.format(hostname=hosts[0], port=profiles[profile_id][u'sshport']),
-                        name=profiles[profile_id][u'name'],
-                        username=profiles[profile_id][u'user'],
+                        host='{hostname}:{port}'.format(hostname=_hostname, port=_port),
+                        name=profile[u'name'],
+                        username=profile[u'user'],
                 )
-                ts.set_session_type(profiles[profile_id]['command'])
+                ts.set_session_type(profile['command'])
             ms.add_terminalserver(ts)
             ms.set_default(ts.Name)
 

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


More information about the x2go-commits mailing list