in lib/ec2macosinit/util.go [33:76]
func executeCommand(c []string, runAsUser string, envVars []string) (output commandOutput, err error) {
// Separate name and args, plus catch a few error cases
var name string
var args []string
if len(c) > 1 {
name = c[0]
args = c[1:]
} else if len(c) == 1 {
name = c[0]
if name == "" { // Empty string case ("")
return commandOutput{}, fmt.Errorf("ec2macosinit: must provide a command")
}
} else { // Empty struct case ([]string{})
return commandOutput{}, fmt.Errorf("ec2macosinit: must provide a command")
}
// Set command and create output buffers
cmd := exec.Command(name, args...)
var stdoutb, stderrb bytes.Buffer
cmd.Stdout = &stdoutb
cmd.Stderr = &stderrb
// Set runAsUser, if defined, otherwise will run as root
if runAsUser != "" {
uid, gid, err := getUIDandGID(runAsUser)
if err != nil {
return commandOutput{}, fmt.Errorf("ec2macosinit: error looking up user: %s\n", err)
}
cmd.SysProcAttr = &syscall.SysProcAttr{}
cmd.SysProcAttr.Credential = &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)}
}
// Append environment variables
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, envVars...)
// Run command
err = cmd.Run()
if err != nil {
return commandOutput{stdout: stdoutb.String(), stderr: stderrb.String()}, err
}
return commandOutput{stdout: stdoutb.String(), stderr: stderrb.String()}, nil
}