You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
package utils
|
|
|
|
import (
|
|
stderrors "errors"
|
|
"fmt"
|
|
"github.com/kvz/logstreamer"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
)
|
|
|
|
//http://craigwickesser.com/2015/02/golang-cmd-with-custom-environment/
|
|
//http://www.ryanday.net/2012/10/01/installing-go-and-gopath/
|
|
//
|
|
|
|
func BashCmdExec(cmd string, workingDir string, environ []string, logPrefix string) error {
|
|
return CmdExec("sh", []string{"-c", cmd}, workingDir, environ, logPrefix)
|
|
}
|
|
|
|
func CmdExec(cmdName string, cmdArgs []string, workingDir string, environ []string, logPrefix string) error {
|
|
if logPrefix == "" {
|
|
logPrefix = " >> "
|
|
} else {
|
|
logPrefix = logPrefix + " | "
|
|
}
|
|
|
|
// Create a logger (your app probably already has one)
|
|
logger := log.New(os.Stdout, logPrefix, log.Ldate|log.Ltime)
|
|
|
|
// Setup a streamer that we'll pipe cmd.Stdout to
|
|
logStreamerOut := logstreamer.NewLogstreamer(logger, "stdout", false)
|
|
defer logStreamerOut.Close()
|
|
// Setup a streamer that we'll pipe cmd.Stderr to.
|
|
// We want to record/buffer anything that's written to this (3rd argument true)
|
|
logStreamerErr := logstreamer.NewLogstreamer(logger, "stderr", true)
|
|
defer logStreamerErr.Close()
|
|
|
|
cmd := exec.Command(cmdName, cmdArgs...)
|
|
cmd.Stdout = logStreamerOut
|
|
cmd.Stderr = logStreamerErr
|
|
if environ != nil {
|
|
cmd.Env = environ
|
|
}
|
|
if workingDir != "" && path.IsAbs(workingDir) {
|
|
cmd.Dir = workingDir
|
|
} else if workingDir != "" {
|
|
return stderrors.New("Working Directory must be an absolute path")
|
|
}
|
|
//cmdReader, err := cmd.StdoutPipe()
|
|
//if err != nil {
|
|
// fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
|
|
// return err
|
|
//}
|
|
//
|
|
//done := make(chan struct{})
|
|
//
|
|
//scanner := bufio.NewScanner(cmdReader)
|
|
//go func() {
|
|
// for scanner.Scan() {
|
|
// fmt.Printf("%s%s\n", logPrefix, scanner.Text())
|
|
// }
|
|
// done <- struct{}{}
|
|
//
|
|
//}()
|
|
|
|
// Reset any error we recorded
|
|
logStreamerErr.FlushRecord()
|
|
|
|
err := cmd.Start()
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
|
|
return err
|
|
}
|
|
|
|
//<-done
|
|
|
|
err = cmd.Wait()
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|