use viper.BindPFlags

This commit is contained in:
1138-4EB 2018-08-11 18:40:45 +01:00
parent 002d9fb9b5
commit c407502fd2
4 changed files with 53 additions and 76 deletions

View File

@ -1,8 +1,7 @@
package cmd package cmd
import ( import (
"fmt" "log"
"os"
"strings" "strings"
homedir "github.com/mitchellh/go-homedir" homedir "github.com/mitchellh/go-homedir"
@ -29,8 +28,7 @@ easily, everywhere, every time.`,
func Execute() { func Execute() {
checkRootAlias() checkRootAlias()
if err := rootCmd.Execute(); err != nil { if err := rootCmd.Execute(); err != nil {
fmt.Println(err) panic(err)
os.Exit(1)
} }
} }
@ -47,8 +45,7 @@ func initConfig() {
// Find home directory. // Find home directory.
home, err := homedir.Dir() home, err := homedir.Dir()
if err != nil { if err != nil {
fmt.Println(err) panic(err)
os.Exit(1)
} }
v.AddConfigPath(".") v.AddConfigPath(".")
v.AddConfigPath(home) v.AddConfigPath(home)
@ -68,6 +65,6 @@ func initConfig() {
panic(err) panic(err)
} }
} else { } else {
fmt.Println("Using config file:", v.ConfigFileUsed()) log.Println("Using config file:", v.ConfigFileUsed())
} }
} }

View File

@ -29,7 +29,6 @@ func init() {
rootCmd.AddCommand(serveCmd) rootCmd.AddCommand(serveCmd)
f := serveCmd.PersistentFlags() f := serveCmd.PersistentFlags()
l := f.Lookup
// Global settings // Global settings
port := 0 port := 0
@ -48,21 +47,13 @@ func init() {
f.String("prefixurl", prefixurl, "Prefix URL") f.String("prefixurl", prefixurl, "Prefix URL")
f.String("staticgen", staticg, "Static Generator you want to enable") f.String("staticgen", staticg, "Static Generator you want to enable")
v.SetDefault("Port", port) v.SetDefault("port", port)
v.SetDefault("Address", addr) v.SetDefault("address", addr)
v.SetDefault("Database", database) v.SetDefault("database", database)
v.SetDefault("Logger", logfile) v.SetDefault("log", logfile)
v.SetDefault("BaseURL", baseurl) v.SetDefault("baseurl", baseurl)
v.SetDefault("PrefixURL", prefixurl) v.SetDefault("prefixurl", prefixurl)
v.SetDefault("StaticGen", staticg) v.SetDefault("staticgen", staticg)
v.BindPFlag("Port", l("port"))
v.BindPFlag("Address", l("address"))
v.BindPFlag("Database", l("database"))
v.BindPFlag("Logger", l("log"))
v.BindPFlag("BaseURL", l("baseurl"))
v.BindPFlag("PrefixURL", l("prefixurl"))
v.BindPFlag("StaticGen", l("staticgen"))
// User default settings // User default settings
var defaults = struct { var defaults = struct {
@ -94,23 +85,14 @@ func init() {
f.Bool("defaults.allowPublish", defaults.allowPublish, "Default allow publish option for new users") f.Bool("defaults.allowPublish", defaults.allowPublish, "Default allow publish option for new users")
f.String("defaults.locale", defaults.locale, "Default locale for new users, set it empty to enable auto detect from browser") f.String("defaults.locale", defaults.locale, "Default locale for new users, set it empty to enable auto detect from browser")
v.SetDefault("Defaults.Scope", defaults.scope) v.SetDefault("defaults.scope", defaults.scope)
v.SetDefault("Defaults.Commands", []string{"git", "svn", "hg"}) v.SetDefault("defaults.commands", []string{"git", "svn", "hg"})
v.SetDefault("Defaults.ViewMode", defaults.viewMode) v.SetDefault("defaults.viewMode", defaults.viewMode)
v.SetDefault("Defaults.AllowCommmands", defaults.allowCommands) v.SetDefault("defaults.allowCommands", defaults.allowCommands)
v.SetDefault("Defaults.AllowEdit", defaults.allowEdit) v.SetDefault("defaults.allowEdit", defaults.allowEdit)
v.SetDefault("Defaults.AllowNew", defaults.allowNew) v.SetDefault("defaults.allowNew", defaults.allowNew)
v.SetDefault("Defaults.AllowPublish", defaults.allowPublish) v.SetDefault("defaults.allowPublish", defaults.allowPublish)
v.SetDefault("Defaults.Locale", defaults.locale) v.SetDefault("defaults.locale", defaults.locale)
v.BindPFlag("Defaults.Scope", l("defaults.scope"))
v.BindPFlag("Defaults.Commands", l("defaults.commands"))
v.BindPFlag("Defaults.ViewMode", l("defaults.viewMode"))
v.BindPFlag("Defaults.AllowCommands", l("defaults.allowCommands"))
v.BindPFlag("Defaults.AllowEdit", l("defaults.allowEdit"))
v.BindPFlag("Defaults.AllowNew", l("defaults.allowNew"))
v.BindPFlag("Defaults.AllowPublish", l("defaults.allowPublish"))
v.BindPFlag("Defaults.Locale", l("defaults.locale"))
// Recaptcha settings // Recaptcha settings
var recaptcha = struct { var recaptcha = struct {
@ -127,13 +109,9 @@ func init() {
f.String("recaptcha.key", recaptcha.key, "ReCaptcha site key") f.String("recaptcha.key", recaptcha.key, "ReCaptcha site key")
f.String("recaptcha.secret", recaptcha.secret, "ReCaptcha secret") f.String("recaptcha.secret", recaptcha.secret, "ReCaptcha secret")
v.SetDefault("Recaptcha.Host", recaptcha.host) v.SetDefault("recaptcha.host", recaptcha.host)
v.SetDefault("Recaptcha.Key", recaptcha.key) v.SetDefault("recaptcha.key", recaptcha.key)
v.SetDefault("Recaptcha.Secret", recaptcha.secret) v.SetDefault("recaptcha.secret", recaptcha.secret)
v.BindPFlag("Recaptcha.Host", l("recaptcha.host"))
v.BindPFlag("Recaptcha.Key", l("recaptcha.key"))
v.BindPFlag("Recaptcha.Secret", l("recaptcha.secret"))
// Auth settings // Auth settings
var auth = struct { var auth = struct {
@ -147,11 +125,13 @@ func init() {
f.String("auth.method", auth.method, "Switch between 'none', 'default' and 'proxy' authentication") f.String("auth.method", auth.method, "Switch between 'none', 'default' and 'proxy' authentication")
f.String("auth.header", auth.header, "The header name used for proxy authentication") f.String("auth.header", auth.header, "The header name used for proxy authentication")
v.SetDefault("Auth.Method", auth.method) v.SetDefault("auth.method", auth.method)
v.SetDefault("Auth.Header", auth.header) v.SetDefault("auth.header", auth.header)
v.BindPFlag("Auth.Method", l("auth.method")) // Bind the full flag set to the configuration
v.BindPFlag("Auth.Header", l("auth.header")) if err := v.BindPFlags(f); err != nil {
panic(err)
}
// Deprecated flags // Deprecated flags
Deprecated(f, "no-auth", false, "Disables authentication", "use --auth.method='none' instead") Deprecated(f, "no-auth", false, "Disables authentication", "use --auth.method='none' instead")

View File

@ -20,7 +20,7 @@ import (
func Serve() { func Serve() {
// Set up process log before anything bad happens. // Set up process log before anything bad happens.
switch l := viper.GetString("Logger"); l { switch l := viper.GetString("log"); l {
case "stdout": case "stdout":
log.SetOutput(os.Stdout) log.SetOutput(os.Stdout)
case "stderr": case "stderr":
@ -44,14 +44,14 @@ func Serve() {
validMethods["default"] = false validMethods["default"] = false
validMethods["proxy"] = true validMethods["proxy"] = true
m := viper.GetString("Auth.Method") m := viper.GetString("auth.method")
b, ok := validMethods[m] b, ok := validMethods[m]
if !ok { if !ok {
log.Fatal("The property 'auth.method' needs to be set to 'none', 'default' or 'proxy'.") log.Fatal("The property 'auth.method' needs to be set to 'none', 'default' or 'proxy'.")
} }
if b { if b {
if viper.GetString("Auth.Header") == "" { if viper.GetString("auth.header") == "" {
log.Fatal("The 'auth.header' needs to be specified when '", m, "' authentication is used.") log.Fatal("The 'auth.header' needs to be specified when '", m, "' authentication is used.")
} }
log.Println("[WARN] Filebrowser authentication is configured to '", m, "' authentication. This can cause a huge security issue if the infrastructure is not configured correctly.") log.Println("[WARN] Filebrowser authentication is configured to '", m, "' authentication. This can cause a huge security issue if the infrastructure is not configured correctly.")
@ -59,7 +59,7 @@ func Serve() {
} }
// Builds the address and a listener. // Builds the address and a listener.
laddr := viper.GetString("Address") + ":" + viper.GetString("Port") laddr := viper.GetString("address") + ":" + viper.GetString("port")
listener, err := net.Listen("tcp", laddr) listener, err := net.Listen("tcp", laddr)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -75,33 +75,33 @@ func Serve() {
} }
func handler() http.Handler { func handler() http.Handler {
db, err := storm.Open(viper.GetString("Database")) db, err := storm.Open(viper.GetString("database"))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
fb := &filebrowser.FileBrowser{ fb := &filebrowser.FileBrowser{
Auth: &filebrowser.Auth{ Auth: &filebrowser.Auth{
Method: viper.GetString("Auth.Method"), Method: viper.GetString("auth.method"),
Header: viper.GetString("Auth.Header"), Header: viper.GetString("auth.header"),
}, },
ReCaptcha: &filebrowser.ReCaptcha{ ReCaptcha: &filebrowser.ReCaptcha{
Host: viper.GetString("Recaptcha.Host"), Host: viper.GetString("recaptcha.host"),
Key: viper.GetString("Recaptcha.Key"), Key: viper.GetString("recaptcha.key"),
Secret: viper.GetString("Recaptcha.Secret"), Secret: viper.GetString("recaptcha.secret"),
}, },
DefaultUser: &filebrowser.User{ DefaultUser: &filebrowser.User{
AllowCommands: viper.GetBool("Defaults.AllowCommands"), AllowCommands: viper.GetBool("defaults.allowCommands"),
AllowEdit: viper.GetBool("Defaults.AllowEdit"), AllowEdit: viper.GetBool("defaults.allowEdit"),
AllowNew: viper.GetBool("Defaults.AllowNew"), AllowNew: viper.GetBool("defaults.allowNew"),
AllowPublish: viper.GetBool("Defaults.AllowPublish"), AllowPublish: viper.GetBool("defaults.allowPublish"),
Commands: viper.GetStringSlice("Defaults.Commands"), Commands: viper.GetStringSlice("defaults.commands"),
Rules: []*filebrowser.Rule{}, Rules: []*filebrowser.Rule{},
Locale: viper.GetString("Defaults.Locale"), Locale: viper.GetString("defaults.locale"),
CSS: "", CSS: "",
Scope: viper.GetString("Defaults.Scope"), Scope: viper.GetString("defaults.scope"),
FileSystem: fileutils.Dir(viper.GetString("Defaults.Scope")), FileSystem: fileutils.Dir(viper.GetString("defaults.scope")),
ViewMode: viper.GetString("Defaults.ViewMode"), ViewMode: viper.GetString("defaults.viewMode"),
}, },
Store: &filebrowser.Store{ Store: &filebrowser.Store{
Config: bolt.ConfigStore{DB: db}, Config: bolt.ConfigStore{DB: db},
@ -113,15 +113,15 @@ func handler() http.Handler {
}, },
} }
fb.SetBaseURL(viper.GetString("BaseURL")) fb.SetBaseURL(viper.GetString("baseurl"))
fb.SetPrefixURL(viper.GetString("PrefixURL")) fb.SetPrefixURL(viper.GetString("prefixurl"))
err = fb.Setup() err = fb.Setup()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
switch viper.GetString("StaticGen") { switch viper.GetString("staticgen") {
case "hugo": case "hugo":
hugo := &staticgen.Hugo{ hugo := &staticgen.Hugo{
Root: viper.GetString("Scope"), Root: viper.GetString("Scope"),

View File

@ -227,7 +227,7 @@ func renderFile(c *fb.Context, w http.ResponseWriter, file string) (int, error)
w.Header().Set("Content-Type", contentType+"; charset=utf-8") w.Header().Set("Content-Type", contentType+"; charset=utf-8")
data := map[string]interface{}{ data := map[string]interface{}{
"BaseURL": c.RootURL(), "baseurl": c.RootURL(),
"NoAuth": c.Auth.Method == "none", "NoAuth": c.Auth.Method == "none",
"Version": fb.Version, "Version": fb.Version,
"CSS": template.CSS(c.CSS), "CSS": template.CSS(c.CSS),
@ -237,7 +237,7 @@ func renderFile(c *fb.Context, w http.ResponseWriter, file string) (int, error)
} }
if c.StaticGen != nil { if c.StaticGen != nil {
data["StaticGen"] = c.StaticGen.Name() data["staticgen"] = c.StaticGen.Name()
} }
err := tpl.Execute(w, data) err := tpl.Execute(w, data)
@ -291,7 +291,7 @@ func sharePage(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, erro
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
err := tpl.Execute(w, map[string]interface{}{ err := tpl.Execute(w, map[string]interface{}{
"BaseURL": c.RootURL(), "baseurl": c.RootURL(),
"File": c.File, "File": c.File,
}) })