github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/plugin/uninstall_plugin.go (about) 1 package plugin 2 3 import ( 4 "fmt" 5 "net/rpc" 6 "os" 7 "os/exec" 8 "time" 9 10 "github.com/cloudfoundry/cli/cf/command_registry" 11 "github.com/cloudfoundry/cli/cf/configuration/plugin_config" 12 . "github.com/cloudfoundry/cli/cf/i18n" 13 "github.com/cloudfoundry/cli/cf/requirements" 14 "github.com/cloudfoundry/cli/cf/terminal" 15 "github.com/cloudfoundry/cli/flags" 16 rpcService "github.com/cloudfoundry/cli/plugin/rpc" 17 ) 18 19 type PluginUninstall struct { 20 ui terminal.UI 21 config plugin_config.PluginConfiguration 22 rpcService *rpcService.CliRpcService 23 } 24 25 func init() { 26 command_registry.Register(&PluginUninstall{}) 27 } 28 29 func (cmd *PluginUninstall) MetaData() command_registry.CommandMetadata { 30 return command_registry.CommandMetadata{ 31 Name: "uninstall-plugin", 32 Description: T("Uninstall the plugin defined in command argument"), 33 Usage: T("CF_NAME uninstall-plugin PLUGIN-NAME"), 34 } 35 } 36 37 func (cmd *PluginUninstall) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) { 38 if len(fc.Args()) != 1 { 39 cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + command_registry.Commands.CommandUsage("uninstall-plugin")) 40 } 41 42 return 43 } 44 45 func (cmd *PluginUninstall) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command { 46 cmd.ui = deps.Ui 47 cmd.config = deps.PluginConfig 48 49 //reset rpc registration in case there is other running instance, 50 //each service can only be registered once 51 rpc.DefaultServer = rpc.NewServer() 52 53 rpcService, err := rpcService.NewRpcService(deps.TeePrinter, deps.TeePrinter, deps.Config, deps.RepoLocator, rpcService.NewNonCodegangstaRunner()) 54 if err != nil { 55 cmd.ui.Failed("Error initializing RPC service: " + err.Error()) 56 } 57 58 cmd.rpcService = rpcService 59 60 return cmd 61 } 62 63 func (cmd *PluginUninstall) Execute(c flags.FlagContext) { 64 pluginName := c.Args()[0] 65 pluginNameMap := map[string]interface{}{"PluginName": pluginName} 66 67 cmd.ui.Say(fmt.Sprintf(T("Uninstalling plugin {{.PluginName}}...", pluginNameMap))) 68 69 plugins := cmd.config.Plugins() 70 71 if _, ok := plugins[pluginName]; !ok { 72 cmd.ui.Failed(fmt.Sprintf(T("Plugin name {{.PluginName}} does not exist", pluginNameMap))) 73 } 74 75 pluginMetadata := plugins[pluginName] 76 77 err := cmd.notifyPluginUninstalling(pluginMetadata) 78 if err != nil { 79 cmd.ui.Say("Error invoking plugin: " + err.Error() + ". Process to uninstall ...") 80 } 81 82 time.Sleep(500 * time.Millisecond) //prevent 'process being used' error in Windows 83 84 err = os.Remove(pluginMetadata.Location) 85 if err != nil { 86 cmd.ui.Warn("Error removing plugin binary: " + err.Error()) 87 } 88 89 cmd.config.RemovePlugin(pluginName) 90 91 cmd.ui.Ok() 92 cmd.ui.Say(fmt.Sprintf(T("Plugin {{.PluginName}} successfully uninstalled.", pluginNameMap))) 93 } 94 95 func (cmd *PluginUninstall) notifyPluginUninstalling(meta plugin_config.PluginMetadata) error { 96 err := cmd.rpcService.Start() 97 if err != nil { 98 cmd.ui.Failed(err.Error()) 99 } 100 defer cmd.rpcService.Stop() 101 102 pluginInvocation := exec.Command(meta.Location, cmd.rpcService.Port(), "CLI-MESSAGE-UNINSTALL") 103 pluginInvocation.Stdout = os.Stdout 104 105 return pluginInvocation.Run() 106 }