~sircmpwn/core-go

3c1346e6bbc37884ca5eb390e22728e4c40e3fa5 — Conrad Hoffmann 4 months ago bd40a71 master
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.
1 files changed, 18 insertions(+), 2 deletions(-)

M config/config.go
M config/config.go => config/config.go +18 -2
@@ 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
		}
	}