riemann-tools 1.1.1 → 1.4.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +8 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +60 -2
  7. data/Rakefile +17 -3
  8. data/bin/riemann-apache-status +1 -106
  9. data/bin/riemann-bench +2 -70
  10. data/bin/riemann-cloudant +1 -56
  11. data/bin/riemann-consul +1 -106
  12. data/bin/riemann-dir-files-count +1 -55
  13. data/bin/riemann-dir-space +1 -55
  14. data/bin/riemann-diskstats +1 -92
  15. data/bin/riemann-fd +2 -81
  16. data/bin/riemann-freeswitch +2 -119
  17. data/bin/riemann-haproxy +1 -58
  18. data/bin/riemann-health +0 -2
  19. data/bin/riemann-kvminstance +2 -22
  20. data/bin/riemann-md +8 -0
  21. data/bin/riemann-memcached +1 -37
  22. data/bin/riemann-net +0 -2
  23. data/bin/riemann-nginx-status +1 -85
  24. data/bin/riemann-ntp +0 -2
  25. data/bin/riemann-portcheck +1 -44
  26. data/bin/riemann-proc +1 -108
  27. data/bin/riemann-varnish +1 -54
  28. data/bin/riemann-wrapper +113 -0
  29. data/bin/riemann-zookeeper +1 -39
  30. data/bin/riemann-zpool +8 -0
  31. data/lib/riemann/tools/apache_status.rb +107 -0
  32. data/lib/riemann/tools/bench.rb +72 -0
  33. data/lib/riemann/tools/cloudant.rb +57 -0
  34. data/lib/riemann/tools/consul_health.rb +107 -0
  35. data/lib/riemann/tools/dir_files_count.rb +56 -0
  36. data/lib/riemann/tools/dir_space.rb +56 -0
  37. data/lib/riemann/tools/diskstats.rb +94 -0
  38. data/lib/riemann/tools/fd.rb +81 -0
  39. data/lib/riemann/tools/freeswitch.rb +119 -0
  40. data/lib/riemann/tools/haproxy.rb +59 -0
  41. data/lib/riemann/tools/health.rb +150 -19
  42. data/lib/riemann/tools/kvm.rb +23 -0
  43. data/lib/riemann/tools/md.rb +35 -0
  44. data/lib/riemann/tools/mdstat_parser.tab.rb +340 -0
  45. data/lib/riemann/tools/memcached.rb +38 -0
  46. data/lib/riemann/tools/net.rb +2 -1
  47. data/lib/riemann/tools/nginx_status.rb +86 -0
  48. data/lib/riemann/tools/ntp.rb +1 -0
  49. data/lib/riemann/tools/portcheck.rb +45 -0
  50. data/lib/riemann/tools/proc.rb +109 -0
  51. data/lib/riemann/tools/riemann_client_wrapper.rb +43 -0
  52. data/lib/riemann/tools/uptime_parser.tab.rb +323 -0
  53. data/lib/riemann/tools/varnish.rb +55 -0
  54. data/lib/riemann/tools/version.rb +1 -1
  55. data/lib/riemann/tools/zookeeper.rb +40 -0
  56. data/lib/riemann/tools/zpool.rb +40 -0
  57. data/lib/riemann/tools.rb +2 -20
  58. data/riemann-tools.gemspec +10 -1
  59. data/tools/riemann-aws/Rakefile +6 -9
  60. data/tools/riemann-aws/bin/riemann-aws-billing +2 -87
  61. data/tools/riemann-aws/bin/riemann-aws-rds-status +2 -62
  62. data/tools/riemann-aws/bin/riemann-aws-sqs-status +2 -44
  63. data/tools/riemann-aws/bin/riemann-aws-status +2 -77
  64. data/tools/riemann-aws/bin/riemann-elb-metrics +2 -162
  65. data/tools/riemann-aws/bin/riemann-s3-list +2 -81
  66. data/tools/riemann-aws/bin/riemann-s3-status +2 -96
  67. data/tools/riemann-aws/lib/riemann/tools/aws/billing.rb +87 -0
  68. data/tools/riemann-aws/lib/riemann/tools/aws/elb_metrics.rb +163 -0
  69. data/tools/riemann-aws/lib/riemann/tools/aws/rds_status.rb +63 -0
  70. data/tools/riemann-aws/lib/riemann/tools/aws/s3_list.rb +82 -0
  71. data/tools/riemann-aws/lib/riemann/tools/aws/s3_status.rb +97 -0
  72. data/tools/riemann-aws/lib/riemann/tools/aws/sqs_status.rb +45 -0
  73. data/tools/riemann-aws/lib/riemann/tools/aws/status.rb +74 -0
  74. data/tools/riemann-chronos/Rakefile +6 -9
  75. data/tools/riemann-chronos/bin/riemann-chronos +1 -154
  76. data/tools/riemann-chronos/lib/riemann/tools/chronos.rb +157 -0
  77. data/tools/riemann-docker/Rakefile +5 -8
  78. data/tools/riemann-docker/bin/riemann-docker +2 -200
  79. data/tools/riemann-docker/lib/riemann/tools/docker.rb +200 -0
  80. data/tools/riemann-elasticsearch/Rakefile +6 -9
  81. data/tools/riemann-elasticsearch/bin/riemann-elasticsearch +1 -167
  82. data/tools/riemann-elasticsearch/lib/riemann/tools/elasticsearch.rb +170 -0
  83. data/tools/riemann-marathon/Rakefile +6 -9
  84. data/tools/riemann-marathon/bin/riemann-marathon +1 -156
  85. data/tools/riemann-marathon/lib/riemann/tools/marathon.rb +159 -0
  86. data/tools/riemann-mesos/Rakefile +6 -9
  87. data/tools/riemann-mesos/bin/riemann-mesos +1 -139
  88. data/tools/riemann-mesos/lib/riemann/tools/mesos.rb +142 -0
  89. data/tools/riemann-munin/Rakefile +5 -8
  90. data/tools/riemann-munin/bin/riemann-munin +1 -36
  91. data/tools/riemann-munin/lib/riemann/tools/munin.rb +37 -0
  92. data/tools/riemann-rabbitmq/Rakefile +6 -9
  93. data/tools/riemann-rabbitmq/bin/riemann-rabbitmq +1 -266
  94. data/tools/riemann-rabbitmq/lib/riemann/tools/rabbitmq.rb +269 -0
  95. data/tools/riemann-riak/Rakefile +5 -8
  96. data/tools/riemann-riak/bin/riemann-riak +1 -316
  97. data/tools/riemann-riak/bin/riemann-riak-keys +0 -1
  98. data/tools/riemann-riak/bin/riemann-riak-ring +0 -1
  99. data/tools/riemann-riak/lib/riemann/tools/riak.rb +317 -0
  100. metadata +64 -10
  101. data/.travis.yml +0 -31
  102. data/tools/riemann-riak/riak_status/key_count.erl +0 -13
  103. data/tools/riemann-riak/riak_status/riak_status.rb +0 -152
  104. data/tools/riemann-riak/riak_status/ringready.erl +0 -9
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'riemann/tools'
4
4
  require 'riemann/tools/utils'
