diff options
Diffstat (limited to 'shell.go')
| -rw-r--r-- | shell.go | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/shell.go b/shell.go new file mode 100644 index 0000000..09c24c9 --- /dev/null +++ b/shell.go @@ -0,0 +1,117 @@ +package shell + +import "fmt" +import "log" +import "strings" +import "time" +import "os" +import "os/exec" +import "bufio" +import "github.com/davecgh/go-spew/spew" +import "github.com/svent/go-nbreader" + +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 = strings.TrimSpace(line) // this is like 'chomp' in perl + fmt.Println("LINE:", line) + time.Sleep(1) + shell(line) + } + return 0 +} + +func Run(cmdline string) int { + log.Println("START " + cmdline) + + cmd := strings.TrimSpace(cmdline) // this is like 'chomp' in perl + cmdArgs := strings.Fields(cmd) + if (len(cmdArgs) == 0) { + log.Println("END ", cmd) + return 0 // nothing to do + } + if (cmdArgs[0] == "cd") { + if (len(cmdArgs) > 1) { + log.Println("os.Chdir()", cmd) + os.Chdir(cmdArgs[1]) + } + log.Println("END ", cmd) + return 0 // nothing to do + } + + process := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) + stdout, _ := process.StdoutPipe() + stderr, _ := process.StderrPipe() + process.Start() + + f := bufio.NewWriter(os.Stdout) + + newreader := bufio.NewReader(stdout) + nbr := nbreader.NewNBReader(newreader, 1024) + + newerrreader := bufio.NewReader(stderr) + nbrerr := nbreader.NewNBReader(newerrreader, 1024) + + for { + time.Sleep(2 * time.Millisecond) // only check the buffer 500 times a second + // log.Println("sleep done") + + oneByte := make([]byte, 1024) + count, err := nbr.Read(oneByte) + + if (err != nil) { + // log.Println("Read() count = ", count, "err = ", err) + oneByte = make([]byte, 1024) + count, err = nbr.Read(oneByte) + f.Write([]byte(string(oneByte))) + f.Flush() + } + f.Write([]byte(string(oneByte))) + f.Flush() + + oneByte = make([]byte, 1024) + count, err = nbrerr.Read(oneByte) + + if (err != nil) { + oneByte = make([]byte, 1024) + count, err = nbrerr.Read(oneByte) + f.Write([]byte(string(oneByte))) + f.Flush() + + log.Println("Read() count = ", count, "err = ", err) + spew.Dump(process.Process) + spew.Dump(process.ProcessState) + err := process.Wait() + if err != nil { + spew.Dump(err.(*exec.ExitError)) + spew.Dump(process.ProcessState) + stuff := err.(*exec.ExitError) + log.Println("ERROR ", stuff) + log.Println("END ", cmdline) + return -1 + } + log.Println("END ", cmdline) + return 0 + } else { + f.Write([]byte(string(oneByte))) + f.Flush() + } + + // spew.Dump(reflect.ValueOf(cmd.Process).Elem()) + } + + err := process.Wait() + + if err != nil { + spew.Dump(err.(*exec.ExitError)) + spew.Dump(process.ProcessState) + stuff := err.(*exec.ExitError) + log.Println("ERROR ", stuff) + log.Println("END ", cmdline) + return -1 + } + log.Println("END ", cmdline) + return 0 +} |
