aboutsummaryrefslogtreecommitdiff
path: root/cmd/main
diff options
context:
space:
mode:
authorMitch Riedstra <mitch@riedstra.us>2021-01-24 10:31:53 -0500
committerMitch Riedstra <mitch@riedstra.us>2021-01-24 10:31:53 -0500
commita4554be33914fd7cd77eea3326a747078bbe4c50 (patch)
tree5e97506f384344662f9d3e55a6f83f88c76d6217 /cmd/main
downloadcheckup-a4554be33914fd7cd77eea3326a747078bbe4c50.tar.gz
checkup-a4554be33914fd7cd77eea3326a747078bbe4c50.tar.xz
initial
Diffstat (limited to 'cmd/main')
-rw-r--r--cmd/main/main.go113
1 files changed, 113 insertions, 0 deletions
diff --git a/cmd/main/main.go b/cmd/main/main.go
new file mode 100644
index 0000000..aa37a7f
--- /dev/null
+++ b/cmd/main/main.go
@@ -0,0 +1,113 @@
+package main
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "gopkg.in/yaml.v3"
+ "os"
+ "time"
+
+ "riedstra.dev/go/checkup"
+)
+
+type Config struct {
+ RocketChatURL string `yaml:"RocketChatURL"`
+ DiscordURL string `yaml:"DiscordURL"`
+ DefaultCertPort string `yaml:"DefaultCertPort"`
+ CertWindow int `yaml:"CertWindow"`
+ CheckCerts map[string]*string `yaml:"CheckCerts"`
+ ExpectedStatusCode int `yaml:"ExpectedStatusCode"`
+ StatusChecks map[string]*int `yaml:"StatusChecks"`
+}
+
+func ReadConfig(fn string) (*Config, error) {
+ fh, err := os.Open(fn)
+ if err != nil {
+ return nil, err
+ }
+
+ dec := yaml.NewDecoder(fh)
+ conf := &Config{}
+ err = dec.Decode(conf)
+ return conf, err
+}
+
+func notify(conf *Config, b []byte) {
+ if len(b) >= 1 {
+
+ if conf.RocketChatURL != "" {
+ err := checkup.SendRocketChatAlert(conf.RocketChatURL, string(b))
+ if err != nil {
+ fmt.Fprintln(os.Stderr, string(b))
+ fmt.Fprintf(os.Stderr,
+ "When sending webhook for rocketchat: %s\n", err)
+ }
+
+ }
+ if conf.DiscordURL != "" {
+ err := checkup.SendDiscordAlert(conf.DiscordURL, string(b))
+ if err != nil {
+ fmt.Fprintln(os.Stderr, string(b))
+ fmt.Fprintf(os.Stderr,
+ "When sending webhook for discord: %s\n", err)
+ }
+ }
+ }
+}
+
+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)
+
+ confFn := fl.String("c", "config.yml", "Configuration file path")
+
+ _ = fl.Parse(os.Args[1:])
+
+ conf, err := ReadConfig(*confFn)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(1)
+ }
+
+ checkCerts(conf)
+ checkStatus(conf)
+
+}