From 3c1346e6bbc37884ca5eb390e22728e4c40e3fa5 Mon Sep 17 00:00:00 2001 From: Conrad Hoffmann Date: Tue, 6 Feb 2024 16:03:14 +0100 Subject: [PATCH] config: allow spreading config over multiple files This is the Go-equivalent to https://lists.sr.ht/~sircmpwn/sr.ht-dev/patches/47657 This commit enables spreading the config in /etc/sr.ht - and, crucially, _only_ in /etc/sr.ht - over multiple .ini files. If a file config.ini is found (either in current or parent directory, or /etc/sr.ht) it (and only it) is loaded and any other ini files are ignored. To utilize multiple configs, they must be in /etc/sr.ht, and none of them must be called config.ini. Spreading the config over multiple files will make it much easier to create containerized versions, where e.g. different secrets can be made available in different files, but rendering it all into one big file would require some preprocessing. --- config/config.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index 102e14654e87f6ede9001725bd9850044a8316ed..90f853d551e4ffa617416a5b632af529b26e08df 100644 --- a/config/config.go +++ b/config/config.go @@ -3,6 +3,7 @@ package config import ( "log" "os" + "path/filepath" "git.sr.ht/~sircmpwn/getopt" "github.com/vaughan0/go-ini" @@ -37,13 +38,28 @@ func LoadConfig(defaultAddr string) ini.File { } } + // Only loads from one of these locations for _, path := range []string{ "config.ini", "../config.ini", "/etc/sr.ht/config.ini", + "/etc/sr.ht/*.ini", } { - config, err = ini.LoadFile(path) - if err == nil { + matches, err_ := filepath.Glob(path) + if err_ != nil { + panic(err) // only happens on bad input + } + for _, f := range matches { + if config == nil { + config, err = ini.LoadFile(f) + } else { + err = config.LoadFile(f) + } + if err != nil { + break + } + } + if len(matches) > 0 { break } }