package main import ( "io/ioutil" "os" "path/filepath" "log" "github.com/docopt/docopt-go" ) type Commit struct { CommitId string `json:"commit_id"` RootId string `json:"root_id"` RepoId string `json:"repo_id"` CreatorName string `json:"creator_name"` Creator string `json:"creator"` Description string `json:"description"` Ctime uint64 `json:"ctime"` ParentId string `json:"parent_id"` SecondParentId string `json:"second_parent_id"` RepoName string `json:"repo_name"` RepoDesc string `json:"repo_desc"` RepoCategory string `json:"repo_category"` NoLocalHistory int `json:"no_local_history"` Version int `json:"version"` } func checkFolder(storage string) { files, err := ioutil.ReadDir(storage) if err != nil { log.Fatal(err) } checked_folders := map[string]bool{"fs": false, "commits": false, "blocks": false} for _, f := range files { if _, ok := checked_folders[f.Name()]; ok { info, err := os.Stat(filepath.Join(storage, f.Name())); if err == nil && info.IsDir() { checked_folders[f.Name()] = true } } } for path, seen := range checked_folders { if !seen { log.Fatal("Folder ", path, " is required but not present!") } } } func main() { usage := `Seafile Recovery. Usage: seafile_recovery [--storage=] commits seafile_recovery (-h | --help) Options: -h --help Show this screen --storage= Set Seafile storage path [default: ./storage]` var config struct { Commits bool `docopt:"commits"` Storage string `docopt:"--storage"` RepoId string `docopt:""` } opts, err := docopt.ParseDoc(usage) if err != nil { log.Fatal(err) } opts.Bind(&config) checkFolder(config.Storage) }