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<- *string) { for cc := range jobs { conn, err := checkup.CertExpiresSoon(cc.Host, cc.Port, cc.Window) if err != nil { s := fmt.Sprintf("%s:%s --> %s\n", cc.Host, cc.Port, err) msg <- &s continue } conn.Close() msg <- nil } } func checkCerts(conf *Config) { buf := &bytes.Buffer{} cc := make(chan certCheck) msgs := make(chan *string) 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) }() for i := 0; i < len(conf.CheckCerts); i++ { m := <-msgs if m != nil { buf.Write([]byte(*m)) } } notify(conf, buf.Bytes()) }