From 0fcd92fcce9fb9f1b1e40e171623f56187e392f2 Mon Sep 17 00:00:00 2001 From: Juan Font Alonso Date: Sat, 5 Jun 2021 11:13:28 +0200 Subject: [PATCH] Minor fix to help testing --- cmd/headscale/cli/utils.go | 45 +++++++++++++++++++++++++++++++ cmd/headscale/headscale.go | 48 +-------------------------------- cmd/headscale/headscale_test.go | 9 ++++--- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/cmd/headscale/cli/utils.go b/cmd/headscale/cli/utils.go index 6da5e9c0..52a9368e 100644 --- a/cmd/headscale/cli/utils.go +++ b/cmd/headscale/cli/utils.go @@ -2,6 +2,7 @@ package cli import ( "encoding/json" + "errors" "fmt" "io" "log" @@ -20,6 +21,50 @@ type ErrorOutput struct { Error string } +func LoadConfig(path string) error { + viper.SetConfigName("config") + if path == "" { + viper.AddConfigPath("/etc/headscale/") + viper.AddConfigPath("$HOME/.headscale") + viper.AddConfigPath(".") + } else { + // For testing + viper.AddConfigPath(path) + } + viper.AutomaticEnv() + + viper.SetDefault("tls_letsencrypt_cache_dir", "/var/www/.cache") + viper.SetDefault("tls_letsencrypt_challenge_type", "HTTP-01") + + err := viper.ReadInConfig() + if err != nil { + return fmt.Errorf("Fatal error reading config file: %s \n", err) + } + + // Collect any validation errors and return them all at once + var errorText string + if (viper.GetString("tls_letsencrypt_hostname") != "") && ((viper.GetString("tls_cert_path") != "") || (viper.GetString("tls_key_path") != "")) { + errorText += "Fatal config error: set either tls_letsencrypt_hostname or tls_cert_path/tls_key_path, not both\n" + } + + if (viper.GetString("tls_letsencrypt_hostname") != "") && (viper.GetString("tls_letsencrypt_challenge_type") == "TLS-ALPN-01") && (!strings.HasSuffix(viper.GetString("listen_addr"), ":443")) { + errorText += "Fatal config error: when using tls_letsencrypt_hostname with TLS-ALPN-01 as challenge type, listen_addr must end in :443\n" + } + + if (viper.GetString("tls_letsencrypt_challenge_type") != "HTTP-01") && (viper.GetString("tls_letsencrypt_challenge_type") != "TLS-ALPN-01") { + errorText += "Fatal config error: the only supported values for tls_letsencrypt_challenge_type are HTTP-01 and TLS-ALPN-01\n" + } + + if !strings.HasPrefix(viper.GetString("server_url"), "http://") && !strings.HasPrefix(viper.GetString("server_url"), "https://") { + errorText += "Fatal config error: server_url must start with https:// or http://\n" + } + if errorText != "" { + return errors.New(strings.TrimSuffix(errorText, "\n")) + } else { + return nil + } +} + func absPath(path string) string { // If a relative path is provided, prefix it with the the directory where // the config file was found. diff --git a/cmd/headscale/headscale.go b/cmd/headscale/headscale.go index 8dec1c89..f16ac7e7 100644 --- a/cmd/headscale/headscale.go +++ b/cmd/headscale/headscale.go @@ -1,7 +1,6 @@ package main import ( - "errors" "fmt" "log" "os" @@ -9,7 +8,6 @@ import ( "github.com/juanfont/headscale/cmd/headscale/cli" "github.com/spf13/cobra" - "github.com/spf13/viper" ) var version = "dev" @@ -38,52 +36,8 @@ Juan Font Alonso - 2021 https://gitlab.com/juanfont/headscale`, } -func loadConfig(path string) error { - viper.SetConfigName("config") - if path == "" { - viper.AddConfigPath("/etc/headscale/") - viper.AddConfigPath("$HOME/.headscale") - viper.AddConfigPath(".") - } else { - // For testing - viper.AddConfigPath(path) - } - viper.AutomaticEnv() - - viper.SetDefault("tls_letsencrypt_cache_dir", "/var/www/.cache") - viper.SetDefault("tls_letsencrypt_challenge_type", "HTTP-01") - - err := viper.ReadInConfig() - if err != nil { - return fmt.Errorf("Fatal error reading config file: %s \n", err) - } - - // Collect any validation errors and return them all at once - var errorText string - if (viper.GetString("tls_letsencrypt_hostname") != "") && ((viper.GetString("tls_cert_path") != "") || (viper.GetString("tls_key_path") != "")) { - errorText += "Fatal config error: set either tls_letsencrypt_hostname or tls_cert_path/tls_key_path, not both\n" - } - - if (viper.GetString("tls_letsencrypt_hostname") != "") && (viper.GetString("tls_letsencrypt_challenge_type") == "TLS-ALPN-01") && (!strings.HasSuffix(viper.GetString("listen_addr"), ":443")) { - errorText += "Fatal config error: when using tls_letsencrypt_hostname with TLS-ALPN-01 as challenge type, listen_addr must end in :443\n" - } - - if (viper.GetString("tls_letsencrypt_challenge_type") != "HTTP-01") && (viper.GetString("tls_letsencrypt_challenge_type") != "TLS-ALPN-01") { - errorText += "Fatal config error: the only supported values for tls_letsencrypt_challenge_type are HTTP-01 and TLS-ALPN-01\n" - } - - if !strings.HasPrefix(viper.GetString("server_url"), "http://") && !strings.HasPrefix(viper.GetString("server_url"), "https://") { - errorText += "Fatal config error: server_url must start with https:// or http://\n" - } - if errorText != "" { - return errors.New(strings.TrimSuffix(errorText, "\n")) - } else { - return nil - } -} - func main() { - err := loadConfig("") + err := cli.LoadConfig("") if err != nil { log.Fatalf(err.Error()) } diff --git a/cmd/headscale/headscale_test.go b/cmd/headscale/headscale_test.go index ed142cd6..838852c2 100644 --- a/cmd/headscale/headscale_test.go +++ b/cmd/headscale/headscale_test.go @@ -8,6 +8,7 @@ import ( "strings" "testing" + "github.com/juanfont/headscale/cmd/headscale/cli" "github.com/spf13/viper" "gopkg.in/check.v1" ) @@ -46,7 +47,7 @@ func (*Suite) TestPostgresConfigLoading(c *check.C) { } // Load example config, it should load without validation errors - err = loadConfig(tmpDir) + err = cli.LoadConfig(tmpDir) c.Assert(err, check.IsNil) // Test that config file was interpreted correctly @@ -78,7 +79,7 @@ func (*Suite) TestSqliteConfigLoading(c *check.C) { } // Load example config, it should load without validation errors - err = loadConfig(tmpDir) + err = cli.LoadConfig(tmpDir) c.Assert(err, check.IsNil) // Test that config file was interpreted correctly @@ -112,7 +113,7 @@ func (*Suite) TestTLSConfigValidation(c *check.C) { writeConfig(c, tmpDir, configYaml) // Check configuration validation errors (1) - err = loadConfig(tmpDir) + err = cli.LoadConfig(tmpDir) c.Assert(err, check.NotNil) // check.Matches can not handle multiline strings tmp := strings.ReplaceAll(err.Error(), "\n", "***") @@ -124,7 +125,7 @@ func (*Suite) TestTLSConfigValidation(c *check.C) { // Check configuration validation errors (2) configYaml = []byte("---\nserver_url: \"http://127.0.0.1:8000\"\ntls_letsencrypt_hostname: \"example.com\"\ntls_letsencrypt_challenge_type: \"TLS-ALPN-01\"") writeConfig(c, tmpDir, configYaml) - err = loadConfig(tmpDir) + err = cli.LoadConfig(tmpDir) c.Assert(err, check.NotNil) c.Assert(err, check.ErrorMatches, "Fatal config error: when using tls_letsencrypt_hostname with TLS-ALPN-01 as challenge type, listen_addr must end in :443.*") }