package main import ( "flag" "fmt" "io/ioutil" "os" "strings" ) type CrashDump struct { Name string DumpPath string MetadataPath string } func expandHomeDir(path string) (string, error) { home, err := os.UserHomeDir() if err != nil { return path, err } return strings.Replace(path, "~/", home, -1), nil } func dumps(path string) ([]CrashDump, error) { files, err := ioutil.ReadDir(path) if err != nil { return nil, err } var crashes []CrashDump for i, file := range files { if strings.HasSuffix(file.Name(), ".dmp") { if i+1 < len(files) && files[i+1].Name() == file.Name()+".txt" { crashes = append(crashes, CrashDump{Name: strings.TrimSuffix(file.Name(), ".dmp"), DumpPath: file.Name(), MetadataPath: files[i+1].Name()}) } else { crashes = append(crashes, CrashDump{Name: strings.TrimSuffix(file.Name(), ".dmp"), DumpPath: file.Name()}) } } } return crashes, nil } func main() { helpFlag := flag.Bool("help", false, "Show help information.") flag.StringVar(&dumpPath, "crashd", dumpPath, "Crash dump path") // create crash report flags crashedFlag := flag.String("c", "", "Create crash report at specified location and write any specified data into it") flag.Parse() dumpPath, _ = expandHomeDir(dumpPath) if *helpFlag { flag.PrintDefaults() return } if *crashedFlag != "" { fmt.Println("Creating crash dump report", *crashedFlag) contents := []byte("Additional information: " + strings.Join(flag.Args(), "")) ioutil.WriteFile(*crashedFlag+".txt", contents, 0644) return } fmt.Printf("[%s]\n", dumpPath) c, err := dumps(dumpPath) if err != nil { panic(err) } for _, d := range c { fmt.Printf("\t- %s\n", d.Name) } }