Fix: improve robustness of configuration initialization

This commit is contained in:
kayos@tcp.direct 2024-06-19 20:06:01 -07:00
parent a5b6612028
commit af4a3440ca
No known key found for this signature in database
GPG Key ID: 4B841471B4BEE979
2 changed files with 32 additions and 9 deletions

View File

@ -1,6 +1,7 @@
package config package config
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
@ -24,6 +25,16 @@ var (
snek = viper.New(".") snek = viper.New(".")
) )
func init() {
home, _ = os.UserHomeDir()
if home == "" {
home = os.Getenv("HOME")
}
if home == "" {
println("WARNING: could not determine home directory")
}
}
// exported generic vars // exported generic vars
var ( var (
// Trace is the value of our trace (extra verbose) on/off toggle as per the current configuration. // Trace is the value of our trace (extra verbose) on/off toggle as per the current configuration.
@ -37,8 +48,13 @@ var (
func writeConfig() string { func writeConfig() string {
prefConfigLocation, _ := os.UserConfigDir() prefConfigLocation, _ := os.UserConfigDir()
if prefConfigLocation == "" {
home, _ = os.UserHomeDir()
prefConfigLocation = filepath.Join(home, ".config", Title)
}
if _, err := os.Stat(prefConfigLocation); os.IsNotExist(err) { if _, err := os.Stat(prefConfigLocation); os.IsNotExist(err) {
if err = os.MkdirAll(prefConfigLocation, 0o750); err != nil { if err = os.MkdirAll(prefConfigLocation, 0o750); err != nil && !errors.Is(err, os.ErrExist) {
println("error writing new config: " + err.Error()) println("error writing new config: " + err.Error())
os.Exit(1) os.Exit(1)
} }
@ -88,25 +104,31 @@ func Init() {
} }
if chosen == "" && uconf != "" { if chosen == "" && uconf != "" {
_ = os.MkdirAll(filepath.Join(uconf, Title), 0o645)
chosen = filepath.Join(uconf, Title, "config.toml") chosen = filepath.Join(uconf, Title, "config.toml")
} }
if chosen == "" { if chosen == "" {
pwd, _ := os.Getwd()
if _, err := os.Stat("./config.toml"); err == nil { if _, err := os.Stat("./config.toml"); err == nil {
chosen = "./config.toml" chosen = "./config.toml"
} else {
if _, err := os.Stat(filepath.Join(pwd, "config.toml")); err == nil {
chosen = filepath.Join(pwd, "config.toml")
}
} }
} }
if chosen == "" { loadErr := snek.Load(file.Provider(chosen), toml.Parser())
if chosen == "" || loadErr != nil {
println("No configuration file found, writing new configuration file...") println("No configuration file found, writing new configuration file...")
chosen = writeConfig() chosen = writeConfig()
} }
Filename = chosen Filename = chosen
if err := snek.Load(file.Provider(chosen), toml.Parser()); err != nil { if loadErr = snek.Load(file.Provider(chosen), toml.Parser()); loadErr != nil {
println("Error opening specified config file: " + chosen) fmt.Println("failed to load default config file: ", loadErr.Error())
println(err.Error())
os.Exit(1) os.Exit(1)
} }

View File

@ -4,6 +4,7 @@ import (
"io" "io"
"os" "os"
"path" "path"
"path/filepath"
"strings" "strings"
"time" "time"
@ -20,10 +21,10 @@ var (
func prepLogDir() { func prepLogDir() {
logDir = snek.String("logger.directory") logDir = snek.String("logger.directory")
if err := os.MkdirAll(logDir, 0750); err != nil { if logDir == "" {
println("cannot create log directory: " + logDir + "(" + err.Error() + ")") logDir = filepath.Join(home, ".local", "share", Title, "logs")
os.Exit(1)
} }
_ = os.MkdirAll(logDir, 0666)
} }
// StartLogger instantiates an instance of our zerolog loggger so we can hook it in our main package. // StartLogger instantiates an instance of our zerolog loggger so we can hook it in our main package.