github.com/swisscom/cloudfoundry-cli@v7.1.0+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  }