@marcel91200 / caddy Mirror · read-only / commits / f2ab7099
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 12, 22:00 UTC

cmd: Prevent overwriting existing env vars with `--envfile` (#5803)

Co-authored-by: Francis Lavoie <lavofr@gmail.com>

Evan Van Dam committed Sep 6, 2023 at 19:19 UTC f2ab7099db6d8386299796e6eef8e30f65b21bcc
3 files changed +57 -33
cmd/commandfuncs.go
+31 -11
@@ -46,7 +46,14 @@ func cmdStart(fl Flags) (int, error) {
46 startCmdConfigAdapterFlag := fl.String("adapter")
47 startCmdPidfileFlag := fl.String("pidfile")
48 startCmdWatchFlag := fl.Bool("watch")
49 - startCmdEnvfileFlag := fl.String("envfile")
49 +
50 + var err error
51 + var startCmdEnvfileFlag []string
52 + startCmdEnvfileFlag, err = fl.GetStringSlice("envfile")
53 + if err != nil {
54 + return caddy.ExitCodeFailedStartup,
55 + fmt.Errorf("reading envfile flag: %v", err)
56 + }
57
58 // open a listener to which the child process will connect when
59 // it is ready to confirm that it has successfully started
@@ -70,8 +77,9 @@ func cmdStart(fl Flags) (int, error) {
77 if startCmdConfigFlag != "" {
78 cmd.Args = append(cmd.Args, "--config", startCmdConfigFlag)
79 }
73 - if startCmdEnvfileFlag != "" {
74 - cmd.Args = append(cmd.Args, "--envfile", startCmdEnvfileFlag)
80 +
81 + for _, envFile := range startCmdEnvfileFlag {
82 + cmd.Args = append(cmd.Args, "--envfile", envFile)
83 }
84 if startCmdConfigAdapterFlag != "" {
85 cmd.Args = append(cmd.Args, "--adapter", startCmdConfigAdapterFlag)
@@ -160,15 +168,22 @@ func cmdRun(fl Flags) (int, error) {
168 runCmdConfigFlag := fl.String("config")
169 runCmdConfigAdapterFlag := fl.String("adapter")
170 runCmdResumeFlag := fl.Bool("resume")
163 - runCmdLoadEnvfileFlag := fl.String("envfile")
171 runCmdPrintEnvFlag := fl.Bool("environ")
172 runCmdWatchFlag := fl.Bool("watch")
173 runCmdPidfileFlag := fl.String("pidfile")
174 runCmdPingbackFlag := fl.String("pingback")
175
176 + var err error
177 + var runCmdLoadEnvfileFlag []string
178 + runCmdLoadEnvfileFlag, err = fl.GetStringSlice("envfile")
179 + if err != nil {
180 + return caddy.ExitCodeFailedStartup,
181 + fmt.Errorf("reading envfile flag: %v", err)
182 + }
183 +
184 // load all additional envs as soon as possible
170 - if runCmdLoadEnvfileFlag != "" {
171 - if err := loadEnvFromFile(runCmdLoadEnvfileFlag); err != nil {
185 + for _, envFile := range runCmdLoadEnvfileFlag {
186 + if err := loadEnvFromFile(envFile); err != nil {
187 return caddy.ExitCodeFailedStartup,
188 fmt.Errorf("loading additional environment variables: %v", err)
189 }
@@ -181,7 +196,6 @@ func cmdRun(fl Flags) (int, error) {
196
197 // load the config, depending on flags
198 var config []byte
184 - var err error
199 if runCmdResumeFlag {
200 config, err = os.ReadFile(caddy.ConfigAutosavePath)
201 if os.IsNotExist(err) {
@@ -497,18 +511,24 @@ func cmdAdaptConfig(fl Flags) (int, error) {
511 func cmdValidateConfig(fl Flags) (int, error) {
512 validateCmdConfigFlag := fl.String("config")
513 validateCmdAdapterFlag := fl.String("adapter")
500 - runCmdLoadEnvfileFlag := fl.String("envfile")
514 +
515 + var err error
516 + var runCmdLoadEnvfileFlag []string
517 + runCmdLoadEnvfileFlag, err = fl.GetStringSlice("envfile")
518 + if err != nil {
519 + return caddy.ExitCodeFailedStartup,
520 + fmt.Errorf("reading envfile flag: %v", err)
521 + }
522
523 // load all additional envs as soon as possible
503 - if runCmdLoadEnvfileFlag != "" {
504 - if err := loadEnvFromFile(runCmdLoadEnvfileFlag); err != nil {
524 + for _, envFile := range runCmdLoadEnvfileFlag {
525 + if err := loadEnvFromFile(envFile); err != nil {
526 return caddy.ExitCodeFailedStartup,
527 fmt.Errorf("loading additional environment variables: %v", err)
528 }
529 }
530
531 // use default config and ensure a config file is specified
511 - var err error
532 validateCmdConfigFlag, err = configFileWithRespectToDefault(caddy.Log(), validateCmdConfigFlag)
533 if err != nil {
534 return caddy.ExitCodeFailedStartup, err
cmd/commands.go
+20 -20
@@ -104,7 +104,7 @@ using 'caddy run' instead to keep it in the foreground.
104 CobraFunc: func(cmd *cobra.Command) {
105 cmd.Flags().StringP("config", "c", "", "Configuration file")
106 cmd.Flags().StringP("adapter", "a", "", "Name of config adapter to apply")
107 - cmd.Flags().StringP("envfile", "", "", "Environment file to load")
107 + cmd.Flags().StringSliceP("envfile", "", []string{}, "Environment file(s) to load")
108 cmd.Flags().BoolP("watch", "w", false, "Reload changed config file automatically")
109 cmd.Flags().StringP("pidfile", "", "", "Path of file to which to write process ID")
110 cmd.RunE = WrapCommandFuncForCobra(cmdStart)
@@ -150,7 +150,7 @@ option in a local development environment.
150 CobraFunc: func(cmd *cobra.Command) {
151 cmd.Flags().StringP("config", "c", "", "Configuration file")
152 cmd.Flags().StringP("adapter", "a", "", "Name of config adapter to apply")
153 - cmd.Flags().StringP("envfile", "", "", "Environment file to load")
153 + cmd.Flags().StringSliceP("envfile", "", []string{}, "Environment file(s) to load")
154 cmd.Flags().BoolP("environ", "e", false, "Print environment")
155 cmd.Flags().BoolP("resume", "r", false, "Use saved config, if any (and prefer over --config file)")
156 cmd.Flags().BoolP("watch", "w", false, "Watch config file for changes and reload it automatically")
@@ -301,7 +301,7 @@ the KEY=VALUE format will be loaded into the Caddy process.
301 CobraFunc: func(cmd *cobra.Command) {
302 cmd.Flags().StringP("config", "c", "", "Input configuration file")
303 cmd.Flags().StringP("adapter", "a", "", "Name of config adapter")
304 - cmd.Flags().StringP("envfile", "", "", "Environment file to load")
304 + cmd.Flags().StringSliceP("envfile", "", []string{}, "Environment file(s) to load")
305 cmd.RunE = WrapCommandFuncForCobra(cmdValidateConfig)
306 },
307 })
@@ -402,7 +402,7 @@ latest versions. EXPERIMENTAL: May be changed or removed.
402 Short: "Adds Caddy packages (EXPERIMENTAL)",
403 Long: `
404 Downloads an updated Caddy binary with the specified packages (module/plugin)
405 -added. Retains existing packages. Returns an error if the any of packages are
405 +added. Retains existing packages. Returns an error if the any of packages are
406 already included. EXPERIMENTAL: May be changed or removed.
407 `,
408 CobraFunc: func(cmd *cobra.Command) {
@@ -417,8 +417,8 @@ already included. EXPERIMENTAL: May be changed or removed.
417 Usage: "<packages...>",
418 Short: "Removes Caddy packages (EXPERIMENTAL)",
419 Long: `
420 -Downloads an updated Caddy binaries without the specified packages (module/plugin).
421 -Returns an error if any of the packages are not included.
420 +Downloads an updated Caddy binaries without the specified packages (module/plugin).
421 +Returns an error if any of the packages are not included.
422 EXPERIMENTAL: May be changed or removed.
423 `,
424 CobraFunc: func(cmd *cobra.Command) {
@@ -464,40 +464,40 @@ argument of --directory. If the directory does not exist, it will be created.
464 Use: "completion [bash|zsh|fish|powershell]",
465 Short: "Generate completion script",
466 Long: fmt.Sprintf(`To load completions:
467 -
467 +
468 Bash:
469 -
469 +
470 $ source <(%[1]s completion bash)
471 -
471 +
472 # To load completions for each session, execute once:
473 # Linux:
474 $ %[1]s completion bash > /etc/bash_completion.d/%[1]s
475 # macOS:
476 $ %[1]s completion bash > $(brew --prefix)/etc/bash_completion.d/%[1]s
477 -
477 +
478 Zsh:
479 -
479 +
480 # If shell completion is not already enabled in your environment,
481 # you will need to enable it. You can execute the following once:
482 -
482 +
483 $ echo "autoload -U compinit; compinit" >> ~/.zshrc
484 -
484 +
485 # To load completions for each session, execute once:
486 $ %[1]s completion zsh > "${fpath[1]}/_%[1]s"
487 -
487 +
488 # You will need to start a new shell for this setup to take effect.
489 -
489 +
490 fish:
491 -
491 +
492 $ %[1]s completion fish | source
493 -
493 +
494 # To load completions for each session, execute once:
495 $ %[1]s completion fish > ~/.config/fish/completions/%[1]s.fish
496 -
496 +
497 PowerShell:
498 -
498 +
499 PS> %[1]s completion powershell | Out-String | Invoke-Expression
500 -
500 +
501 # To load completions for every new session, run:
502 PS> %[1]s completion powershell > %[1]s.ps1
503 # and source this file from your PowerShell profile.
cmd/main.go
+6 -2
@@ -300,8 +300,12 @@ func loadEnvFromFile(envFile string) error {
300 }
301
302 for k, v := range envMap {
303 - if err := os.Setenv(k, v); err != nil {
304 - return fmt.Errorf("setting environment variables: %v", err)
303 + // do not overwrite existing environment variables
304 + _, exists := os.LookupEnv(k)
305 + if !exists {
306 + if err := os.Setenv(k, v); err != nil {
307 + return fmt.Errorf("setting environment variables: %v", err)
308 + }
309 }
310 }
311