package main import ( "bytes" "fmt" "time" "riedstra.dev/go/checkup" ) type certCheck struct { Host, Port string Window time.Duration } func certWorker(jobs <-chan certCheck, msg chan<- *jobResponse) { for cc := range jobs { conn, err := checkup.CertExpiresSoon(cc.Host, cc.Port, cc.Window) if err != nil { s := fmt.Sprintf("%s:%s --> %s", cc.Host, cc.Port, err) msg <- &jobResponse{ Id: cc.Host + ":" + cc.Port, Message: s, Err: err, } continue } conn.Close() msg <- nil } } func checkCerts(conf *Config) map[string]*jobResponse { buf := &bytes.Buffer{} cc := make(chan certCheck) msgs := make(chan *jobResponse) for i := 1; i <= conf.Workers; i++ { go certWorker(cc, msgs) } go func() { for host, port := range conf.CheckCerts { if port == nil { port = &conf.DefaultCertPort } cc <- certCheck{host, *port, time.Duration(conf.CertWindow) * time.Hour * 24} } close(cc) }() out := make(map[string]*jobResponse) for i := 0; i < len(conf.CheckCerts); i++ { resp := <-msgs if resp != nil { buf.Write([]byte(resp.Message)) out[resp.Id] = resp } } // notify(conf, buf.Bytes()) return out }