package shell // old code and probably junk import ( "io/ioutil" "net/http" "os" "os/exec" "go.wit.com/log" ) // TODO: look at https://github.com/go-cmd/cmd/issues/20 // use go-cmd instead here? var callback func(interface{}, int) var shellStdout *os.File var shellStderr *os.File var spewOn bool = false var quiet bool = false // var msecDelay int = 20 // number of milliseconds to delay between reads with no data // var bytesBuffer bytes.Buffer // var bytesSplice []byte func handleError(c interface{}, ret int) { log.Log(INFO, "shell.Run() Returned", ret) if callback != nil { callback(c, ret) } } func init() { callback = nil } func InitCallback(f func(interface{}, int)) { callback = f } // this means it won't copy all the output to STDOUT func Quiet(q bool) { quiet = q } /* func Script(cmds string) int { // split on new lines (while we are at it, handle stupid windows text files lines := strings.Split(strings.Replace(cmds, "\r\n", "\n", -1), "\n") for _, line := range lines { line = Chomp(line) // this is like 'chomp' in perl log.Log(INFO, "LINE:", line) time.Sleep(1) RunString(line) } return 0 } */ func Unlink(filename string) bool { if err := os.Remove(filename); err != nil { return Exists(filename) } else { return Exists(filename) } } // run interactively. output from the cmd is in real time // shows all the output. For example, 'ping -n localhost' // shows the output like you would expect to see func RunSimple(cmd []string) error { log.Log(INFO, "NewRun() ", cmd) return PathRunSimple("", cmd) } func PathRunSimple(workingpath string, cmd []string) error { log.Log(INFO, "NewRun() ", cmd) process := exec.Command(cmd[0], cmd[1:len(cmd)]...) // Set the working directory process.Dir = workingpath process.Stderr = os.Stderr process.Stdin = os.Stdin process.Stdout = os.Stdout process.Start() err := process.Wait() if err != nil { log.Log(INFO, "shell.Exec() err =", err) } return err } // return true if the filename exists (cross-platform) // return true if the filename exists (cross-platform) func Exists(filename string) bool { _, err := os.Stat(Path(filename)) if os.IsNotExist(err) { return false } return true } // makes the directory func Mkdir(dir string) bool { if Dir(dir) { // already a dir return true } if Exists(dir) { // something else is there return false } Run([]string{"mkdir", "-p", dir}) return true } func IsDir(dirname string) bool { return Dir(dirname) } // return true if the filename exists (cross-platform) func Dir(dirname string) bool { info, err := os.Stat(Path(dirname)) if os.IsNotExist(err) { return false } return info.IsDir() } // Cat a file into a string func Cat(filename string) string { buffer, err := ioutil.ReadFile(Path(filename)) // log.Log(INFO, "buffer =", string(buffer)) if err != nil { return "" } return string(buffer) } func RunPathHttpOut(path string, cmd []string, w http.ResponseWriter, r *http.Request) error { log.Warn("Run(): ", cmd) process := exec.Command(cmd[0], cmd[1:len(cmd)]...) process.Dir = path process.Stderr = os.Stderr process.Stdin = r.Body process.Stdout = w process.Start() err := process.Wait() log.Warn("shell.Exec() err =", err) return err } func RunHttpOut(cmd []string, w http.ResponseWriter, r *http.Request) error { log.Warn("NewRun() ", cmd) process := exec.Command(cmd[0], cmd[1:len(cmd)]...) process.Stderr = os.Stderr process.Stdin = r.Body process.Stdout = w process.Start() err := process.Wait() log.Warn("shell.Exec() err =", err) return err }