diff --git a/CHANGELOG.md b/CHANGELOG.md index c34e6f5..04af630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ - Use new ACL syntax [#618](https://github.com/juanfont/headscale/pull/618) - Add -c option to specify config file from command line [#285](https://github.com/juanfont/headscale/issues/285) [#612](https://github.com/juanfont/headscale/pull/601) - Add configuration option to allow Tailscale clients to use a random WireGuard port. [kb/1181/firewalls](https://tailscale.com/kb/1181/firewalls) [#624](https://github.com/juanfont/headscale/pull/624) +- Improve obtuse UX regarding missing configuration (`ephemeral_node_inactivity_timeout` not set) [#639](https://github.com/juanfont/headscale/pull/639) ## 0.15.0 (2022-03-20) diff --git a/cmd/headscale/cli/utils.go b/cmd/headscale/cli/utils.go index f5c679c..327c8c1 100644 --- a/cmd/headscale/cli/utils.go +++ b/cmd/headscale/cli/utils.go @@ -7,12 +7,10 @@ import ( "fmt" "os" "reflect" - "time" "github.com/juanfont/headscale" v1 "github.com/juanfont/headscale/gen/go/headscale/v1" "github.com/rs/zerolog/log" - "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -29,21 +27,6 @@ func getHeadscaleApp() (*headscale.Headscale, error) { return nil, fmt.Errorf("failed to load configuration while creating headscale instance: %w", err) } - // Minimum inactivity time out is keepalive timeout (60s) plus a few seconds - // to avoid races - minInactivityTimeout, _ := time.ParseDuration("65s") - if viper.GetDuration("ephemeral_node_inactivity_timeout") <= minInactivityTimeout { - // TODO: Find a better way to return this text - //nolint - err := fmt.Errorf( - "ephemeral_node_inactivity_timeout (%s) is set too low, must be more than %s", - viper.GetString("ephemeral_node_inactivity_timeout"), - minInactivityTimeout, - ) - - return nil, err - } - app, err := headscale.NewHeadscale(cfg) if err != nil { return nil, err diff --git a/config.go b/config.go index 917b473..9e71a75 100644 --- a/config.go +++ b/config.go @@ -160,7 +160,11 @@ func LoadConfig(path string, isFile bool) error { viper.SetDefault("logtail.enabled", false) viper.SetDefault("randomize_client_port", false) + viper.SetDefault("ephemeral_node_inactivity_timeout", "120s") + if err := viper.ReadInConfig(); err != nil { + log.Warn().Err(err).Msg("Failed to read configuration from disk") + return fmt.Errorf("fatal error reading config file: %w", err) } @@ -202,6 +206,17 @@ func LoadConfig(path string, isFile bool) error { EnforcedClientAuth) } + // Minimum inactivity time out is keepalive timeout (60s) plus a few seconds + // to avoid races + minInactivityTimeout, _ := time.ParseDuration("65s") + if viper.GetDuration("ephemeral_node_inactivity_timeout") <= minInactivityTimeout { + errorText += fmt.Sprintf( + "Fatal config error: ephemeral_node_inactivity_timeout (%s) is set too low, must be more than %s", + viper.GetString("ephemeral_node_inactivity_timeout"), + minInactivityTimeout, + ) + } + if errorText != "" { //nolint return errors.New(strings.TrimSuffix(errorText, "\n"))