disk = nil
IO.popen(%w(ssacli controller all show config detail)).each do |line|
+ next unless line.valid_encoding?
+
if line =~ /^Smart (?:Array|HBA) (\S+) /
controller = {
:id => devices[:controllers].count,
elsif array && line =~ /^ Status:\s+(.*\S)\s*$/
case Regexp.last_match(1)
when "OK" then array[:status] = "optimal"
+ when "Interim Recovery Mode" then array[:status] = "degraded"
else array[:status] = "unknown"
end
elsif array && line =~ /^ (\S[^:]+):\s+(.*\S)\s*$/
if disk[:status] == "Failed"
disk[:status] = "failed"
+ elsif disk[:status] == "Predictive Failure"
+ disk[:status] = "failed"
elsif disk[:status] == "OK" && disk[:drive_type] == "Data Drive"
disk[:status] = "online"
elsif disk[:status] == "OK" && disk[:drive_type] == "Spare Drive"
disk[:status] = "hotspare"
+ elsif disk[:status] == "OK" && disk[:drive_type] == "Unassigned Drive"
+ disk[:status] = "unconfigured"
else
disk[:status] = "unknown"
end
devices[:controllers] << controller
controllers << controller
- elsif line =~ /^Bus Number\s+:\s+(\d+)$/
+ elsif line =~ /^Bus Number\s+:\s+([0-9a-f]+)$/i
controller[:pci_slot] = format "0000:%02x", Integer("0x#{Regexp.last_match(1)}")
- elsif line =~ /^Device Number\s+:\s+(\d+)$/
+ elsif line =~ /^Device Number\s+:\s+([0-9a-f]+)$/i
controller[:pci_slot] = format "%s:%02x", controller[:pci_slot], Integer("0x#{Regexp.last_match(1)}")
- elsif line =~ /^Function Number\s+:\s+(\d+)$/
+ elsif line =~ /^Function Number\s+:\s+([0-9a-f]+)$/i
controller[:pci_slot] = format "%s.%01x", controller[:pci_slot], Integer("0x#{Regexp.last_match(1)}")
end
end