github.com/cloudfoundry/cli@v7.1.0+incompatible/plugin/rpc/run_plugin.go (about)

     1  package rpc
     2  
     3  import (
     4  	"os"
     5  	"os/exec"
     6  
     7  	"code.cloudfoundry.org/cli/cf/configuration/pluginconfig"
     8  )
     9  
    10  func RunMethodIfExists(rpcService *CliRpcService, args []string, pluginList map[string]pluginconfig.PluginMetadata) bool {
    11  	for _, metadata := range pluginList {
    12  		for _, command := range metadata.Commands {
    13  			if command.Name == args[0] || command.Alias == args[0] {
    14  				args[0] = command.Name
    15  
    16  				rpcService.Start()
    17  				defer rpcService.Stop()
    18  
    19  				pluginArgs := append([]string{rpcService.Port()}, args...)
    20  
    21  				cmd := exec.Command(metadata.Location, pluginArgs...)
    22  				cmd.Stdout = os.Stdout
    23  				cmd.Stdin = os.Stdin
    24  				cmd.Stderr = os.Stderr
    25  
    26  				defer stopPlugin(cmd)
    27  				err := cmd.Run()
    28  				if err != nil {
    29  					os.Exit(1)
    30  				}
    31  				return true
    32  			}
    33  		}
    34  	}
    35  	return false
    36  }
    37  
    38  func stopPlugin(plugin *exec.Cmd) {
    39  	plugin.Process.Kill()
    40  	plugin.Wait()
    41  }