package main import ( "cbfs" "cbtables" "flag" "fmt" "io/ioutil" "kconfig" "log" "os" "os/exec" ) var ClobberDir = flag.Bool("clobber", false, "Clobber temporary output when finished. Useful for debugging.") func RunAndSave(output string, name string, arg ...string) { cmd := exec.Command(name, arg...) f, err := os.Create(output) if err != nil { log.Fatal(err) } cmd.Stdout = f cmd.Stderr = f err = cmd.Start() if err != nil { log.Fatal(err) } cmd.Wait() } /* Missing features: serial, upload, ssh */ func main() { flag.Parse() cb, err := cbfs.OpenROM() if err != nil { log.Fatal(err) } config, err := cb.GetFile("config") if err != nil { log.Fatal(err) } revision, err := cb.GetFile("revision") if err != nil { log.Fatal(err) } parsedConfig := kconfig.ParseKConfig(config) mainboardDir := kconfig.UnQuote(parsedConfig["CONFIG_MAINBOARD_DIR"]) tempDir, err := ioutil.TempDir("", "coreboot_board_status") if err != nil { log.Fatal(err) } tbl, err := cbtables.Open() if err != nil { log.Fatal(err) } taggedVersion, err := tbl.GetVersion() if err != nil { log.Fatal(err) } versionTimestamp, err := tbl.GetVersionTimestamp() if err != nil { log.Fatal(err) } timestampFormated := versionTimestamp.UTC().Format("2006-01-02T15:04:05Z") outputDir := tempDir + "/" + mainboardDir + "/" + taggedVersion + "/" + timestampFormated os.MkdirAll(outputDir, 0755) fmt.Printf("Temporarily placing output in %s\n", outputDir) cf, err := os.Create(outputDir + "/cbfs.txt") if err != nil { log.Fatal(err) } defer cf.Close() fmt.Fprintf(cf, "%v", cb) cf, err = os.Create(outputDir + "/config.txt") if err != nil { log.Fatal(err) } defer cf.Close() cf.Write(config) cf, err = os.Create(outputDir + "/revision.txt") if err != nil { log.Fatal(err) } defer cf.Close() cf.Write(revision) RunAndSave(outputDir+"/kernel_log.txt", "dmesg") cons, lost, err := tbl.GetConsole() if err != nil { log.Fatal(err) } cf, err = os.Create(outputDir + "/coreboot_console.txt") if err != nil { log.Fatal(err) } defer cf.Close() cf.Write(cons) switch lost { case 0: case 1: fmt.Fprintf(cf, "\none byte lost\n") default: fmt.Fprintf(cf, "\n%d bytes lost\n", lost) } timest, err := tbl.GetTimestamps() if err != nil { log.Fatal(err) } ts, err := os.Create(outputDir + "/coreboot_timestamps.txt") if err != nil { log.Fatal(err) } defer ts.Close() fmt.Fprintf(ts, "%v", timest) if *ClobberDir { os.RemoveAll(tempDir) } }