package main import ( "flag" "log" "dim13.org/acme" ) var confName = flag.String("conf", "acme.toml", "configuration file") func prepare(conf *Config) error { var err error for k, pro := range conf.Provider { log.Println("DialProvider", k) pro.Provider, err = acme.DialProvider(pro.Directory) if err != nil { return err } conf.Provider[k] = pro } for k, acc := range conf.Account { log.Println("LoadAccount", k) acc.Account, err = acme.LoadAccount(acc.Key) if err != nil { log.Println("NewAccount", k) acc.Account, err = acme.NewAccount(acc.KeySize) if err != nil { return err } if err := acc.Account.SaveKey(acc.Key); err != nil { return err } acc.pending = true } acc.Contacts.AddMail(acc.Mail) acc.Contacts.AddPhone(acc.Phone) conf.Account[k] = acc } for k, des := range conf.Desire { log.Println("NewDesire", k) des.Desire, err = acme.NewDesire(des.Altnames, des.Webroot, des.KeySize) if err != nil { return err } conf.Desire[k] = des } return nil } func satisfice(des *desire) error { var err error if des.account.pending { log.Println("register pending account") err = des.provider.Register(des.account, des.account.Contacts) if err != nil { return err } } hs := &httpChallenge{Webroot: des.Webroot} des.RegisterSolver(acme.ChallengeHTTP, hs) err = des.provider.Authorize(des.account, des.Desire) if err != nil { return err } err = des.provider.Cert(des.account, des.Desire) if err != nil { return err } if err := des.Save(des.Cert, des.Key); err != nil { return err } return nil } func main() { flag.Parse() conf, err := LoadConfig(*confName) if err != nil { log.Fatal(err) } if err := prepare(conf); err != nil { log.Fatal(err) } httpSolver(conf.Defaults.Listen) for k, des := range conf.Desire { log.Println("satisfice", k) if err := satisfice(des); err != nil { log.Fatal(err) } } }