summaryrefslogtreecommitdiffstats
path: root/deluge/ui/web/pluginmanager.py
diff options
context:
space:
mode:
Diffstat (limited to 'deluge/ui/web/pluginmanager.py')
-rw-r--r--deluge/ui/web/pluginmanager.py153
1 files changed, 153 insertions, 0 deletions
diff --git a/deluge/ui/web/pluginmanager.py b/deluge/ui/web/pluginmanager.py
new file mode 100644
index 0000000..2da5b61
--- /dev/null
+++ b/deluge/ui/web/pluginmanager.py
@@ -0,0 +1,153 @@
+#
+# Copyright (C) 2009 Damien Churchill <damoxc@gmail.com>
+#
+# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
+# the additional special exception to link portions of this program with the OpenSSL library.
+# See LICENSE for more details.
+#
+
+import logging
+import os
+
+from deluge import component
+from deluge.configmanager import ConfigManager
+from deluge.pluginmanagerbase import PluginManagerBase
+from deluge.ui.client import client
+
+log = logging.getLogger(__name__)
+
+
+def gather_info(plugin):
+ # Get the scripts for the plugin
+ scripts = getattr(plugin, 'scripts', ())
+ debug_scripts = getattr(plugin, 'debug_scripts') or scripts
+
+ directories = []
+ for script in scripts + debug_scripts:
+ if os.path.dirname(script) not in directories:
+ directories.append(os.path.dirname(script))
+
+ return {
+ 'scripts': scripts,
+ 'debug_scripts': debug_scripts,
+ 'script_directories': directories,
+ }
+
+
+class PluginManager(PluginManagerBase, component.Component):
+ def __init__(self):
+ component.Component.__init__(self, 'Web.PluginManager')
+ self.config = ConfigManager('web.conf')
+ PluginManagerBase.__init__(self, 'web.conf', 'deluge.plugin.web')
+
+ client.register_event_handler(
+ 'PluginEnabledEvent', self._on_plugin_enabled_event
+ )
+ client.register_event_handler(
+ 'PluginDisabledEvent', self._on_plugin_disabled_event
+ )
+
+ def _on_get_enabled_plugins(self, plugins):
+ for plugin in plugins:
+ self.enable_plugin(plugin)
+
+ def _on_plugin_enabled_event(self, name):
+ self.enable_plugin(name)
+
+ def _on_plugin_disabled_event(self, name):
+ self.disable_plugin(name)
+
+ def disable_plugin(self, name):
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.debug(
+ '%s plugin contains no WebUI code, ignoring WebUI disable call.', name
+ )
+ return
+
+ info = gather_info(plugin)
+
+ scripts = component.get('Scripts')
+ for script in info['scripts']:
+ scripts.remove_script(f'{name.lower()}/{os.path.basename(script).lower()}')
+
+ for script in info['debug_scripts']:
+ scripts.remove_script(
+ f'{name.lower()}/{os.path.basename(script).lower()}', 'debug'
+ )
+ scripts.remove_script(
+ f'{name.lower()}/{os.path.basename(script).lower()}', 'dev'
+ )
+
+ super().disable_plugin(name)
+
+ def enable_plugin(self, name):
+ super().enable_plugin(name)
+
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.info(
+ '%s plugin contains no WebUI code, ignoring WebUI enable call.', name
+ )
+ return
+
+ info = gather_info(plugin)
+
+ scripts = component.get('Scripts')
+ for script in info['scripts']:
+ log.debug('adding script %s for %s', name, os.path.basename(script))
+ scripts.add_script(f'{name.lower()}/{os.path.basename(script)}', script)
+
+ for script in info['debug_scripts']:
+ log.debug('adding debug script %s for %s', name, os.path.basename(script))
+ scripts.add_script(
+ f'{name.lower()}/{os.path.basename(script)}', script, 'debug'
+ )
+ scripts.add_script(
+ f'{name.lower()}/{os.path.basename(script)}', script, 'dev'
+ )
+
+ def start(self):
+ """
+ Start up the plugin manager
+ """
+ # Update the enabled plugins from the core
+ d = client.core.get_enabled_plugins()
+ d.addCallback(self._on_get_enabled_plugins)
+
+ def stop(self):
+ """
+ Stop the plugin manager
+ """
+ self.disable_plugins()
+ client.deregister_event_handler(
+ 'PluginEnabledEvent', self._on_plugin_enabled_event
+ )
+ client.deregister_event_handler(
+ 'PluginDisabledEvent', self._on_plugin_disabled_event
+ )
+
+ def update(self):
+ pass
+
+ def get_plugin_resources(self, name):
+ # Get the plugin instance
+ try:
+ plugin = component.get('WebPlugin.' + name)
+ except KeyError:
+ log.info('Plugin has no web ui')
+ return
+ info = gather_info(plugin)
+ info['name'] = name
+ info['scripts'] = [
+ f'js/{name.lower()}/{os.path.basename(s)}' for s in info['scripts']
+ ]
+ info['debug_scripts'] = [
+ f'js/{name.lower()}/{os.path.basename(s)}' for s in info['debug_scripts']
+ ]
+ del info['script_directories']
+ return info