1package internal
2
3import (
4	"bufio"
5	"bytes"
6	"fmt"
7	"os/exec"
8	"strings"
9)
10
11func NVRAM(names ...string) ([]string, error) {
12	if len(names) == 0 {
13		return nil, nil
14	}
15	out, err := nvram("show")
16	if err != nil {
17		return nil, err
18	}
19	s := bufio.NewScanner(strings.NewReader(out))
20	names = append([]string{}, names...)
21	for i := range names {
22		names[i] += "="
23	}
24	var vars []string
25	for s.Scan() {
26		v := s.Text()
27		for _, n := range names {
28			if strings.HasPrefix(v, n) {
29				vars = append(vars, v)
30			}
31		}
32	}
33	if err := s.Err(); err != nil {
34		return nil, err
35	}
36	return vars, nil
37}
38
39func SetNVRAM(vars ...string) error {
40	if len(vars) == 0 {
41		return nil
42	}
43	for _, v := range vars {
44		cmd := "set"
45		if strings.HasSuffix(v, "=") {
46			cmd = "unset"
47		}
48		if _, err := nvram(cmd, v); err != nil {
49			return err
50		}
51	}
52	_, err := nvram("commit")
53	return err
54}
55
56func nvram(args ...string) (string, error) {
57	cmd := exec.Command("nvram", args...)
58	var stdout, stderr bytes.Buffer
59	cmd.Stdout = &stdout
60	cmd.Stderr = &stderr
61	if err := cmd.Run(); err != nil {
62		errDesc := stderr.String()
63		return "", fmt.Errorf("nvram %s: %w: %s", strings.Join(args, " "), err, errDesc)
64	}
65	return strings.TrimSpace(stdout.String()), nil
66}
67