From 5219deb79f84e9f124ff5834d127830a19831a0b Mon Sep 17 00:00:00 2001 From: laurentu Date: Wed, 16 Aug 2023 16:16:41 +0200 Subject: [PATCH] Presque ok --- main.go | 94 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/main.go b/main.go index 97441bf..ad9a8a7 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,8 @@ import "log" import "gopkg.in/yaml.v3" import "time" import "sync" +import "os/signal" +import "os" type Check struct { Type string `yaml:"type"` @@ -47,29 +49,32 @@ func main() { go checkGroup(name, group, &waitGroup, stopChannel) } - time.Sleep(5 * time.Second) + exit := make(chan os.Signal, 1) + + signal.Notify(exit, os.Interrupt) + + s := <-exit + log.Println("Received signal", s) log.Println("main closing stopChannel") - close(stopChannel) + close(stopChannel) waitGroup.Wait() } func checkGroup(name string, group Group, waitGroup *sync.WaitGroup, stopChannel chan bool) { channels := make(map[string]chan int) - var checkHostWaitGroup sync.WaitGroup for _, host := range group.Hosts { channel := make(chan int, 1) channels[host] = channel - checkHostWaitGroup.Add(1) - go checkHost(channels[host], name, host, group.Check, &checkHostWaitGroup, stopChannel) + waitGroup.Add(1) + go checkHost(channels[host], name, host, group.Check, waitGroup, stopChannel) } for { select { case <-stopChannel: log.Println("checkGroup", name, "stopChannel") - checkHostWaitGroup.Wait() - waitGroup.Done() - return + waitGroup.Done() + return break default: for host, channel := range channels { @@ -87,28 +92,73 @@ func checkGroup(name string, group Group, waitGroup *sync.WaitGroup, stopChannel } } -func checkHost(status chan<- int,group string, host string, check Check, waitGroup *sync.WaitGroup, stopChannel chan bool) { - client := &http.Client{ - Timeout: time.Second * time.Duration(check.Timeout), - } +func checkHost(status chan<- int, group string, host string, check Check, waitGroup *sync.WaitGroup, stopChannel chan bool) { + + if check.Timeout == 0 { + check.Timeout = 5 + } + if check.Interval == 0 { + check.Interval = 60 + } + if len(check.Method) == 0 { + check.Method = "HEAD" + } + if len(check.Uri) == 0 { + check.Uri = "/" + } + if check.Port == 0 { + check.Port = 80 + } for { select { case <-stopChannel: log.Println("checkHost", host, "group", group, "stopChannel") waitGroup.Done() - return + return default: - resp, err := client.Head(fmt.Sprintf("http://%s", host)) - if err != nil { - log.Println(host, "Failed") - status <- 1 - } else { - status <- 0 - _, _ = io.ReadAll(resp.Body) - resp.Body.Close() - log.Println(host, "Status", resp.StatusCode) + var err error + + err = nil + switch check.Type { + case "http": + err = CheckHTTP(host, check) + case "tcp": + err = CheckTCP(host, check) + case "smtp": + err = CheckSMTP(host, check) + default: + err = CheckHTTP(host, check) } + if err != nil { + status <- 1 + log.Println("checkHost", host, "group", group, "error", err) + } else { + status <- 0 + } time.Sleep(time.Duration(check.Interval) * time.Second) } } } + +func CheckHTTP(host string, check Check) error { + + client := &http.Client{ + Timeout: time.Second * time.Duration(check.Timeout), + } + resp, err := client.Head(fmt.Sprintf("http://%s", host)) + if err != nil { + return err + } + _, _ = io.ReadAll(resp.Body) + resp.Body.Close() + + return nil +} + +func CheckTCP(host string, check Check) error { + return nil +} + +func CheckSMTP(host string, check Check) error { + return nil +}