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