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