commit 564b4d1c7ae95d7b92185872783fd085626471b5 Author: Quentin Dufour Date: Wed Apr 21 14:25:35 2021 +0200 initial commit diff --git a/seafile_recovery.go b/seafile_recovery.go new file mode 100644 index 0000000..9cd55be --- /dev/null +++ b/seafile_recovery.go @@ -0,0 +1,68 @@ +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) +}