diff --git a/changelog/24790.txt b/changelog/24790.txt new file mode 100644 index 0000000000..14bc913c84 --- /dev/null +++ b/changelog/24790.txt @@ -0,0 +1,6 @@ +```release-note:bug +agent: Fixed incorrect parsing of boolean environment variables for configuration. +``` +```release-note:bug +proxy: Fixed incorrect parsing of boolean environment variables for configuration. +``` \ No newline at end of file diff --git a/command/agent.go b/command/agent.go index 87988efaf3..3c1643856f 100644 --- a/command/agent.go +++ b/command/agent.go @@ -1027,7 +1027,12 @@ func (c *AgentCommand) setBoolFlag(f *FlagSets, configVal bool, fVar *BoolVar) { // Don't do anything as the flag is already set from the command line case flagEnvSet: // Use value from env var - *fVar.Target = flagEnvValue != "" + val, err := parseutil.ParseBool(flagEnvValue) + if err != nil { + c.logger.Error("error parsing bool from environment variable, using default instead", "environment variable", fVar.EnvVar, "provided value", flagEnvValue, "default", fVar.Default, "err", err) + val = fVar.Default + } + *fVar.Target = val case configVal: // Use value from config *fVar.Target = configVal diff --git a/command/agent_test.go b/command/agent_test.go index 8d12f6584d..521070736d 100644 --- a/command/agent_test.go +++ b/command/agent_test.go @@ -2820,6 +2820,36 @@ func TestAgent_LogFile_Config(t *testing.T) { assert.Equal(t, 1048576, cfg.LogRotateBytes) } +// TestAgent_EnvVar_Overrides tests that environment variables are properly +// parsed and override defaults. +func TestAgent_EnvVar_Overrides(t *testing.T) { + configFile := populateTempFile(t, "agent-config.hcl", BasicHclConfig) + + cfg, err := agentConfig.LoadConfigFile(configFile.Name()) + if err != nil { + t.Fatal("Cannot load config to test update/merge", err) + } + + assert.Equal(t, false, cfg.Vault.TLSSkipVerify) + + t.Setenv("VAULT_SKIP_VERIFY", "true") + // Parse the cli flags (but we pass in an empty slice) + cmd := &AgentCommand{BaseCommand: &BaseCommand{}} + f := cmd.Flags() + err = f.Parse([]string{}) + if err != nil { + t.Fatal(err) + } + + cmd.applyConfigOverrides(f, cfg) + assert.Equal(t, true, cfg.Vault.TLSSkipVerify) + + t.Setenv("VAULT_SKIP_VERIFY", "false") + + cmd.applyConfigOverrides(f, cfg) + assert.Equal(t, false, cfg.Vault.TLSSkipVerify) +} + func TestAgent_Config_NewLogger_Default(t *testing.T) { cmd := &AgentCommand{BaseCommand: &BaseCommand{}} cmd.config = agentConfig.NewConfig() diff --git a/command/proxy.go b/command/proxy.go index eba9670348..79138d745b 100644 --- a/command/proxy.go +++ b/command/proxy.go @@ -939,7 +939,12 @@ func (c *ProxyCommand) setBoolFlag(f *FlagSets, configVal bool, fVar *BoolVar) { // Don't do anything as the flag is already set from the command line case flagEnvSet: // Use value from env var - *fVar.Target = flagEnvValue != "" + val, err := parseutil.ParseBool(flagEnvValue) + if err != nil { + c.logger.Error("error parsing bool from environment variable, using default instead", "environment variable", fVar.EnvVar, "provided value", flagEnvValue, "default", fVar.Default, "err", err) + val = fVar.Default + } + *fVar.Target = val case configVal: // Use value from config *fVar.Target = configVal diff --git a/command/proxy_test.go b/command/proxy_test.go index 391bee40a0..4e95becc88 100644 --- a/command/proxy_test.go +++ b/command/proxy_test.go @@ -2184,6 +2184,36 @@ func TestProxy_LogFile_Config(t *testing.T) { assert.Equal(t, 1048576, cfg.LogRotateBytes) } +// TestProxy_EnvVar_Overrides tests that environment variables are properly +// parsed and override defaults. +func TestProxy_EnvVar_Overrides(t *testing.T) { + configFile := populateTempFile(t, "proxy-config.hcl", BasicHclConfig) + + cfg, err := proxyConfig.LoadConfigFile(configFile.Name()) + if err != nil { + t.Fatal("Cannot load config to test update/merge", err) + } + + assert.Equal(t, false, cfg.Vault.TLSSkipVerify) + + t.Setenv("VAULT_SKIP_VERIFY", "true") + // Parse the cli flags (but we pass in an empty slice) + cmd := &ProxyCommand{BaseCommand: &BaseCommand{}} + f := cmd.Flags() + err = f.Parse([]string{}) + if err != nil { + t.Fatal(err) + } + + cmd.applyConfigOverrides(f, cfg) + assert.Equal(t, true, cfg.Vault.TLSSkipVerify) + + t.Setenv("VAULT_SKIP_VERIFY", "false") + + cmd.applyConfigOverrides(f, cfg) + assert.Equal(t, false, cfg.Vault.TLSSkipVerify) +} + // TestProxy_Config_NewLogger_Default Tests defaults for log level and // specifically cmd.newLogger() func TestProxy_Config_NewLogger_Default(t *testing.T) {