5
+ require 'riemann/tools/uptime_parser.tab'
5
6
 
7
+ # Reports current CPU, disk, load average, and memory use to riemann.
6
8
  module Riemann
7
9
  module Tools
8
10
  class Health
@@ -14,12 +16,18 @@ module Riemann
14
16
  opt :disk_warning, 'Disk warning threshold (fraction of space used)', default: 0.9
15
17
  opt :disk_critical, 'Disk critical threshold (fraction of space used)', default: 0.95
16
18
  opt :disk_ignorefs, 'A list of filesystem types to ignore',
17
- default: %w[anon_inodefs autofs cd9660 devfs devtmpfs fdescfs iso9660 linprocfs linsysfs nfs overlay procfs tmpfs]
19
+ default: %w[anon_inodefs autofs cd9660 devfs devtmpfs fdescfs iso9660 linprocfs linsysfs nfs overlay procfs squashfs tmpfs]
18
20
  opt :load_warning, 'Load warning threshold (load average / core)', default: 3.0
19
21
  opt :load_critical, 'Load critical threshold (load average / core)', default: 8.0
20
22
  opt :memory_warning, 'Memory warning threshold (fraction of RAM)', default: 0.85
21
23
  opt :memory_critical, 'Memory critical threshold (fraction of RAM)', default: 0.95
22
- opt :checks, 'A list of checks to run.', type: :strings, default: %w[cpu load memory disk]
24
+ opt :uptime_warning, 'Uptime warning threshold', default: 86_400
25
+ opt :uptime_critical, 'Uptime critical threshold', default: 3600
26
+ opt :users_warning, 'Users warning threshold', default: 1
27
+ opt :users_critical, 'Users critical threshold', default: 1
28
+ opt :swap_warning, 'Swap warning threshold', default: 0.4
29
+ opt :swap_critical, 'Swap critical threshold', default: 0.5
30
+ opt :checks, 'A list of checks to run.', type: :strings, default: %w[cpu load memory disk swap]
23
31
 
24
32
  def initialize
