github.com/chyroc/anb@v0.3.0/internal/local_command.go (about) 1 package internal 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "os" 8 "os/exec" 9 "strings" 10 11 "github.com/chyroc/chaos" 12 ) 13 14 type Command interface { 15 Md5File(file string) (string, error) 16 } 17 18 type LocalCommand struct{} 19 20 func NewLocalCommand() *LocalCommand { 21 return &LocalCommand{} 22 } 23 24 func (r *LocalCommand) Md5File(file string) (string, error) { 25 out, err := r.RunCommand("md5sum " + file) 26 if err != nil { 27 return "", err 28 } 29 ss := strings.Split(out, " ") 30 if len(ss) >= 2 { 31 return ss[0], nil 32 } 33 return "", fmt.Errorf("md5sum response %q not valid", out) 34 } 35 36 func (r *LocalCommand) RunCommand(cmd string) (string, error) { 37 var bufout bytes.Buffer 38 var buferr bytes.Buffer 39 c := exec.Command("/bin/sh", "-c", cmd) 40 c.Stdout = &bufout 41 c.Stderr = &buferr 42 if err := c.Run(); err != nil { 43 ser := strings.TrimSpace(buferr.String()) 44 if ser != "" { 45 return "", fmt.Errorf("run %q fail: %s", cmd, ser) 46 } 47 return bufout.String(), fmt.Errorf("run %q fail: %w", cmd, err) 48 } 49 50 return bufout.String(), nil 51 } 52 53 func (r *LocalCommand) RunCommandInPipe(cmd string) (string, error) { 54 bufout := new(bytes.Buffer) 55 buferr := new(bytes.Buffer) 56 c := exec.Command("/bin/sh", "-c", cmd) 57 c.Stdout = chaos.TeeWriter([]io.Writer{bufout, os.Stdout}, nil) 58 c.Stderr = chaos.TeeWriter([]io.Writer{buferr, os.Stderr}, nil) 59 if err := c.Run(); err != nil { 60 ser := strings.TrimSpace(buferr.String()) 61 if ser != "" { 62 return "", fmt.Errorf("run %q fail: %s", cmd, ser) 63 } 64 return bufout.String(), fmt.Errorf("run %q fail: %w", cmd, err) 65 } 66 67 return bufout.String(), nil 68 }