From f57d279dc0101611e2bd977aef93e32802ff2370 Mon Sep 17 00:00:00 2001 From: Santos Solorzano Date: Wed, 11 Jul 2018 09:17:19 -0700 Subject: [MM-10117] Add support to add/delete and enable/disable plugins via CLI (#8745) * Testing caching for emojis * MM-10117 Add support to add/delete and activate/deactivate plugins via CLI * Removing old work * MM-10117 Moved files and addedd plugin test * MM-10117 Renamed commands to enable/disable and updated add test * MM-10117 Finished plugin test and improved error message for plugin commands * MM-10117 Fixing plugin directories for test * MM-10117 Renamed commands and updated commands to support multiple plugins * MM-10117 Updating removed to deleted textclear * MM-10117 Fixing nil pointer error for listing plugins * MM-10117 Removing fileReader close * MM-10117 Declaring error for GetPlugins * MM-10117 Removing unnecessary nil check --- cmd/mattermost/commands/init.go | 2 + cmd/mattermost/commands/plugin.go | 186 +++++++++++++++++++++++++++++++++ cmd/mattermost/commands/plugin_test.go | 42 ++++++++ 3 files changed, 230 insertions(+) create mode 100644 cmd/mattermost/commands/plugin.go create mode 100644 cmd/mattermost/commands/plugin_test.go (limited to 'cmd/mattermost') diff --git a/cmd/mattermost/commands/init.go b/cmd/mattermost/commands/init.go index ea7e8ec84..8d8f12c53 100644 --- a/cmd/mattermost/commands/init.go +++ b/cmd/mattermost/commands/init.go @@ -17,6 +17,8 @@ func InitDBCommandContextCobra(command *cobra.Command) (*app.App, error) { } a, err := InitDBCommandContext(config) + a.InitPlugins(*a.Config().PluginSettings.Directory, *a.Config().PluginSettings.ClientDirectory) + if err != nil { // Returning an error just prints the usage message, so actually panic panic(err) diff --git a/cmd/mattermost/commands/plugin.go b/cmd/mattermost/commands/plugin.go new file mode 100644 index 000000000..56a57ddf1 --- /dev/null +++ b/cmd/mattermost/commands/plugin.go @@ -0,0 +1,186 @@ +// Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package commands + +import ( + "errors" + "os" + + "github.com/spf13/cobra" +) + +var PluginCmd = &cobra.Command{ + Use: "plugin", + Short: "Management of plugins", +} + +var PluginAddCmd = &cobra.Command{ + Use: "add [plugins]", + Short: "Add plugins", + Long: "Add plugins to your Mattermost server.", + Example: ` plugin add hovercardexample.tar.gz pluginexample.tar.gz`, + RunE: pluginAddCmdF, +} + +var PluginDeleteCmd = &cobra.Command{ + Use: "delete [plugins]", + Short: "Delete plugins", + Long: "Delete previously uploaded plugins from your Mattermost server.", + Example: ` plugin delete hovercardexample pluginexample`, + RunE: pluginDeleteCmdF, +} + +var PluginEnableCmd = &cobra.Command{ + Use: "enable [plugins]", + Short: "Enable plugins", + Long: "Enable plugins for use on your Mattermost server.", + Example: ` plugin enable hovercardexample pluginexample`, + RunE: pluginEnableCmdF, +} + +var PluginDisableCmd = &cobra.Command{ + Use: "disable [plugins]", + Short: "Disable plugins", + Long: "Disable plugins. Disabled plugins are immediately removed from the user interface and logged out of all sessions.", + Example: ` plugin disable hovercardexample pluginexample`, + RunE: pluginDisableCmdF, +} + +var PluginListCmd = &cobra.Command{ + Use: "list", + Short: "List plugins", + Long: "List all active and inactive plugins installed on your Mattermost server.", + Example: ` plugin list`, + RunE: pluginListCmdF, +} + +func init() { + PluginCmd.AddCommand( + PluginAddCmd, + PluginDeleteCmd, + PluginEnableCmd, + PluginDisableCmd, + PluginListCmd, + ) + RootCmd.AddCommand(PluginCmd) +} + +func pluginAddCmdF(command *cobra.Command, args []string) error { + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + if len(args) < 1 { + return errors.New("Expected at least one argument. See help text for details.") + } + + for i, plugin := range args { + fileReader, err := os.Open(plugin) + if err != nil { + return err + } + + if _, err := a.InstallPlugin(fileReader); err != nil { + CommandPrintErrorln("Unable to add plugin: " + args[i] + ". Error: " + err.Error()) + } else { + CommandPrettyPrintln("Added plugin: " + plugin) + } + fileReader.Close() + } + + return nil +} + +func pluginDeleteCmdF(command *cobra.Command, args []string) error { + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + if len(args) < 1 { + return errors.New("Expected at least one argument. See help text for details.") + } + + for _, plugin := range args { + if err := a.RemovePlugin(plugin); err != nil { + CommandPrintErrorln("Unable to delete plugin: " + plugin + ". Error: " + err.Error()) + } else { + CommandPrettyPrintln("Deleted plugin: " + plugin) + } + } + + return nil +} + +func pluginEnableCmdF(command *cobra.Command, args []string) error { + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + if len(args) < 1 { + return errors.New("Expected at least one argument. See help text for details.") + } + + for _, plugin := range args { + if err := a.EnablePlugin(plugin); err != nil { + CommandPrintErrorln("Unable to enable plugin: " + plugin + ". Error: " + err.Error()) + } else { + CommandPrettyPrintln("Enabled plugin: " + plugin) + } + } + + return nil +} + +func pluginDisableCmdF(command *cobra.Command, args []string) error { + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + if len(args) < 1 { + return errors.New("Expected at least one argument. See help text for details.") + } + + for _, plugin := range args { + if err := a.DisablePlugin(plugin); err != nil { + CommandPrintErrorln("Unable to disable plugin: " + plugin + ". Error: " + err.Error()) + } else { + CommandPrettyPrintln("Disabled plugin: " + plugin) + } + } + + return nil +} + +func pluginListCmdF(command *cobra.Command, args []string) error { + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + pluginsResp, appErr := a.GetPlugins() + if appErr != nil { + return errors.New("Unable to list plugins. Error: " + appErr.Error()) + } + + CommandPrettyPrintln("Listing active plugins") + for _, plugin := range pluginsResp.Active { + CommandPrettyPrintln(plugin.Manifest.Name + ", Version: " + plugin.Manifest.Version) + } + + CommandPrettyPrintln("Listing inactive plugins") + for _, plugin := range pluginsResp.Inactive { + CommandPrettyPrintln(plugin.Manifest.Name + ", Version: " + plugin.Manifest.Version) + } + + return nil +} diff --git a/cmd/mattermost/commands/plugin_test.go b/cmd/mattermost/commands/plugin_test.go new file mode 100644 index 000000000..043823583 --- /dev/null +++ b/cmd/mattermost/commands/plugin_test.go @@ -0,0 +1,42 @@ +package commands + +import ( + "os" + "path/filepath" + "testing" + + "github.com/mattermost/mattermost-server/api4" + "github.com/mattermost/mattermost-server/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPlugin(t *testing.T) { + os.MkdirAll("./test-plugins", os.ModePerm) + os.MkdirAll("./test-client-plugins", os.ModePerm) + + th := api4.Setup().InitBasic().InitSystemAdmin() + defer th.TearDown() + + path, _ := utils.FindDir("tests") + + os.Chdir(filepath.Join("..", "..", "..")) + + CheckCommand(t, "--config", filepath.Join(path, "test-config.json"), "plugin", "add", filepath.Join(path, "testplugin.tar.gz")) + + CheckCommand(t, "--config", filepath.Join(path, "test-config.json"), "plugin", "enable", "testplugin") + cfg, _, _, err := utils.LoadConfig(filepath.Join(path, "test-config.json")) + require.Nil(t, err) + assert.Equal(t, cfg.PluginSettings.PluginStates["testplugin"].Enable, true) + + CheckCommand(t, "--config", filepath.Join(path, "test-config.json"), "plugin", "disable", "testplugin") + cfg, _, _, err = utils.LoadConfig(filepath.Join(path, "test-config.json")) + require.Nil(t, err) + assert.Equal(t, cfg.PluginSettings.PluginStates["testplugin"].Enable, false) + + CheckCommand(t, "--config", filepath.Join(path, "test-config.json"), "plugin", "list") + + CheckCommand(t, "--config", filepath.Join(path, "test-config.json"), "plugin", "delete", "testplugin") + + os.Chdir(filepath.Join("cmd", "mattermost", "commands")) +} -- cgit v1.2.3-1-g7c22