sensu-plugins-network-checks 0.0.1.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data.tar.gz.sig +2 -0
- data/CHANGELOG.md +8 -0
- data/LICENSE +22 -0
- data/README.md +71 -0
- data/bin/check-banner.rb +88 -0
- data/bin/check-multicast-groups.rb +77 -0
- data/bin/check-netstat-tcp.rb +128 -0
- data/bin/check-ping.rb +105 -0
- data/bin/check-ports.rb +91 -0
- data/bin/check-rbl.rb +102 -0
- data/bin/metrics-interface.rb +83 -0
- data/bin/metrics-net.rb +92 -0
- data/bin/metrics-netif.rb +55 -0
- data/bin/metrics-netstat-tcp.rb +110 -0
- data/bin/metrics-sockstat.rb +75 -0
- data/lib/sensu-plugins-network-checks.rb +7 -0
- metadata +287 -0
- metadata.gz.sig +2 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 313887c517630cb3ea1af2696f2177fd1d1dacc8
|
4
|
+
data.tar.gz: 711ccebf4a7a2487d5387a7f1d3e1e11728f678e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a1320cfabd4bc8ffb4ce71bcffe7bd709a017dda7e56809577024c8e02a4dbf3350874c38015b9ed8a4bef84c2effaca6ee14c7b5188bc793a0ef21cd95a0bf3
|
7
|
+
data.tar.gz: d05ed8213e49614af6e433a70436b4b895aedaff86cc6e8a873c60a024bc6658d0440444881575874133298cb924a128d6a3e81a56feb755f224969d27b123c5
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Q���ч8Q�7��<�іR?����e�P�~qz mv��Ī�<W�7Y!sz
|
data.tar.gz.sig
ADDED
data/CHANGELOG.md
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 devops@yieldbot.com
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
[](https://travis-ci.org/sensu-plugins/sensu-plugins-network-checks)
|
3
|
+
[](http://badge.fury.io/rb/sensu-plugins-network-checks)
|
4
|
+
[](https://codeclimate.com/github/sensu-plugins/sensu-plugins-network-checks)
|
5
|
+
[](https://codeclimate.com/github/sensu-plugins/sensu-plugins-network-checks)
|
6
|
+
[](https://gemnasium.com/sensu-plugins/sensu-plugins-network-checks)
|
7
|
+
|
8
|
+
## Functionality
|
9
|
+
|
10
|
+
## Files
|
11
|
+
* bin/check-banner
|
12
|
+
* bin/check-multicast-groups
|
13
|
+
* bin/check-netstat-tcp
|
14
|
+
* bin/check-ping
|
15
|
+
* bin/check-ports
|
16
|
+
* bin/check-rbl
|
17
|
+
* bin/metrics-interface
|
18
|
+
* bin/metrics-net
|
19
|
+
* bin/metrics-netif
|
20
|
+
* bin/metrics-netstat-tcp
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
**check-multicast-groups**
|
25
|
+
```
|
26
|
+
{
|
27
|
+
"check-multicast-groups": [
|
28
|
+
["eth0", "224.2.2.4"]
|
29
|
+
]
|
30
|
+
}
|
31
|
+
```
|
32
|
+
## Installation
|
33
|
+
|
34
|
+
Add the public key (if you haven’t already) as a trusted certificate
|
35
|
+
|
36
|
+
```
|
37
|
+
gem cert --add <(curl -Ls https://raw.githubusercontent.com/sensu-plugins/sensu-plugins.github.io/master/certs/sensu-plugins.pem)
|
38
|
+
gem install sensu-plugins-network-checks -P MediumSecurity
|
39
|
+
```
|
40
|
+
|
41
|
+
You can also download the key from /certs/ within each repository.
|
42
|
+
|
43
|
+
#### Rubygems
|
44
|
+
|
45
|
+
`gem install sensu-plugins-network`
|
46
|
+
|
47
|
+
#### Bundler
|
48
|
+
|
49
|
+
Add *sensu-plugins-network* to your Gemfile and run `bundle install` or `bundle update`
|
50
|
+
|
51
|
+
`gem install sensu-plugins-network-checks`
|
52
|
+
|
53
|
+
#### Chef
|
54
|
+
|
55
|
+
Using the Sensu **sensu_gem** LWRP
|
56
|
+
```
|
57
|
+
sensu_gem 'sensu-plugins-network-checks' do
|
58
|
+
options('--prerelease')
|
59
|
+
version '0.0.1.alpha.2'
|
60
|
+
end
|
61
|
+
```
|
62
|
+
|
63
|
+
Using the Chef **gem_package** resource
|
64
|
+
```
|
65
|
+
gem_package 'sensu-plugins-network-checks' do
|
66
|
+
options('--prerelease')
|
67
|
+
version '0.0.1.alpha.2'
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
## Notes
|
data/bin/check-banner.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-banner
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# Connect to a TCP port, read one line, test it against a pattern.
|
7
|
+
# Useful for SSH, ZooKeeper, etc.
|
8
|
+
|
9
|
+
# OUTPUT:
|
10
|
+
# plain text
|
11
|
+
#
|
12
|
+
# PLATFORMS:
|
13
|
+
# Linux
|
14
|
+
#
|
15
|
+
# DEPENDENCIES:
|
16
|
+
# gem: sensu-plugin
|
17
|
+
# gem: timeout
|
18
|
+
#
|
19
|
+
# USAGE:
|
20
|
+
#
|
21
|
+
# NOTES:
|
22
|
+
#
|
23
|
+
# LICENSE:
|
24
|
+
# Copyright 2012 Sonian, Inc <chefs@sonian.net>
|
25
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
26
|
+
# for details.
|
27
|
+
#
|
28
|
+
|
29
|
+
require 'sensu-plugin/check/cli'
|
30
|
+
require 'socket'
|
31
|
+
require 'timeout'
|
32
|
+
|
33
|
+
#
|
34
|
+
# Check Banner
|
35
|
+
#
|
36
|
+
class CheckBanner < Sensu::Plugin::Check::CLI
|
37
|
+
option :host,
|
38
|
+
short: '-H HOSTNAME',
|
39
|
+
long: '--hostname HOSTNAME',
|
40
|
+
description: 'Host to connect to',
|
41
|
+
default: 'localhost'
|
42
|
+
|
43
|
+
option :port,
|
44
|
+
short: '-p PORT',
|
45
|
+
long: '--port PORT',
|
46
|
+
proc: proc(&:to_i),
|
47
|
+
default: 22
|
48
|
+
|
49
|
+
option :write,
|
50
|
+
short: '-w STRING',
|
51
|
+
long: '--write STRING',
|
52
|
+
description: 'write STRING to the socket'
|
53
|
+
|
54
|
+
option :pattern,
|
55
|
+
short: '-q PAT',
|
56
|
+
long: '--pattern PAT',
|
57
|
+
description: 'Pattern to search for',
|
58
|
+
default: 'OpenSSH'
|
59
|
+
|
60
|
+
option :timeout,
|
61
|
+
short: '-t SECS',
|
62
|
+
long: '--timeout SECS',
|
63
|
+
description: 'Connection timeout',
|
64
|
+
proc: proc(&:to_i),
|
65
|
+
default: 30
|
66
|
+
|
67
|
+
def acquire_banner # rubocop:disable all
|
68
|
+
timeout(config[:timeout]) do
|
69
|
+
sock = TCPSocket.new(config[:host], config[:port])
|
70
|
+
sock.puts config[:write] if config[:write]
|
71
|
+
sock.readline
|
72
|
+
end
|
73
|
+
rescue Errno::ECONNREFUSED
|
74
|
+
critical "Connection refused by #{config[:host]}:#{config[:port]}"
|
75
|
+
rescue Timeout::Error
|
76
|
+
critical 'Connection or read timed out'
|
77
|
+
rescue Errno::EHOSTUNREACH
|
78
|
+
critical 'Check failed to run: No route to host'
|
79
|
+
rescue EOFError
|
80
|
+
critical 'Connection closed unexpectedly'
|
81
|
+
end
|
82
|
+
|
83
|
+
def run
|
84
|
+
banner = acquire_banner
|
85
|
+
message banner
|
86
|
+
banner =~ /#{config[:pattern]}/ ? ok : warning
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-multicasr-groups
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin checks if specific multicast groups are configured
|
7
|
+
# on specific interfaces. The netstat command is required.
|
8
|
+
#
|
9
|
+
# The configurations can be put in the default sensu config directory
|
10
|
+
# and/or out of the sensu directory, as a JSON file. If the config file
|
11
|
+
# is not in the sensu directry, -c PATH option must be given.
|
12
|
+
#
|
13
|
+
# OUTPUT:
|
14
|
+
# plain text
|
15
|
+
#
|
16
|
+
# PLATFORMS:
|
17
|
+
# Linux
|
18
|
+
#
|
19
|
+
# DEPENDENCIES:
|
20
|
+
# gem: sensu-plugin
|
21
|
+
# gem: json
|
22
|
+
# gem: set
|
23
|
+
#
|
24
|
+
# USAGE:
|
25
|
+
# example commands
|
26
|
+
#
|
27
|
+
# NOTES:
|
28
|
+
# Does it behave differently on specific platforms, specific use cases, etc
|
29
|
+
#
|
30
|
+
# LICENSE:
|
31
|
+
# Copyright 2014 Mitsutoshi Aoe <maoe@foldr.in>
|
32
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
33
|
+
# for details.
|
34
|
+
#
|
35
|
+
|
36
|
+
require 'json'
|
37
|
+
require 'sensu-plugin/check/cli'
|
38
|
+
require 'sensu-plugin/utils'
|
39
|
+
require 'set'
|
40
|
+
|
41
|
+
#
|
42
|
+
# Check Multicast Groups
|
43
|
+
#
|
44
|
+
class CheckMulticastGroups < Sensu::Plugin::Check::CLI
|
45
|
+
include Sensu::Plugin::Utils
|
46
|
+
|
47
|
+
option :config,
|
48
|
+
short: '-c PATH',
|
49
|
+
long: '--config PATH',
|
50
|
+
required: true,
|
51
|
+
description: 'Path to a config file'
|
52
|
+
|
53
|
+
def run # rubocop:disable all
|
54
|
+
targets = settings['check-multicast-groups'] ||= []
|
55
|
+
extras = load_config(config[:config])['check-multicast-groups'] || []
|
56
|
+
targets.deep_merge(extras)
|
57
|
+
|
58
|
+
critical 'No target muticast groups are specified.' if targets.empty?
|
59
|
+
|
60
|
+
iface_pat = /[a-zA-Z0-9\.]+/
|
61
|
+
refcount_pat = /\d+/
|
62
|
+
group_pat = /[a-f0-9\.:]+/ # assumes that -n is given
|
63
|
+
pattern = /(#{iface_pat})\s+#{refcount_pat}\s+(#{group_pat})/
|
64
|
+
|
65
|
+
actual = Set.new(`netstat -ng`.scan(pattern))
|
66
|
+
expected = Set.new(targets)
|
67
|
+
|
68
|
+
diff = expected.difference(actual)
|
69
|
+
if diff.size > 0
|
70
|
+
diff_output = diff.map { |iface, addr| "#{iface}\t#{addr}" }.join("\n")
|
71
|
+
critical "#{diff.size} missing multicast group(s):\n#{diff_output}"
|
72
|
+
end
|
73
|
+
ok
|
74
|
+
rescue => ex
|
75
|
+
critical "Failed to check multicast groups: #{ex}"
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-netstat-tcp
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# Alert based on thresholds of discrete TCP socket states reported by netstat
|
7
|
+
#
|
8
|
+
# OUTPUT:
|
9
|
+
# plain text
|
10
|
+
#
|
11
|
+
# PLATFORMS:
|
12
|
+
# Linux
|
13
|
+
#
|
14
|
+
# DEPENDENCIES:
|
15
|
+
# gem: sensu-plugin
|
16
|
+
# gem: <?>
|
17
|
+
#
|
18
|
+
# USAGE:
|
19
|
+
# $ ./check-netstat-tcp.rb --states ESTABLISHED,CLOSE_WAIT --warning 10,3 --critical 100,30
|
20
|
+
#
|
21
|
+
# NOTES:
|
22
|
+
# - Thanks to metric-netstat-tcp.rb!
|
23
|
+
# https://github.com/sensu/sensu-community-plugins
|
24
|
+
# - Code for parsing Linux /proc/net/tcp from Anthony Goddard's ruby-netstat:
|
25
|
+
# https://github.com/agoddard/ruby-netstat
|
26
|
+
#
|
27
|
+
# LICENSE:
|
28
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
29
|
+
# for details.
|
30
|
+
#
|
31
|
+
|
32
|
+
require 'sensu-plugin/check/cli'
|
33
|
+
require 'socket'
|
34
|
+
|
35
|
+
TCP_STATES = {
|
36
|
+
'00' => 'UNKNOWN', # Bad state ... Impossible to achieve ...
|
37
|
+
'FF' => 'UNKNOWN', # Bad state ... Impossible to achieve ...
|
38
|
+
'01' => 'ESTABLISHED',
|
39
|
+
'02' => 'SYN_SENT',
|
40
|
+
'03' => 'SYN_RECV',
|
41
|
+
'04' => 'FIN_WAIT1',
|
42
|
+
'05' => 'FIN_WAIT2',
|
43
|
+
'06' => 'TIME_WAIT',
|
44
|
+
'07' => 'CLOSE',
|
45
|
+
'08' => 'CLOSE_WAIT',
|
46
|
+
'09' => 'LAST_ACK',
|
47
|
+
'0A' => 'LISTEN',
|
48
|
+
'0B' => 'CLOSING'
|
49
|
+
}
|
50
|
+
|
51
|
+
#
|
52
|
+
# Check Netstat TCP
|
53
|
+
#
|
54
|
+
class CheckNetstatTCP < Sensu::Plugin::Check::CLI
|
55
|
+
option :states,
|
56
|
+
description: 'Comma delimited list of states to check',
|
57
|
+
short: '-s STATES',
|
58
|
+
long: '--states STATES',
|
59
|
+
default: ['ESTABLISHED'],
|
60
|
+
proc: proc { |a| a.split(',') }
|
61
|
+
|
62
|
+
option :critical,
|
63
|
+
description: "Comma delimited list of state values to set critical at (order follows 'states')",
|
64
|
+
short: '-c CRITICAL',
|
65
|
+
long: '--critical CRITICAL',
|
66
|
+
default: [1000],
|
67
|
+
proc: proc { |a| a.split(',').map(&:to_i) }
|
68
|
+
|
69
|
+
option :warning,
|
70
|
+
description: "Comma delimited list of state values to set warning at (order follows 'states')",
|
71
|
+
short: '-w WARNING',
|
72
|
+
long: '--warning WARNING',
|
73
|
+
default: [500],
|
74
|
+
proc: proc { |a| a.split(',').map(&:to_i) }
|
75
|
+
|
76
|
+
option :port,
|
77
|
+
description: 'Port you wish to check values on (default: all)',
|
78
|
+
short: '-p PORT',
|
79
|
+
long: '--port PORT',
|
80
|
+
proc: proc(&:to_i)
|
81
|
+
|
82
|
+
def netstat(protocols = ['tcp']) # rubocop:disable all
|
83
|
+
state_counts = Hash.new(0)
|
84
|
+
TCP_STATES.each_pair { |_hex, name| state_counts[name] = 0 }
|
85
|
+
|
86
|
+
protocols.select { |p| File.exist?('/proc/net/' + p) }.each do |protocol|
|
87
|
+
# #YELLOW
|
88
|
+
File.open('/proc/net/' + protocol).each do |line| # rubocop:disable Style/Next
|
89
|
+
line.strip!
|
90
|
+
if m = line.match(/^\s*\d+:\s+(.{8}|.{32}):(.{4})\s+(.{8}|.{32}):(.{4})\s+(.{2})/) # rubocop:disable AssignmentInCondition
|
91
|
+
connection_state = m[5]
|
92
|
+
connection_port = m[2].to_i(16)
|
93
|
+
connection_state = TCP_STATES[connection_state]
|
94
|
+
next unless config[:states].include?(connection_state)
|
95
|
+
if config[:port] && config[:port] == connection_port
|
96
|
+
state_counts[connection_state] += 1
|
97
|
+
elsif !config[:port]
|
98
|
+
state_counts[connection_state] += 1
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
state_counts
|
104
|
+
end
|
105
|
+
|
106
|
+
def run # rubocop:disable all
|
107
|
+
state_counts = netstat(%w(tcp tcp6))
|
108
|
+
is_critical = false
|
109
|
+
is_warning = false
|
110
|
+
message = ''
|
111
|
+
|
112
|
+
config[:states].each_index do |i|
|
113
|
+
if state_counts[config[:states][i]] >= config[:critical][i]
|
114
|
+
is_critical = true
|
115
|
+
message += " CRITICAL:#{config[:states][i]}=#{state_counts[config[:states][i]]}"
|
116
|
+
elsif state_counts[config[:states][i]] >= config[:warning][i]
|
117
|
+
is_warning = true
|
118
|
+
message += " WARNING:#{config[:states][i]}=#{state_counts[config[:states][i]]}"
|
119
|
+
else
|
120
|
+
message += " OK:#{config[:states][i]}=#{state_counts[config[:states][i]]}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
critical message if is_critical
|
125
|
+
warning message if is_warning
|
126
|
+
ok message
|
127
|
+
end
|
128
|
+
end
|
data/bin/check-ping.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-ping
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This is a simple Ping check script for Sensu.
|
7
|
+
#
|
8
|
+
# OUTPUT:
|
9
|
+
# plain text
|
10
|
+
#
|
11
|
+
# PLATFORMS:
|
12
|
+
# Linux
|
13
|
+
#
|
14
|
+
# DEPENDENCIES:
|
15
|
+
# gem: sensu-plugin
|
16
|
+
# gem: net-ping
|
17
|
+
#
|
18
|
+
# USAGE:
|
19
|
+
# check-ping -h host -T timeout [--report]
|
20
|
+
#
|
21
|
+
# NOTES:
|
22
|
+
#
|
23
|
+
# LICENSE:
|
24
|
+
# Deepak Mohan Dass <deepakmdass88@gmail.com>
|
25
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
26
|
+
# for details.
|
27
|
+
#
|
28
|
+
|
29
|
+
require 'sensu-plugin/check/cli'
|
30
|
+
require 'net/ping'
|
31
|
+
|
32
|
+
#
|
33
|
+
# Check Ping
|
34
|
+
#
|
35
|
+
class CheckPING < Sensu::Plugin::Check::CLI
|
36
|
+
option :host,
|
37
|
+
short: '-h host',
|
38
|
+
default: 'localhost'
|
39
|
+
|
40
|
+
option :timeout,
|
41
|
+
short: '-T timeout',
|
42
|
+
proc: proc(&:to_i),
|
43
|
+
default: 5
|
44
|
+
|
45
|
+
option :count,
|
46
|
+
short: '-c count',
|
47
|
+
description: 'The number of ping requests',
|
48
|
+
proc: proc(&:to_i),
|
49
|
+
default: 1
|
50
|
+
|
51
|
+
option :interval,
|
52
|
+
short: '-i interval',
|
53
|
+
description: 'The number of seconds to wait between ping requests',
|
54
|
+
proc: proc(&:to_f),
|
55
|
+
default: 1
|
56
|
+
|
57
|
+
option :warn_ratio,
|
58
|
+
short: '-W ratio',
|
59
|
+
description: 'Warn if successful ratio is under this value',
|
60
|
+
proc: proc(&:to_f),
|
61
|
+
default: 0.5
|
62
|
+
|
63
|
+
option :critical_ratio,
|
64
|
+
short: '-C ratio',
|
65
|
+
description: 'Critical if successful ratio is under this value',
|
66
|
+
proc: proc(&:to_f),
|
67
|
+
default: 0.2
|
68
|
+
|
69
|
+
option :report,
|
70
|
+
short: '-r',
|
71
|
+
long: '--report',
|
72
|
+
description: 'Attach MTR report if ping is failed',
|
73
|
+
default: false
|
74
|
+
|
75
|
+
def run # rubocop:disable all
|
76
|
+
result = []
|
77
|
+
pt = Net::Ping::External.new(config[:host], nil, config[:timeout])
|
78
|
+
config[:count].times do |i|
|
79
|
+
sleep(config[:interval]) unless i == 0
|
80
|
+
result[i] = pt.ping?
|
81
|
+
end
|
82
|
+
|
83
|
+
successful_count = result.count(true)
|
84
|
+
total_count = config[:count]
|
85
|
+
success_ratio = successful_count / total_count.to_f
|
86
|
+
|
87
|
+
if success_ratio > config[:warn_ratio]
|
88
|
+
success_message = "ICMP ping successful for host: #{config[:host]}"
|
89
|
+
ok success_message
|
90
|
+
else
|
91
|
+
failure_message = "ICMP ping unsuccessful for host: #{config[:host]} (successful: #{successful_count}/#{total_count})"
|
92
|
+
|
93
|
+
if config[:report]
|
94
|
+
report = `mtr --curses --report-cycles=1 --report --no-dns #{config[:host]}`
|
95
|
+
failure_message = failure_message + "\n" + report
|
96
|
+
end
|
97
|
+
|
98
|
+
if success_ratio <= config[:critical_ratio]
|
99
|
+
critical failure_message
|
100
|
+
else
|
101
|
+
warning failure_message
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|