// UnloadPlugin unloads a plugin from the LoadedPlugins table func (p *pluginManager) UnloadPlugin(pl core.Plugin) (*loadedPlugin, serror.SnapError) { plugin, err := p.loadedPlugins.get(fmt.Sprintf("%s:%s:%d", pl.TypeName(), pl.Name(), pl.Version())) if err != nil { se := serror.New(ErrPluginNotFound, map[string]interface{}{ "plugin-name": pl.Name(), "plugin-version": pl.Version(), "plugin-type": pl.TypeName(), }) return nil, se } if plugin.State != LoadedState { se := serror.New(ErrPluginNotInLoadedState, map[string]interface{}{ "plugin-name": plugin.Name(), "plugin-version": plugin.Version(), "plugin-type": pl.TypeName(), }) return nil, se } // If the plugin has been uploaded via REST API // aka, was not auto loaded from auto_discover_path // nor loaded from tests // then do clean up if !plugin.Details.IsAutoLoaded { pmLogger.WithFields(log.Fields{ "plugin-type": plugin.TypeName(), "plugin-name": plugin.Name(), "plugin-version": plugin.Version(), "plugin-path": plugin.Details.Path, }).Debugf("Removing plugin") if err := os.RemoveAll(filepath.Dir(plugin.Details.Path)); err != nil { pmLogger.WithFields(log.Fields{ "plugin-type": plugin.TypeName(), "plugin-name": plugin.Name(), "plugin-version": plugin.Version(), "plugin-path": plugin.Details.Path, }).Error(err) se := serror.New(err) se.SetFields(map[string]interface{}{ "plugin-type": plugin.TypeName(), "plugin-name": plugin.Name(), "plugin-version": plugin.Version(), "plugin-path": plugin.Details.Path, }) return nil, se } } p.loadedPlugins.remove(plugin.Key()) // Remove any metrics from the catalog if this was a collector if plugin.TypeName() == "collector" { p.metricCatalog.RmUnloadedPluginMetrics(plugin) } return plugin, nil }
func containsPlugin(slice []core.SubscribedPlugin, lookup subscribedPlugin) bool { for _, plugin := range slice { if plugin.Name() == lookup.Name() && plugin.Version() == lookup.Version() && plugin.TypeName() == lookup.TypeName() { return true } } return false }