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 +++++++++++++++++++++++++++++++++++++++++++++++++---- cmd/acmed/main.go | 14 ++++------- 2 files changed, 68 insertions(+), 15 deletions(-) (limited to 'cmd') 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 } diff --git a/cmd/acmed/main.go b/cmd/acmed/main.go index 01691e5..b6602f7 100644 --- a/cmd/acmed/main.go +++ b/cmd/acmed/main.go @@ -27,8 +27,8 @@ func newKey(w io.Writer, size int) (*rsa.PrivateKey, error) { return key, pem.Encode(w, block) } -func chkKey(baseDir string, k Keychain) (*rsa.PrivateKey, error) { - key := path.Join(baseDir, k.Path()) +func chkKey(k Keychain) (*rsa.PrivateKey, error) { + key := k.Path() flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC if _, err := os.Stat(key); os.IsNotExist(err) { log.Println("allocating", key, k.Size()) @@ -59,10 +59,7 @@ func main() { } for k, acc := range conf.Account { - if acc.KeySize == 0 { - acc.KeySize = conf.Defaults.KeySize - } - acc.key, err = chkKey(conf.Defaults.Basedir, acc) + acc.key, err = chkKey(acc) if err != nil { log.Fatal(err) } @@ -70,10 +67,7 @@ func main() { } for k, des := range conf.Desire { - if des.KeySize == 0 { - des.KeySize = conf.Defaults.KeySize - } - des.key, err = chkKey(conf.Defaults.Basedir, des) + des.key, err = chkKey(des) if err != nil { log.Fatal(err) } -- cgit v1.2.3