Compare commits
4 Commits
61e218e58f
...
5578822c3f
Author | SHA1 | Date | |
---|---|---|---|
5578822c3f | |||
099f4777cd | |||
8d470cbe68 | |||
8ce2789588 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -35,3 +35,4 @@ watcher
|
||||
lts
|
||||
store
|
||||
ALLOWED_USERS.txt
|
||||
ltscleanerd
|
||||
|
@ -1 +1,2 @@
|
||||
./lts
|
||||
./ltscleanerd
|
||||
|
11
Makefile
11
Makefile
@ -1,17 +1,20 @@
|
||||
BUILD_MODE ?= DEBUG
|
||||
|
||||
ifeq ($(BUILD_MODE),DEBUG)
|
||||
LISTEN_PORT = ":9090"
|
||||
LISTEN_ADDR = "localhost:9090"
|
||||
else ifeq ($(BUILD_MODE),RELEASE)
|
||||
LISTEN_PORT = ":80"
|
||||
LISTEN_ADDR = "0.0.0.0:80"
|
||||
else
|
||||
$(error Unknown build mode)
|
||||
endif
|
||||
|
||||
all: lts watcher
|
||||
|
||||
lts: lts.go uuid.go
|
||||
go build -ldflags="-X main.LISTEN_PORT=$(LISTEN_PORT)"
|
||||
lts: ltscleanerd lts.go uuid.go
|
||||
go build -ldflags="-X main.LISTEN_ADDR=$(LISTEN_ADDR)"
|
||||
|
||||
ltscleanerd: ltscleanerd.c
|
||||
cc -o ltscleanerd ltscleanerd.c
|
||||
|
||||
watcher: watcher.c
|
||||
cc -o $@ $<
|
||||
|
85
lts.go
85
lts.go
@ -8,16 +8,21 @@ import (
|
||||
"html/template"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/fsnotify/fsnotify"
|
||||
)
|
||||
|
||||
var LISTEN_PORT string
|
||||
var LISTEN_ADDR string
|
||||
|
||||
var listener net.Listener
|
||||
|
||||
//go:embed tmpls/*
|
||||
var tmpls embed.FS
|
||||
@ -106,18 +111,42 @@ func handleUpload(w http.ResponseWriter, r *http.Request) {
|
||||
limit := int64(10737418240) // 10GiB
|
||||
r.ParseMultipartForm(limit)
|
||||
|
||||
hours_str := r.FormValue("hours")
|
||||
mins_str := r.FormValue("mins")
|
||||
secs_str := r.FormValue("secs")
|
||||
|
||||
hours, err := strconv.ParseInt(hours_str, 10, 32)
|
||||
if err != nil {
|
||||
http.Error(w, "Could not parse timeout hours", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
mins, err := strconv.ParseInt(mins_str, 10, 32)
|
||||
if err != nil {
|
||||
http.Error(w, "Could not parse timeout mins", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
secs, err := strconv.ParseInt(secs_str, 10, 32)
|
||||
if err != nil {
|
||||
http.Error(w, "Could not parse timeout secs", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
if (hours < 0 || hours > 24) || (mins < 0 || mins > 60) || (secs < 0 || secs > 60) {
|
||||
http.Error(w, "Max values: 24 hours, 60 mins, 60 secs, all cannot be < 0", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
total := secs + mins*60 + hours*60*60
|
||||
|
||||
log.Printf("h: %d m: %d s: %d, total: %d\n", hours, mins, secs, total)
|
||||
|
||||
file, handler, err := r.FormFile("myfile")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
log.Println("Error getting file from form: ", err)
|
||||
http.Error(w, "Could not get the file", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
fmt.Fprintf(w, "Uploaded file: %s\n", handler.Filename)
|
||||
fmt.Fprintf(w, "File size: %s\n", byteCountSI(handler.Size))
|
||||
fmt.Fprintf(w, "Link: ")
|
||||
|
||||
dst, err := createFile(storePath, handler.Filename)
|
||||
if err != nil {
|
||||
http.Error(w, "Could not save file", http.StatusInternalServerError)
|
||||
@ -128,13 +157,29 @@ func handleUpload(w http.ResponseWriter, r *http.Request) {
|
||||
if _, err := dst.ReadFrom(file); err != nil {
|
||||
http.Error(w, "Error saving file", http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
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()))
|
||||
|
||||
cmd := exec.Command("./ltscleanerd", dst.Name(), strconv.FormatInt(total, 10))
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
func handleHome(w http.ResponseWriter, r *http.Request) {
|
||||
home_tmpl, _ := tmpls.ReadFile("tmpls/home.html")
|
||||
tmpl := template.Must(template.New("home").Parse(string(home_tmpl)))
|
||||
if err := tmpl.Execute(w, nil); err != nil {
|
||||
log.Println(err)
|
||||
log.Println("Error executing template: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -151,7 +196,7 @@ func handleBrowse(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
storeEntries, err := os.ReadDir(storePath)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
log.Printf("Error reading store path %s %v\n", storePath, err)
|
||||
return
|
||||
}
|
||||
|
||||
@ -176,7 +221,7 @@ func handleBrowse(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if err := tmpl.Execute(w, records); err != nil {
|
||||
log.Println(err)
|
||||
log.Println("Error executing template: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -184,7 +229,7 @@ func reloadAllowedUsers() {
|
||||
log.Println("loading ALLOWED_USERS.txt")
|
||||
allowedUsersTxt, err := ioutil.ReadFile("./ALLOWED_USERS.txt")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
log.Println("Error reading ALLOWED_USERS.txt: ", err)
|
||||
return
|
||||
}
|
||||
scanner := bufio.NewScanner(strings.NewReader(string(allowedUsersTxt)))
|
||||
@ -200,7 +245,7 @@ func reloadAllowedUsers() {
|
||||
func watchAllowedUsers() chan bool {
|
||||
watcher, err := fsnotify.NewWatcher()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Fatal("Error creating new watcher: ", err)
|
||||
}
|
||||
defer watcher.Close()
|
||||
|
||||
@ -220,7 +265,7 @@ func watchAllowedUsers() chan bool {
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
log.Println(err)
|
||||
log.Println("Watcher error: ", err)
|
||||
case <-done:
|
||||
break
|
||||
}
|
||||
@ -229,7 +274,7 @@ func watchAllowedUsers() chan bool {
|
||||
|
||||
err = watcher.Add("./ALLOWED_USERS.txt")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
log.Fatal("Error adding ALLOWED_USERS.txt to watcher: ", err)
|
||||
}
|
||||
|
||||
return done
|
||||
@ -245,8 +290,18 @@ func main() {
|
||||
http.Handle("/etc/", http.FileServerFS(etc))
|
||||
http.Handle("/store/", http.StripPrefix("/store/", http.FileServer(http.Dir(storePath))))
|
||||
|
||||
log.Printf("Listening on %s\n", LISTEN_PORT)
|
||||
http.ListenAndServe(LISTEN_PORT, nil)
|
||||
listener_tcp, err := net.Listen("tcp", LISTEN_ADDR)
|
||||
if err != nil {
|
||||
log.Fatal("Error starting server: ", err)
|
||||
}
|
||||
listener = listener_tcp
|
||||
|
||||
log.Printf("Listening on %s\n", listener.Addr().String())
|
||||
|
||||
err = http.Serve(listener, nil)
|
||||
if err != nil {
|
||||
log.Fatal("Error in serving: ", err)
|
||||
}
|
||||
|
||||
doneWatching<-true
|
||||
}
|
||||
|
75
ltscleanerd.c
Normal file
75
ltscleanerd.c
Normal file
@ -0,0 +1,75 @@
|
||||
//go:build exclude
|
||||
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#define GEBS_NO_PREFIX
|
||||
#define GEBS_IMPLEMENTATION
|
||||
#include "gebs/gebs.h"
|
||||
|
||||
char *prog = nil;
|
||||
char *file_path = nil;
|
||||
|
||||
void timer_handler(int sig, siginfo_t *si, void *uc)
|
||||
{
|
||||
if (file_path != nil) {
|
||||
remove1(file_path);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
void make_timer(char *name, long seconds)
|
||||
{
|
||||
struct sigevent timer_event;
|
||||
struct itimerspec timer_spec;
|
||||
struct sigaction action;
|
||||
int sig_no = SIGRTMIN;
|
||||
|
||||
action.sa_flags = SA_SIGINFO;
|
||||
action.sa_sigaction = &timer_handler;
|
||||
sigemptyset(&action.sa_mask);
|
||||
|
||||
if (sigaction(sig_no, &action, nil) == -1) {
|
||||
LOGE("Could not create timer signal handler\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
timer_event.sigev_notify = SIGEV_SIGNAL;
|
||||
timer_event.sigev_signo = sig_no;
|
||||
timer_event.sigev_value.sival_ptr = name;
|
||||
|
||||
timer_t timer_id;
|
||||
if (timer_create(CLOCK_REALTIME, &timer_event, &timer_id) == -1) {
|
||||
LOGE("Could not create timer\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
memset(&timer_spec, 0, sizeof(timer_spec));
|
||||
timer_spec.it_value.tv_sec = seconds;
|
||||
|
||||
if (timer_settime(timer_id, 0, &timer_spec, nil) == -1) {
|
||||
LOGE("Could not set the timeout\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
prog = SHIFT(&argc, &argv);
|
||||
file_path = SHIFT(&argc, &argv);
|
||||
char *timeout_string = SHIFT(&argc, &argv);
|
||||
|
||||
if (!exists1(file_path)) {
|
||||
LOGI("Path %s does not exist\n", file_path);
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *endp;
|
||||
long timeout = strtol(timeout_string, &endp, 10);
|
||||
|
||||
make_timer("cleaner", timeout);
|
||||
|
||||
pause();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -22,6 +22,9 @@
|
||||
<input type="file" name="myfile" id="myfile" required />
|
||||
<input type="text" name="user" id="user" required />
|
||||
<input type="password" name="pass", id="pass" required />
|
||||
<input type="number" name="hours" id="hours" min="0" max="24" step="1" value="0" required />
|
||||
<input type="number" name="mins" id="mins" min="0" max="60" step="1" value="0" required />
|
||||
<input type="number" name="secs" id="secs" min="0" max="60" step="1" value="0" required />
|
||||
<input type="submit" value="Upload" />
|
||||
</form>
|
||||
</p>
|
||||
@ -44,8 +47,15 @@ upload_form.addEventListener("submit", async function (event) {
|
||||
return;
|
||||
}
|
||||
|
||||
const hours = document.getElementById("hours").value;
|
||||
const mins = document.getElementById("mins").value;
|
||||
const secs = document.getElementById("secs").value;
|
||||
|
||||
const form_data = new FormData();
|
||||
form_data.append("myfile", file);
|
||||
form_data.append("hours", hours);
|
||||
form_data.append("mins", mins);
|
||||
form_data.append("secs", secs);
|
||||
|
||||
const user = document.getElementById("user").value;
|
||||
const pass = document.getElementById("pass").value;
|
||||
|
Reference in New Issue
Block a user