From 4e67a31552c80ca12280e3c63d1594ec2aa99107 Mon Sep 17 00:00:00 2001 From: Christopher Ramey Date: Sat, 2 Jan 2021 06:29:12 -0900 Subject: [PATCH] Ping check actually pings --- alrmrc | 2 +- check/check.go | 2 +- check/check_ping.go | 35 +++++++++++++++++++++++++++++++---- config/group.go | 4 ++-- go.mod | 5 +++++ go.sum | 7 +++++++ main.go | 18 +++++++++--------- 7 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 go.mod create mode 100644 go.sum diff --git a/alrmrc b/alrmrc index 28a6c88..e512ccc 100644 --- a/alrmrc +++ b/alrmrc @@ -8,7 +8,7 @@ monitor group webservers check ping # or the end of a line check ping # checks are not named, so multiple is okay -monitor host gateway address 10.79.37.200 +monitor host gateway address 10.79.37.220 check ping # Hosts without any checks will always be successful diff --git a/check/check.go b/check/check.go index ce33f6b..e5b25d5 100644 --- a/check/check.go +++ b/check/check.go @@ -6,7 +6,7 @@ import ( type AlrmCheck interface { Parse(string) (bool, error) - Check() error + Check(int) error } func NewCheck(name string, addr string) (AlrmCheck, error) { diff --git a/check/check_ping.go b/check/check_ping.go index 85b1434..e9cb740 100644 --- a/check/check_ping.go +++ b/check/check_ping.go @@ -1,16 +1,43 @@ package check import ( + "alrm/check/ping" "fmt" + "time" ) type CheckPing struct { - Type string - Address string + Type string + Address string + Count int + Timeout time.Duration } -func (c *CheckPing) Check() error { - fmt.Printf("Pinging %s .. \n", c.Address) +func (c *CheckPing) Check(debuglvl int) error { + if debuglvl > 0 { + fmt.Printf("Pinging %s .. \n", c.Address) + } + + p, err := ping.NewPinger(c.Address) + if err != nil { + return err + } + + p.Count = 1 + p.Timeout = time.Second * 5 + err = p.Run() + if err != nil { + return err + } + + stats := p.Statistics() + if len(stats.Rtts) < 1 { + return fmt.Errorf("ping failure") + } + + if debuglvl > 0 { + fmt.Printf("Ping RTT: %s\n", stats.Rtts[0]) + } return nil } diff --git a/config/group.go b/config/group.go index 9b32648..0e97fb8 100644 --- a/config/group.go +++ b/config/group.go @@ -23,10 +23,10 @@ func (ag *AlrmGroup) NewHost(name string) (*AlrmHost, error) { return host, nil } -func (ag *AlrmGroup) Check() error { +func (ag *AlrmGroup) Check(debuglvl int) error { for _, host := range ag.Hosts { for _, chk := range host.Checks { - err := chk.Check() + err := chk.Check(debuglvl) if err != nil { return err } diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..71641ff --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module alrm + +go 1.15 + +require golang.org/x/net v0.0.0-20201224014010-6772e930b67b diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..89bc358 --- /dev/null +++ b/go.sum @@ -0,0 +1,7 @@ +golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/main.go b/main.go index cabe3fb..be5440e 100644 --- a/main.go +++ b/main.go @@ -44,7 +44,7 @@ func main() { } fmt.Fprintf(os.Stdout, "%s\n", string(o)) - case "check", "config", "": + case "config", "": _, err := config.ReadConfig(*cfgPath, *debuglvl) if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) @@ -52,26 +52,26 @@ func main() { } fmt.Fprintf(os.Stdout, "Config is OK.\n") - case "test": - cfg, err := config.ReadConfig(*cfgPath, *debuglvl) - if err != nil { - fmt.Fprintf(os.Stderr, "%s\n", err.Error()) - os.Exit(1) - } - + case "check": tn := flag.Arg(1) if tn == "" { fmt.Fprintf(os.Stderr, "test requires a host or group\n") os.Exit(1) } + cfg, err := config.ReadConfig(*cfgPath, 0) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err.Error()) + os.Exit(1) + } + group, exists := cfg.Groups[tn] if !exists { fmt.Fprintf(os.Stderr, "group or host is not defined\n") os.Exit(1) } - err = group.Check() + err = group.Check(*debuglvl) if err != nil { fmt.Fprintf(os.Stderr, "Check failed: %s\n", err.Error()) os.Exit(1)