feat: adds support for unix sockets (#729)

License: MIT
Signed-off-by: Henrique Dias <hacdias@gmail.com>
pull/732/head
Henrique Dias 2019-05-17 11:48:06 +01:00 committed by GitHub
parent 34a1bf1380
commit d0f8c141e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 9 deletions

View File

@ -101,6 +101,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port) fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port)
fmt.Fprintf(w, "\tBase URL:\t%s\n", ser.BaseURL) fmt.Fprintf(w, "\tBase URL:\t%s\n", ser.BaseURL)
fmt.Fprintf(w, "\tRoot:\t%s\n", ser.Root) fmt.Fprintf(w, "\tRoot:\t%s\n", ser.Root)
fmt.Fprintf(w, "\tSocket:\t%s\n", ser.Socket)
fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address) fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address)
fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert) fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert)
fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey) fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey)

View File

@ -43,6 +43,7 @@ override the options.`,
ser := &settings.Server{ ser := &settings.Server{
Address: mustGetString(flags, "address"), Address: mustGetString(flags, "address"),
Socket: mustGetString(flags, "socket"),
Root: mustGetString(flags, "root"), Root: mustGetString(flags, "root"),
BaseURL: mustGetString(flags, "baseurl"), BaseURL: mustGetString(flags, "baseurl"),
TLSKey: mustGetString(flags, "key"), TLSKey: mustGetString(flags, "key"),

View File

@ -34,6 +34,8 @@ you want to change. Other options will remain unchanged.`,
ser.BaseURL = mustGetString(flags, flag.Name) ser.BaseURL = mustGetString(flags, flag.Name)
case "root": case "root":
ser.Root = mustGetString(flags, flag.Name) ser.Root = mustGetString(flags, flag.Name)
case "socket":
ser.Socket = mustGetString(flags, flag.Name)
case "cert": case "cert":
ser.TLSCert = mustGetString(flags, flag.Name) ser.TLSCert = mustGetString(flags, flag.Name)
case "key": case "key":

View File

@ -2,13 +2,16 @@ package cmd
import ( import (
"crypto/tls" "crypto/tls"
"errors"
"io/ioutil" "io/ioutil"
"log" "log"
"net" "net"
"net/http" "net/http"
"os" "os"
"os/signal"
"path/filepath" "path/filepath"
"strings" "strings"
"syscall"
"github.com/filebrowser/filebrowser/v2/auth" "github.com/filebrowser/filebrowser/v2/auth"
fbhttp "github.com/filebrowser/filebrowser/v2/http" fbhttp "github.com/filebrowser/filebrowser/v2/http"
@ -50,6 +53,7 @@ func addServerFlags(flags *pflag.FlagSet) {
flags.StringP("cert", "t", "", "tls certificate") flags.StringP("cert", "t", "", "tls certificate")
flags.StringP("key", "k", "", "tls key") flags.StringP("key", "k", "", "tls key")
flags.StringP("root", "r", ".", "root to prepend to relative paths") flags.StringP("root", "r", ".", "root to prepend to relative paths")
flags.String("socket", "", "socket to listen to (cannot be used with address, port, cert nor key flags)")
flags.StringP("baseurl", "b", "", "base url") flags.StringP("baseurl", "b", "", "base url")
} }
@ -109,7 +113,10 @@ user created with the credentials from options "username" and "password".`,
var listener net.Listener var listener net.Listener
if server.TLSKey != "" && server.TLSCert != "" { if server.Socket != "" {
listener, err = net.Listen("unix", server.Socket)
checkErr(err)
} else if server.TLSKey != "" && server.TLSCert != "" {
cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey)
checkErr(err) checkErr(err)
listener, err = tls.Listen("tcp", adr, &tls.Config{Certificates: []tls.Certificate{cer}}) listener, err = tls.Listen("tcp", adr, &tls.Config{Certificates: []tls.Certificate{cer}})
@ -119,9 +126,15 @@ user created with the credentials from options "username" and "password".`,
checkErr(err) checkErr(err)
} }
sigc := make(chan os.Signal, 1)
signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
go cleanupHandler(listener, sigc)
handler, err := fbhttp.NewHandler(d.store, server) handler, err := fbhttp.NewHandler(d.store, server)
checkErr(err) checkErr(err)
defer listener.Close()
log.Println("Listening on", listener.Addr().String()) log.Println("Listening on", listener.Addr().String())
if err := http.Serve(listener, handler); err != nil { if err := http.Serve(listener, handler); err != nil {
log.Fatal(err) log.Fatal(err)
@ -129,6 +142,13 @@ user created with the credentials from options "username" and "password".`,
}, pythonConfig{allowNoDB: true}), }, pythonConfig{allowNoDB: true}),
} }
func cleanupHandler(listener net.Listener, c chan os.Signal) {
sig := <-c
log.Printf("Caught signal %s: shutting down.", sig)
listener.Close()
os.Exit(0)
}
func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server { func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server {
server, err := st.Settings.GetServer() server, err := st.Settings.GetServer()
checkErr(err) checkErr(err)
@ -141,24 +161,45 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server {
server.BaseURL = val server.BaseURL = val
} }
if val, set := getParamB(flags, "address"); set {
server.Address = val
}
if val, set := getParamB(flags, "port"); set {
server.Port = val
}
if val, set := getParamB(flags, "log"); set { if val, set := getParamB(flags, "log"); set {
server.Log = val server.Log = val
} }
isSocketSet := false
isAddrSet := false
if val, set := getParamB(flags, "address"); set {
server.Address = val
isAddrSet = isAddrSet || set
}
if val, set := getParamB(flags, "port"); set {
server.Port = val
isAddrSet = isAddrSet || set
}
if val, set := getParamB(flags, "key"); set { if val, set := getParamB(flags, "key"); set {
server.TLSKey = val server.TLSKey = val
isAddrSet = isAddrSet || set
} }
if val, set := getParamB(flags, "cert"); set { if val, set := getParamB(flags, "cert"); set {
server.TLSCert = val server.TLSCert = val
isAddrSet = isAddrSet || set
}
if val, set := getParamB(flags, "socket"); set {
server.Socket = val
isSocketSet = isSocketSet || set
}
if isAddrSet && isSocketSet {
checkErr(errors.New("--socket flag cannot be used with --adress, --port, --key nor --cert"))
}
// Do not use saved Socket if address was manually set.
if isAddrSet && server.Socket != "" {
server.Socket = ""
} }
return server return server

View File

@ -32,6 +32,7 @@ func (s *Settings) GetRules() []rules.Rule {
type Server struct { type Server struct {
Root string `json:"root"` Root string `json:"root"`
BaseURL string `json:"baseURL"` BaseURL string `json:"baseURL"`
Socket string `json:"socket"`
TLSKey string `json:"tlsKey"` TLSKey string `json:"tlsKey"`
TLSCert string `json:"tlsCert"` TLSCert string `json:"tlsCert"`
Port string `json:"port"` Port string `json:"port"`