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) }