25
33
  @limits = {
@@ -27,6 +35,9 @@ module Riemann
27
35
  disk: { critical: opts[:disk_critical], warning: opts[:disk_warning] },
28
36
  load: { critical: opts[:load_critical], warning: opts[:load_warning] },
29
37
  memory: { critical: opts[:memory_critical], warning: opts[:memory_warning] },
38
+ uptime: { critical: opts[:uptime_critical], warning: opts[:uptime_warning] },
39
+ users: { critical: opts[:users_critical], warning: opts[:users_warning] },
40
+ swap: { critical: opts[:swap_critical], warning: opts[:swap_warning] },
30
41
  }
31
42
  case (@ostype = `uname -s`.chomp.downcase)
32
43
  when 'darwin'
@@ -35,25 +46,32 @@ module Riemann
35
46
  @disk = method :disk
36
47
  @load = method :darwin_load
37
48
  @memory = method :darwin_memory
38
- darwin_top
49
+ @uptime = method :bsd_uptime
50
+ @swap = method :bsd_swap
39
51
  when 'freebsd'
40
52
  @cores = `sysctl -n hw.ncpu`.to_i
41
53
  @cpu = method :freebsd_cpu
42
54
  @disk = method :disk
43
55
  @load = method :bsd_load
44
56
  @memory = method :freebsd_memory
57
+ @uptime = method :bsd_uptime
58
+ @swap = method :bsd_swap
45
59
  when 'openbsd'
46
60
  @cores = `sysctl -n hw.ncpu`.to_i
47
61
  @cpu = method :openbsd_cpu
48
62
  @disk = method :disk
49
63
  @load = method :bsd_load
50
64
  @memory = method :openbsd_memory
65
+ @uptime = method :bsd_uptime
66
+ @swap = method :bsd_swap
51
67
  when 'sunos'
52
68
  @cores = `mpstat -a 2>/dev/null`.split[33].to_i
53
69
  @cpu = method :sunos_cpu
54
70
  @disk = method :disk
55
71
  @load = method :bsd_load
56
72
  @memory = method :sunos_memory
73
+ @uptime = method :bsd_uptime
74
+ @swap = method :bsd_swap
57
75
  else
58
76
  @cores = `nproc`.to_i
59
77
  puts "WARNING: OS '#{@ostype}' not explicitly supported. Falling back to Linux" unless @ostype == 'linux'
@@ -61,8 +79,11 @@ module Riemann
61
79
  @disk = method :disk
62
80
  @load = method :linux_load
63
81
  @memory = method :linux_memory
82
+ @uptime = method :linux_uptime
83
+ @swap = method :linux_swap
64
84
  @supports_exclude_type = `df --help 2>&1 | grep -e "--exclude-type"` != ''
65
85
  end
86
+ @users = method :users
66
87
 
67
88
  opts[:checks].each do |check|
68
89
  case check
@@ -74,6 +95,12 @@ module Riemann
74
95
  @cpu_enabled = true
75
96
  when 'memory'
76
97
  @memory_enabled = true
98
+ when 'uptime'
99
+ @uptime_enabled = true
100
+ when 'users'
101
+ @users_enabled = true
102
+ when 'swap'
103
+ @swap_enabled = true
77
104
  end
78
105
  end
79
106
  end
@@ -99,6 +126,30 @@ module Riemann
99
126
  end
100
127
  end
101
128
 
129
+ def report_int(service, value, report)
130
+ return unless value
131
+
132
+ if value >= @limits[service][:critical]
133
+ alert service, :critical, value, "#{value} #{report}"
134
+ elsif value >= @limits[service][:warning]
135
+ alert service, :warning, value, "#{value} #{report}"
136
+ else
137
+ alert service, :ok, value, "#{value} #{report}"
138
+ end
139
+ end
140
+
141
+ def report_uptime(uptime)
142
+ description = uptime_to_human(uptime)
143
+
144
+ if uptime < @limits[:uptime][:critical]
145
+ alert 'uptime', :critical, uptime, description
146
+ elsif uptime < @limits[:uptime][:warning]
147
+ alert 'uptime', :warning, uptime, description
148
+ else
149
+ alert 'uptime', :ok, uptime, description
150
+ end
151
+ end
152
+
102
153
  def linux_cpu
103
154
  new = File.read('/proc/stat')
104
155
  unless new[/cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/]
@@ -205,9 +256,16 @@ module Riemann
205
256
  @old_cpu = [u2, s2, t2, i2]
206
257
  end
207
258
 
259
+ def uptime_parser
260
+ @uptime_parser ||= UptimeParser.new
261
+ end
262
+
263
+ def uptime
264
+ @cached_data[:uptime] ||= uptime_parser.parse(`uptime`)
265
+ end
266
+
208
267
  def bsd_load
