#!/usr/local/bin/ruby
## This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version. For further details see:
## .
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
# ==============
# check_arcconf
# ==============
# * written by Silver Salonen, Estonia
# version 1.0.1 (18.Nov.2013)
# - bugfix: variable #{arcconf_bin} was not used properly
# version 1.0 (22.Mar.2011)
# plugin return codes:
# 0 OK
# 1 Warning
# 2 Critical
# 3 Unknown
require 'getoptlong'
opts = GetoptLong.new(
[ "--help", "-h", GetoptLong::OPTIONAL_ARGUMENT],
[ "--controller", "-c", GetoptLong::REQUIRED_ARGUMENT],
[ "--disk", "-d", GetoptLong::REQUIRED_ARGUMENT],
[ "--raid", "-r", GetoptLong::REQUIRED_ARGUMENT]
)
optHelp = nil
optController = nil
optDisk = nil
optRaid = nil
opts.each {|opt, arg|
case opt
when "--help", "-h"
optHelp = true
break 2
when "--controller", "-c"
optController = arg
when "--disk", "-d"
optDisk = arg
when "--raid", "-r"
optRaid = arg
end
}
def printUsage()
print "Usage: #{0} [-h] [-c ] (-d |-r )\n\n"
print "Examples: #{0} -d 2\n"
print " #{0} -r 1\n"
end
def printHelp()
printUsage
print "\nThis plugin checks healt of logical and physical units of Adaptec RAID controller.\n\n"
print "For more details, see inside the script ;)\n"
exit 3
end
if (optHelp)
printHelp
exit 3
end
if (!optDisk && !optRaid)
printUsage
exit 3
end
arcconf_bin = `which arcconf`
if (arcconf_bin == "")
print "arcconf: command not found!\n"
exit 3
end
controller = optController ? optController : 1
arcconf=`#{arcconf_bin} getconfig #{controller}`
if (arcconf.include?("Invalid controller number"))
print "Invalid controller number: #{controller}\n"
exit 3
end
def getParam(what, number, param, arcconf)
correctSection = false
if (what == "disk")
lineCheck = "Device ##{number}"
elsif (what == "raid")
lineCheck = "Logical device number #{number}"
else
return false
end
arcconf.each_line do |line|
line = line.strip
if (!correctSection)
if (line == lineCheck)
correctSection = true
end
next
end
# else
if (!line.include?(':'))
next
end
aParam = line.split(':')
if (aParam[0].strip == param)
return aParam[1].strip
end
end
return false
end
retDisk = 0
if (optDisk)
aParams = ["State", "S.M.A.R.T. warnings"]
aParams.each do |param|
paramValue = getParam("disk", optDisk, param, arcconf)
if (paramValue == false)
print "Could not get parameter #{param} for disk #{optDisk}!\n"
retDisk = 3
next
end
if (param == "State" && paramValue != "Online" || param == "S.M.A.R.T. warnings" && paramValue != "0")
print "Disk #{optDisk} #{param}: #{paramValue}\n"
retDisk = 2
end
end
if (retDisk == 0)
print "Disk #{optDisk} OK!\n"
end
end
retRaid = 0
if (optRaid)
aParams = ["Status of logical device", "Failed stripes"]
aParams.each do |param|
paramValue = getParam("raid", optRaid, param, arcconf)
if (paramValue == false)
print "Could not get parameter #{param} for RAID #{optRaid}!\n"
retRaid = 3
next
end
if (param == "Status of logical device" && paramValue != "Optimal" || param == "Failed stripes" && paramValue != "No")
print "RAID #{optRaid} '#{param}': #{paramValue}\n"
retRaid = 2
end
end
if (retRaid == 0)
print "RAID #{optRaid} OK!\n"
end
end
exit retDisk > retRaid ? retDisk : retRaid