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 }