added maxpacketloss variable for ping check

This commit is contained in:
Christopher Ramey 2021-01-03 08:17:02 -09:00
parent d80a5a80d7
commit 5c55903e88

View File

@ -3,9 +3,9 @@ package check
import ( import (
"alrm/check/ping" "alrm/check/ping"
"fmt" "fmt"
"time"
"strings"
"strconv" "strconv"
"strings"
"time"
) )
const ( const (
@ -13,6 +13,7 @@ const (
TK_COUNT TK_COUNT
TK_TIMEOUT TK_TIMEOUT
TK_INTERVAL TK_INTERVAL
TK_MAXPACKETLOSS
) )
type CheckPing struct { type CheckPing struct {
@ -21,6 +22,7 @@ type CheckPing struct {
Count int Count int
Timeout time.Duration Timeout time.Duration
Interval time.Duration Interval time.Duration
MaxPacketLoss float64
state int state int
} }
@ -28,7 +30,7 @@ func NewCheckPing(addr string) *CheckPing {
return &CheckPing{ return &CheckPing{
Type: "ping", Address: addr, Type: "ping", Address: addr,
Count: 1, Timeout: time.Second * 5, Count: 1, Timeout: time.Second * 5,
Interval: time.Second, Interval: time.Second, MaxPacketLoss: 0,
} }
} }
@ -52,15 +54,20 @@ func (c *CheckPing) Check(debuglvl int) error {
} }
stats := p.Statistics() stats := p.Statistics()
if len(stats.Rtts) < 1 {
return fmt.Errorf("ping failure")
}
if debuglvl > 0 { if debuglvl > 1 {
for i, r := range stats.Rtts { for i, r := range stats.Rtts {
fmt.Printf("Ping %d: %s\n", i+1, r) fmt.Printf("Ping %d: %s\n", i+1, r)
} }
} }
if debuglvl > 0 {
fmt.Printf("Packet loss: %.f%%\n", stats.PacketLoss)
}
if stats.PacketLoss > c.MaxPacketLoss {
return fmt.Errorf("ping packet loss exceeds max")
}
return nil return nil
} }
@ -68,13 +75,15 @@ func (c *CheckPing) Parse(tk string) (bool, error) {
var err error var err error
switch c.state { switch c.state {
case TK_NONE: case TK_NONE:
switch strings.ToLower(tk){ switch strings.ToLower(tk) {
case "count": case "count":
c.state = TK_COUNT c.state = TK_COUNT
case "timeout": case "timeout":
c.state = TK_TIMEOUT c.state = TK_TIMEOUT
case "interval": case "interval":
c.state = TK_INTERVAL c.state = TK_INTERVAL
case "maxpacketloss":
c.state = TK_MAXPACKETLOSS
default: default:
return false, nil return false, nil
} }
@ -100,6 +109,13 @@ func (c *CheckPing) Parse(tk string) (bool, error) {
} }
c.state = TK_NONE c.state = TK_NONE
case TK_MAXPACKETLOSS:
c.MaxPacketLoss, err = strconv.ParseFloat(tk, 64)
if err != nil {
return false, fmt.Errorf("invalid minpacketloss \"%s\"", tk)
}
c.state = TK_NONE
default: default:
return false, fmt.Errorf("invalid state in check_ping") return false, fmt.Errorf("invalid state in check_ping")
} }