Files
shhh/internal/clis/hmsecrets/config.go
T
jmug 03247415b2
build-secretsserver / build (push) Successful in 1m39s
release-clis / release (push) Successful in 2m25s
feat: Support configuration file for hmsecrets.
2026-10-29 14:35:46 -07:00

84 lines
1.8 KiB
Go

package hmsecrets
import (
"errors"
"fmt"
"os"
"path"
"runtime"
"gopkg.in/yaml.v3"
)
type config struct {
APIBase string `yaml:"api-base"`
CA string `yaml:"ca"`
ClientCert string `yaml:"client-cert"`
ClientKey string `yaml:"client-key"`
}
func mustLoadConfig() config {
var baseConfigDir string
var err error
switch runtime.GOOS {
case "windows":
fallthrough
case "linux":
baseConfigDir, err = os.UserConfigDir()
if err != nil {
panic(fmt.Errorf("determining user config dir: %w", err))
}
case "darwin":
// We want $HOME/.config in macOS.
homeDir, err := os.UserHomeDir()
if err != nil {
panic(fmt.Errorf("determining user home dir: %w", err))
}
baseConfigDir = path.Join(homeDir, ".config")
}
configDir := path.Join(baseConfigDir, "hmsecrets")
configBytes, err := os.ReadFile(path.Join(configDir, "config.yaml"))
if err != nil {
panic(fmt.Errorf("reading config file: %w", err))
}
var conf config
err = yaml.Unmarshal(configBytes, &conf)
if err != nil {
panic(fmt.Errorf("parsing config file: %w", err))
}
if conf.APIBase == "" {
panic(errors.New("api base must be present in config"))
}
if conf.CA == "" {
conf.CA = path.Join(configDir, "ca.crt")
}
if !fileAccesible(conf.CA) {
panic(fmt.Errorf("ca file '%s' does not exist or is inaccesible", conf.CA))
}
if conf.ClientCert == "" {
conf.ClientCert = path.Join(configDir, "client.crt")
}
if !fileAccesible(conf.ClientCert) {
panic(fmt.Errorf("client cert file '%s' does not exist or is inaccesible", conf.ClientCert))
}
if conf.ClientKey == "" {
conf.ClientKey = path.Join(configDir, "client.key")
}
if !fileAccesible(conf.ClientKey) {
panic(fmt.Errorf("client key file '%s' does not exist or is inaccesible", conf.ClientKey))
}
return conf
}
func fileAccesible(f string) bool {
_, err := os.Stat(f)
return err == nil
}