summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-04-07 16:49:06 -0400
committerSimo Sorce <simo@redhat.com>2014-04-11 17:25:54 -0400
commit0464f1403990d3bfd85cd471f6676e70b1e81648 (patch)
treec8c87d56d7b26a7f02bb63a308ba4b884fe4f842
parente8c8dce4043fa4fb3bb636cab21be77978642002 (diff)
downloadipsilon.git-0464f1403990d3bfd85cd471f6676e70b1e81648.tar.gz
ipsilon.git-0464f1403990d3bfd85cd471f6676e70b1e81648.tar.xz
ipsilon.git-0464f1403990d3bfd85cd471f6676e70b1e81648.zip
Change provider plugins registration and enablement
When plugins are not enabled at startup the admin page is not available as it is created only on enablement. Split enablement and registration, so plugins can be registered even when actually disabled. Also rework the way enablement is tracked and make sure enablement status is saved back to the database when it changes so it is kept on restarts. Signed-off-by: Simo Sorce <simo@redhat.com>
-rwxr-xr-xipsilon/admin/providers.py11
-rwxr-xr-xipsilon/providers/common.py52
-rw-r--r--templates/admin/providers.html2
3 files changed, 46 insertions, 19 deletions
diff --git a/ipsilon/admin/providers.py b/ipsilon/admin/providers.py
index 1a2df7c..ba5e1e7 100755
--- a/ipsilon/admin/providers.py
+++ b/ipsilon/admin/providers.py
@@ -43,12 +43,17 @@ class ProviderPlugins(Page):
def root_with_msg(self, message=None, message_type=None):
plugins = self._site[FACILITY]
+ enabled_plugins = []
+ for item in plugins['available']:
+ plugin = plugins['available'][item]
+ if plugin.is_enabled:
+ enabled_plugins.append(item)
return self._template('admin/providers.html', title=self.title,
baseurl=self.url,
message=message,
message_type=message_type,
available=plugins['available'],
- enabled=plugins['enabled'],
+ enabled=enabled_plugins,
menu=self._master.menu)
def root(self, *args, **kwargs):
@@ -61,7 +66,7 @@ class ProviderPlugins(Page):
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
- if obj not in plugins['enabled']:
+ if not obj.is_enabled:
obj.enable(self._site)
msg = "Plugin %s enabled" % obj.name
return self.root_with_msg(msg, "success")
@@ -74,7 +79,7 @@ class ProviderPlugins(Page):
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
- if obj in plugins['enabled']:
+ if obj.is_enabled:
obj.disable(self._site)
msg = "Plugin %s disabled" % obj.name
return self.root_with_msg(msg, "success")
diff --git a/ipsilon/providers/common.py b/ipsilon/providers/common.py
index f9c1311..b1eab1a 100755
--- a/ipsilon/providers/common.py
+++ b/ipsilon/providers/common.py
@@ -43,6 +43,7 @@ class ProviderBase(PluginObject):
super(ProviderBase, self).__init__()
self.name = name
self.path = path
+ self.tree = None
self.admin = None
def _debug(self, fact):
@@ -52,32 +53,55 @@ class ProviderBase(PluginObject):
def get_tree(self, site):
raise NotImplementedError
- def enable(self, site):
- plugins = site[FACILITY]
- if self in plugins['enabled']:
+ def register(self, site):
+ if self.tree:
+ # already registered
return
# configure self
+ plugins = site[FACILITY]
if self.name in plugins['config']:
self.set_config(plugins['config'][self.name])
+ # init pages and admin interfaces
+ self.tree = self.get_tree(site)
+
+ self._debug('IdP Provider registered: %s' % self.name)
+
+ if self.get_config_value('enabled') == '1':
+ # and add self to the root
+ root = site[FACILITY]['root']
+ root.add_subtree(self.name, self.tree)
+ self._debug('IdP Provider enabled: %s' % self.name)
+
+ @property
+ def is_enabled(self):
+ if self.get_config_value('enabled') == '1':
+ return True
+ return False
+
+ def enable(self, site):
+ if self.is_enabled:
+ return
+
# and add self to the root
- root = plugins['root']
- root.add_subtree(self.name, self.get_tree(site))
+ root = site[FACILITY]['root']
+ root.add_subtree(self.name, self.tree)
- plugins['enabled'].append(self)
+ self.set_config_value('enabled', '1')
+ self.save_plugin_config(FACILITY)
self._debug('IdP Provider enabled: %s' % self.name)
def disable(self, site):
- plugins = site[FACILITY]
- if self not in plugins['enabled']:
+ if not self.is_enabled:
return
# remove self to the root
- root = plugins['root']
+ root = site[FACILITY]['root']
root.del_subtree(self.name)
- plugins['enabled'].remove(self)
+ self.set_config_value('enabled', '0')
+ self.save_plugin_config(FACILITY)
self._debug('IdP Provider disabled: %s' % self.name)
@@ -123,11 +147,9 @@ class LoadProviders(object):
self._debug('Available providers: %s' % str(available))
providers['root'] = root
- for item in providers['whitelist']:
- self._debug('IdP Provider in whitelist: %s' % item)
- if item not in providers['available']:
- continue
- providers['available'][item].enable(site)
+ for item in providers['available']:
+ plugin = providers['available'][item]
+ plugin.register(site)
def _debug(self, fact):
if cherrypy.config.get('debug', False):
diff --git a/templates/admin/providers.html b/templates/admin/providers.html
index fbeb54d..66230d7 100644
--- a/templates/admin/providers.html
+++ b/templates/admin/providers.html
@@ -7,7 +7,7 @@
<div class="row">
<div class="col-md-3 col-sm-3 col-xs-6">{{ p }}</div>
<div class="col-md-3 col-sm-3 col-xs-6">
- {% if available[p] in enabled %}
+ {% if p in enabled %}
<a class="btn btn-default" href="{{ baseurl }}/disable/{{ p }}">Disable</a>
<a class="btn btn-default" href="{{ baseurl }}/{{ p }}">Configure</a>
{% if available[p].admin %}