Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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