tAdd partage-trash to cleanup expired files - partage - File upload system
(HTM) git clone git://git.z3bra.org/partage.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit cc7caa5aec5806d9892516c8074d8b7632638f7e
(DIR) parent 18aa29fccc0769886a79c7171c407cede717c6c4
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 19 Oct 2021 14:03:15 +0200
Add partage-trash to cleanup expired files
Diffstat:
M mkfile | 17 +++++++++++++----
A partage-trash/partage-trash.go | 83 +++++++++++++++++++++++++++++++
2 files changed, 96 insertions(+), 4 deletions(-)
---
(DIR) diff --git a/mkfile b/mkfile
t@@ -1,21 +1,30 @@
<config.mk
-all:V: partage
+all:V: partage partage-trash/partage-trash
%: %.go
$GO build -o $stem
clean:V:
- rm -f partage
+ rm -f partage partage-trash/partage-trash
-install:V: partage
+install:V: partage partage-trash/partage-trash
mkdir -p ${DESTDIR}${PREFIX}/bin
cp partage ${DESTDIR}${PREFIX}/bin/partage
+ cp partage-trash/partage-trash ${DESTDIR}${PREFIX}/bin/partage-trash
chmod 755 ${DESTDIR}${PREFIX}/bin/partage
+ chmod 755 ${DESTDIR}${PREFIX}/bin/partage-trash
mkdir -p ${DESTDIR}${MANDIR}/man1
- cp partage.1 ${DESTDIR}${MANDIR}/man1/partage.1
+ cp man/partage.1 ${DESTDIR}${MANDIR}/man1/partage.1
+ cp man/partage-trash.1 ${DESTDIR}${MANDIR}/man1/partage-trash.1
+ cp man/partage.conf.5 ${DESTDIR}${MANDIR}/man5/partage.conf.5
chmod 644 ${DESTDIR}${MANDIR}/man1/partage.1
+ chmod 644 ${DESTDIR}${MANDIR}/man1/partage-trash.1
+ chmod 644 ${DESTDIR}${MANDIR}/man5/partage.conf.5
uninstall:V:
rm ${DESTDIR}${PREFIX}/bin/partage
+ rm ${DESTDIR}${PREFIX}/bin/partage-trash
rm ${DESTDIR}${MANDIR}/man1/partage.1
+ rm ${DESTDIR}${MANDIR}/man1/partage-trash.1
+ rm ${DESTDIR}${MANDIR}/man5/partage.conf.5
(DIR) diff --git a/partage-trash/partage-trash.go b/partage-trash/partage-trash.go
t@@ -0,0 +1,83 @@
+package main
+
+import (
+ "log"
+ "flag"
+ "os"
+ "time"
+ "path/filepath"
+ "encoding/json"
+
+ "github.com/dustin/go-humanize"
+)
+
+type metadata struct {
+ Filename string
+ Size int64
+ Expiry int64
+}
+
+var conf struct {
+ filepath string
+ metapath string
+}
+
+var verbose bool
+var count int64
+var size int64
+
+func readmeta(filename string) (metadata, error) {
+ j, err := os.ReadFile(filename)
+ if err != nil {
+ return metadata{}, err
+ }
+
+ var meta metadata
+ err = json.Unmarshal(j, &meta)
+ if err != nil {
+ return metadata{}, err
+ }
+
+ return meta, nil
+}
+
+func checkexpiry(path string, info os.FileInfo, err error) error {
+ if filepath.Ext(path) != ".json" {
+ return nil
+ }
+ meta, err := readmeta(path)
+
+ now := time.Now().Unix()
+
+ if meta.Expiry > 0 && now >= meta.Expiry {
+ if verbose {
+ expiration := humanize.Time(time.Unix(meta.Expiry, 0))
+ log.Printf("%s/%s expired %s\n", conf.filepath, meta.Filename, expiration)
+ }
+ os.Remove(conf.filepath + "/" + meta.Filename)
+ os.Remove(path)
+ return nil
+ } else {
+ count++
+ size += meta.Size
+ }
+
+ return nil
+}
+
+func main() {
+ flag.BoolVar(&verbose, "v", false, "Verbose logging")
+ flag.StringVar(&conf.filepath, "f", "./files", "Directory containing files")
+ flag.StringVar(&conf.metapath, "m", "./meta", "Directory containing metadata")
+
+ flag.Parse()
+
+ err := filepath.Walk(conf.metapath, checkexpiry)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ if verbose && count > 0 {
+ log.Printf("%d file(s) remain on disk (total: %s)", count, humanize.IBytes(uint64(size)))
+ }
+}