aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitch Riedstra <mitch@riedstra.us>2021-01-24 12:26:02 -0500
committerMitch Riedstra <mitch@riedstra.us>2021-01-24 12:26:02 -0500
commitbad568d0a26ad348f25a4556266ba98f73b3be02 (patch)
tree6eb909e37d7b65472381a17362283b6765adfc14
parent0539b119a4c205a96590b356849215b6e1b1ed35 (diff)
downloadcheckup-bad568d0a26ad348f25a4556266ba98f73b3be02.tar.gz
checkup-bad568d0a26ad348f25a4556266ba98f73b3be02.tar.xz
Run requests concurrently
-rw-r--r--cmd/main/certs.go58
-rw-r--r--cmd/main/http.go56
-rw-r--r--cmd/main/main.go45
-rw-r--r--http.go5
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)
diff --git a/http.go b/http.go
index f3a910f..24e0b4d 100644
--- a/http.go
+++ b/http.go
@@ -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