fix(config): mkdir before writing config

Ayman Bagabas created

Change summary

server/config/config.go | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)

Detailed changes

server/config/config.go 🔗

@@ -125,6 +125,9 @@ func ParseConfig(path string) (*Config, error) {
 
 // WriteConfig writes the configuration to the given file.
 func WriteConfig(path string, cfg *Config) error {
+	if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
+		return err
+	}
 	return os.WriteFile(path, []byte(newConfigFile(cfg)), 0o600) // nolint: errcheck
 }
 
@@ -162,6 +165,7 @@ func DefaultConfig() *Config {
 			ListenAddr: ":8081",
 		},
 	}
+
 	cp := filepath.Join(cfg.DataPath, "config.yaml")
 	f, err := os.Open(cp)
 	if err == nil {
@@ -169,18 +173,22 @@ func DefaultConfig() *Config {
 		if err := yaml.NewDecoder(f).Decode(cfg); err != nil {
 			log.Error("failed to decode config", "err", err)
 		}
-	} else {
-		defer func() {
-			os.WriteFile(cp, []byte(newConfigFile(cfg)), 0o600) // nolint: errcheck
-		}()
 	}
 
+	// Override with environment variables
 	if err := env.Parse(cfg, env.Options{
 		Prefix: "SOFT_SERVE_",
 	}); err != nil {
 		log.Fatal(err)
 	}
 
+	// Write config if it doesn't exist
+	if _, err := os.Stat(cp); os.IsNotExist(err) {
+		if err := WriteConfig(cp, cfg); err != nil {
+			log.Fatal("failed to write config", "err", err)
+		}
+	}
+
 	if err := cfg.init(); err != nil {
 		log.Fatal(err)
 	}