209
- m = `uptime`.split(':')[-1].chomp.gsub(/\s+/, '').split(',')
210
- load = m[0].to_f / @cores
268
+ load = uptime[:load_averages][1] / @cores
211
269
  if load > @limits[:load][:critical]
212
270
  alert 'load', :critical, load, "1-minute load average/core is #{load}"
213
271
  elsif load > @limits[:load][:warning]
@@ -240,47 +298,50 @@ module Riemann
240
298
  end
241
299
 
242
300
  def darwin_top
301
+ return @cached_data[:darwin_top] if @cached_data[:darwin_top]
302
+
243
303
  raw = `top -l 1 | grep -i "^\\(cpu\\|physmem\\|load\\)"`.chomp
244
- @topdata = { stamp: Time.now.to_i }
304
+ topdata = {}
245
305
  raw.each_line do |ln|
246
306
  if ln.match(/Load Avg: [0-9.]+, [0-9.]+, ([0-9.])+/i)
247
- @topdata[:load] = Regexp.last_match(1).to_f
307
+ topdata[:load] = Regexp.last_match(1).to_f
248
308
  elsif ln.match(/CPU usage: [0-9.]+% user, [0-9.]+% sys, ([0-9.]+)% idle/i)
249
- @topdata[:cpu] = 1 - (Regexp.last_match(1).to_f / 100)
309
+ topdata[:cpu] = 1 - (Regexp.last_match(1).to_f / 100)
250
310
  elsif (mdat = ln.match(/PhysMem: ([0-9]+)([BKMGT]) wired, ([0-9]+)([BKMGT]) active, ([0-9]+)([BKMGT]) inactive, ([0-9]+)([BKMGT]) used, ([0-9]+)([BKMGT]) free/i))
251
311
  wired = mdat[1].to_i * (1024**'BKMGT'.index(mdat[2]))
252
312
  active = mdat[3].to_i * (1024**'BKMGT'.index(mdat[4]))
253
313
  inactive = mdat[5].to_i * (1024**'BKMGT'.index(mdat[6]))
254
314
  used = mdat[7].to_i * (1024**'BKMGT'.index(mdat[8]))
255
315
  free = mdat[9].to_i * (1024**'BKMGT'.index(mdat[10]))
256
- @topdata[:memory] = (wired + active + used).to_f / (wired + active + used + inactive + free)
316
+ topdata[:memory] = (wired + active + used).to_f / (wired + active + used + inactive + free)
257
317
  # This is for OSX Mavericks which
258
318
  # uses a different format for top
259
319
  # Example: PhysMem: 4662M used (1328M wired), 2782M unused.
260
320
  elsif (mdat = ln.match(/PhysMem: ([0-9]+)([BKMGT]) used \([0-9]+[BKMGT] wired\), ([0-9]+)([BKMGT]) unused/i))
261
321
  used = mdat[1].to_i * (1024**'BKMGT'.index(mdat[2]))
262
322
  unused = mdat[3].to_i * (1024**'BKMGT'.index(mdat[4]))
263
- @topdata[:memory] = used.to_f / (used + unused)
323
+ topdata[:memory] = used.to_f / (used + unused)
264
324
  end
265
325
  end
326
+ @cached_data[:darwin_top] = topdata
266
327
  end
267
328
 
268
329
  def darwin_cpu
269
- darwin_top unless (Time.now.to_i - @topdata[:stamp]) < opts[:interval]
270
- unless @topdata[:cpu]
330
+ topdata = darwin_top
331
+ unless topdata[:cpu]
271
332
  alert 'cpu', :unknown, nil, 'unable to get CPU stats from top'
272
333
  return false
273
334
  end
274
- report_pct :cpu, @topdata[:cpu], "usage\n\n#{reverse_numeric_sort_with_header(`ps -eo pcpu,pid,comm`)}"
335
+ report_pct :cpu, topdata[:cpu], "usage\n\n#{reverse_numeric_sort_with_header(`ps -eo pcpu,pid,comm`)}"
275
336
  end
276
337
 
277
338
  def darwin_load
278
- darwin_top unless (Time.now.to_i - @topdata[:stamp]) < opts[:interval]
279
- unless @topdata[:load]
339
+ topdata = darwin_top
340
+ unless topdata[:load]
280
341
  alert 'load', :unknown, nil, 'unable to get load ave from top'
281
342
  return false
282
343
  end
283
- metric = @topdata[:load] / @cores
344
+ metric = topdata[:load] / @cores
284
345
  if metric > @limits[:load][:critical]
