Class: Elesai::Action::Check

Inherits:
Object
  • Object
show all
Includes:
Senedsa
Defined in:
lib/elesai/action/check.rb

Constant Summary collapse

DEFAULT_SENEDSA_CONFIG_FILE =
File.join(ENV['HOME'],"/.senedsa/config")

Instance Method Summary collapse

Constructor Details

#initialize(arguments, options) ⇒ Check

Returns a new instance of Check.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/elesai/action/check.rb', line 11

def initialize(arguments,options)
  @options = options.merge!({ :monitor => :nagios, :mode => :active, :diskcachepolicy => nil })
  @arguments = []
  @lsi = nil

  opts = OptionParser.new
  opts.banner = "Usage: #{ID} [options] check [check_options]"
  opts.separator ""
  opts.separator "Check Options"
  opts.on('--hotspare MIN',                      Integer,              "Minimum number of hotspares")                       { |o| @options[:hotspare]        = o }
  opts.on('--diskcachepolicy DISKCACHEPOLICY',   String,               "Disk cache policy/Disk Write Cache checks")         { |o| @options[:diskcachepolicy] = o }
  opts.on('-M', '--monitor [nagios]',            [:nagios],            "Monitoring system")                                 { |o| @options[:monitor]         = o }
  opts.on('-m', '--mode [active|passive]',       [:active, :passive],  "Monitoring mode")                                   { |o| @options[:mode]            = o }
  opts.on('-H', '--nsca_hostname HOSTNAME',      String,               "NSCA hostname to send passive checks")              { |o| @options[:nsca_hostame]    = o }
  opts.on('-c', '--config CONFIG',               String,               "Path to Senedsa (send_nsca) configuration" )        { |o| @options[:senedsa_config]  = o }
  opts.on('-S', '--svc_descr SVC_DESR',          String,               "Nagios service description")                        { |o| @options[:svc_descr]       = o }
  opts.order!(arguments)

  options_valid?
end

Instance Method Details

#execObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/elesai/action/check.rb', line 32

