[X2Go-Commits] [python-x2go] 03/03: Provide basic session profile backend for a http broker.
git-admin at x2go.org
git-admin at x2go.org
Tue Mar 4 13:58:42 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 8014735e439c4f6a4d3c71e532d6e8d525103f27
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Tue Mar 4 13:58:21 2014 +0100
Provide basic session profile backend for a http broker.
---
debian/changelog | 1 +
x2go/backends/profiles/base.py | 2 +
x2go/backends/profiles/httpbroker.py | 83 ++++++++++++++++++++++++++++------
x2go/client.py | 10 +++-
4 files changed, 80 insertions(+), 16 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 0c28057..3d245b2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,6 +9,7 @@ python-x2go (0.5.0.0-0x2go1) UNRELEASED; urgency=low
not really used by third-party products, if at all).
- Fix setting default values in X2GoClientXConfig class.
- Default to xdg-open as default PDF viewer command.
+ - Provide basic session profile backend for a http broker.
-- Mike Gabriel <mike.gabriel at das-netzwerkteam.de> Sun, 05 Jan 2014 16:35:57 +0100
diff --git a/x2go/backends/profiles/base.py b/x2go/backends/profiles/base.py
index 6985f9a..7660165 100644
--- a/x2go/backends/profiles/base.py
+++ b/x2go/backends/profiles/base.py
@@ -64,6 +64,8 @@ class X2GoSessionProfiles():
self._cached_profile_names = []
self._profiles_need_profile_id_renewal = []
self.write_user_config = False
+ self.config_files = None
+ self.user_config_file = None
if logger is None:
self.logger = log.X2GoLogger(loglevel=loglevel)
diff --git a/x2go/backends/profiles/httpbroker.py b/x2go/backends/profiles/httpbroker.py
index 0d27cb4..1739597 100644
--- a/x2go/backends/profiles/httpbroker.py
+++ b/x2go/backends/profiles/httpbroker.py
@@ -26,8 +26,15 @@ applications.
"""
__NAME__ = 'x2gosessionprofiles-pylib'
+import copy
+import re
+import requests
+try: import simplejson as json
+except ImportError: import json
+
# Python X2Go modules
-from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS
+from x2go.defaults import X2GO_SESSIONPROFILE_DEFAULTS as _X2GO_SESSIONPROFILE_DEFAULTS
+from x2go.defaults import CURRENT_LOCAL_USER as _CURRENT_LOCAL_USER
import x2go.backends.profiles.base as base
import x2go.log as log
@@ -35,14 +42,21 @@ from x2go.x2go_exceptions import X2GoNotImplementedYetException
class X2GoSessionProfiles(base.X2GoSessionProfiles):
- defaultSessionProfile = X2GO_SESSIONPROFILE_DEFAULTS
+ defaultSessionProfile = _X2GO_SESSIONPROFILE_DEFAULTS
- def __init__(self, session_profile_defaults=None, logger=None, loglevel=log.loglevel_DEFAULT):
+ def __init__(self, session_profile_defaults=None,
+ broker_url="http://localhost:8080/json/",
+ broker_user=None,
+ broker_password=None,
+ logger=None, loglevel=log.loglevel_DEFAULT,
+ **kwargs):
"""\
Retrieve X2Go session profiles from a HTTP(S) session broker.
@param session_profile_defaults: a default session profile
@type session_profile_defaults: C{dict}
+ @param broker_url: URL for accessing the X2Go Session Broker
+ @type broker_url: C{str}
@param logger: you can pass an L{X2GoLogger} object to the
L{X2GoSessionProfilesHTTPSBROKER} constructor
@type logger: L{X2GoLogger} instance
@@ -51,8 +65,48 @@ class X2GoSessionProfiles(base.X2GoSessionProfiles):
@type loglevel: C{int}
"""
+ match = re.match('^(?P<protocol>(http(|s)))://(|(?P<user>[a-zA-Z0-9_\.-]+)(|:(?P<password>.*))@)(?P<hostname>[a-zA-Z0-9\.-]+)(|:(?P<port>[0-9]+))($|/(?P<path>.*)$)', broker_url)
+ p = match.groupdict()
+ if p['user']:
+ self.broker_user = p['user']
+ else:
+ self.broker_user = broker_user
+ if p['password']:
+ self.broker_password = p['password']
+ else:
+ self.broker_password = broker_password
+
+ # fine-tune the URL
+ p['path'] = "/{path}".format(**p)
+ if p['port'] is not None:
+ p['port'] = ":{port}".format(**p)
+
+ self.broker_url = "{protocol}://{hostname}{port}{path}".format(**p)
+
base.X2GoSessionProfiles.__init__(self, session_profile_defaults=session_profile_defaults, logger=logger, loglevel=loglevel)
+ def broker_simpleauth(self, broker_user, broker_password):
+ payload = {
+ 'user': broker_user,
+ 'password': broker_password,
+ }
+ r = requests.post(self.broker_url, data=payload)
+ if r.status_code == 200:
+ self.broker_user = broker_user
+ self.broker_password = broker_password
+ return True
+ return False
+
+ def broker_listsessions(self):
+ payload = {
+ 'task': 'listsessions',
+ 'user': self.broker_user,
+ 'password': self.broker_password,
+ }
+ r = requests.post(self.broker_url, data=payload)
+ if r.status_code == 200 and r.headers['content-type'].startswith("text/json"):
+ return json.loads(r.text)
+
def _populate_session_profiles(self):
"""\
Populate the set of session profiles by loading the session
@@ -62,31 +116,30 @@ class X2GoSessionProfiles(base.X2GoSessionProfiles):
@rtype: C{dict}
"""
- session_profiles = LOAD
+ session_profiles = self.broker_listsessions()
+ _session_profiles = copy.deepcopy(session_profiles)
- for session_profile in session_profiles:
+ 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)
+ if not session_profiles[session_profile].has_key(key):
+ session_profiles[session_profile][key] = default_value
return session_profiles
def _write(self):
- print "BROKER CLIENT: WRITING SESSION PROFILES IS NOT SUPPORTED"
+ print "not suported"
def _delete_profile(self, profile_id):
- print "BROKER CLIENT: DELETING SESSION PROFILES IS NOT SUPPORTED"
+ del self.session_profiles[profile_id]
def _update_value(self, profile_id, option, value):
- print "BROKER CLIENT: MODIFYING SESSION PROFILES IS NOT SUPPORTED"
+ self.session_profiles[profile_id][option] = value
def _get_profile_parameter(self, profile_id, option, key_type):
- print "TODO"
+ return key_type(self.session_profiles[profile_id][option])
def _get_profile_options(self, profile_id):
- print "TODO"
+ return self.session_profiles[profile_id].keys()
def _get_profile_ids(self):
- print "TODO"
+ return self.session_profiles.keys()
diff --git a/x2go/client.py b/x2go/client.py
index debba28..b0bace6 100644
--- a/x2go/client.py
+++ b/x2go/client.py
@@ -182,6 +182,7 @@ class X2GoClient(object):
profiles_backend=_BACKENDS['X2GoSessionProfiles']['default'],
settings_backend=_BACKENDS['X2GoClientSettings']['default'],
printing_backend=_BACKENDS['X2GoClientPrinting']['default'],
+ broker_url=None,
client_rootdir=None,
sessions_rootdir=None,
ssh_rootdir=None,
@@ -268,6 +269,13 @@ class X2GoClient(object):
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")
+ print broker_url
+ if broker_url is not None:
+ if broker_url.startswith('ssh://'):
+ profiles_backend = 'sshbroker'
+ elif broker_url.startswith('http://') or broker_url.startswith('https://'):
+ self.logger('using http(s) broker at URL %s' % broker_url, loglevel=log.loglevel_NOTICE)
+ profiles_backend = 'httpbroker'
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")
@@ -288,7 +296,7 @@ class X2GoClient(object):
_settings_config_file = os.path.join(self.client_rootdir, _X2GO_SETTINGS_FILENAME)
_printing_config_file = os.path.join(self.client_rootdir, _X2GO_PRINTING_FILENAME)
_xconfig_config_file = os.path.join(self.client_rootdir, _X2GO_XCONFIG_FILENAME)
- self.session_profiles = self.profiles_backend(config_files=[_sessions_config_file], logger=self.logger)
+ self.session_profiles = self.profiles_backend(config_files=[_sessions_config_file], logger=self.logger, broker_url=broker_url)
self.client_settings = self.settings_backend(config_files=[_settings_config_file], logger=self.logger)
self.client_printing = self.printing_backend(config_files=[_printing_config_file], client_instance=self, logger=self.logger)
else:
--
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