mirror of
https://github.com/restic/rest-server.git
synced 2025-10-19 07:33:21 +00:00
81 lines
2 KiB
Go
81 lines
2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime/pprof"
|
|
|
|
"goji.io"
|
|
"goji.io/pat"
|
|
)
|
|
|
|
var (
|
|
path = flag.String("path", "/tmp/restic", "data directory")
|
|
listen = flag.String("listen", ":8000", "listen address")
|
|
tls = flag.Bool("tls", false, "turn on TLS support")
|
|
cpuprofile = flag.String("cpuprofile", "", "write CPU profile to file")
|
|
debug = flag.Bool("debug", false, "output debug messages")
|
|
)
|
|
|
|
func setupMux() *goji.Mux {
|
|
mux := goji.NewMux()
|
|
mux.HandleFunc(pat.Head("/config"), CheckConfig)
|
|
mux.HandleFunc(pat.Get("/config"), GetConfig)
|
|
mux.HandleFunc(pat.Post("/config"), SaveConfig)
|
|
mux.HandleFunc(pat.Get("/:type/"), ListBlobs)
|
|
mux.HandleFunc(pat.Head("/:type/:name"), CheckBlob)
|
|
mux.HandleFunc(pat.Get("/:type/:name"), GetBlob)
|
|
mux.HandleFunc(pat.Post("/:type/:name"), SaveBlob)
|
|
mux.HandleFunc(pat.Delete("/:type/:name"), DeleteBlob)
|
|
|
|
return mux
|
|
}
|
|
|
|
func main() {
|
|
log.SetFlags(0)
|
|
|
|
flag.Parse()
|
|
|
|
if *cpuprofile != "" {
|
|
f, err := os.Create(*cpuprofile)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if err := pprof.StartCPUProfile(f); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("CPU profiling enabled")
|
|
defer pprof.StopCPUProfile()
|
|
}
|
|
|
|
mux := setupMux()
|
|
|
|
var handler http.Handler
|
|
htpasswdFile, err := NewHtpasswdFromFile(filepath.Join(*path, ".htpasswd"))
|
|
if err != nil {
|
|
handler = mux
|
|
log.Println("Authentication disabled")
|
|
} else {
|
|
handler = AuthHandler(htpasswdFile, mux)
|
|
log.Println("Authentication enabled")
|
|
}
|
|
|
|
if !*tls {
|
|
log.Printf("Starting server on %s\n", *listen)
|
|
err = http.ListenAndServe(*listen, handler)
|
|
} else {
|
|
privateKey := filepath.Join(*path, "private_key")
|
|
publicKey := filepath.Join(*path, "public_key")
|
|
log.Println("TLS enabled")
|
|
log.Printf("Private key: %s", privateKey)
|
|
log.Printf("Public key: %s", publicKey)
|
|
log.Printf("Starting server on %s\n", *listen)
|
|
err = http.ListenAndServeTLS(*listen, publicKey, privateKey, handler)
|
|
}
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|