
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja> git-svn-id: file:///srv/svn/repo/marisa/trunk@67 d6811dac-2434-b64a-9ddc-f563ab233461
142 lines
2.7 KiB
Go
142 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"net/http/fcgi"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"marisa.chaotic.ninja/marisa"
|
|
)
|
|
|
|
type templatedata struct {
|
|
Links []string
|
|
Size string
|
|
Maxsize string
|
|
}
|
|
|
|
type metadata struct {
|
|
Filename string
|
|
Size int64
|
|
Expiry int64
|
|
}
|
|
|
|
var conf struct {
|
|
user string
|
|
group string
|
|
chroot string
|
|
listen string
|
|
baseuri string
|
|
rootdir string
|
|
tmplpath string
|
|
filepath string
|
|
metapath string
|
|
filectx string
|
|
maxsize int64
|
|
expiry int64
|
|
}
|
|
|
|
var verbose bool
|
|
|
|
func main() {
|
|
var err error
|
|
var configfile string
|
|
var listener net.Listener
|
|
|
|
/* default values */
|
|
conf.listen = "127.0.0.1:8080"
|
|
conf.baseuri = "http://127.0.0.1:8080"
|
|
conf.rootdir = "static"
|
|
conf.tmplpath = "templates"
|
|
conf.filepath = "files"
|
|
conf.metapath = "meta"
|
|
conf.filectx = "/f/"
|
|
conf.maxsize = 34359738368
|
|
conf.expiry = 86400
|
|
|
|
flag.StringVar(&configfile, "f", "", "Configuration file")
|
|
flag.BoolVar(&verbose, "v", false, "Verbose logging")
|
|
flag.Parse()
|
|
|
|
if configfile != "" {
|
|
if verbose {
|
|
log.Printf("Reading configuration %s", configfile)
|
|
}
|
|
parseconfig(configfile)
|
|
}
|
|
|
|
if conf.chroot != "" {
|
|
if verbose {
|
|
log.Printf("Changing root to %s", conf.chroot)
|
|
}
|
|
syscall.Chroot(conf.chroot)
|
|
}
|
|
|
|
if conf.listen[0] == '/' {
|
|
/* Remove any stale socket */
|
|
os.Remove(conf.listen)
|
|
if listener, err = net.Listen("unix", conf.listen); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
|
|
/*
|
|
* Ensure unix socket is removed on exit.
|
|
* Note: this might not work when dropping privileges…
|
|
*/
|
|
defer os.Remove(conf.listen)
|
|
sigs := make(chan os.Signal, 1)
|
|
signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGTERM)
|
|
go func() {
|
|
_ = <-sigs
|
|
listener.Close()
|
|
if err = os.Remove(conf.listen); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
os.Exit(0)
|
|
}()
|
|
} else {
|
|
if listener, err = net.Listen("tcp", conf.listen); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer listener.Close()
|
|
}
|
|
|
|
if conf.user != "" {
|
|
if verbose {
|
|
log.Printf("Dropping privileges to %s", conf.user)
|
|
}
|
|
uid, gid, err := usergroupids(conf.user, conf.group)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if listener.Addr().Network() == "unix" {
|
|
os.Chown(conf.listen, uid, gid)
|
|
}
|
|
|
|
syscall.Setuid(uid)
|
|
syscall.Setgid(gid)
|
|
}
|
|
|
|
http.HandleFunc("/", uploader)
|
|
http.Handle(conf.filectx, http.StripPrefix(conf.filectx, http.FileServer(http.Dir(conf.filepath))))
|
|
|
|
if verbose {
|
|
log.Printf("Starting marisa %v\n", marisa.FullVersion())
|
|
log.Printf("Listening on %s", conf.listen)
|
|
}
|
|
|
|
if listener.Addr().Network() == "unix" {
|
|
err = fcgi.Serve(listener, nil)
|
|
log.Fatal(err) /* NOTREACHED */
|
|
}
|
|
|
|
err = http.Serve(listener, nil)
|
|
log.Fatal(err) /* NOTREACHED */
|
|
}
|