safing-portbase/utils/osdetail/command.go
2022-03-19 22:00:15 +01:00

51 lines
1.1 KiB
Go

package osdetail
import (
"bytes"
"errors"
"os/exec"
"strings"
)
// RunCmd runs the given command and run error checks on the output.
func RunCmd(command ...string) (output []byte, err error) {
// Create command to execute.
var cmd *exec.Cmd
switch len(command) {
case 0:
return nil, errors.New("no command supplied")
case 1:
cmd = exec.Command(command[0])
default:
cmd = exec.Command(command[0], command[1:]...)
}
// Create and assign output buffers.
var stdoutBuf bytes.Buffer
var stderrBuf bytes.Buffer
cmd.Stdout = &stdoutBuf
cmd.Stderr = &stderrBuf
// Run command and collect output.
err = cmd.Run()
stdout, stderr := stdoutBuf.Bytes(), stderrBuf.Bytes()
if err != nil {
return nil, err
}
// Command might not return an error, but just write to stdout instead.
if len(stderr) > 0 {
return nil, errors.New(strings.SplitN(string(stderr), "\n", 2)[0])
}
// Debugging output:
// fmt.Printf("command stdout: %s\n", stdout)
// fmt.Printf("command stderr: %s\n", stderr)
// Finalize stdout.
cleanedOutput := bytes.TrimSpace(stdout)
if len(cleanedOutput) == 0 {
return nil, ErrEmptyOutput
}
return cleanedOutput, nil
}