Skip to content

Commit 4bd1776

Browse files
adamchalmerssssilver
authored andcommitted
TUN-4359: Warn about unused keys in 'tunnel ingress validate'
1 parent b87cb9a commit 4bd1776

File tree

7 files changed

+50
-23
lines changed

7 files changed

+50
-23
lines changed

cmd/cloudflared/cliutil/handler.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,38 @@ func Action(actionFunc cli.ActionFunc) cli.ActionFunc {
1313
}
1414

1515
func ConfiguredAction(actionFunc cli.ActionFunc) cli.ActionFunc {
16+
// Adapt actionFunc to the type signature required by ConfiguredActionWithWarnings
17+
f := func(context *cli.Context, _ string) error {
18+
return actionFunc(context)
19+
}
20+
21+
return ConfiguredActionWithWarnings(f)
22+
}
23+
24+
// Just like ConfiguredAction, but accepts a second parameter with configuration warnings.
25+
func ConfiguredActionWithWarnings(actionFunc func(*cli.Context, string) error) cli.ActionFunc {
1626
return WithErrorHandler(func(c *cli.Context) error {
17-
if err := setFlagsFromConfigFile(c); err != nil {
27+
warnings, err := setFlagsFromConfigFile(c)
28+
if err != nil {
1829
return err
1930
}
20-
return actionFunc(c)
31+
return actionFunc(c, warnings)
2132
})
2233
}
2334

24-
func setFlagsFromConfigFile(c *cli.Context) error {
35+
func setFlagsFromConfigFile(c *cli.Context) (configWarnings string, err error) {
2536
const errorExitCode = 1
2637
log := logger.CreateLoggerFromContext(c, logger.EnableTerminalLog)
27-
inputSource, err := config.ReadConfigFile(c, log)
38+
inputSource, warnings, err := config.ReadConfigFile(c, log)
2839
if err != nil {
2940
if err == config.ErrNoConfigFile {
30-
return nil
41+
return "", nil
3142
}
32-
return cli.Exit(err, errorExitCode)
43+
return "", cli.Exit(err, errorExitCode)
3344
}
3445

3546
if err := altsrc.ApplyInputSource(c, inputSource); err != nil {
36-
return cli.Exit(err, errorExitCode)
47+
return "", cli.Exit(err, errorExitCode)
3748
}
38-
return nil
49+
return warnings, nil
3950
}

cmd/cloudflared/linux_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func installLinuxService(c *cli.Context) error {
238238
"--origincert", serviceConfigDir + "/" + serviceCredentialFile,
239239
}
240240
} else {
241-
src, err := config.ReadConfigFile(c, log)
241+
src, _, err := config.ReadConfigFile(c, log)
242242
if err != nil {
243243
return err
244244
}

cmd/cloudflared/tunnel/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ func configureProxyFlags(shouldHide bool) []cli.Flag {
699699
Hidden: shouldHide,
700700
}),
701701
altsrc.NewDurationFlag(&cli.DurationFlag{
702-
Name: ingress.ProxyTCPKeepAlive,
702+
Name: ingress.ProxyTCPKeepAliveFlag,
703703
Usage: "HTTP proxy TCP keepalive duration",
704704
Value: time.Second * 30,
705705
Hidden: shouldHide,

cmd/cloudflared/tunnel/ingress_subcommands.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func buildIngressSubcommand() *cli.Command {
4545
func buildValidateIngressCommand() *cli.Command {
4646
return &cli.Command{
4747
Name: "validate",
48-
Action: cliutil.ConfiguredAction(validateIngressCommand),
48+
Action: cliutil.ConfiguredActionWithWarnings(validateIngressCommand),
4949
Usage: "Validate the ingress configuration ",
5050
UsageText: "cloudflared tunnel [--config FILEPATH] ingress validate",
5151
Description: "Validates the configuration file, ensuring your ingress rules are OK.",
@@ -68,7 +68,7 @@ func buildTestURLCommand() *cli.Command {
6868
}
6969

7070
// validateIngressCommand check the syntax of the ingress rules in the cloudflared config file
71-
func validateIngressCommand(c *cli.Context) error {
71+
func validateIngressCommand(c *cli.Context, warnings string) error {
7272
conf := config.GetConfiguration()
7373
if conf.Source() == "" {
7474
fmt.Println("No configuration file was found. Please create one, or use the --config flag to specify its filepath. You can use the help command to learn more about configuration files")
@@ -81,6 +81,11 @@ func validateIngressCommand(c *cli.Context) error {
8181
if c.IsSet("url") {
8282
return ingress.ErrURLIncompatibleWithIngress
8383
}
84+
if warnings != "" {
85+
fmt.Println("Warning: unused keys detected in your config file. Here is a list of unused keys:")
86+
fmt.Println(warnings)
87+
return nil
88+
}
8489
fmt.Println("OK")
8590
return nil
8691
}

config/configuration.go

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -358,13 +358,13 @@ func GetConfiguration() *Configuration {
358358
// ReadConfigFile returns InputSourceContext initialized from the configuration file.
359359
// On repeat calls returns with the same file, returns without reading the file again; however,
360360
// if value of "config" flag changes, will read the new config file
361-
func ReadConfigFile(c *cli.Context, log *zerolog.Logger) (*configFileSettings, error) {
361+
func ReadConfigFile(c *cli.Context, log *zerolog.Logger) (settings *configFileSettings, warnings string, err error) {
362362
configFile := c.String("config")
363363
if configuration.Source() == configFile || configFile == "" {
364364
if configuration.Source() == "" {
365-
return nil, ErrNoConfigFile
365+
return nil, "", ErrNoConfigFile
366366
}
367-
return &configuration, nil
367+
return &configuration, "", nil
368368
}
369369

370370
log.Debug().Msgf("Loading configuration from %s", configFile)
@@ -373,16 +373,27 @@ func ReadConfigFile(c *cli.Context, log *zerolog.Logger) (*configFileSettings, e
373373
if os.IsNotExist(err) {
374374
err = ErrNoConfigFile
375375
}
376-
return nil, err
376+
return nil, "", err
377377
}
378378
defer file.Close()
379379
if err := yaml.NewDecoder(file).Decode(&configuration); err != nil {
380380
if err == io.EOF {
381381
log.Error().Msgf("Configuration file %s was empty", configFile)
382-
return &configuration, nil
382+
return &configuration, "", nil
383383
}
384-
return nil, errors.Wrap(err, "error parsing YAML in config file at "+configFile)
384+
return nil, "", errors.Wrap(err, "error parsing YAML in config file at "+configFile)
385385
}
386386
configuration.sourceFile = configFile
387-
return &configuration, nil
387+
388+
// Parse it again, with strict mode, to find warnings.
389+
if file, err := os.Open(configFile); err == nil {
390+
decoder := yaml.NewDecoder(file)
391+
decoder.SetStrict(true)
392+
var unusedConfig configFileSettings
393+
if err := decoder.Decode(&unusedConfig); err != nil {
394+
warnings = err.Error()
395+
}
396+
}
397+
398+
return &configuration, warnings, nil
388399
}

ingress/ingress_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ func TestSingleOriginSetsConfig(t *testing.T) {
402402
flagSet.Bool("hello-world", true, "")
403403
flagSet.Duration(ProxyConnectTimeoutFlag, time.Second, "")
404404
flagSet.Duration(ProxyTLSTimeoutFlag, time.Second, "")
405-
flagSet.Duration(ProxyTCPKeepAlive, time.Second, "")
405+
flagSet.Duration(ProxyTCPKeepAliveFlag, time.Second, "")
406406
flagSet.Bool(ProxyNoHappyEyeballsFlag, true, "")
407407
flagSet.Int(ProxyKeepAliveConnectionsFlag, 10, "")
408408
flagSet.Duration(ProxyKeepAliveTimeoutFlag, time.Second, "")
@@ -423,7 +423,7 @@ func TestSingleOriginSetsConfig(t *testing.T) {
423423
require.NoError(t, err)
424424
err = cliCtx.Set(ProxyTLSTimeoutFlag, "1s")
425425
require.NoError(t, err)
426-
err = cliCtx.Set(ProxyTCPKeepAlive, "1s")
426+
err = cliCtx.Set(ProxyTCPKeepAliveFlag, "1s")
427427
require.NoError(t, err)
428428
err = cliCtx.Set(ProxyNoHappyEyeballsFlag, "true")
429429
require.NoError(t, err)

ingress/origin_request_config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const (
2222
Socks5Flag = "socks5"
2323
ProxyConnectTimeoutFlag = "proxy-connect-timeout"
2424
ProxyTLSTimeoutFlag = "proxy-tls-timeout"
25-
ProxyTCPKeepAlive = "proxy-tcp-keepalive"
25+
ProxyTCPKeepAliveFlag = "proxy-tcp-keepalive"
2626
ProxyNoHappyEyeballsFlag = "proxy-no-happy-eyeballs"
2727
ProxyKeepAliveConnectionsFlag = "proxy-keepalive-connections"
2828
ProxyKeepAliveTimeoutFlag = "proxy-keepalive-timeout"
@@ -60,7 +60,7 @@ func originRequestFromSingeRule(c *cli.Context) OriginRequestConfig {
6060
if flag := ProxyTLSTimeoutFlag; c.IsSet(flag) {
6161
tlsTimeout = c.Duration(flag)
6262
}
63-
if flag := ProxyTCPKeepAlive; c.IsSet(flag) {
63+
if flag := ProxyTCPKeepAliveFlag; c.IsSet(flag) {
6464
tcpKeepAlive = c.Duration(flag)
6565
}
6666
if flag := ProxyNoHappyEyeballsFlag; c.IsSet(flag) {

0 commit comments

Comments
 (0)