sensu-plugins-network-checks 4.1.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c2ce6e609965658347f8c02baa043e102a8f02c2963c01e0bd3e6ec1376da59a
4
- data.tar.gz: e8728d260dbcedfe9925ab777bc87dc7135a265a0097fa03a3ebc8d93b8bb420
3
+ metadata.gz: 9403cddd827516f176d2c6e53e8269e16c407c9dab1cd403dd03f4be819ee9ea
4
+ data.tar.gz: 43c4090041fb9f1218a6578771b8632221c894a9dbdb8e7f38cc845a8812890c
5
5
  SHA512:
6
- metadata.gz: 993526dc40bef783d55a7ea7270dce6ae98a99326890dfbc84396f15eb32aa6c18481de783b42dca7421b5c9f13ecdf615eeedfbe8da2427240579a89add5086
7
- data.tar.gz: 01b9d44c7164813948a35c2e258c37cf6d7ae2001f105ae7ed710827a9c1e8bce17303907dfb6b752930b9f6c72bff95f3ec9b0aa176597b6af1eabd1e227a14
6
+ metadata.gz: '0058fc17e30c10c24a204b79894ecc051c91d7e056e7b932807bfe0fa3aee32933fe24e1502bec71fabf5cc2a695e481e3689fe14e9d5bb25e8ebbb873737cf5'
7
+ data.tar.gz: e70c078cb49a2d5650767874f52c5e2e5f5d33e00fe0e432a3c8ed0db13fc9ad17c1cda46d80a257647b19fb5c8d522c9e88f59f9ced08183eb3f3cffc983163
@@ -4,11 +4,31 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
  This CHANGELOG follows the format listed [here](https://github.com/sensu-plugins/community/blob/master/HOW_WE_CHANGELOG.md)
5
5
 
6
6
  ## [Unreleased]
7
+ ## [5.0.0] 2020-01-26
8
+ ### Breaking Changes
9
+ - `metrics-sockstat.rb`: Added hostname to default metric scheme.
10
+ - `metrics-netstat-tcp.rb`: Added support to choose between local and remote port metrics. Defaults to local. Metric scheme extended to indicate local or remote.
11
+
12
+ ### Added
13
+ - `metrics-interface.rb`: options to include or exclude interfaces via regex. `-X`, `--exclude-interfaces-regex` and `-I`, `--include-interfaces-regex` as alternative to `-x` and `-i`.
14
+ - `check-ports-bind.rb`: Allow to specify the protocol to check for each port individually (address:port/proto)
15
+
16
+
17
+ ### Changed
18
+ - Updated net-ping runtime dependancy to '2.0.6'
19
+ - Updated rake development dependancy to '~> 12.3'
20
+ - Removed centos build from bonsai.yml
21
+ - Updated whois-parser to ~> 1.2
22
+ - Updated rubocop dependency to '~> 0.79.0'
23
+ - Reconciled issues identified by updating rubocop
24
+ - Updated rake requirement to '~> 13.0'
25
+ - Updated rdoc requirement to '~> 6.2.0'
7
26
 
8
27
  ## [4.1.1] - 2019-12-18
9
28
  ### Changed
10
29
  - Updated README to conform with standardization guidelines (sensu-plugins/community#134)
11
30
  - Updated bundler development depedency to '~> 2.1'
31
+ - Removed codeclimate development dependency
12
32
 
13
33
  ## [4.1.0] - 2019-012-12
14
34
  ### Added
@@ -250,7 +270,8 @@ This CHANGELOG follows the format listed [here](https://github.com/sensu-plugin
250
270
 
251
271
  * initial release, same as community repo
252
272
 
253
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/4.1.1...HEAD
273
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/5.0.0...HEAD
274
+ [5.0.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/4.1.1...5.0.0
254
275
  [4.1.1]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/4.0.0...4.1.1
255
276
  [4.1.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/4.0.0...4.1.0
256
277
  [4.0.0]: https://github.com/sensu-plugins/sensu-plugins-network-checks/compare/3.2.1...4.0.0
@@ -85,5 +85,4 @@ class CheckMTU < Sensu::Plugin::Check::CLI
85
85
  ok_message = "#{mtu} matches #{required_mtu}"
86
86
  ok ok_message
87
87
  end
88
- # rubocop:enable Metrics/AbcSize
89
88
  end
@@ -68,7 +68,7 @@ class CheckMulticastGroups < Sensu::Plugin::Check::CLI
68
68
  critical "#{diff.size} missing multicast group(s):\n#{diff_output}"
69
69
  end
70
70
  ok
71
- rescue StandardError => ex
72
- critical "Failed to check multicast groups: #{ex}"
71
+ rescue StandardError => e
72
+ critical "Failed to check multicast groups: #{e}"
73
73
  end
74
74
  end
@@ -61,7 +61,7 @@ class CheckNetfilterConntrack < Sensu::Plugin::Check::CLI
61
61
  def run
62
62
  max = nf_conntrack_max
63
63
  count = nf_conntrack_count
64
- percentage = (count.to_f / max.to_f) * 100
64
+ percentage = (count / max.to_f) * 100
65
65
 
66
66
  message "Table is at #{percentage.round(1)}% (#{count}/#{max})"
67
67
 
@@ -92,6 +92,7 @@ class CheckNetstatTCP < Sensu::Plugin::Check::CLI
92
92
  connection_port = m[2].to_i(16)
93
93
  connection_state = TCP_STATES[connection_state]
94
94
  next unless config[:states].include?(connection_state)
95
+
95
96
  if config[:port] && config[:port] == connection_port
96
97
  state_counts[connection_state] += 1
97
98
  elsif !config[:port]
@@ -23,10 +23,11 @@
23
23
  # Ports are comma separated and support ranges
24
24
  # ./check-ports.rb -p 127.0.0.1:22,46.20.205.10 --hard --warn
25
25
  # ./check-ports.rb -p 127.0.0.1:22,46.20.205.10:80
26
+ # ./check-ports.rb -p 127.0.0.1:22,127.0.0.1:1812/udp,46.20.205.10:389/both
26
27
  # If you mention a port without the bind address then the default address is : 0.0.0.0
27
28
  #
28
29
  # NOTES:
29
- # By default, checks for openssh on localhost port 22
30
+ # By default, checks for openssh on localhost port 22 (TCP)
30
31
  #
31
32
  #
32
33
  # LICENSE:
@@ -48,11 +49,11 @@ class CheckPort < Sensu::Plugin::Check::CLI
48
49
  :hard,
49
50
  short: '-d',
50
51
  long: '--hard',
51
- description: 'Check given ports on both, TCP & UDP',
52
+ description: 'Check given ports on both, TCP & UDP, if no explicit protocol is set',
52
53
  boolean: true,
53
54
  default: false
54
-
55
55
  )
56
+
56
57
  option(
57
58
  :host,
58
59
  short: '-H HOSTNAME',
@@ -65,7 +66,7 @@ class CheckPort < Sensu::Plugin::Check::CLI
65
66
  :portbinds,
66
67
  short: '-p PORTS',
67
68
  long: '--portbinds PORTS',
68
- 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)',
69
+ description: 'different address:port/protocol to check, comma separated (0.0.0.0:22,localhost:25/tcp,127.0.0.0.1:8100-8131/udp,192.168.0.12:3030/both)',
69
70
  default: '0.0.0.0:22'
70
71
  )
71
72
 
@@ -99,59 +100,126 @@ class CheckPort < Sensu::Plugin::Check::CLI
99
100
  # Severity switcher
100
101
  def severity(warn, text)
101
102
  if warn
102
- warning text.to_s
103
+ warning(text.to_s)
103
104
  else
104
- critical text.to_s
105
+ critical(text.to_s)
105
106
  end
106
107
  end
107
108
 
108
- # Check address:port
109
- def check_port(portbind, okays)
110
- address = portbind.split(':')[0]
111
- port = portbind.split(':')[1]
109
+ # Check valid port number
110
+ def valid_port?(port)
111
+ return false unless port =~ /^[0-9]+$/
112
+
113
+ (0..65_535).include?(port.to_i)
114
+ end
115
+
116
+ # Check valid port range
117
+ def valid_port_range?(port)
118
+ return false unless port =~ /^[0-9]+-[0-9]+$/
119
+
120
+ port_start, port_end = port.split('-', 2)
121
+
122
+ valid_port?(port_start) && valid_port?(port_end) && port_start.to_i <= port_end.to_i
123
+ end
124
+
125
+ # Ports to check
126
+ def portbinds
127
+ default_protocol = config[:hard] ? 'both' : 'tcp'
128
+ binds = []
129
+
130
+ config[:portbinds].split(',').each do |portbind|
131
+ portbind = "#{config[:host]}:#{portbind}" unless portbind.include?(':')
132
+ portbind = "#{portbind}/#{default_protocol}" unless portbind.include?('/')
133
+
134
+ protocol = portbind.split('/')[1] || default_protocol
135
+ address_port = portbind.split('/')[0]
136
+ address = address_port.split(':')[0]
137
+ port = address_port.split(':')[1]
138
+
139
+ if valid_port_range?(port)
140
+ # Port range
141
+
142
+ first_port, last_port = port.split('-', 2)
143
+ (first_port.to_i..last_port.to_i).each do |p|
144
+ binds += portbindings(address, p, protocol)
145
+ end
146
+ elsif valid_port?(port)
147
+ # Single port
148
+
149
+ binds += portbindings(address, port, protocol)
150
+ else
151
+ critical("Invalid port or port range: #{port}")
152
+ end
153
+ end
154
+
155
+ binds
156
+ end
157
+
158
+ def portbindings(address, port, protocol)
159
+ if protocol == 'both'
160
+ [
161
+ { address: address, port: port, protocol: 'tcp' },
162
+ { address: address, port: port, protocol: 'udp' }
163
+ ]
164
+ else
165
+ [{ address: address, port: port, protocol: protocol }]
166
+ end
167
+ end
168
+
169
+ # Portbind hash to string
170
+ def portbind_to_s(portbind)
171
+ "#{portbind[:address]}:#{portbind[:port]}/#{portbind[:protocol]}"
172
+ end
173
+
174
+ # Check TCP port
175
+ def check_tcp_port(portbind, okays)
112
176
  Timeout.timeout(config[:timeout]) do
113
- connection = TCPSocket.new(address, port.to_i)
177
+ connection = TCPSocket.new(portbind[:address], portbind[:port])
114
178
  p connection if config[:debug]
115
- okays.push("TCP-#{portbind}")
179
+ okays.push(portbind_to_s(portbind))
116
180
  end
117
- if config[:hard]
118
- Timeout.timeout(config[:timeout]) do
119
- s = UDPSocket.new
120
- s.connect(address, port.to_i)
121
- s.close
122
- okays.push("UDP-#{portbind}")
123
- end
181
+ end
182
+
183
+ # Check UDP port
184
+ def check_udp_port(portbind, okays)
185
+ Timeout.timeout(config[:timeout]) do
186
+ s = UDPSocket.new
187
+ s.connect(portbind[:address], portbind[:port])
188
+ s.close
189
+ okays.push(portbind_to_s(portbind))
190
+ end
191
+ end
192
+
193
+ # Check address:port/protocol
194
+ def check_port(portbind, okays)
195
+ case portbind[:protocol].downcase
196
+ when 'tcp'
197
+ check_tcp_port(portbind, okays)
198
+ when 'udp'
199
+ check_udp_port(portbind, okays)
200
+ else
201
+ severity(config[:warn], "Unsupported protocol #{portbind_to_s(portbind)}")
124
202
  end
125
203
  rescue Errno::ECONNREFUSED
126
- severity(config[:warn], "Connection refused by #{portbind}")
204
+ severity(config[:warn], "Connection refused by #{portbind_to_s(portbind)}")
127
205
  rescue Timeout::Error
128
- severity(config[:warn], "Connection or read timed out (#{portbind})")
206
+ severity(config[:warn], "Connection or read timed out (#{portbind_to_s(portbind)})")
129
207
  rescue Errno::EHOSTUNREACH
130
- severity(config[:warn], "Check failed to run: No route to host (#{portbind})")
208
+ severity(config[:warn], "Check failed to run: No route to host (#{portbind_to_s(portbind)})")
131
209
  rescue EOFError
132
- severity(config[:warn], "Connection closed unexpectedly (#{portbind})")
210
+ severity(config[:warn], "Connection closed unexpectedly (#{portbind_to_s(portbind)})")
133
211
  end
134
212
 
135
213
  def run
136
- portbinds = config[:portbinds].split(',').flat_map do |port_bind|
137
- port_bind = "#{config[:host]}:#{port_bind}" unless port_bind.include? ':'
138
- # Port range
139
- if port_bind.split(',')[1] =~ /^[0-9]+(-[0-9]+)$/
140
- first_port, last_port = port_bind.split('-')
141
- (first_port.to_i..last_port.to_i).to_a
142
- # Single port
143
- else
144
- port_bind
145
- end
146
- end
147
- array = []
148
- portbinds.each do |port|
149
- check_port(port, array)
214
+ ports = portbinds
215
+ okays = []
216
+
217
+ ports.each do |portbind|
218
+ check_port(portbind, okays)
150
219
  end
151
- multiplier = 1
152
- multiplier = 2 if config[:hard] == true
153
- if array.size == portbinds.size * multiplier
154
- ok "All ports (#{config[:portbinds]}) are reachable - HARD: #{config[:hard]} => SUCCESS: #{array}"
220
+
221
+ if okays.size == ports.size
222
+ ok "All ports (#{config[:portbinds]}) are reachable: #{okays.join(', ')}"
155
223
  else
156
224
  severity(config[:warn], 'port count or pattern does not match')
157
225
  end
@@ -38,6 +38,16 @@ class InterfaceGraphite < Sensu::Plugin::Metric::CLI::Graphite
38
38
  long: '--scheme SCHEME',
39
39
  default: "#{Socket.gethostname}.interface"
40
40
 
41
+ option :excludeinterfaceregex,
42
+ description: 'Regex matching interfaces to exclude',
43
+ short: '-X INTERFACE',
44
+ long: '--exclude-interface-regex'
45
+
46
+ option :includeinterfaceregex,
47
+ description: 'Regex matching interfaces to include',
48
+ short: '-I INTERFACE',
49
+ long: '--include-interface-regex'
50
+
41
51
  option :excludeinterface,
42
52
  description: 'List of interfaces to exclude',
43
53
  short: '-x INTERFACE[,INTERFACE]',
@@ -72,9 +82,12 @@ class InterfaceGraphite < Sensu::Plugin::Metric::CLI::Graphite
72
82
 
73
83
  File.open('/proc/net/dev', 'r').each_line do |line|
74
84
  interface, stats_string = line.scan(/^\s*([^:]+):\s*(.*)$/).first
85
+ next if config[:excludeinterfaceregex] && (interface =~ /#{config[:excludeinterfaceregex]}/)
86
+ next if config[:includeinterfaceregex] && (interface !~ /#{config[:includeinterfaceregex]}/)
75
87
  next if config[:excludeinterface] && config[:excludeinterface].find { |x| line.match(x) }
76
88
  next if config[:includeinterface] && !(config[:includeinterface].find { |x| line.match(x) })
77
89
  next unless interface
90
+
78
91
  if interface.is_a?(String)
79
92
  interface = interface.tr('.', '_')
80
93
  end
@@ -83,6 +83,7 @@ class LinuxPacketMetrics < Sensu::Plugin::Metric::CLI::Graphite
83
83
 
84
84
  Dir.glob('/sys/class/net/*').each do |iface_path|
85
85
  next if File.file?(iface_path)
86
+
86
87
  iface = File.basename(iface_path)
87
88
  next if iface == 'lo'
88
89
 
@@ -78,6 +78,12 @@ class NetstatTCPMetrics < Sensu::Plugin::Metric::CLI::Graphite
78
78
  long: '--port PORT',
79
79
  proc: proc(&:to_i)
80
80
 
81
+ option :type,
82
+ description: 'Specify the type of the port to get metrics for: Local (default) or remote',
83
+ short: '-t local|remote',
84
+ long: '--type local|remote',
85
+ default: 'local'
86
+
81
87
  option :disabletcp6,
82
88
  description: 'Disable tcp6 check',
83
89
  short: '-d',
@@ -89,7 +95,13 @@ class NetstatTCPMetrics < Sensu::Plugin::Metric::CLI::Graphite
89
95
  line.strip!
90
96
  if m = line.match(pattern) # rubocop:disable AssignmentInCondition
91
97
  connection_state = m[5]
92
- connection_port = m[2].to_i(16)
98
+ if config[:type] == 'local'
99
+ connection_port = m[2].to_i(16)
100
+ elsif config[:type] == 'remote'
101
+ connection_port = m[4].to_i(16)
102
+ else
103
+ unknown "Unknown type level #{config[:type]}. Available values are: local, remote."
104
+ end
93
105
  connection_state = TCP_STATES[connection_state]
94
106
  if config[:port] && config[:port] == connection_port
95
107
  state_counts[connection_state] += 1
@@ -115,7 +127,7 @@ class NetstatTCPMetrics < Sensu::Plugin::Metric::CLI::Graphite
115
127
  end
116
128
 
117
129
  state_counts.each do |state, count|
118
- graphite_name = config[:port] ? "#{config[:scheme]}.#{config[:port]}.#{state}" :
130
+ graphite_name = config[:port] ? "#{config[:scheme]}.#{config[:port]}.#{config[:type]}.#{state}" :
119
131
  "#{config[:scheme]}.#{state}"
120
132
  output graphite_name.to_s, count, timestamp
121
133
  end
@@ -73,7 +73,7 @@ class PingMetrics < Sensu::Plugin::Metric::CLI::Graphite
73
73
 
74
74
  OVERVIEW_METRICS = %i[packets_transmitted packets_received packet_loss time].freeze
75
75
  STATISTIC_METRICS = %i[min avg max mdev].freeze
76
- FLOAT = '(\d+\.\d+)'.freeze
76
+ FLOAT = '(\d+\.\d+)'
77
77
 
78
78
  def overview
79
79
  @ping.split("\n")[-2].scan(/^(\d+) packets transmitted, (\d+) received, (\d+)% packet loss, time (\d+)ms/)[0]
@@ -35,7 +35,7 @@ class MetricsSockstat < Sensu::Plugin::Metric::CLI::Graphite
35
35
  description: 'Metric naming scheme, text to prepend to $protocol.$field',
36
36
  long: '--scheme SCHEME',
37
37
  short: '-s SCHEME',
38
- default: 'network.sockets'
38
+ default: "#{Socket.gethostname}.network.sockets"
39
39
 
40
40
  def output_metric(name, value)
41
41
  output "#{@config[:scheme]}.#{name} #{value} #{@timestamp}"
@@ -55,7 +55,7 @@ class MetricsSockstat < Sensu::Plugin::Metric::CLI::Graphite
55
55
  end
56
56
 
57
57
  def read_sockstat
58
- return IO.read('/proc/net/sockstat')
58
+ IO.read('/proc/net/sockstat')
59
59
  rescue StandardError => e
60
60
  unknown "Failed to read /proc/net/sockstat: #{e}"
61
61
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module SensuPluginsNetworkChecks
4
4
  module Version
5
- MAJOR = 4
6
- MINOR = 1
7
- PATCH = 1
5
+ MAJOR = 5
6
+ MINOR = 0
7
+ PATCH = 0
8
8
 
9
9
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
10
10
  end
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: 4.1.1
4
+ version: 5.0.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: 2020-01-10 00:00:00.000000000 Z
11
+ date: 2020-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.2
47
+ version: 1.0.4
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.2
54
+ version: 1.0.4
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: net-ping
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.7.8
61
+ version: 2.0.6
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.7.8
68
+ version: 2.0.6
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: whois
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.0
89
+ version: '1.2'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.0
96
+ version: '1.2'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bundler
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '2.1'
111
- - !ruby/object:Gem::Dependency
112
- name: codeclimate-test-reporter
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '0.4'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '0.4'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: github-markup
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -156,28 +142,28 @@ dependencies:
156
142
  requirements:
157
143
  - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '10.0'
145
+ version: '13.0'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '10.0'
152
+ version: '13.0'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: rdoc
169
155
  requirement: !ruby/object:Gem::Requirement
170
156
  requirements:
171
157
  - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: 5.1.0
159
+ version: 6.2.0
174
160
  type: :development
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: 5.1.0
166
+ version: 6.2.0
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: redcarpet
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -212,14 +198,14 @@ dependencies:
212
198
  requirements:
213
199
  - - "~>"
214
200
  - !ruby/object:Gem::Version
215
- version: 0.51.0
201
+ version: 0.79.0
216
202
  type: :development
217
203
  prerelease: false
218
204
  version_requirements: !ruby/object:Gem::Requirement
219
205
  requirements:
220
206
  - - "~>"
221
207
  - !ruby/object:Gem::Version
222
- version: 0.51.0
208
+ version: 0.79.0
223
209
  - !ruby/object:Gem::Dependency
224
210
  name: yard
225
211
  requirement: !ruby/object:Gem::Requirement