diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b9bbea8..649d815 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -8,8 +8,8 @@ + - - + @@ -58,59 +58,59 @@ - + + - + - + - + - + - + - @@ -131,4 +131,4 @@ true - \ No newline at end of file + diff --git a/client.go b/client.go index d2d1db5..7c5ff5d 100644 --- a/client.go +++ b/client.go @@ -489,18 +489,31 @@ func (c *Client) SetModeLive() <-chan *StreamIntervalReport { } func (c *Client) Start() (err error) { + _, err = c.start() + return err +} + +func (c *Client) StartEx() (pid int, err error) { + return c.start() +} + +func (c *Client) start() (pid int, err error) { read := make(chan interface{}) cmd, err := c.commandString() if err != nil { - return err + return -1, err } var exit chan int +<<<<<<< HEAD if c.Debug { fmt.Printf("executing command: %s\n", cmd) } c.outputStream, c.errorStream, exit, c.cancel, err = ExecuteAsyncWithCancelReadIndicator(cmd, read) +======= + c.outputStream, c.errorStream, exit, c.cancel, pid, err = ExecuteAsyncWithCancelReadIndicator(cmd, read) +>>>>>>> 328913249f87399ed1ce133fec58df85a24aa9b0 if err != nil { - return err + return -1, err } c.Running = true @@ -551,7 +564,7 @@ func (c *Client) Start() (err error) { reporter.Stop() } }() - return nil + return pid, nil } func (c *Client) Stop() { diff --git a/cmd/main.go b/cmd/main.go index 69e02a7..b59bd10 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,11 +2,14 @@ package main import ( //"fmt" -//"github.com/BGrewell/go-conversions" + "github.com/BGrewell/go-conversions" //"github.com/BGrewell/go-iperf" //"time" "fmt" +<<<<<<< HEAD "github.com/BGrewell/go-conversions" +======= +>>>>>>> 328913249f87399ed1ce133fec58df85a24aa9b0 "github.com/BGrewell/go-iperf" "time" ) diff --git a/controller.go b/controller.go index 39af92f..45f05bf 100644 --- a/controller.go +++ b/controller.go @@ -29,12 +29,6 @@ func NewController(port int) (controller *Controller, err error) { // server side it listens for new gRPC connections, when a connection is made by a client the client can tell it to // start a new iperf server instance. It will start a instance on an unused port and return the port number to the // client. This allows the entire iperf setup and session to be performed from the client side. -// -// CLIENT SERVER -// connect to grpc ---> accept grpc connection -// call StartServer() ---> find unused port -// start iperf server on port -// get server port info <--- return port information to client type Controller struct { api.UnimplementedCommandServer Port int diff --git a/execute.go b/execute.go index f8ae6d3..3bdebb4 100644 --- a/execute.go +++ b/execute.go @@ -42,34 +42,38 @@ func ExecuteAsync(cmd string) (outPipe io.ReadCloser, errPipe io.ReadCloser, exi return outPipe, errPipe, exitCode, nil } -func ExecuteAsyncWithCancel(cmd string) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, err error) { +func ExecuteAsyncWithCancel(cmd string) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) { return ExecuteAsyncWithCancelReadIndicator(cmd, nil) } -func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, err error) { +func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) { + return executeAsyncWithCancel(cmd, readIndicator) +} + +func executeAsyncWithCancel(cmd string, readIndicator chan interface{}) (stdOut io.ReadCloser, stdErr io.ReadCloser, exitCode chan int, cancelToken context.CancelFunc, pid int, err error) { exitCode = make(chan int) ctx, cancel := context.WithCancel(context.Background()) cmdParts := strings.Fields(cmd) binary, err := exec.LookPath(cmdParts[0]) if err != nil { defer cancel() - return nil, nil, nil, nil, err + return nil, nil, nil, nil, -1, err } exe := exec.CommandContext(ctx, binary, cmdParts[1:]...) stdOut, err = exe.StdoutPipe() if err != nil { defer cancel() - return nil, nil, nil, nil, err + return nil, nil, nil, nil, -1, err } stdErr, err = exe.StderrPipe() if err != nil { defer cancel() - return nil, nil, nil, nil, err + return nil, nil, nil, nil, -1, err } err = exe.Start() if err != nil { defer cancel() - return nil, nil, nil, nil, err + return nil, nil, nil, nil, -1, err } go func() { // Note: Wait() will close the Stdout/Stderr and in some cases can do it before we read. In order to prevent @@ -87,5 +91,5 @@ func ExecuteAsyncWithCancelReadIndicator(cmd string, readIndicator chan interfac exitCode <- 0 } }() - return stdOut, stdErr, exitCode, cancel, nil -} + return stdOut, stdErr, exitCode, cancel, exe.Process.Pid, nil +} \ No newline at end of file diff --git a/reporter_darwin.go b/reporter_darwin.go index 40f0f31..0025f53 100644 --- a/reporter_darwin.go +++ b/reporter_darwin.go @@ -10,6 +10,11 @@ import ( "time" ) +<<<<<<< HEAD +//TODO: This has not been tested on OS X ... my assumption is it is the exact same as linux but if it's not then the +// reporting will be broken + +======= /* Connecting to host 10.254.100.100, port 5201 [ 4] local 192.168.3.182 port 54104 connected to 10.254.100.100 port 5201 @@ -45,6 +50,7 @@ Connecting to host 10.254.100.100, port 5201 iperf Done. */ +>>>>>>> 8ad71c4c5699a6d55965c2f1ab99d5c306295c3b func (r *Reporter) runLogProcessor() { var err error r.tailer, err = tail.TailFile(r.LogFile, tail.Config{ diff --git a/server.go b/server.go index 638a225..977200c 100644 --- a/server.go +++ b/server.go @@ -151,17 +151,30 @@ func (s *Server) SetLogFile(filename string) { } func (s *Server) Start() (err error) { + _, err = s.start() + return err +} + +func (s *Server) StartEx() (pid int, err error) { + return s.start() +} + +func (s *Server) start() (pid int, err error) { cmd, err := s.commandString() if err != nil { - return err + return -1, err } var exit chan int +<<<<<<< HEAD if s.Debug { fmt.Printf("executing command: %s\n", cmd) } s.outputStream, s.errorStream, exit, s.cancel, err = ExecuteAsyncWithCancel(cmd) +======= + s.outputStream, s.errorStream, exit, s.cancel, pid, err = ExecuteAsyncWithCancel(cmd) +>>>>>>> 328913249f87399ed1ce133fec58df85a24aa9b0 if err != nil { - return err + return -1, err } s.Running = true @@ -179,7 +192,7 @@ func (s *Server) Start() (err error) { s.ExitCode = &exitCode s.Running = false }() - return nil + return pid,nil } func (s *Server) Stop() {