285
346
  alert 'load', :critical, metric, "1-minute load average per core is #{metric}"
286
347
  elsif metric > @limits[:load][:warning]
@@ -291,12 +352,12 @@ module Riemann
291
352
  end
292
353
 
293
354
  def darwin_memory
294
- darwin_top unless (Time.now.to_i - @topdata[:stamp]) < opts[:interval]
295
- unless @topdata[:memory]
355
+ topdata = darwin_top
356
+ unless topdata[:memory]
296
357
  alert 'memory', :unknown, nil, 'unable to get memory data from top'
297
358
  return false
298
359
  end
299
- report_pct :memory, @topdata[:memory], "usage\n\n#{reverse_numeric_sort_with_header(`ps -eo pmem,pid,comm`)}"
360
+ report_pct :memory, topdata[:memory], "usage\n\n#{reverse_numeric_sort_with_header(`ps -eo pmem,pid,comm`)}"
300
361
  end
301
362
 
302
363
  def df
@@ -336,11 +397,81 @@ module Riemann
336
397
  end
337
398
  end
338
399
 
400
+ def bsd_uptime
401
+ value = uptime[:uptime]
402
+
403
+ report_uptime(value)
404
+ end
405
+
406
+ def linux_uptime
407
+ value = File.read('/proc/uptime').split(/\s+/)[0].to_f
408
+
409
+ report_uptime(value)
410
+ end
411
+
412
+ def users
413
+ value = uptime[:users]
414
+
415
+ report_int(:users, value, "user#{'s' if value != 1}")
416
+ end
417
+
418
+ def bsd_swap
419
+ _device, blocks, used, _avail, _capacity = `swapinfo`.lines.last.split(/\s+/)
420
+
421
+ value = Float(used) / Integer(blocks)
422
+
423
+ report_pct :swap, value, 'used'
424
+ rescue ArgumentError
425
+ # Ignore
426
+ end
427
+
428
+ def linux_swap
429
+ total_size = 0.0
430
+ total_used = 0.0
431
+
432
+ File.read('/proc/swaps').lines.each_with_index do |line, n|
433
+ next if n.zero?
434
+
435
+ _filename, _type, size, used, _priority = line.split(/\s+/)
436
+
437
+ total_size += size.to_f
438
+ total_used += used.to_f
439
+ end
440
+
441
+ return if total_size.zero?
442
+
443
+ value = total_used / total_size
444
+
445
+ report_pct :swap, value, 'used'
446
+ end
447
+
448
+ def uptime_to_human(value)
449
+ seconds = value.to_i
450
+ days = seconds / 86_400
451
+ seconds %= 86_400
452
+ hrs = seconds / 3600
453
+ seconds %= 3600
454
+ mins = seconds / 60
455
+ [
456
+ ("#{days} day#{'s' if days > 1}" unless days.zero?),
457
+ format('%<hrs>2d:%<mins>02d', hrs: hrs, mins: mins),
458
+ ].compact.join(' ')
459
+ end
460
+
339
461
  def tick
462
+ invalidate_cache
463
+
340
464
  @cpu.call if @cpu_enabled
341
465
  @memory.call if @memory_enabled
342
466
  @disk.call if @disk_enabled
343
467
  @load.call if @load_enabled
468
+ @uptime.call if @uptime_enabled
469
+ @users.call if @users_enabled
470
+ @swap.call if @swap_enabled
471
+ end
472
+
473
+ def invalidate_cache
474
+ @cached_data = {}
344
475
  end
345
476
  end
