From affe252f73d0f70f023c7e640e2f9fdaa9adea19 Mon Sep 17 00:00:00 2001 From: Luke Granger-Brown Date: Tue, 23 Mar 2021 01:21:39 +0000 Subject: [PATCH] fup: fix config file handling Whoops! Before, config files were being read but all the contents were basically being discarded. Now, we both load and actually use the config file, leading to a much more positive experience for everyone involved :) --- web/fup/cmd/root.go | 8 +++-- web/fup/cmd/serve.go | 69 ++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/web/fup/cmd/root.go b/web/fup/cmd/root.go index fb42df7654..91c6994a55 100644 --- a/web/fup/cmd/root.go +++ b/web/fup/cmd/root.go @@ -12,8 +12,7 @@ import ( ) var ( - cfgFile string - bucketURL string + cfgFile string rootCmd = &cobra.Command{ Use: "fup", @@ -22,6 +21,8 @@ var ( } ) +func bucketURL() string { return viper.GetString("storage.bucketURL") } + func Execute() error { return rootCmd.Execute() } @@ -30,8 +31,9 @@ func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file") - rootCmd.PersistentFlags().StringVar(&bucketURL, "bucket-url", "mem://", "gocloud.dev-compatible URL to use for file storage") + rootCmd.PersistentFlags().String("bucket-url", "mem://", "gocloud.dev-compatible URL to use for file storage") viper.BindPFlag("storage.bucketURL", rootCmd.PersistentFlags().Lookup("bucket-url")) + viper.SetDefault("storage.bucketURL", "mem://") } func initConfig() { diff --git a/web/fup/cmd/serve.go b/web/fup/cmd/serve.go index 21d9d69a6e..04ef82c923 100644 --- a/web/fup/cmd/serve.go +++ b/web/fup/cmd/serve.go @@ -24,45 +24,46 @@ import ( func init() { rootCmd.AddCommand(serveCmd) - serveCmd.Flags().StringVar(&serveRoot, "root", "http://localhost:8191/", "Application root address.") + serveCmd.Flags().String("root", "http://localhost:8191/", "Application root address.") viper.BindPFlag("serve.app-root", serveCmd.Flags().Lookup("root")) - serveCmd.Flags().StringVar(&serveStaticRoot, "static-root", "/static/", "Root address from which static assets should be referenced.") - viper.BindPFlag("serve.static-root", serveCmd.Flags().Lookup("static-root")) - serveCmd.Flags().StringVarP(&serveBind, "listen", "l", ":8191", "Bind address for HTTP server.") - viper.BindPFlag("serve.listen", serveCmd.Flags().Lookup("listen")) - serveCmd.Flags().BoolVar(&serveDirectOnly, "direct-only", false, "If set, all file serving will be proxied, even if the backend supports signed URLs.") - viper.BindPFlag("serve.direct-only", serveCmd.Flags().Lookup("direct-only")) + viper.SetDefault("serve.app-root", "http://localhost:8191/") - serveCmd.Flags().StringVar(&serveCheddarPath, "cheddar-path", "cheddar", "Path to 'cheddar' binary to use for syntax highlighting. If it cannot be found, syntax highlighting and markdown rendering will be disabled.") + serveCmd.Flags().String("static-root", "/static/", "Root address from which static assets should be referenced.") + viper.BindPFlag("serve.static-root", serveCmd.Flags().Lookup("static-root")) + viper.SetDefault("serve.static-root", "/static/") + + serveCmd.Flags().StringP("listen", "l", ":8191", "Bind address for HTTP server.") + viper.BindPFlag("serve.listen", serveCmd.Flags().Lookup("listen")) + viper.SetDefault("serve.listen", ":8191") + + serveCmd.Flags().Bool("direct-only", false, "If set, all file serving will be proxied, even if the backend supports signed URLs.") + viper.BindPFlag("serve.direct-only", serveCmd.Flags().Lookup("direct-only")) + viper.SetDefault("serve.direct-only", false) + + serveCmd.Flags().String("cheddar-path", "cheddar", "Path to 'cheddar' binary to use for syntax highlighting. If it cannot be found, syntax highlighting and markdown rendering will be disabled.") viper.BindPFlag("serve.cheddar.path", serveCmd.Flags().Lookup("cheddar-path")) - serveCmd.Flags().StringVar(&serveCheddarAddr, "cheddar-address", "", "If non-empty, will be used instead of attempting to spawn a copy of cheddar.") + viper.SetDefault("serve.cheddar.path", "cheddar") + + serveCmd.Flags().String("cheddar-address", "", "If non-empty, will be used instead of attempting to spawn a copy of cheddar.") viper.BindPFlag("serve.cheddar.address", serveCmd.Flags().Lookup("cheddar-address")) - serveCmd.Flags().StringVar(&serveAuthToken, "auth-token", "", "If non-empty, this auth token will be required as the Basic Auth password.") + serveCmd.Flags().String("auth-token", "", "If non-empty, this auth token will be required as the Basic Auth password.") viper.BindPFlag("serve.auth.token", serveCmd.Flags().Lookup("auth-token")) - serveCmd.Flags().StringVar(&serveAuthRealm, "auth-realm", "fup", "Will be used as the realm for Basic Auth.") + serveCmd.Flags().String("auth-realm", "fup", "Will be used as the realm for Basic Auth.") viper.BindPFlag("serve.auth.realm", serveCmd.Flags().Lookup("auth-realm")) + viper.SetDefault("serve.auth.realm", "fup") } var ( - serveBind string - serveRoot string - serveStaticRoot string - serveDirectOnly bool - serveCheddarPath string - serveCheddarAddr string - serveAuthToken string - serveAuthRealm string - serveCmd = &cobra.Command{ Use: "serve", Short: "Serve HTTP", RunE: func(cmd *cobra.Command, args []string) error { - if !strings.HasSuffix(serveRoot, "/") { - return fmt.Errorf("--root flag should end in / (value is %q)", serveRoot) + if !strings.HasSuffix(viper.GetString("serve.app-root"), "/") { + return fmt.Errorf("--root flag (serve.app-root) should end in / (value is %q)", viper.GetString("serve.app-root")) } - if !strings.HasSuffix(serveStaticRoot, "/") { - return fmt.Errorf("--static-root flag should end in / (value is %q)", serveStaticRoot) + if !strings.HasSuffix(viper.GetString("serve.static-root"), "/") { + return fmt.Errorf("--static-root flag (serve.static-root) should end in / (value is %q)", viper.GetString("serve.static-root")) } ctx := context.Background() @@ -75,11 +76,11 @@ var ( Templates: fupstatic.Templates, Static: fupstatic.Static, StaticRoot: safehtml.TrustedResourceURLFromFlag(cmd.Flag("static-root").Value), - AppRoot: serveRoot, - StorageURL: bucketURL, - RedirectToBlobstore: !serveDirectOnly, + AppRoot: viper.GetString("serve.app-root"), + StorageURL: bucketURL(), + RedirectToBlobstore: !viper.GetBool("serve.direct-only"), Highlighter: highlighter, - AuthMiddleware: fuphttp.TokenAuthMiddleware(serveAuthToken, serveAuthRealm), + AuthMiddleware: fuphttp.TokenAuthMiddleware(viper.GetString("serve.auth.token"), viper.GetString("serve.auth.realm")), } a, err := fuphttp.New(ctx, cfg) if err != nil { @@ -87,8 +88,8 @@ var ( } http.Handle("/", a.Handler()) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(fupstatic.Static)))) - log.Printf("Serving on %s", serveBind) - if serveBind == "systemd" { + log.Printf("Serving on %s", viper.GetString("serve.listen")) + if viper.GetString("serve.listen") == "systemd" { listeners, err := activation.Listeners() if err != nil { return fmt.Errorf("getting systemd socket-activated listeners: %v", err) @@ -98,19 +99,19 @@ var ( } return http.Serve(listeners[0], nil) } - return http.ListenAndServe(serveBind, nil) + return http.ListenAndServe(viper.GetString("serve.listen"), nil) }, } ) func serveCheddar(ctx context.Context) (*minicheddar.Cheddar, error) { - if serveCheddarAddr != "" { + if serveCheddarAddr := viper.GetString("serve.cheddar.addr"); serveCheddarAddr != "" { return minicheddar.Remote(serveCheddarAddr), nil } - cpath, err := exec.LookPath(serveCheddarPath) + cpath, err := exec.LookPath(viper.GetString("serve.cheddar.path")) if err != nil { - log.Printf("couldn't find cheddar at %q; disabling syntax highlighting", serveCheddarPath) + log.Printf("couldn't find cheddar at %q; disabling syntax highlighting", viper.GetString("serve.cheddar.path")) return nil, nil }