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
# File 'lib/elesai/action/check.rb', line 11

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

  opts = OptionParser.new
  opts.banner = "Usage: #{ID} [options] check [check_options]"
  opts.separator ""
  opts.separator "Check Options"
  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



30
31
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
# File 'lib/elesai/action/check.rb', line 30

def exec

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

  plugin_output = ""
  plugin_status = ""

  @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
  end

  @lsi.virtualdrives.each do |vd|
    vd_plugin_string = "[VD:#{vd._id}]"
    case vd[:state]
      when :offline, :failed
        plugin_output += " #{vd_plugin_string}:#{vd[:state]}"
        plugin_status = :critical
      when :partialdegraded, :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
  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[: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
        if bbu[:firmwarestatus][:chargingstatus] == 'None' or bbu[:gasgaugestatus][:discharging] == 'No'
          if bbu[:gasgaugestatus][:absolutestateofcharge].number <= 50
            plugin_output += " [BBU:absolutestateofcharge:#{bbu[:gasgaugestatus][:absolutestateofcharge]}]"
            plugin_status = :warning if plugin_status == ""
          end
          if bbu[:capacityinfo][:remainingcapacity].number <= bbu[:capacityinfo][:remainingcapacityalarm].number
            plugin_output += " [BBU:remainingcapacity:#{bbu[:capacityinfo][:remainingcapacityalarm]}]"
            plugin_status = :warning if plugin_status == ""
          end
        end
      end
    end
  end

  if plugin_output.empty? and plugin_status.empty?
    @lsi.adapters.each do |adapter|
      plugin_output += " [#{adapter._id}: #{adapter[:versions][:productname].gsub(/\s+/,'_')} OK]"
    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