def exec

  @lsi = LSI.new(:megacli => @options[:megacli], :fake => @options[:fake])

  plugin_output = ""
  plugin_status = ""

  hotspare = 0

  @lsi.physicaldrives.each do |id,physicaldrive|
    drive_plugin_string = "[PD:#{physicaldrive._id}:#{physicaldrive[:size]}:#{physicaldrive[:mediatype]}:#{physicaldrive[:pdtype]}]"
    unless physicaldrive[:firmwarestate].state == :online or physicaldrive[:firmwarestate].state == :hotspare
      plugin_output += " #{drive_plugin_string}:#{physicaldrive[:firmwarestate].state}"
      plugin_status = :critical if physicaldrive[:firmwarestate].state == :failed
      plugin_status = :warning if  physicaldrive[:firmwarestate].state == :rebuild and plugin_status != :critical
    end
    unless physicaldrive[:mediaerrorcount].to_i < 10
      plugin_output += " #{drive_plugin_string}:MediaError:#{physicaldrive[:mediaerrorcount]}"
      plugin_status = :warning if plugin_status.empty?
    end
    unless physicaldrive[:predictivefailurecount].to_i < 5
      plugin_output += " #{drive_plugin_string}:PredictiveFailure:#{physicaldrive[:predictivefailurecount]}"
      plugin_status = :warning if plugin_status.empty?
    end
    hotspare += 1 if physicaldrive[:firmwarestate].state == :hotspare
  end

  if hotspare < @options[:hotspare].to_i
    plugin_status = :warning unless plugin_status == :critical
    plugin_output += " hotspare low watermark (require #{@options[:hotspare]}, have #{hotspare})"
  end

  @lsi.virtualdrives.each do |vd|
    vd_plugin_string = "[VD:#{vd._id}]"
    if @options[:diskcachepolicy] and vd[:diskcachepolicy] != @options[:diskcachepolicy]
      plugin_output += " #{vd_plugin_string}:diskcachepolicy is not #{@options[:diskcachepolicy]}"
      plugin_status = :warning
    end
    case vd[:state]
      when :offline, :failed
        plugin_output += " #{vd_plugin_string}:#{vd[:state]}"
        plugin_status = :critical
      when :partially_degraded, :degraded
        plugin_output += " #{vd_plugin_string}:#{vd[:state]}"
        plugin_status = :warning if plugin_status != :critical
      when :optimal
        a = 1
      else
        plugin_status = :unknown
        plugin_output += " #{vd_plugin_string}:#{vd[:state]}"
    end
    unless vd[:currentcachepolicy] =~ /^WriteBack/ and @lsi.bbus[0][:firmwarestatus][:learncycleactive] != 'Yes'
      plugin_status = :warning
      plugin_output += " #{vd_plugin_string}:(not in writeback mode)"
    end
  end

  @lsi.bbus.each do |bbu|

    unless bbu[:firmwarestatus][:temperature] == 'OK'
      plugin_output += " [BBU:#{bbu._id}:temperature:#{bbu[:firmwarestatus][:temperature]}:#{bbu[:temperature].gsub(/\s/,'')}]"
    end

    unless bbu[:firmwarestatus][:learncyclestatus] == 'OK'
      plugin_output += " [BBU:#{bbu._id}:learncyclestatus:#{bbu[:firmwarestatus][:learncyclestatus]}]"
      plugin_status = :warning if plugin_status == ""
    end

    [:batterypackmissing, :batteryreplacementrequired].each do |attr|
      unless bbu[:firmwarestatus][attr] == 'No'
        plugin_output += " [BBU:#{attr}:#{bbu[:firmwarestatus][attr]}]"
        plugin_status = :warning if plugin_status == ""
      end
    end

    if bbu[:batterytype] == 'iBBU'
      if bbu[:batterystate] != 'Operational'
        plugin_output += " [BBU:#{bbu._id}:batterystate:#{bbu[:batterystate]}]"
        plugin_status = :warning
      else
        if bbu[:firmwarestatus][:learncycleactive] == 'Yes'
          plugin_output += " learn cycle enabled: [BBU:absolutestateofcharge:#{bbu[:gasgaugestatus][:absolutestateofcharge]}]"
        else
          unless bbu[:firmwarestatus][:voltage] == 'OK'
            plugin_output += " [BBU:#{bbu._id}:voltage:#{bbu[:firmwarestatus][:voltage]}]"
            plugin_status = :warning if plugin_status == ''
          end
          remainingcapacity = bbu[:capacityinfo][:remainingcapacity].number
          designcapacity = bbu[:designinfo][:designcapacity].number
          bbupercent = (remainingcapacity.to_f / designcapacity.to_f) * 100
          if bbupercent < 70
            plugin_output += " [BBU: #{bbupercent.to_i} percent of original capacity remaining]"
            plugin_status = :warning if plugin_status == ''
          end
        end
      end
    end
  end

  if plugin_output.empty? and plugin_status.empty?
    if @lsi.adapters.empty?
      plugin_status = :warning
      plugin_output = 'no adapters found'
    else
      @lsi.adapters.each do |adapter|
        plugin_output += " [#{adapter._id}: #{adapter[:versions][:productname].gsub(/\s+/,'_')} OK]"
      end
    end
  end
  plugin_status = :ok if plugin_status.empty?

  case @options[:monitor]
    when :nagios
      case @options[:mode]
        when :active
          puts "#{plugin_status.to_s.upcase}:#{plugin_output}"
          exit SendNsca::STATUS[plugin_status]
        when :passive
          sn = SendNsca.new @options
          begin
            sn.send plugin_status , plugin_output
          rescue SendNsca::SendNscaError => e
            raise RuntimeError, "send_nsca failed: #{e.message}"
          end
      end
  end
end