diff options
Diffstat (limited to 'cmd/main/certs.go')
| -rw-r--r-- | cmd/main/certs.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/cmd/main/certs.go b/cmd/main/certs.go new file mode 100644 index 0000000..66fe0cd --- /dev/null +++ b/cmd/main/certs.go @@ -0,0 +1,58 @@ +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()) +} |
