diff --git a/lts.go b/lts.go index 3f67405..bcbc666 100644 --- a/lts.go +++ b/lts.go @@ -16,6 +16,8 @@ import ( "strconv" "strings" "sync" + "syscall" + "time" "github.com/fsnotify/fsnotify" ) @@ -30,22 +32,23 @@ var tmpls embed.FS //go:embed etc/* var etc embed.FS -func createFile(storePath, name string) (*os.File, error) { +func createFile(storePath, name string) (*os.File, string, error) { if _, err := os.Stat(storePath); os.IsNotExist(err) { os.Mkdir(storePath, 0755) } uuidBytes, err := NewV4() if err != nil { - return nil, err + return nil, "", err } uuid := uuidBytes.String() - dst, err := os.Create(filepath.Join(storePath, fmt.Sprintf("%s-%s", uuid, name))) + bare_name := fmt.Sprintf("%s-%s", uuid, name) + dst, err := os.Create(filepath.Join(storePath, bare_name)) if err != nil { - return nil, err + return nil, bare_name, err } - return dst, nil + return dst, bare_name, nil } type AllowedUser struct { @@ -107,6 +110,19 @@ func byteCountSI(b int64) string { float64(b)/float64(div), "kMGTPE"[exp]) } +type Timeout struct { + H int64 + M int64 + S int64 +} + +type Cleaner struct { + Timeout Timeout + SpawnTime int64 +} + +var cleaners map[string]Cleaner = map[string]Cleaner{} + func handleUpload(w http.ResponseWriter, r *http.Request) { limit := int64(10737418240) // 10GiB r.ParseMultipartForm(limit) @@ -147,7 +163,7 @@ func handleUpload(w http.ResponseWriter, r *http.Request) { } defer file.Close() - dst, err := createFile(storePath, handler.Filename) + dst, bare_name, err := createFile(storePath, handler.Filename) if err != nil { http.Error(w, "Could not save file", http.StatusInternalServerError) return @@ -161,17 +177,20 @@ func handleUpload(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Uploaded file: %s\n", handler.Filename) fmt.Fprintf(w, "File size: %s\n", byteCountSI(handler.Size)) fmt.Fprintf(w, "Lifetime: %02d:%02d:%02d total %d\n", hours, mins, secs, total); - fmt.Fprintf(w, "Link: %s", fmt.Sprintf("%s/%s", listener.Addr().String(), dst.Name())) - + fmt.Fprintf(w, "Link: %s", fmt.Sprintf("%s/store/%s", listener.Addr().String(), bare_name)) + cmd := exec.Command("./ltscleanerd", dst.Name(), strconv.FormatInt(total, 10)) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setsid: true, + } log.Println("Started ", cmd.String()) err = cmd.Start() if err != nil { log.Println("Could not start cleaner daemon: ", err) } - err = cmd.Process.Release() - if err != nil { - log.Fatal("Could not detach from cleaner daemon: ", err) + cleaners[bare_name] = Cleaner{ + Timeout: Timeout{ H: hours, M: mins, S: secs }, + SpawnTime: time.Now().Unix(), } } @@ -188,6 +207,7 @@ type BrowseRecord struct { ReadableName string Perm string Modtime string + TimeLeft string } func handleBrowse(w http.ResponseWriter, r *http.Request) { @@ -211,12 +231,21 @@ func handleBrowse(w http.ResponseWriter, r *http.Request) { info.ModTime().Day(), info.ModTime().Month().String(), info.ModTime().Year(), info.ModTime().Hour(), info.ModTime().Minute(), info.ModTime().Second(), ) + cleaner, _ := cleaners[e.Name()] + total := cleaner.Timeout.S + cleaner.Timeout.M*60 + cleaner.Timeout.H*60*60 + now := time.Now().Unix() + fmt.Println(cleaner.SpawnTime + total - now) + timeleft_unix := time.Unix(cleaner.SpawnTime + total - now, 0) + timeleft := fmt.Sprintf("time left %02d:%02d:%02d", + timeleft_unix.Hour() - 1, timeleft_unix.Minute(), timeleft_unix.Second(), + ) records = append(records, BrowseRecord{ FileName: filename, ReadableName: readable_name, Perm: info.Mode().Perm().String(), Modtime: modtime, + TimeLeft: timeleft, }) } diff --git a/tmpls/browse.html b/tmpls/browse.html index b6f8d9e..5702c18 100644 --- a/tmpls/browse.html +++ b/tmpls/browse.html @@ -11,6 +11,7 @@
Welcome to The Lair's temporary storage service. Use this service to transport files via
a temporary remote storage.
- ONLY WHITELISTED USERS can upload! For access, reach out to me.
- Only 30PLN / 12MON.
+ ONLY WHITELISTED USERS can upload! For access, reach out to me.