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