github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/plugin/rpc/run_plugin.go (about)

     1  package rpc
     2  
     3  import (
     4  	"os"
     5  	"os/exec"
     6  
     7  	"github.com/cloudfoundry/cli/cf/configuration/plugin_config"
     8  	"github.com/cloudfoundry/cli/cf/terminal"
     9  	"github.com/codegangsta/cli"
    10  )
    11  
    12  func RunMethodIfExists(coreCommandRunner *cli.App, args []string, outputCapture terminal.OutputCapture, terminalOutputSwitch terminal.TerminalOutputSwitch, pluginList map[string]plugin_config.PluginMetadata) bool {
    13  	for _, metadata := range pluginList {
    14  		for _, command := range metadata.Commands {
    15  			if command.Name == args[0] || command.Alias == args[0] {
    16  				args[0] = command.Name
    17  				cliServer, err := startCliServer(coreCommandRunner, outputCapture, terminalOutputSwitch)
    18  				if err != nil {
    19  					os.Exit(1)
    20  				}
    21  
    22  				defer cliServer.Stop()
    23  				pluginArgs := append([]string{cliServer.Port()}, args...)
    24  				cmd := exec.Command(metadata.Location, pluginArgs...)
    25  				cmd.Stdout = os.Stdout
    26  				cmd.Stdin = os.Stdin
    27  
    28  				defer stopPlugin(cmd)
    29  				err = cmd.Run()
    30  				if err != nil {
    31  					os.Exit(1)
    32  				}
    33  				return true
    34  			}
    35  		}
    36  	}
    37  	return false
    38  }
    39  
    40  func startCliServer(coreCommandRunner *cli.App, outputCapture terminal.OutputCapture, terminalOutputSwitch terminal.TerminalOutputSwitch) (*CliRpcService, error) {
    41  	cliServer, err := NewRpcService(coreCommandRunner, outputCapture, terminalOutputSwitch)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	err = cliServer.Start()
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return cliServer, nil
    52  }
    53  
    54  func stopPlugin(plugin *exec.Cmd) {
    55  	plugin.Process.Kill()
    56  	plugin.Wait()
    57  }