From 83a00e54c5b3be283e570660c43af514a7362810 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 15 Dec 2015 17:58:36 +0100 Subject: Populate defaults --- cmd/acmed/config.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 5 deletions(-) (limited to 'cmd/acmed/config.go') diff --git a/cmd/acmed/config.go b/cmd/acmed/config.go index 4130aab..fdd931b 100644 --- a/cmd/acmed/config.go +++ b/cmd/acmed/config.go @@ -2,16 +2,18 @@ package main import ( "crypto/rsa" + "errors" + "path" "github.com/BurntSushi/toml" ) type Config struct { Defaults defaults - Provider map[string]provider - Account map[string]account - Hook map[string]hook - Desire map[string]desire + Provider map[string]*provider + Account map[string]*account + Hook map[string]*hook + Desire map[string]*desire } type defaults struct { @@ -32,7 +34,7 @@ type account struct { Phone string Key string KeySize int - key *rsa.PrivateKey `toml:"-"` + key *rsa.PrivateKey } type hook struct { @@ -49,11 +51,68 @@ type desire struct { Webroot string Hooks []string key *rsa.PrivateKey `toml:"-"` + account *account + provider *provider } +var ( + errNoProvider = errors.New("no provider specified") + errNoAccount = errors.New("no account specified") + errNoKey = errors.New("no key specified") + errNoCert = errors.New("no cert specified") +) + func LoadConfig(fname string) (*Config, error) { c := &Config{} _, err := toml.DecodeFile(fname, c) + // apply defaults + if c.Defaults.KeySize == 0 { + c.Defaults.KeySize = 2048 + } + for k, v := range c.Account { + if v.KeySize == 0 { + v.KeySize = c.Defaults.KeySize + } + if v.Key == "" { + return nil, errNoKey + } + if c.Defaults.Basedir != "" { + v.Key = path.Join(c.Defaults.Basedir, v.Key) + } + c.Account[k] = v + } + for k, v := range c.Desire { + if v.KeySize == 0 { + v.KeySize = c.Defaults.KeySize + } + if v.Provider == "" { + if c.Defaults.Provider != "" { + v.Provider = c.Defaults.Provider + } else { + return nil, errNoProvider + } + } + v.provider = c.Provider[v.Provider] + if v.Account == "" { + if c.Defaults.Account != "" { + v.Account = c.Defaults.Account + } else { + return nil, errNoAccount + } + } + v.account = c.Account[v.Account] + if v.Key == "" { + return nil, errNoKey + } + if v.Cert == "" { + return nil, errNoCert + } + if c.Defaults.Basedir != "" { + v.Key = path.Join(c.Defaults.Basedir, v.Key) + v.Cert = path.Join(c.Defaults.Basedir, v.Cert) + } + c.Desire[k] = v + } return c, err } -- cgit v1.2.3