func executeCommand()

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
}