github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/utils/scriptrunner/scriptrunner.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package scriptrunner 5 6 import ( 7 "time" 8 9 "github.com/juju/clock" 10 "github.com/juju/errors" 11 "github.com/juju/utils/exec" 12 ) 13 14 type ScriptResult struct { 15 Stdout []byte 16 Stderr []byte 17 Code int 18 } 19 20 func RunCommand(command string, environ []string, clock clock.Clock, timeout time.Duration) (*ScriptResult, error) { 21 cmd := exec.RunParams{ 22 Commands: command, 23 Environment: environ, 24 Clock: clock, 25 } 26 27 err := cmd.Run() 28 if err != nil { 29 return nil, errors.Trace(err) 30 } 31 32 var cancel chan struct{} 33 34 if timeout != 0 { 35 cancel = make(chan struct{}) 36 go func() { 37 <-clock.After(timeout) 38 close(cancel) 39 }() 40 } 41 42 result, err := cmd.WaitWithCancel(cancel) 43 44 if err != nil { 45 err = errors.Trace(err) 46 } 47 48 return &ScriptResult{ 49 Stdout: result.Stdout, 50 Stderr: result.Stderr, 51 Code: result.Code, 52 }, err 53 }