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>
def root_with_msg(self, message=None, message_type=None):
plugins = self._site[FACILITY]
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'],
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):
menu=self._master.menu)
def root(self, *args, **kwargs):
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
- if obj not in plugins['enabled']:
obj.enable(self._site)
msg = "Plugin %s enabled" % obj.name
return self.root_with_msg(msg, "success")
obj.enable(self._site)
msg = "Plugin %s enabled" % obj.name
return self.root_with_msg(msg, "success")
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
msg = "Unknown plugin %s" % plugin
return self.root_with_msg(msg, "error")
obj = plugins['available'][plugin]
- if obj in plugins['enabled']:
obj.disable(self._site)
msg = "Plugin %s disabled" % obj.name
return self.root_with_msg(msg, "success")
obj.disable(self._site)
msg = "Plugin %s disabled" % obj.name
return self.root_with_msg(msg, "success")
super(ProviderBase, self).__init__()
self.name = name
self.path = path
super(ProviderBase, self).__init__()
self.name = name
self.path = path
self.admin = None
def _debug(self, fact):
self.admin = None
def _debug(self, fact):
def get_tree(self, site):
raise NotImplementedError
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
+ plugins = site[FACILITY]
if self.name in plugins['config']:
self.set_config(plugins['config'][self.name])
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
# 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):
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
return
# remove self to the root
+ root = site[FACILITY]['root']
root.del_subtree(self.name)
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)
self._debug('IdP Provider disabled: %s' % self.name)
self._debug('Available providers: %s' % str(available))
providers['root'] = root
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):
def _debug(self, fact):
if cherrypy.config.get('debug', False):
<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">
<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 %}
<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 %}
<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 %}