1
0
Fork 0

Compare commits

...

5 Commits

3 changed files with 55 additions and 55 deletions

View File

@ -10,10 +10,10 @@ import (
)
var (
uploadDir *string = flag.String("dir", "/srv/upload", "path to a directory where uploaded files are stored")
expiry *time.Duration = flag.Duration("expiry", 36*time.Hour, "keep files for this much hours")
uploadDir = flag.String("dir", "/srv/upload", "path to a directory where uploaded files are stored")
expiry = flag.Duration("expiry", 36*time.Hour, "keep files for this much hours")
showVersion *bool = flag.Bool("v", false, "show version")
showVersion = flag.Bool("v", false, "show version")
)
var version string

View File

@ -1,30 +1,28 @@
package main
import (
"dwelling-upload/internal/http"
duihttp "dwelling-upload/internal/http"
"dwelling-upload/pkg/utils"
"dwelling-upload/pkg/watcher"
"dwelling-upload/web"
"flag"
"fmt"
"log"
nethttp "net/http"
"net/netip"
"net/http"
"os"
"os/signal"
"path"
"strings"
"syscall"
"git.arav.su/Arav/httpr"
)
var (
listenAddress *string = flag.String("listen", "/var/run/dwelling-upload/sock", "listen address (ip:port|unix_path)")
uploadDir *string = flag.String("dir", "/srv/upload", "directory where uploaded files are stored")
expiry *int = flag.Int("expiry", 36, "keep files for this much hours")
storageSize *int64 = flag.Int64("storage", 102400, "storage size in MiB for uploads")
fileSize *int64 = flag.Int64("file", 128, "max. size in MiB for files")
listenAddress = flag.String("listen", "/var/run/dwelling-upload/sock", "listen address (ip:port|unix_path)")
uploadDir = flag.String("dir", "/srv/upload", "directory where uploaded files are stored")
expiry = flag.Int("expiry", 36, "keep files for this much hours")
storageSize = flag.Int64("storage", 102400, "storage size in MiB for uploads")
fileSize = flag.Int64("file", 128, "max. size in MiB for files")
showVersion *bool = flag.Bool("v", false, "show version")
)
@ -40,36 +38,6 @@ func main() {
return
}
var network string
if !strings.ContainsRune(*listenAddress, ':') {
network = "unix"
defer os.Remove(*listenAddress)
} else {
ap, err := netip.ParseAddrPort(*listenAddress)
if err != nil {
log.Fatalln(err)
}
if ap.Addr().Is4() {
network = "tcp4"
} else {
network = "tcp6"
}
}
watcha, err := watcher.NewInotifyWatcher()
if err != nil {
log.Fatalln(err)
}
defer watcha.Close()
if err := watcha.AddWatch(*uploadDir, watcher.CrDelMask); err != nil {
log.Fatalln(err)
}
uploadDirNotify := make(chan uint32)
go watcha.WatchForMask(uploadDirNotify, watcher.CrDelMask)
hashSalt, err := os.ReadFile(path.Join(os.Getenv("CREDENTIALS_DIRECTORY"), "salt"))
if err != nil {
log.Fatalln("failed to read hash salt file:", err)
@ -90,39 +58,52 @@ func main() {
log.Fatalf("failed to get initial size of %s: %s", *uploadDir, err)
}
hand := http.NewUploadHandlers(logFile, *uploadDir, &uploadDirSize, string(hashSalt),
hand := duihttp.NewUploadHandlers(logFile, *uploadDir, &uploadDirSize, string(hashSalt),
*expiry, *storageSize, *fileSize)
r := httpr.New()
r.NotFoundHandler = func(w nethttp.ResponseWriter, r *nethttp.Request) {
http.Error(w, r, nethttp.StatusNotFound, "")
r.NotFoundHandler = func(w http.ResponseWriter, r *http.Request) {
duihttp.Error(w, r, http.StatusNotFound, "")
}
r.Handler(nethttp.MethodGet, "/", hand.Index)
r.Handler(nethttp.MethodPost, "/", hand.Upload)
r.Handler(nethttp.MethodGet, "/:hash/:name", hand.Download)
r.Handler(nethttp.MethodPost, "/delete", hand.Delete)
r.Handler(nethttp.MethodDelete, "/:hash", hand.Delete)
r.Handler(http.MethodGet, "/", hand.Index)
r.Handler(http.MethodPost, "/", hand.Upload)
r.Handler(http.MethodGet, "/:hash/:name", hand.Download)
r.Handler(http.MethodPost, "/delete", hand.Delete)
r.Handler(http.MethodDelete, "/:hash", hand.Delete)
r.ServeStatic("/assets/*filepath", web.Assets())
r.Handler(nethttp.MethodGet, "/robots.txt", http.RobotsTxt)
r.Handler(nethttp.MethodGet, "/favicon.svg", http.Favicon)
r.Handler(http.MethodGet, "/robots.txt", duihttp.RobotsTxt)
r.Handler(http.MethodGet, "/favicon.svg", duihttp.Favicon)
srv := http.NewHttpServer(r)
srv := duihttp.NewHttpServer(r)
defer func() {
if err := srv.Stop(); err != nil {
log.Fatalln("failed to properly shutdown a server:", err)
}
}()
if err := srv.Start(network, *listenAddress); err != nil {
if err := srv.Start(*listenAddress); err != nil {
log.Fatalln("failed to start a server:", err)
}
doneSignal := make(chan os.Signal, 1)
signal.Notify(doneSignal, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
watcha, err := watcher.NewInotifyWatcher()
if err != nil {
log.Fatalln(err)
}
defer watcha.Close()
if err := watcha.AddWatch(*uploadDir, watcher.CrDelMask); err != nil {
log.Fatalln(err)
}
uploadDirNotify := make(chan uint32)
go watcha.WatchForMask(uploadDirNotify, watcher.CrDelMask)
go func() {
for {
select {

View File

@ -5,7 +5,9 @@ import (
"log"
"net"
"net/http"
"net/netip"
"os"
"strings"
"time"
)
@ -20,7 +22,24 @@ func NewHttpServer(r http.Handler) *HttpServer {
Handler: r}}
}
func (s *HttpServer) Start(network, address string) error {
func (s *HttpServer) Start(address string) error {
var network string
if !strings.ContainsRune(address, ':') {
network = "unix"
defer os.Remove(address)
} else {
ap, err := netip.ParseAddrPort(address)
if err != nil {
log.Fatalln(err)
}
if ap.Addr().Is4() {
network = "tcp4"
} else if ap.Addr().Is6() {
network = "tcp6"
}
}
listener, err := net.Listen(network, address)
if err != nil {
return err