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  }