346
477
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+
5
+ module Riemann
6
+ module Tools
7
+ class Kvm
8
+ include Riemann::Tools
9
+
10
+ def tick
11
+ # determine how many instances I have according to libvirt
12
+ kvm_instances = `LANG=C virsh list | grep -c running`
13
+
14
+ # submit them to riemann
15
+ report(
16
+ service: 'KVM Running VMs',
17
+ metric: kvm_instances.to_i,
18
+ state: 'info',
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+ require 'riemann/tools/mdstat_parser.tab'
5
+
6
+ module Riemann
7
+ module Tools
8
+ class Md
9
+ include Riemann::Tools
10
+
11
+ def mdstat_parser
12
+ @mdstat_parser ||= MdstatParser.new
13
+ end
14
+
15
+ def tick
16
+ status = File.read('/proc/mdstat')
17
+ res = mdstat_parser.parse(status)
18
+
19
+ state = res.values.all? { |value| value =~ /\AU+\z/ } ? 'ok' : 'critical'
20
+
21
+ report(
22
+ service: 'mdstat',
23
+ description: status,
24
+ state: state,
25
+ )
26
+ rescue Errno::ENOENT => e
27
+ report(
28
+ service: 'mdstat',
29
+ description: e.message,
30
+ state: 'critical',
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,340 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.6.0
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require 'strscan'
11
+
12
+ module Riemann
13
+ module Tools
14
+ class MdstatParser < Racc::Parser
15
+
16
+ module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y', 42)
17
+
18
+ def parse(text)
19
+ s = StringScanner.new(text)
20
+ @tokens = []
21
+
22
+ until s.eos? do
23
+ case
24
+ when s.scan(/\n/) then # ignore
25
+ when s.scan(/\s+/) then # ignore
26
+
27
+ when s.scan(/\[=*>.*\]/) then @tokens << [:PROGRESS, s.matched]
28
+ when s.scan(/%/) then @tokens << ['%', s.matched]
29
+ when s.scan(/,/) then @tokens << [',', s.matched]
30
+ when s.scan(/:/) then @tokens << [':', s.matched]
31
+ when s.scan(/</) then @tokens << ['<', s.matched]
32
+ when s.scan(/=/) then @tokens << ['=', s.matched]
33
+ when s.scan(/>/) then @tokens << ['>', s.matched]
34
+ when s.scan(/\(/) then @tokens << ['(', s.matched]
35
+ when s.scan(/\)/) then @tokens << [')', s.matched]
36
+ when s.scan(/\./) then @tokens << ['.', s.matched]
37
+ when s.scan(/\//) then @tokens << ['/', s.matched]
38
+ when s.scan(/\[/) then @tokens << ['[', s.matched]
39
+ when s.scan(/]/) then @tokens << [']', s.matched]
40
+ when s.scan(/algorithm/) then @tokens << [:ALGORITHM, s.matched]
41
+ when s.scan(/bitmap/) then @tokens << [:BITMAP, s.matched]
42
+ when s.scan(/blocks/) then @tokens << [:BLOCKS, s.matched]
43
+ when s.scan(/chunk/) then @tokens << [:CHUNK, s.matched]
44
+ when s.scan(/finish/) then @tokens << [:FINISH, s.matched]
45
+ when s.scan(/level/) then @tokens << [:LEVEL, s.matched]
46
+ when s.scan(/min/) then @tokens << [:MIN, s.matched]
47
+ when s.scan(/pages/) then @tokens << [:PAGES, s.matched]
48
+ when s.scan(/(raid([014-6]|10)|linear|multipath|faulty)\b/) then @tokens << [:PERSONALITY, s.matched]
49
+ when s.scan(/Personalities/) then @tokens << [:PERSONALITIES, s.matched]
50
+ when s.scan(/recovery/) then @tokens << [:RECOVERY, s.matched]
51
+ when s.scan(/speed/) then @tokens << [:SPEED, s.matched]
52
+ when s.scan(/super/) then @tokens << [:SUPER, s.matched]
53
+ when s.scan(/unused devices/) then @tokens << [:UNUSED_DEVICES, s.matched]
54
+ when s.scan(/K\/sec/) then @tokens << [:SPEED_UNIT, s.matched.to_i]
55
+ when s.scan(/KB/) then @tokens << [:BYTE_UNIT, s.matched.to_i]
56
+ when s.scan(/k/) then @tokens << [:UNIT, s.matched.to_i]
57
+ when s.scan(/\d+\.\d+/) then @tokens << [:FLOAT, s.matched.to_i]
58
+ when s.scan(/\d+/) then @tokens << [:INTEGER, s.matched.to_i]
59
+ when s.scan(/F\b/) then @tokens << [:FAILED, s.matched.to_i]
60
+ when s.scan(/\w+/) then @tokens << [:IDENTIFIER, s.matched]
61
+ else
62
+ raise s.rest
63
+ end
64
+ end
65
+
66
+ do_parse
67
+ end
68
+
69
+ def next_token
70
+ @tokens.shift
71
+ end
72
+ ...end mdstat_parser.y/module_eval...
73
+ ##### State transition tables begin ###
74
+
75
+ racc_action_table = [
76
+ 10, 13, 14, 10, 29, 3, 4, 6, 7, 15,
77
+ 16, 17, 18, 11, 19, 20, 21, 22, 23, 24,
78
+ 10, 27, 28, 31, 32, 33, 35, 37, 38, 39,
79
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
80
+ 50, 51, 52, 53, 54, 56, 58, 59, 60, 61,
81
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
82
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
83
+ 82, 83, 84, 85, 86, 87, 88 ]
84
+
85
+ racc_action_check = [
86
+ 5, 10, 10, 25, 25, 0, 1, 3, 4, 11,
87
+ 12, 13, 14, 5, 15, 16, 17, 18, 19, 20,
88
+ 21, 22, 23, 27, 29, 31, 32, 34, 35, 36,
89
+ 37, 39, 40, 41, 42, 43, 44, 45, 46, 47,
90
+ 48, 49, 50, 51, 52, 53, 55, 56, 58, 59,
91
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
92
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
93
+ 80, 81, 82, 84, 85, 86, 87 ]
94
+
95
+ racc_action_pointer = [
96
+ -10, 6, nil, -17, 8, -10, nil, nil, nil, nil,
97
+ -23, -15, -15, 1, 1, -19, -1, 0, -9, 8,
98
+ -7, 10, -7, -12, nil, -7, nil, 16, nil, 20,
99
+ nil, -4, 5, nil, 15, 19, 4, 19, nil, 20,
100
+ 2, 6, 23, 24, 14, 11, 32, 14, 10, 31,
101
+ 40, 17, 33, 42, nil, 29, 23, nil, 30, 38,
102
+ 19, 24, 43, 42, 22, 41, 28, 32, 47, 48,
103
+ 33, 56, 51, 37, 35, 35, 58, 56, 37, 64,
104
+ 61, 65, 59, nil, 54, 43, 64, 56, nil ]
105
+
106
+ racc_action_default = [
107
+ -21, -21, -6, -21, -21, -21, -4, 89, -1, -5,
108
+ -21, -21, -2, -21, -21, -21, -21, -21, -21, -21,
109
+ -21, -21, -11, -21, -3, -21, -9, -21, -20, -21,
110
+ -8, -21, -13, -10, -15, -21, -21, -21, -12, -21,
111
+ -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,
112
+ -21, -21, -21, -17, -14, -19, -21, -7, -21, -21,
113
+ -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,
114
+ -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,
115
+ -21, -21, -21, -16, -21, -21, -21, -21, -18 ]
116
+
117
+ racc_goto_table = [
118
+ 9, 1, 2, 5, 8, 12, 25, 34, 36, 55,
119
+ 57, nil, nil, nil, nil, nil, 26, nil, nil, nil,
120
+ 30 ]
121
+
122
+ racc_goto_check = [
123
+ 6, 1, 2, 3, 4, 5, 7, 8, 9, 10,
124
+ 11, nil, nil, nil, nil, nil, 6, nil, nil, nil,
125
+ 6 ]
126
+
127
+ racc_goto_pointer = [
128
+ nil, 1, 2, 1, -1, -1, -5, -15, -25, -26,
129
+ -44, -45 ]
130
+
131
+ racc_goto_default = [
132
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
133
+ nil, nil ]
134
+
135
+ racc_reduce_table = [
136
+ 0, 0, :racc_error,
137
+ 3, 36, :_reduce_1,
138
+ 3, 37, :_reduce_none,
139
+ 4, 40, :_reduce_none,
140
+ 0, 40, :_reduce_none,
141
+ 2, 38, :_reduce_5,
142
+ 0, 38, :_reduce_6,
143
+ 19, 41, :_reduce_7,
144
+ 2, 42, :_reduce_none,
145
+ 1, 42, :_reduce_none,
146
+ 7, 41, :_reduce_none,
147
+ 4, 41, :_reduce_none,
148
+ 2, 43, :_reduce_none,
149
+ 0, 43, :_reduce_none,
150
+ 9, 44, :_reduce_none,
151
+ 0, 44, :_reduce_none,
152
+ 14, 45, :_reduce_none,
153
+ 0, 45, :_reduce_none,
154
+ 18, 46, :_reduce_none,
155
+ 0, 46, :_reduce_none,
156
+ 5, 39, :_reduce_none ]
157
+
158
+ racc_reduce_n = 21
159
+
160
+ racc_shift_n = 89
161
+
162
+ racc_token_table = {
163
+ false => 0,
164
+ :error => 1,
165
+ :ALGORITHM => 2,
166
+ :BITMAP => 3,
167
+ :BLOCKS => 4,
168
+ :BYTE_UNIT => 5,
169
+ :CHUNK => 6,
170
+ :FAILED => 7,
171
+ :FINISH => 8,
172
+ :FLOAT => 9,
173
+ :IDENTIFIER => 10,
174
+ :INTEGER => 11,
175
+ :LEVEL => 12,
176
+ :MIN => 13,
177
+ :PAGES => 14,
178
+ :PERSONALITIES => 15,
179
+ :PERSONALITY => 16,
180
+ :PROGRESS => 17,
181
+ :RECOVERY => 18,
182
+ :SPEED => 19,
183
+ :SPEED_UNIT => 20,
184
+ :SUPER => 21,
185
+ :UNIT => 22,
186
+ :UNUSED_DEVICES => 23,
187
+ ":" => 24,
188
+ "[" => 25,
189
+ "]" => 26,
190
+ "/" => 27,
191
+ "(" => 28,
192
+ ")" => 29,
193
+ "," => 30,
194
+ "=" => 31,
195
+ "%" => 32,
196
+ "<" => 33,
197
+ ">" => 34 }
198
+
199
+ racc_nt_base = 35
200
+
201
+ racc_use_result_var = true
202
+
203
+ Racc_arg = [
204
+ racc_action_table,
205
+ racc_action_check,
206
+ racc_action_default,
207
+ racc_action_pointer,
208
+ racc_goto_table,
209
+ racc_goto_check,
210
+ racc_goto_default,
211
+ racc_goto_pointer,
212
+ racc_nt_base,
213
+ racc_reduce_table,
214
+ racc_token_table,
215
+ racc_shift_n,
216
+ racc_reduce_n,
217
+ racc_use_result_var ]
218
+
219
+ Racc_token_to_s_table = [
220
+ "$end",
221
+ "error",
222
+ "ALGORITHM",
223
+ "BITMAP",
224
+ "BLOCKS",
225
+ "BYTE_UNIT",
226
+ "CHUNK",
227
+ "FAILED",
228
+ "FINISH",
229
+ "FLOAT",
230
+ "IDENTIFIER",
231
+ "INTEGER",
232
+ "LEVEL",
233
+ "MIN",
234
+ "PAGES",
235
+ "PERSONALITIES",
236
+ "PERSONALITY",
237
+ "PROGRESS",
238
+ "RECOVERY",
239
+ "SPEED",
240
+ "SPEED_UNIT",
241
+ "SUPER",
242
+ "UNIT",
243
+ "UNUSED_DEVICES",
244
+ "\":\"",
245
+ "\"[\"",
246
+ "\"]\"",
247
+ "\"/\"",
248
+ "\"(\"",
249
+ "\")\"",
250
+ "\",\"",
251
+ "\"=\"",
252
+ "\"%\"",
253
+ "\"<\"",
254
+ "\">\"",
255
+ "$start",
256
+ "target",
257
+ "personalities",
258
+ "devices",
259
+ "unused_devices",
260
+ "list_of_personalities",
261
+ "device",
262
+ "list_of_devices",
263
+ "super",
264
+ "level",
265
+ "bitmap",
266
+ "restore_progress" ]
267
+
268
+ Racc_debug_parser = false
269
+
270
+ ##### State transition tables end #####
271
+
272
+ # reduce 0 omitted
273
+
274
+ module_eval(<<'.,.,', 'mdstat_parser.y', 3)
275
+ def _reduce_1(val, _values, result)
276
+ result = val[1]
277
+ result
278
+ end
279
+ .,.,
280
+
281
+ # reduce 2 omitted
282
+
283
+ # reduce 3 omitted
284
+
285
+ # reduce 4 omitted
286
+
287
+ module_eval(<<'.,.,', 'mdstat_parser.y', 10)
288
+ def _reduce_5(val, _values, result)
289
+ result = val[0].merge(val[1])
290
+ result
291
+ end
292
+ .,.,
293
+
294
+ module_eval(<<'.,.,', 'mdstat_parser.y', 11)
295
+ def _reduce_6(val, _values, result)
296
+ result = {}
297
+ result
298
+ end
299
+ .,.,
300
+
301
+ module_eval(<<'.,.,', 'mdstat_parser.y', 13)
302
+ def _reduce_7(val, _values, result)
303
+ result = { val[0] => val[15] }
304
+ result
305
+ end
306
+ .,.,
307
+
308
+ # reduce 8 omitted
309
+
310
+ # reduce 9 omitted
311
+
312
+ # reduce 10 omitted
313
+
314
+ # reduce 11 omitted
315
+
316
+ # reduce 12 omitted
317
+
318
+ # reduce 13 omitted
319
+
320
+ # reduce 14 omitted
321
+
322
+ # reduce 15 omitted
323
+
324
+ # reduce 16 omitted
325
+
326
+ # reduce 17 omitted
327
+
328
+ # reduce 18 omitted
329
+
330
+ # reduce 19 omitted
331
+
332
+ # reduce 20 omitted
333
+
334
+ def _reduce_none(val, _values, result)
335
+ val[0]
336
+ end
337
+
338
+ end # class MdstatParser
339
+ end # module Tools
340
+ end # module Riemann