aboutsummaryrefslogtreecommitdiff
path: root/cmd/main/certs.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/main/certs.go')
-rw-r--r--cmd/main/certs.go58
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())
+}