From 607bef271a885c851381aa6ed620154114d7b4a0 Mon Sep 17 00:00:00 2001 From: Pistasj Date: Sun, 2 Jul 2023 22:24:17 +0200 Subject: [PATCH 1/5] Require config for caddy validate - fixes #5612 Signed-off-by: Pistasj --- cmd/commandfuncs.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go index 77a4cdf4a80..ffb516c1e5f 100644 --- a/cmd/commandfuncs.go +++ b/cmd/commandfuncs.go @@ -516,6 +516,26 @@ func cmdValidateConfig(fl Flags) (int, error) { } } + // if no input file was specified, try a default + // Caddyfile if the Caddyfile adapter is plugged in + if validateCmdConfigFlag == "" && caddyconfig.GetAdapter("caddyfile") != nil { + _, err := os.Stat("Caddyfile") + if err == nil { + // default Caddyfile exists + validateCmdConfigFlag = "Caddyfile" + validateCmdAdapterFlag = "caddyfile" + caddy.Log().Info("using adjacent Caddyfile") + } else if !os.IsNotExist(err) { + // default Caddyfile exists, but error accessing it + return caddy.ExitCodeFailedStartup, fmt.Errorf("accessing default Caddyfile: %v", err) + } + } + + if validateCmdConfigFlag == "" { + return caddy.ExitCodeFailedStartup, + fmt.Errorf("input file required when there is no Caddyfile in current directory (use --config flag)") + } + input, _, err := LoadConfig(validateCmdConfigFlag, validateCmdAdapterFlag) if err != nil { return caddy.ExitCodeFailedStartup, err From db59ef3d3723b1e56a173ead7a72ec80e3ca0257 Mon Sep 17 00:00:00 2001 From: Pistasj Date: Mon, 10 Jul 2023 19:24:12 +0200 Subject: [PATCH 2/5] Try making adjacent Caddyfile check its own function Signed-off-by: Pistasj --- cmd/commandfuncs.go | 48 +++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go index ffb516c1e5f..b9e65f4d036 100644 --- a/cmd/commandfuncs.go +++ b/cmd/commandfuncs.go @@ -416,30 +416,38 @@ func cmdEnviron(_ Flags) (int, error) { return caddy.ExitCodeSuccess, nil } -func cmdAdaptConfig(fl Flags) (int, error) { - adaptCmdInputFlag := fl.String("config") - adaptCmdAdapterFlag := fl.String("adapter") - adaptCmdPrettyFlag := fl.Bool("pretty") - adaptCmdValidateFlag := fl.Bool("validate") - +func detectAdjacentCaddyfile(configFlag string) (int, error) { // if no input file was specified, try a default // Caddyfile if the Caddyfile adapter is plugged in - if adaptCmdInputFlag == "" && caddyconfig.GetAdapter("caddyfile") != nil { + if configFlag == "" && caddyconfig.GetAdapter("caddyfile") != nil { _, err := os.Stat("Caddyfile") if err == nil { // default Caddyfile exists - adaptCmdInputFlag = "Caddyfile" - caddy.Log().Info("using adjacent Caddyfile") + return caddy.ExitCodeSuccess, nil } else if !os.IsNotExist(err) { // default Caddyfile exists, but error accessing it return caddy.ExitCodeFailedStartup, fmt.Errorf("accessing default Caddyfile: %v", err) } } - if adaptCmdInputFlag == "" { - return caddy.ExitCodeFailedStartup, - fmt.Errorf("input file required when there is no Caddyfile in current directory (use --config flag)") + return caddy.ExitCodeSuccess, nil +} + +func cmdAdaptConfig(fl Flags) (int, error) { + adaptCmdInputFlag := fl.String("config") + adaptCmdAdapterFlag := fl.String("adapter") + adaptCmdPrettyFlag := fl.Bool("pretty") + adaptCmdValidateFlag := fl.Bool("validate") + + adjacent, err := detectAdjacentCaddyfile(adaptCmdInputFlag) + if adjacent != caddy.ExitCodeSuccess { + return adjacent, err + } else { + if adaptCmdInputFlag == "" { + adaptCmdInputFlag = "Caddyfile" + } } + if adaptCmdAdapterFlag == "" { return caddy.ExitCodeFailedStartup, fmt.Errorf("adapter name is required (use --adapt flag or leave unspecified for default)") @@ -516,18 +524,12 @@ func cmdValidateConfig(fl Flags) (int, error) { } } - // if no input file was specified, try a default - // Caddyfile if the Caddyfile adapter is plugged in - if validateCmdConfigFlag == "" && caddyconfig.GetAdapter("caddyfile") != nil { - _, err := os.Stat("Caddyfile") - if err == nil { - // default Caddyfile exists + adjacent, err := detectAdjacentCaddyfile(validateCmdConfigFlag) + if adjacent != caddy.ExitCodeSuccess { + return adjacent, err + } else { + if validateCmdConfigFlag == "" { validateCmdConfigFlag = "Caddyfile" - validateCmdAdapterFlag = "caddyfile" - caddy.Log().Info("using adjacent Caddyfile") - } else if !os.IsNotExist(err) { - // default Caddyfile exists, but error accessing it - return caddy.ExitCodeFailedStartup, fmt.Errorf("accessing default Caddyfile: %v", err) } } From ba4962b94fd7ffe7acc9375eb2f1d420acbcd3cf Mon Sep 17 00:00:00 2001 From: pistasjis <57069715+pistasjis@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:44:39 +0200 Subject: [PATCH 3/5] add Francis' suggestion Co-authored-by: Francis Lavoie --- cmd/commandfuncs.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go index b9e65f4d036..1c449863ce9 100644 --- a/cmd/commandfuncs.go +++ b/cmd/commandfuncs.go @@ -439,11 +439,11 @@ func cmdAdaptConfig(fl Flags) (int, error) { adaptCmdPrettyFlag := fl.Bool("pretty") adaptCmdValidateFlag := fl.Bool("validate") - adjacent, err := detectAdjacentCaddyfile(adaptCmdInputFlag) - if adjacent != caddy.ExitCodeSuccess { - return adjacent, err - } else { - if adaptCmdInputFlag == "" { + if adaptCmdInputFlag == "" { + adjacent, err := detectAdjacentCaddyfile(adaptCmdInputFlag) + if adjacent != caddy.ExitCodeSuccess { + return adjacent, err + } else { adaptCmdInputFlag = "Caddyfile" } } From ddb3ecc645562e0970379b0572357db39870fb81 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Mon, 7 Aug 2023 12:04:26 -0600 Subject: [PATCH 4/5] Refactor --- cmd/commandfuncs.go | 67 +++++++++++++++++++++++---------------------- cmd/main.go | 7 ++--- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/cmd/commandfuncs.go b/cmd/commandfuncs.go index 1c449863ce9..d8d197a4f14 100644 --- a/cmd/commandfuncs.go +++ b/cmd/commandfuncs.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "io" + "io/fs" "log" "net" "net/http" @@ -416,36 +417,16 @@ func cmdEnviron(_ Flags) (int, error) { return caddy.ExitCodeSuccess, nil } -func detectAdjacentCaddyfile(configFlag string) (int, error) { - // if no input file was specified, try a default - // Caddyfile if the Caddyfile adapter is plugged in - if configFlag == "" && caddyconfig.GetAdapter("caddyfile") != nil { - _, err := os.Stat("Caddyfile") - if err == nil { - // default Caddyfile exists - return caddy.ExitCodeSuccess, nil - } else if !os.IsNotExist(err) { - // default Caddyfile exists, but error accessing it - return caddy.ExitCodeFailedStartup, fmt.Errorf("accessing default Caddyfile: %v", err) - } - } - - return caddy.ExitCodeSuccess, nil -} - func cmdAdaptConfig(fl Flags) (int, error) { adaptCmdInputFlag := fl.String("config") adaptCmdAdapterFlag := fl.String("adapter") adaptCmdPrettyFlag := fl.Bool("pretty") adaptCmdValidateFlag := fl.Bool("validate") - if adaptCmdInputFlag == "" { - adjacent, err := detectAdjacentCaddyfile(adaptCmdInputFlag) - if adjacent != caddy.ExitCodeSuccess { - return adjacent, err - } else { - adaptCmdInputFlag = "Caddyfile" - } + var err error + adaptCmdInputFlag, err = configFileWithRespectToDefault(caddy.Log(), adaptCmdInputFlag) + if err != nil { + return caddy.ExitCodeFailedStartup, err } if adaptCmdAdapterFlag == "" { @@ -524,15 +505,12 @@ func cmdValidateConfig(fl Flags) (int, error) { } } - adjacent, err := detectAdjacentCaddyfile(validateCmdConfigFlag) - if adjacent != caddy.ExitCodeSuccess { - return adjacent, err - } else { - if validateCmdConfigFlag == "" { - validateCmdConfigFlag = "Caddyfile" - } + // use default config and ensure a config file is specified + var err error + validateCmdConfigFlag, err = configFileWithRespectToDefault(caddy.Log(), validateCmdConfigFlag) + if err != nil { + return caddy.ExitCodeFailedStartup, err } - if validateCmdConfigFlag == "" { return caddy.ExitCodeFailedStartup, fmt.Errorf("input file required when there is no Caddyfile in current directory (use --config flag)") @@ -743,6 +721,31 @@ func DetermineAdminAPIAddress(address string, config []byte, configFile, configA return caddy.DefaultAdminListen, nil } +// configFileWithRespectToDefault returns the filename to use for loading the config, based +// on whether a config file is already specified and a supported default config file exists. +func configFileWithRespectToDefault(logger *zap.Logger, configFile string) (string, error) { + const defaultCaddyfile = "Caddyfile" + + // if no input file was specified, try a default Caddyfile if the Caddyfile adapter is plugged in + if configFile == "" && caddyconfig.GetAdapter("caddyfile") != nil { + _, err := os.Stat(defaultCaddyfile) + if err == nil { + // default Caddyfile exists + if logger != nil { + logger.Info("using adjacent Caddyfile") + } + return defaultCaddyfile, nil + } + if !errors.Is(err, fs.ErrNotExist) { + // problem checking + return configFile, fmt.Errorf("checking if default Caddyfile exists: %v", err) + } + } + + // default config file does not exist or is irrelevant + return configFile, nil +} + type moduleInfo struct { caddyModuleID string goModule *debug.Module diff --git a/cmd/main.go b/cmd/main.go index bfbd0bbceb1..1c92078f715 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -116,10 +116,9 @@ func loadConfigWithLogger(logger *zap.Logger, configFile, adapterName string) ([ zap.String("config_file", configFile), zap.String("config_adapter", adapterName)) } - } else if adapterName == "" { - // as a special case when no config file or adapter - // is specified, see if the Caddyfile adapter is - // plugged in, and if so, try using a default Caddyfile + } else { + // if the Caddyfile adapter is plugged in, we can try using an + // adjacent Caddyfile by default cfgAdapter = caddyconfig.GetAdapter("caddyfile") if cfgAdapter != nil { config, err = os.ReadFile("Caddyfile") From 38aa2644f07ab21ef42eaa32bac84c475b98aa2a Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Mon, 7 Aug 2023 12:07:19 -0600 Subject: [PATCH 5/5] Fix borked commit, sigh --- cmd/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index 1c92078f715..53b8d675230 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -116,7 +116,7 @@ func loadConfigWithLogger(logger *zap.Logger, configFile, adapterName string) ([ zap.String("config_file", configFile), zap.String("config_adapter", adapterName)) } - } else { + } else if adapterName == "" { // if the Caddyfile adapter is plugged in, we can try using an // adjacent Caddyfile by default cfgAdapter = caddyconfig.GetAdapter("caddyfile")