diff --git a/check/check_ping.go b/check/check_ping.go index cde50b3..5ed266c 100644 --- a/check/check_ping.go +++ b/check/check_ping.go @@ -14,6 +14,8 @@ const ( TK_TIMEOUT TK_INTERVAL TK_MAXPACKETLOSS + TK_MAXRTT + TK_MAXAVGRTT ) type CheckPing struct { @@ -23,6 +25,8 @@ type CheckPing struct { Timeout time.Duration Interval time.Duration MaxPacketLoss float64 + MaxRTT time.Duration + MaxAvgRTT time.Duration state int } @@ -63,11 +67,22 @@ func (c *CheckPing) Check(debuglvl int) error { if debuglvl > 0 { fmt.Printf("Packet loss: %.f%%\n", stats.PacketLoss) + fmt.Printf("Max RTT: %s\n", stats.MaxRtt.String()) + fmt.Printf("Max Configured RTT: %s\n", c.MaxRTT.String()) + fmt.Printf("Average RTT: %s\n", stats.AvgRtt.String()) } if stats.PacketLoss > c.MaxPacketLoss { return fmt.Errorf("ping packet loss exceeds max") } + + if c.MaxRTT > 0 && stats.MaxRtt > c.MaxRTT { + return fmt.Errorf("ping rtt exceeds max") + } + + if c.MaxAvgRTT > 0 && stats.AvgRtt > c.MaxAvgRTT { + return fmt.Errorf("ping average rtt exceeds max") + } return nil } @@ -84,6 +99,10 @@ func (c *CheckPing) Parse(tk string) (bool, error) { c.state = TK_INTERVAL case "maxpacketloss": c.state = TK_MAXPACKETLOSS + case "maxrtt": + c.state = TK_MAXRTT + case "maxavgrtt": + c.state = TK_MAXAVGRTT default: return false, nil } @@ -116,6 +135,20 @@ func (c *CheckPing) Parse(tk string) (bool, error) { } c.state = TK_NONE + case TK_MAXRTT: + c.MaxRTT, err = time.ParseDuration(tk) + if err != nil { + return false, fmt.Errorf("invalid maxrtt \"%s\"", tk) + } + c.state = TK_NONE + + case TK_MAXAVGRTT: + c.MaxAvgRTT, err = time.ParseDuration(tk) + if err != nil { + return false, fmt.Errorf("invalid maxavgrtt \"%s\"", tk) + } + c.state = TK_NONE + default: return false, fmt.Errorf("invalid state in check_ping") }