diff --git a/cmd/XDC/main.go b/cmd/XDC/main.go index db3e4e68f6..d57040b8cc 100644 --- a/cmd/XDC/main.go +++ b/cmd/XDC/main.go @@ -201,6 +201,7 @@ func init() { if err := debug.Setup(ctx); err != nil { return err } + flags.CheckEnvVars(ctx, app.Flags, "XDC") // Start system runtime metrics collection go metrics.CollectProcessMetrics(3 * time.Second) diff --git a/internal/flags/helpers.go b/internal/flags/helpers.go index eb9844272e..a35b9f609f 100644 --- a/internal/flags/helpers.go +++ b/internal/flags/helpers.go @@ -20,8 +20,10 @@ import ( "fmt" "os" "regexp" + "sort" "strings" + "github.com/XinFinOrg/XDPoSChain/log" "github.com/XinFinOrg/XDPoSChain/params" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" @@ -252,3 +254,37 @@ func AutoEnvVars(flags []cli.Flag, prefix string) { } } } + +// CheckEnvVars iterates over all the environment variables and checks if any of +// them look like a CLI flag but is not consumed. This can be used to detect old +// or mistyped names. +func CheckEnvVars(ctx *cli.Context, flags []cli.Flag, prefix string) { + known := make(map[string]string) + for _, flag := range flags { + docflag, ok := flag.(cli.DocGenerationFlag) + if !ok { + continue + } + for _, envvar := range docflag.GetEnvVars() { + known[envvar] = flag.Names()[0] + } + } + keyvals := os.Environ() + sort.Strings(keyvals) + + for _, keyval := range keyvals { + key := strings.Split(keyval, "=")[0] + if !strings.HasPrefix(key, prefix) { + continue + } + if flag, ok := known[key]; ok { + if ctx.Count(flag) > 0 { + log.Info("Config environment variable found", "envvar", key, "shadowedby", "--"+flag) + } else { + log.Info("Config environment variable found", "envvar", key) + } + } else { + log.Warn("Unknown config environment variable", "envvar", key) + } + } +}