From c16003d47edf182e68b9964ba1f66a4fd77fafbd Mon Sep 17 00:00:00 2001 From: Alex Unger Date: Tue, 17 Mar 2020 17:48:25 +0100 Subject: [PATCH] Load config from Viper on Before hook (#51) * abstract ParseConfig to its own scope * remove hardcoded values * parse config from root if present * update example.json * fix linter * code style --- config/example.json | 3 +- go.sum | 3 +- pkg/command/root.go | 83 +++++++++++++++++++++------------------ pkg/command/server.go | 7 ++-- pkg/server/http/server.go | 1 - 5 files changed, 51 insertions(+), 46 deletions(-) diff --git a/config/example.json b/config/example.json index dbbb398..f1bd1d5 100644 --- a/config/example.json +++ b/config/example.json @@ -7,7 +7,8 @@ }, "http": { "addr": "0.0.0.0:9130", - "root": "/" + "root": "/", + "tls": true }, "tracing": { "enabled": false, diff --git a/go.sum b/go.sum index 3c16820..ab9a35b 100644 --- a/go.sum +++ b/go.sum @@ -356,6 +356,7 @@ github.com/longsleep/go-metrics v0.0.0-20191013204616-cddea569b0ea/go.mod h1:w6Q github.com/lucas-clemente/quic-go v0.12.1/go.mod h1:UXJJPE4RfFef/xPO5wQm0tITK8gNfqwTxjbE7s3Vb8s= github.com/lucas-clemente/quic-go v0.13.1 h1:CxtJTXQIh2aboCPk0M6vf530XOov6DZjVBiSE3nSj8s= github.com/lucas-clemente/quic-go v0.13.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= +github.com/lucas-clemente/quic-go v0.14.1 h1:c1aKoBZKOPA+49q96B1wGkibyPP0AxYh45WuAoq+87E= github.com/lucas-clemente/quic-go v0.14.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -481,8 +482,6 @@ github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukw github.com/orcaman/concurrent-map v0.0.0-20190826125027-8c72a8bb44f6 h1:lNCW6THrCKBiJBpz8kbVGjC7MgdCGKwuvBgc7LoD6sw= github.com/orcaman/concurrent-map v0.0.0-20190826125027-8c72a8bb44f6/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= -github.com/owncloud/ocis-pkg/v2 v2.0.3-0.20200309135548-7e0d3cab3467 h1:7uOmEVi7tiwth1A34F3vk5eaGLDGnJyxgnptpVj8Vbo= -github.com/owncloud/ocis-pkg/v2 v2.0.3-0.20200309135548-7e0d3cab3467/go.mod h1:TrBRa+D8mUTsl+qvQiIksJbUvxdE/Qq9jEHUcERPQ60= github.com/owncloud/ocis-pkg/v2 v2.0.3-0.20200309150924-5c659fd4b0ad h1:R6JGg68GP8bzzl3L5xso8n9ifay5KUfz2XMQ1KS0pbI= github.com/owncloud/ocis-pkg/v2 v2.0.3-0.20200309150924-5c659fd4b0ad/go.mod h1:TrBRa+D8mUTsl+qvQiIksJbUvxdE/Qq9jEHUcERPQ60= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= diff --git a/pkg/command/root.go b/pkg/command/root.go index be8275c..bcc0207 100644 --- a/pkg/command/root.go +++ b/pkg/command/root.go @@ -32,45 +32,7 @@ func Execute() error { Flags: flagset.RootWithConfig(cfg), Before: func(c *cli.Context) error { - logger := NewLogger(cfg) - - viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) - viper.SetEnvPrefix("KONNECTD") - viper.AutomaticEnv() - - if c.IsSet("config-file") { - viper.SetConfigFile(c.String("config-file")) - } else { - viper.SetConfigName("konnectd") - - viper.AddConfigPath("/etc/ocis") - viper.AddConfigPath("$HOME/.ocis") - viper.AddConfigPath("./config") - } - - if err := viper.ReadInConfig(); err != nil { - switch err.(type) { - case viper.ConfigFileNotFoundError: - logger.Info(). - Msg("Continue without config") - case viper.UnsupportedConfigError: - logger.Fatal(). - Err(err). - Msg("Unsupported config type") - default: - logger.Fatal(). - Err(err). - Msg("Failed to read config") - } - } - - if err := viper.Unmarshal(&cfg); err != nil { - logger.Fatal(). - Err(err). - Msg("Failed to parse config") - } - - return nil + return ParseConfig(c, cfg) }, Commands: []*cli.Command{ @@ -101,3 +63,46 @@ func NewLogger(cfg *config.Config) log.Logger { log.Color(cfg.Log.Color), ) } + +// ParseConfig load configuration for every extension +func ParseConfig(c *cli.Context, cfg *config.Config) error { + logger := NewLogger(cfg) + + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + viper.SetEnvPrefix("KONNECTD") + viper.AutomaticEnv() + + if c.IsSet("config-file") { + viper.SetConfigFile(c.String("config-file")) + } else { + viper.SetConfigName("konnectd") + + viper.AddConfigPath("/etc/ocis") + viper.AddConfigPath("$HOME/.ocis") + viper.AddConfigPath("./config") + } + + if err := viper.ReadInConfig(); err != nil { + switch err.(type) { + case viper.ConfigFileNotFoundError: + logger.Info(). + Msg("Continue without config") + case viper.UnsupportedConfigError: + logger.Fatal(). + Err(err). + Msg("Unsupported config type") + default: + logger.Fatal(). + Err(err). + Msg("Failed to read config") + } + } + + if err := viper.Unmarshal(&cfg); err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to parse config") + } + + return nil +} diff --git a/pkg/command/server.go b/pkg/command/server.go index 4660d4b..dcc17cf 100644 --- a/pkg/command/server.go +++ b/pkg/command/server.go @@ -30,6 +30,7 @@ func Server(cfg *config.Config) *cli.Command { Usage: "Start integrated server", Flags: flagset.ServerWithConfig(cfg), Before: func(c *cli.Context) error { + if cfg.HTTP.Root != "/" { cfg.HTTP.Root = strings.TrimSuffix(cfg.HTTP.Root, "/") } @@ -48,7 +49,7 @@ func Server(cfg *config.Config) *cli.Command { cfg.Konnectd.SigningPrivateKeyFiles = c.StringSlice("signing-private-key") } - return nil + return ParseConfig(c, cfg) }, Action: func(c *cli.Context) error { logger := NewLogger(cfg) @@ -155,8 +156,8 @@ func Server(cfg *config.Config) *cli.Command { http.Context(ctx), http.Config(cfg), http.Metrics(metrics), - http.Flags(flagset.RootWithConfig(cfg)), - http.Flags(flagset.ServerWithConfig(cfg)), + http.Flags(flagset.RootWithConfig(config.New())), + http.Flags(flagset.ServerWithConfig(config.New())), ) if err != nil { diff --git a/pkg/server/http/server.go b/pkg/server/http/server.go index a781bc3..f1e3285 100644 --- a/pkg/server/http/server.go +++ b/pkg/server/http/server.go @@ -53,7 +53,6 @@ func Server(opts ...Option) (http.Service, error) { http.TLSConfig(tlsConfig), ) - options.Config.Konnectd.Listen = options.Config.HTTP.Addr handle := svc.NewService( svc.Logger(options.Logger), svc.Config(options.Config),