173 lines
3.5 KiB
Go
173 lines
3.5 KiB
Go
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
|
|
}
|