diff options
| author | Mitch Riedstra <mitch@riedstra.us> | 2021-01-24 12:26:02 -0500 |
|---|---|---|
| committer | Mitch Riedstra <mitch@riedstra.us> | 2021-01-24 12:26:02 -0500 |
| commit | bad568d0a26ad348f25a4556266ba98f73b3be02 (patch) | |
| tree | 6eb909e37d7b65472381a17362283b6765adfc14 | |
| parent | 0539b119a4c205a96590b356849215b6e1b1ed35 (diff) | |
| download | checkup-bad568d0a26ad348f25a4556266ba98f73b3be02.tar.gz checkup-bad568d0a26ad348f25a4556266ba98f73b3be02.tar.xz | |
Run requests concurrently
| -rw-r--r-- | cmd/main/certs.go | 58 | ||||
| -rw-r--r-- | cmd/main/http.go | 56 | ||||
| -rw-r--r-- | cmd/main/main.go | 45 | ||||
| -rw-r--r-- | http.go | 5 |
4 files changed, 123 insertions, 41 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()) +} diff --git a/cmd/main/http.go b/cmd/main/http.go new file mode 100644 index 0000000..ce31495 --- /dev/null +++ b/cmd/main/http.go @@ -0,0 +1,56 @@ +package main + +import ( + "bytes" + "fmt" + + "riedstra.dev/go/checkup" +) + +type httpCheck struct { + URL string + Code int +} + +func httpStatusWorker(jobs <-chan httpCheck, msg chan<- *string) { + for hc := range jobs { + err := checkup.HttpStatusOK(hc.URL, hc.Code) + if err != nil { + s := fmt.Sprintf("Checking: %s, %v\n", + hc.URL, err) + msg <- &s + continue + } + msg <- nil + } +} + +func checkStatus(conf *Config) { + buf := &bytes.Buffer{} + + hc := make(chan httpCheck) + msgs := make(chan *string) + + for i := 1; i <= conf.Workers; i++ { + go httpStatusWorker(hc, msgs) + } + + go func() { + for url, code := range conf.StatusChecks { + if code == nil { + code = &conf.ExpectedStatusCode + } + hc <- httpCheck{url, *code} + } + close(hc) + }() + + for i := 0; i < len(conf.StatusChecks); i++ { + m := <-msgs + if m != nil { + buf.Write([]byte(*m)) + } + } + + notify(conf, buf.Bytes()) +} diff --git a/cmd/main/main.go b/cmd/main/main.go index aa37a7f..c81a329 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -1,12 +1,10 @@ package main import ( - "bytes" "flag" "fmt" "gopkg.in/yaml.v3" "os" - "time" "riedstra.dev/go/checkup" ) @@ -19,6 +17,7 @@ type Config struct { CheckCerts map[string]*string `yaml:"CheckCerts"` ExpectedStatusCode int `yaml:"ExpectedStatusCode"` StatusChecks map[string]*int `yaml:"StatusChecks"` + Workers int `yaml:"Workers"` } func ReadConfig(fn string) (*Config, error) { @@ -56,44 +55,6 @@ func notify(conf *Config, b []byte) { } } -func checkCerts(conf *Config) { - msg := &bytes.Buffer{} - for host, port := range conf.CheckCerts { - if port == nil { - port = &conf.DefaultCertPort - } - - conn, err := checkup.CertExpiresSoon( - host, - *port, - time.Duration(conf.CertWindow)*time.Hour*24) - if err != nil { - fmt.Fprintf(msg, "%s:%s --> %s\n", host, *port, err) - continue - } - conn.Close() - } - - notify(conf, msg.Bytes()) -} - -func checkStatus(conf *Config) { - msg := &bytes.Buffer{} - - for url, code := range conf.StatusChecks { - if code == nil { - code = &conf.ExpectedStatusCode - } - err := checkup.HttpStatusOK(url, *code) - if err != nil { - fmt.Fprintf(msg, "Checking: %s, %v\n", - url, err) - } - } - - notify(conf, msg.Bytes()) -} - func main() { fl := flag.NewFlagSet("checkup", flag.ExitOnError) @@ -107,6 +68,10 @@ func main() { os.Exit(1) } + if conf.Workers == 0 { + conf.Workers = 1 + } + checkCerts(conf) checkStatus(conf) @@ -3,10 +3,13 @@ package checkup import ( "fmt" "net/http" + "time" ) func HttpStatusOK(url string, status int) error { - resp, err := http.Get(url) + client := &http.Client{Timeout: 5 * time.Second} + + resp, err := client.Get(url) if err != nil { return err |
