def add_plugin(self, plugin, activate=False): plugin_class = plugin.load_module() if plugin_class is None: return None if plugin in self.plugins: log.info('Not loading plugin %s v %s. Plugin already loaded.', plugin.short_name, plugin.version) return None try: plugin_obj = plugin_class() except Exception: log.exception('Error while loading a plugin') return None if plugin.short_name not in app.settings.get_plugins(): app.settings.set_plugin_setting(plugin.short_name, 'active', plugin.shipped) self.plugins.append(plugin_obj) plugin_obj.active = False if activate: self.activate_plugin(plugin_obj) app.nec.push_incoming_event( NetworkEvent('plugin-added', plugin=plugin_obj)) return plugin_obj
def add_plugin(self, plugin_class): ''' :todo: what about adding plug-ins that are already added? Module reload and adding class from reloaded module or ignoring adding plug-in? ''' try: plugin = plugin_class() except Exception: log.exception('Error while loading a plugin') return if plugin not in self.plugins: if not self._plugin_has_entry_in_global_config(plugin): self._create_plugin_entry_in_global_config(plugin) self.plugins.append(plugin) plugin.active = False app.nec.push_incoming_event( NetworkEvent('plugin-added', plugin=plugin)) else: log.info( 'Not loading plugin %s v%s from module %s ' '(identified by short name: %s). Plugin already loaded.', plugin.name, plugin.version, plugin.__module__, plugin.short_name)
def update_plugins(self, replace=True, activate=False, plugin_name=None): ''' Move plugins from the downloaded folder to the user plugin folder :param replace: replace plugin files if they already exist. :type replace: boolean :param activate: load and activate the plugin :type activate: boolean :param plugin_name: if provided, update only this plugin :type plugin_name: str :return: list of updated plugins (files have been installed) :rtype: [] of str ''' updated_plugins = [] user_dir = configpaths.get('PLUGINS_USER') dl_dir = configpaths.get('PLUGINS_DOWNLOAD') to_update = [plugin_name] if plugin_name else next(os.walk(dl_dir))[1] for directory in to_update: src_dir = os.path.join(dl_dir, directory) dst_dir = os.path.join(user_dir, directory) try: if os.path.exists(dst_dir): if not replace: continue self.delete_plugin_files(dst_dir) move(src_dir, dst_dir) except Exception: log.exception( 'Upgrade of plugin %s failed. Impossible to move ' 'files from "%s" to "%s"', directory, src_dir, dst_dir) continue updated_plugins.append(directory) if activate: pc = self.scan_dir_for_plugins(dst_dir, scan_dirs=True, package=True) if not pc: continue self.add_plugin(pc[0]) plugin = self.plugins[-1] self.activate_plugin(plugin) return updated_plugins
def update_plugins(self, replace=True, activate=False, plugin_name=None): ''' Move plugins from the downloaded folder to the user plugin folder :param replace: replace plugin files if they already exist. :type replace: boolean :param activate: load and activate the plugin :type activate: boolean :param plugin_name: if provided, update only this plugin :type plugin_name: str :return: list of updated plugins (files have been installed) :rtype: [] of str ''' updated_plugins = [] user_dir = configpaths.get('PLUGINS_USER') dl_dir = configpaths.get('PLUGINS_DOWNLOAD') to_update = [plugin_name] if plugin_name else next(os.walk(dl_dir))[1] for directory in to_update: src_dir = dl_dir / directory dst_dir = user_dir / directory try: if dst_dir.exists(): if not replace: continue self.delete_plugin_files(dst_dir) move(src_dir, dst_dir) except Exception: log.exception( 'Upgrade of plugin %s failed. ' 'Impossible to move files from "%s" to "%s"', directory, src_dir, dst_dir) continue updated_plugins.append(directory) if activate: plugin = self._load_plugin(Path(dst_dir)) if plugin is None: log.warning('Error while updating plugin') continue self.add_plugin(plugin, activate=True) return updated_plugins