aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-12-15 17:58:36 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-12-15 17:58:36 +0100
commit83a00e54c5b3be283e570660c43af514a7362810 (patch)
treec86ae540510384187249e61403e42e3bd53ec74f /cmd
parent7ca19d9f729b96229ddec049b23adfc28a582aa8 (diff)
Populate defaults
Diffstat (limited to 'cmd')
-rw-r--r--cmd/acmed/config.go69
-rw-r--r--cmd/acmed/main.go14
2 files changed, 68 insertions, 15 deletions
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)
}