xref: /aosp_15_r20/external/coreboot/util/board_status/go/src/main/board_status.go (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1package main
2
3import (
4	"cbfs"
5	"cbtables"
6	"flag"
7	"fmt"
8	"io/ioutil"
9	"kconfig"
10	"log"
11	"os"
12	"os/exec"
13)
14
15var ClobberDir = flag.Bool("clobber", false, "Clobber temporary output when finished. Useful for debugging.")
16
17func RunAndSave(output string, name string, arg ...string) {
18	cmd := exec.Command(name, arg...)
19
20	f, err := os.Create(output)
21	if err != nil {
22		log.Fatal(err)
23	}
24
25	cmd.Stdout = f
26	cmd.Stderr = f
27
28	err = cmd.Start()
29	if err != nil {
30		log.Fatal(err)
31	}
32	cmd.Wait()
33}
34
35/* Missing features: serial, upload, ssh */
36
37func main() {
38	flag.Parse()
39
40	cb, err := cbfs.OpenROM()
41	if err != nil {
42		log.Fatal(err)
43	}
44	config, err := cb.GetFile("config")
45	if err != nil {
46		log.Fatal(err)
47	}
48	revision, err := cb.GetFile("revision")
49	if err != nil {
50		log.Fatal(err)
51	}
52
53	parsedConfig := kconfig.ParseKConfig(config)
54	mainboardDir := kconfig.UnQuote(parsedConfig["CONFIG_MAINBOARD_DIR"])
55
56	tempDir, err := ioutil.TempDir("", "coreboot_board_status")
57	if err != nil {
58		log.Fatal(err)
59	}
60
61	tbl, err := cbtables.Open()
62	if err != nil {
63		log.Fatal(err)
64	}
65
66	taggedVersion, err := tbl.GetVersion()
67	if err != nil {
68		log.Fatal(err)
69	}
70	versionTimestamp, err := tbl.GetVersionTimestamp()
71	if err != nil {
72		log.Fatal(err)
73	}
74	timestampFormated := versionTimestamp.UTC().Format("2006-01-02T15:04:05Z")
75	outputDir := tempDir + "/" + mainboardDir + "/" + taggedVersion + "/" + timestampFormated
76	os.MkdirAll(outputDir, 0755)
77	fmt.Printf("Temporarily placing output in %s\n", outputDir)
78	cf, err := os.Create(outputDir + "/cbfs.txt")
79	if err != nil {
80		log.Fatal(err)
81	}
82	defer cf.Close()
83	fmt.Fprintf(cf, "%v", cb)
84
85	cf, err = os.Create(outputDir + "/config.txt")
86	if err != nil {
87		log.Fatal(err)
88	}
89	defer cf.Close()
90	cf.Write(config)
91
92	cf, err = os.Create(outputDir + "/revision.txt")
93	if err != nil {
94		log.Fatal(err)
95	}
96	defer cf.Close()
97	cf.Write(revision)
98
99	RunAndSave(outputDir+"/kernel_log.txt", "dmesg")
100
101	cons, lost, err := tbl.GetConsole()
102	if err != nil {
103		log.Fatal(err)
104	}
105
106	cf, err = os.Create(outputDir + "/coreboot_console.txt")
107	if err != nil {
108		log.Fatal(err)
109	}
110	defer cf.Close()
111	cf.Write(cons)
112	switch lost {
113	case 0:
114	case 1:
115		fmt.Fprintf(cf, "\none byte lost\n")
116	default:
117		fmt.Fprintf(cf, "\n%d bytes lost\n", lost)
118	}
119	timest, err := tbl.GetTimestamps()
120	if err != nil {
121		log.Fatal(err)
122	}
123
124	ts, err := os.Create(outputDir + "/coreboot_timestamps.txt")
125	if err != nil {
126		log.Fatal(err)
127	}
128	defer ts.Close()
129	fmt.Fprintf(ts, "%v", timest)
130
131	if *ClobberDir {
132		os.RemoveAll(tempDir)
133	}
134}
135