1 | package main
|
---|
2 |
|
---|
3 | import (
|
---|
4 | "log"
|
---|
5 | "flag"
|
---|
6 | "os"
|
---|
7 | "time"
|
---|
8 | "path/filepath"
|
---|
9 | "encoding/json"
|
---|
10 |
|
---|
11 | "github.com/dustin/go-humanize"
|
---|
12 | )
|
---|
13 |
|
---|
14 | type metadata struct {
|
---|
15 | Filename string
|
---|
16 | Size int64
|
---|
17 | Expiry int64
|
---|
18 | }
|
---|
19 |
|
---|
20 | var conf struct {
|
---|
21 | filepath string
|
---|
22 | metapath string
|
---|
23 | }
|
---|
24 |
|
---|
25 | var verbose bool
|
---|
26 | var count int64
|
---|
27 | var size int64
|
---|
28 |
|
---|
29 | func readmeta(filename string) (metadata, error) {
|
---|
30 | j, err := os.ReadFile(filename)
|
---|
31 | if err != nil {
|
---|
32 | return metadata{}, err
|
---|
33 | }
|
---|
34 |
|
---|
35 | var meta metadata
|
---|
36 | err = json.Unmarshal(j, &meta)
|
---|
37 | if err != nil {
|
---|
38 | return metadata{}, err
|
---|
39 | }
|
---|
40 |
|
---|
41 | return meta, nil
|
---|
42 | }
|
---|
43 |
|
---|
44 | func checkexpiry(path string, info os.FileInfo, err error) error {
|
---|
45 | if filepath.Ext(path) != ".json" {
|
---|
46 | return nil
|
---|
47 | }
|
---|
48 | meta, err := readmeta(path)
|
---|
49 | if err != nil {
|
---|
50 | log.Fatal(err)
|
---|
51 | }
|
---|
52 |
|
---|
53 | now := time.Now().Unix()
|
---|
54 |
|
---|
55 | if meta.Expiry > 0 && now >= meta.Expiry {
|
---|
56 | if verbose {
|
---|
57 | expiration := humanize.Time(time.Unix(meta.Expiry, 0))
|
---|
58 | log.Printf("%s/%s expired %s\n", conf.filepath, meta.Filename, expiration)
|
---|
59 | }
|
---|
60 | os.Remove(conf.filepath + "/" + meta.Filename)
|
---|
61 | os.Remove(path)
|
---|
62 | return nil
|
---|
63 | } else {
|
---|
64 | count++
|
---|
65 | size += meta.Size
|
---|
66 | }
|
---|
67 |
|
---|
68 | return nil
|
---|
69 | }
|
---|
70 |
|
---|
71 | func main() {
|
---|
72 | flag.BoolVar(&verbose, "v", false, "Verbose logging")
|
---|
73 | flag.StringVar(&conf.filepath, "f", "./files", "Directory containing files")
|
---|
74 | flag.StringVar(&conf.metapath, "m", "./meta", "Directory containing metadata")
|
---|
75 |
|
---|
76 | flag.Parse()
|
---|
77 |
|
---|
78 | err := filepath.Walk(conf.metapath, checkexpiry)
|
---|
79 | if err != nil {
|
---|
80 | log.Fatal(err)
|
---|
81 | }
|
---|
82 |
|
---|
83 | if verbose && count > 0 {
|
---|
84 | log.Printf("%d file(s) remain on disk (total: %s)", count, humanize.IBytes(uint64(size)))
|
---|
85 | }
|
---|
86 | }
|
---|