sensu-plugins-network-checks 1.1.0 → 1.2.0
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 +4 -4
- data/CHANGELOG.md +18 -2
- data/README.md +1 -0
- data/bin/check-banner.rb +13 -0
- data/bin/check-multicast-groups.rb +3 -3
- data/bin/check-ping.rb +4 -0
- data/bin/check-ports-bind.rb +158 -0
- data/bin/check-whois-domain-expiration-multi.rb +3 -0
- data/bin/metrics-netif.rb +15 -1
- data/bin/metrics-netstat-tcp.rb +10 -2
- data/lib/sensu-plugins-network-checks/version.rb +1 -1
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 651fd18722857deccf8b625724d9af60f6fa6f11
|
4
|
+
data.tar.gz: fac9caaa1715e6dce254c730f7292c1b229a5efc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 786041c0783aed55f063262ed705438e40af3b662406527a3d9d308190f1597c6c8e539eb08fa82519bb38797208a7e0c6174205b4cc38db4dbfbfe94531ce67
|
7
|
+
data.tar.gz: fd47db814330cc687da22208cc4b642cbd3cdb0c9b1d271529b5a7994f1d58c7d75978dcbf217d062542edc4aee1faa7d49adb1e659b8c613759d72f649deb6d
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,21 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
4
4
|
This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
|
5
5
|
|
6
6
|
## [Unreleased]
|
7
|
+
## [1.2.0] - 2017-06-07
|
8
|
+
### Added
|
9
|
+
- Added check-ports-bind.rb (@hanynowsky)
|
10
|
+
- Added interval option to metrics-netif.rb (@Evesy)
|
11
|
+
- metrics-netif.rb: expose average-key option that is used to `grep` to more easily handle locale issues (@majormoses)
|
12
|
+
- metrics-netif.rb: unknown if it can not find `sar` in its `$PATH` (@majormoses)
|
13
|
+
- check-ping.rb: unknown if using `--reports` and do not have `mtr` installed and in "$PATH" (@majormoses)
|
14
|
+
|
15
|
+
### Fixed
|
16
|
+
- metrics-netstat-tcp.rb: Option to disable IPv6 check (#44 via @MattMencel)
|
17
|
+
- check-multicast-groups.rb: Fix undefined method deep_merge for []:Array (@maoe)
|
18
|
+
- check-whois-domain-expiration-multi.rb does not fail as timeout is cast to integer (@majormoses)
|
19
|
+
|
20
|
+
### Changed
|
21
|
+
- check-banner.rb: Option to enable SSL socket for secure connection
|
7
22
|
|
8
23
|
## [1.1.0] - 2016-08-07
|
9
24
|
### Added
|
@@ -29,7 +44,7 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
|
|
29
44
|
|
30
45
|
## [0.2.4] - 2016-04-02
|
31
46
|
### Fixed
|
32
|
-
- metrics-ping.rb: Fix error when a host
|
47
|
+
- metrics-ping.rb: Fix error when a host cannot be pinged. Convert to a proper metrics check.
|
33
48
|
|
34
49
|
### Added
|
35
50
|
- basic check for netfilter conntrack
|
@@ -151,7 +166,8 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
|
|
151
166
|
|
152
167
|
* initial release, same as community repo
|
153
168
|
|
154
|
-
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/1.
|
169
|
+
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/1.2.0...HEAD
|
170
|
+
[1.2.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/1.1.0...1.2.0
|
155
171
|
[1.1.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/1.0.0...1.1.0
|
156
172
|
[1.0.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/0.2.4...1.0.0
|
157
173
|
[0.2.4]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/0.1.4...0.2.4
|
data/README.md
CHANGED
data/bin/check-banner.rb
CHANGED
@@ -34,6 +34,7 @@
|
|
34
34
|
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
35
35
|
# for details.
|
36
36
|
|
37
|
+
require 'openssl'
|
37
38
|
require 'sensu-plugin/check/cli'
|
38
39
|
require 'socket'
|
39
40
|
require 'timeout'
|
@@ -101,9 +102,21 @@ class CheckBanner < Sensu::Plugin::Check::CLI
|
|
101
102
|
long: '--critmessage MESSAGE',
|
102
103
|
description: 'Custom critical message to send'
|
103
104
|
|
105
|
+
option :ssl,
|
106
|
+
short: '-S',
|
107
|
+
long: '--ssl',
|
108
|
+
description: 'Enable SSL socket for secure connection'
|
109
|
+
|
104
110
|
def acquire_banner(host)
|
105
111
|
Timeout.timeout(config[:timeout]) do
|
106
112
|
sock = TCPSocket.new(host, config[:port])
|
113
|
+
|
114
|
+
if config[:ssl]
|
115
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
116
|
+
sock = OpenSSL::SSL::SSLSocket.new(sock, ssl_context)
|
117
|
+
sock.connect
|
118
|
+
end
|
119
|
+
|
107
120
|
if config[:write]
|
108
121
|
sock.write config[:write]
|
109
122
|
sock.write "\n" unless config[:exclude_newline]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# check-
|
3
|
+
# check-multicast-groups
|
4
4
|
#
|
5
5
|
# DESCRIPTION:
|
6
6
|
# This plugin checks if specific multicast groups are configured
|
@@ -51,7 +51,7 @@ class CheckMulticastGroups < Sensu::Plugin::Check::CLI
|
|
51
51
|
def run
|
52
52
|
targets = settings['check-multicast-groups'] ||= []
|
53
53
|
extras = load_config(config[:config])['check-multicast-groups'] || []
|
54
|
-
targets.
|
54
|
+
targets = targets.concat(extras).uniq
|
55
55
|
|
56
56
|
critical 'No target muticast groups are specified.' if targets.empty?
|
57
57
|
|
@@ -64,7 +64,7 @@ class CheckMulticastGroups < Sensu::Plugin::Check::CLI
|
|
64
64
|
expected = Set.new(targets)
|
65
65
|
|
66
66
|
diff = expected.difference(actual)
|
67
|
-
|
67
|
+
unless diff.empty?
|
68
68
|
diff_output = diff.map { |iface, addr| "#{iface}\t#{addr}" }.join("\n")
|
69
69
|
critical "#{diff.size} missing multicast group(s):\n#{diff_output}"
|
70
70
|
end
|
data/bin/check-ping.rb
CHANGED
@@ -98,6 +98,10 @@ class CheckPING < Sensu::Plugin::Check::CLI
|
|
98
98
|
failure_message = "ICMP ping unsuccessful for host: #{config[:host]} (successful: #{successful_count}/#{total_count})"
|
99
99
|
|
100
100
|
if config[:report]
|
101
|
+
mtr = `mtr --help`
|
102
|
+
if mtr == 1
|
103
|
+
unknown 'mtr is not available in $PATH'
|
104
|
+
end
|
101
105
|
report = `mtr --curses --report-cycles=1 --report --no-dns #{config[:host]}`
|
102
106
|
failure_message = failure_message + "\n" + report
|
103
107
|
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# encoding: UTF-8
|
4
|
+
# check-ports-bind
|
5
|
+
#
|
6
|
+
# DESCRIPTION:
|
7
|
+
# Connect to a TCP/UDP address:port, to check whether open or closed.
|
8
|
+
# Don't use nmap since it's overkill.
|
9
|
+
# Test UDP ports as well: Experimental
|
10
|
+
#
|
11
|
+
# OUTPUT:
|
12
|
+
# plain text
|
13
|
+
#
|
14
|
+
# PLATFORMS:
|
15
|
+
# Linux
|
16
|
+
#
|
17
|
+
# DEPENDENCIES:
|
18
|
+
# gem: sensu-plugin
|
19
|
+
#
|
20
|
+
# USAGE:
|
21
|
+
#
|
22
|
+
# Ports are comma separated and support ranges
|
23
|
+
# ./check-ports.rb -p 127.0.0.1:22,46.20.205.10 --hard --warn
|
24
|
+
# ./check-ports.rb -p 127.0.0.1:22,46.20.205.10:80
|
25
|
+
# If you mention a port without the bind address then the default address is : 0.0.0.0
|
26
|
+
#
|
27
|
+
# NOTES:
|
28
|
+
# By default, checks for openssh on localhost port 22
|
29
|
+
#
|
30
|
+
#
|
31
|
+
# LICENSE:
|
32
|
+
# Adpated from check-ports.rb
|
33
|
+
# Magic Online - www.magic.fr - hanynowsky@gmail.com
|
34
|
+
# September 2016
|
35
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
36
|
+
# for details.
|
37
|
+
|
38
|
+
require 'sensu-plugin/check/cli'
|
39
|
+
require 'socket'
|
40
|
+
require 'timeout'
|
41
|
+
|
42
|
+
#
|
43
|
+
# Check Ports by bound address
|
44
|
+
#
|
45
|
+
class CheckPort < Sensu::Plugin::Check::CLI
|
46
|
+
option(
|
47
|
+
:hard,
|
48
|
+
short: '-d',
|
49
|
+
long: '--hard',
|
50
|
+
description: 'Check given ports on both, TCP & UDP',
|
51
|
+
boolean: true,
|
52
|
+
default: false
|
53
|
+
|
54
|
+
)
|
55
|
+
option(
|
56
|
+
:host,
|
57
|
+
short: '-H HOSTNAME',
|
58
|
+
long: '--hostname HOSTNAME',
|
59
|
+
description: 'default Host address bound to port',
|
60
|
+
default: '0.0.0.0'
|
61
|
+
)
|
62
|
+
|
63
|
+
option(
|
64
|
+
:portbinds,
|
65
|
+
short: '-p PORTS',
|
66
|
+
long: '--portbinds PORTS',
|
67
|
+
description: 'different address:port to check, comma separated (0.0.0.0:22,localhost:25,127.0.0.0.1:8100-8131,192.168.0.12:3030)',
|
68
|
+
default: '0.0.0.0:22'
|
69
|
+
)
|
70
|
+
|
71
|
+
option(
|
72
|
+
:timeout,
|
73
|
+
short: '-t SECS',
|
74
|
+
long: '--timeout SECS',
|
75
|
+
description: 'Connection timeout',
|
76
|
+
proc: proc(&:to_i),
|
77
|
+
default: 10
|
78
|
+
)
|
79
|
+
|
80
|
+
option(
|
81
|
+
:warn,
|
82
|
+
description: 'Alert level. warn(warning) instead of critical',
|
83
|
+
short: '-w',
|
84
|
+
long: '--warn',
|
85
|
+
default: false,
|
86
|
+
boolean: true
|
87
|
+
)
|
88
|
+
|
89
|
+
option(
|
90
|
+
:debug,
|
91
|
+
description: 'Print debug info',
|
92
|
+
short: '-D',
|
93
|
+
long: '--debug',
|
94
|
+
default: false,
|
95
|
+
boolean: true
|
96
|
+
)
|
97
|
+
|
98
|
+
# Severity switcher
|
99
|
+
def severity(warn, text)
|
100
|
+
if warn
|
101
|
+
warning text.to_s
|
102
|
+
else
|
103
|
+
critical text.to_s
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Check address:port
|
108
|
+
def check_port(portbind, okays)
|
109
|
+
address = portbind.split(':')[0]
|
110
|
+
port = portbind.split(':')[1]
|
111
|
+
Timeout.timeout(config[:timeout]) do
|
112
|
+
connection = TCPSocket.new(address, port.to_i)
|
113
|
+
p connection if config[:debug]
|
114
|
+
okays.push("TCP-#{portbind}")
|
115
|
+
end
|
116
|
+
if config[:hard]
|
117
|
+
Timeout.timeout(config[:timeout]) do
|
118
|
+
s = UDPSocket.new
|
119
|
+
s.connect(address, port.to_i)
|
120
|
+
s.close
|
121
|
+
okays.push("UDP-#{portbind}")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
rescue Errno::ECONNREFUSED
|
125
|
+
severity(config[:warn], "Connection refused by #{portbind}")
|
126
|
+
rescue Timeout::Error
|
127
|
+
severity(config[:warn], "Connection or read timed out (#{portbind})")
|
128
|
+
rescue Errno::EHOSTUNREACH
|
129
|
+
severity(config[:warn], "Check failed to run: No route to host (#{portbind})")
|
130
|
+
rescue EOFError
|
131
|
+
severity(config[:warn], "Connection closed unexpectedly (#{portbind})")
|
132
|
+
end
|
133
|
+
|
134
|
+
def run
|
135
|
+
portbinds = config[:portbinds].split(',').flat_map do |port_bind|
|
136
|
+
port_bind = "#{config[:host]}:#{port_bind}" unless port_bind.include? ':'
|
137
|
+
# Port range
|
138
|
+
if port_bind.split(',')[1] =~ /^[0-9]+(-[0-9]+)$/
|
139
|
+
first_port, last_port = port_bind.split('-')
|
140
|
+
(first_port.to_i..last_port.to_i).to_a
|
141
|
+
# Single port
|
142
|
+
else
|
143
|
+
port_bind
|
144
|
+
end
|
145
|
+
end
|
146
|
+
array = []
|
147
|
+
portbinds.each do |port|
|
148
|
+
check_port(port, array)
|
149
|
+
end
|
150
|
+
multiplier = 1
|
151
|
+
multiplier = 2 if config[:hard] == true
|
152
|
+
if array.size == portbinds.size * multiplier
|
153
|
+
ok "All ports (#{config[:portbinds]}) are reachable - HARD: #{config[:hard]} => SUCCESS: #{array}"
|
154
|
+
else
|
155
|
+
severity(config[:warn], 'port count or pattern does not match')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -44,17 +44,20 @@ class WhoisDomainExpirationCheck < Sensu::Plugin::Check::CLI
|
|
44
44
|
short: '-w DAYS',
|
45
45
|
long: '--warn DAYS',
|
46
46
|
default: 30,
|
47
|
+
proc: proc(&:to_i),
|
47
48
|
description: 'Warn if fewer than DAYS away'
|
48
49
|
|
49
50
|
option :critical,
|
50
51
|
short: '-c DAYS',
|
51
52
|
long: '--critical DAYS',
|
53
|
+
proc: proc(&:to_i),
|
52
54
|
default: 7,
|
53
55
|
description: 'Critical if fewer than DAYS away'
|
54
56
|
|
55
57
|
option :timeout,
|
56
58
|
short: '-t SECONDS',
|
57
59
|
long: '--timeout SECONDS',
|
60
|
+
proc: proc(&:to_i),
|
58
61
|
default: 10,
|
59
62
|
description: 'Timeout for whois lookup'
|
60
63
|
|
data/bin/metrics-netif.rb
CHANGED
@@ -37,8 +37,22 @@ class NetIFMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
37
37
|
long: '--scheme SCHEME',
|
38
38
|
default: Socket.gethostname.to_s
|
39
39
|
|
40
|
+
option :interval,
|
41
|
+
description: 'Interval to collect metrics over',
|
42
|
+
long: '--interval INTERVAL',
|
43
|
+
default: 1
|
44
|
+
|
45
|
+
option :average_key,
|
46
|
+
description: 'This key is used to `grep` for a key that corresponds to average. useful for different locales',
|
47
|
+
long: '--average-key',
|
48
|
+
default: 'Average'
|
49
|
+
|
40
50
|
def run
|
41
|
-
`sar -n DEV
|
51
|
+
sar = `sar -n DEV #{config[:interval]} 1 | grep #{config[:average_key]} | grep -v IFACE`
|
52
|
+
if sar.nil? || sar.empty?
|
53
|
+
unknown 'sar is not installed or in $PATH'
|
54
|
+
end
|
55
|
+
sar.each_line do |line|
|
42
56
|
stats = line.split(/\s+/)
|
43
57
|
unless stats.empty?
|
44
58
|
stats.shift
|
data/bin/metrics-netstat-tcp.rb
CHANGED
@@ -76,6 +76,12 @@ class NetstatTCPMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
76
76
|
long: '--port PORT',
|
77
77
|
proc: proc(&:to_i)
|
78
78
|
|
79
|
+
option :disabletcp6,
|
80
|
+
description: 'Disable tcp6 check',
|
81
|
+
short: '-d',
|
82
|
+
long: '--disabletcp6',
|
83
|
+
boolean: true
|
84
|
+
|
79
85
|
def netstat(protocol, pattern, state_counts)
|
80
86
|
File.open('/proc/net/' + protocol).each do |line|
|
81
87
|
line.strip!
|
@@ -101,8 +107,10 @@ class NetstatTCPMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
101
107
|
tcp4_pattern = /^\s*\d+:\s+(.{8}):(.{4})\s+(.{8}):(.{4})\s+(.{2})/
|
102
108
|
state_counts = netstat('tcp', tcp4_pattern, state_counts)
|
103
109
|
|
104
|
-
|
105
|
-
|
110
|
+
unless config[:disabletcp6]
|
111
|
+
tcp6_pattern = /^\s*\d+:\s+(.{32}):(.{4})\s+(.{32}):(.{4})\s+(.{2})/
|
112
|
+
state_counts = netstat('tcp6', tcp6_pattern, state_counts)
|
113
|
+
end
|
106
114
|
|
107
115
|
state_counts.each do |state, count|
|
108
116
|
graphite_name = config[:port] ? "#{config[:scheme]}.#{config[:port]}.#{state}" :
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-network-checks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sensu-Plugins and contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dnsbl-client
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: activesupport
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 4.2
|
75
|
+
version: '4.2'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 4.2
|
82
|
+
version: '4.2'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -233,6 +233,7 @@ executables:
|
|
233
233
|
- check-netfilter-conntrack.rb
|
234
234
|
- check-netstat-tcp.rb
|
235
235
|
- check-ping.rb
|
236
|
+
- check-ports-bind.rb
|
236
237
|
- check-ports-nmap.rb
|
237
238
|
- check-ports.rb
|
238
239
|
- check-rbl.rb
|
@@ -259,6 +260,7 @@ files:
|
|
259
260
|
- bin/check-netfilter-conntrack.sh
|
260
261
|
- bin/check-netstat-tcp.rb
|
261
262
|
- bin/check-ping.rb
|
263
|
+
- bin/check-ports-bind.rb
|
262
264
|
- bin/check-ports-nmap.rb
|
263
265
|
- bin/check-ports.rb
|
264
266
|
- bin/check-rbl.rb
|
@@ -299,7 +301,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
299
301
|
version: '0'
|
300
302
|
requirements: []
|
301
303
|
rubyforge_project:
|
302
|
-
rubygems_version: 2.5
|
304
|
+
rubygems_version: 2.4.5
|
303
305
|
signing_key:
|
304
306
|
specification_version: 4
|
305
307
|
summary: Sensu plugins for checking network hardware, connections, and data
|