package main import ( "flag" "log" "sync" "dim13.org/acme" ) var confName = flag.String("conf", "acme.toml", "configuration file") func main() { var wg sync.WaitGroup flag.Parse() conf, err := LoadConfig(*confName) if err != nil { log.Fatal(err) } for k, acc := range conf.Account { wg.Add(1) go func(k string, acc *account) { defer wg.Done() log.Println("LoadAccount", k) acc.Account, err = acme.LoadAccount(acc.Key) if err != nil { log.Println(err) log.Println("NewAccount", k) acc.Account, err = acme.NewAccount(acc.KeySize) if err != nil { log.Fatal(err) } err = acc.Account.SaveKey(acc.Key) if err != nil { log.Fatal(err) } acc.pending = true } acc.Contacts.AddMail(acc.Mail) acc.Contacts.AddPhone(acc.Phone) conf.Account[k] = acc }(k, acc) } for k, des := range conf.Desire { wg.Add(1) go func(k string, des *desire) { defer wg.Done() log.Println("NewDesire", k) des.Desire, err = acme.NewDesire(des.Altnames, des.KeySize) if err != nil { log.Fatal(err) } conf.Desire[k] = des }(k, des) } for k, pro := range conf.Provider { wg.Add(1) go func(k string, pro *provider) { defer wg.Done() log.Println("NewProvider", k) pro.Provider, err = acme.NewProvider(pro.Directory) if err != nil { log.Fatal(err) } conf.Provider[k] = pro }(k, pro) } wg.Wait() for k, des := range conf.Desire { if des.account.pending { err = des.provider.Register(des.account, des.account.Contacts) if err != nil { log.Fatal("register", err) } } wg.Add(1) go func(k string, des *desire) { log.Println("process", k) defer wg.Done() err = des.provider.Authorize(des.account, des.Desire) if err != nil { log.Fatal("authz", err) } err = des.provider.Cert(des.account, des.Desire) if err != nil { log.Fatal("cert", err) } des.SaveKey(des.Key) des.SaveCert(des.Cert) }(k, des) } wg.Wait() }