find_direct_disks(disk)
find_nvme_disks(disk)
- find_hp_disks(disk) if File.exist?("/usr/sbin/hpssacli")
+ find_hp_disks(disk) if File.exist?("/usr/sbin/ssacli")
find_megaraid_disks(disk) if File.exist?("/usr/sbin/megacli")
find_mpt1_disks(disk) if File.exist?("/usr/sbin/lsiutil")
find_mpt2_disks(disk) if File.exist?("/usr/sbin/sas2ircu")
find_md_arrays(disk)
disk[:disks].each do |disk|
- if disk[:vendor] =~ /^CVPR/ && disk[:model] == "INTEL"
+ if disk[:vendor] =~ /^(BTWA|CVPR|PHDV)/ && disk[:model] == "INTEL"
disk[:model] = disk[:serial_number]
disk[:serial_number] = disk[:vendor]
disk[:vendor] = "INTEL"
array = nil
disk = nil
- IO.popen(%w(hpssacli controller all show config detail)).each do |line|
- if line =~ /^Smart Array (\S+) /
+ IO.popen(%w(ssacli controller all show config detail)).each do |line|
+ if line =~ /^Smart (?:Array|HBA) (\S+) /
controller = {
:id => devices[:controllers].count,
:model => Regexp.last_match(1),
disk = nil
elsif controller && line =~ /^ (\S.*):\s+(.*)$/
case Regexp.last_match(1)
+ when "Slot" then controller[:slot] = Regexp.last_match(2)
when "Serial Number" then controller[:serial_number] = Regexp.last_match(2)
when "Hardware Revision" then controller[:hardware_version] = Regexp.last_match(2)
when "Firmware Version" then controller[:firmware_version] = Regexp.last_match(2)
controller[:arrays] << array[:id]
disk = nil
- elsif controller && line =~ /^ physicaldrive (\S+) /
- disks << Regexp.last_match(1)
elsif array && line =~ /^ physicaldrive (\S+)$/
disk = {
:id => devices[:disks].count,
:controller => controller[:id],
:arrays => [array[:id]],
- :location => Regexp.last_match(1),
- :smart_device => "cciss,#{disks.find_index(Regexp.last_match(1))}"
+ :location => Regexp.last_match(1)
}
devices[:disks] << disk
end
controllers.each do |controller|
+ slot = controller[:slot]
+
+ IO.popen(%W(ssacli controller slot=#{slot} pd all show status)).each do |line|
+ if line =~ /^ physicaldrive (\S+) /
+ disks << Regexp.last_match(1)
+ end
+ end
+
if device = Dir.glob("/sys/bus/pci/devices/#{controller[:pci_slot]}/cciss*").first
controller[:device] = File.basename(device).sub(/^cciss(\d+)$/, "/dev/cciss/c\\1d0")
elsif device = Dir.glob("/sys/bus/pci/devices/#{controller[:pci_slot]}/host*/target*:3:0/*:3:0:0/scsi_generic/sg*").first
controller[:device] = "/dev/#{File.basename(device)}"
- elsif device = Dir.glob("/sys/bus/pci/devices/#{controller[:pci_slot]}/host*/target*:1:0/*:1:0:0/scsi_generic/sg*").first
+ elsif device = Dir.glob("/sys/bus/pci/devices/#{controller[:pci_slot]}/host*/target*:1:0/*:1:0:*/scsi_generic/sg*").first
controller[:device] = "/dev/#{File.basename(device)}"
end
end
+
+ devices[:disks].each do |disk|
+ disk[:smart_device] = "cciss,#{disks.find_index(disk[:location])}"
+ end
end
def find_megaraid_disks(devices)
elsif disk && line =~ /^Firmware state:\s+(.*\S)\s*$/
Regexp.last_match(1).split(/,\s*/).each do |state|
case state
+ when "Unconfigured(bad)" then disk[:status] = "unconfigured"
when "Online" then disk[:status] = "online"
when "Hotspare" then disk[:status] = "hotspare"
- when "Spun Up" then disk[:spun_down] = false
- when "Spun down" then disk[:spun_down] = true
+ when "Failed" then disk[:status] = "failed"
+ when "Spun Up" then disk[:state] = "spun_up"
+ when "Spun down" then disk[:state] = "spun_down"
end
end
elsif disk && line =~ /^(\S.*\S)\s*:\s+(\S.*)$/
elsif disk && line =~ /^Firmware state:\s+(.*\S)\s*$/
Regexp.last_match(1).split(/,\s*/).each do |state|
case state
+ when "Unconfigured(bad)" then disk[:status] = "unconfigured"
when "Online" then disk[:status] = "online"
when "Hotspare" then disk[:status] = "hotspare"
+ when "Failed" then disk[:status] = "failed"
when "Spun Up" then disk[:state] = "spun_up"
when "Spun down" then disk[:state] = "spun_down"
end
:controller => controller[:id],
:vendor => Regexp.last_match(4),
:model => Regexp.last_match(5),
- :bus => Regexp.last_match(1),
- :target => Regexp.last_match(2),
+ :sas_address => Regexp.last_match(6),
:arrays => []
}
disks.each do |disk|
slot = controllers[disk[:controller]][:pci_slot]
- bus = disk[:bus]
- target = disk[:target]
+ sas_address = "0x#{disk[:sas_address]}"
- if device = Dir.glob("/sys/bus/pci/devices/#{slot}/host*/port-*:*/end_device-*:*/target*:#{bus}:#{target}/*:#{bus}:#{target}:0/scsi_generic/sg*").first
- disk[:device] = "/dev/#{File.basename(device)}"
+ Dir.glob("/sys/bus/pci/devices/#{slot}/host*/port-*:*/end_device-*:*/sas_device/end_device-*:*").each do |sas_device|
+ if read_sysctl_file("#{sas_device}/sas_address") == sas_address
+ if device = Dir.glob("#{sas_device}/device/target*:0:*/*:0:*:0/scsi_generic/sg*").first
+ disk[:device] = "/dev/#{File.basename(device)}"
+ end
+ end
end
end
end
array[:disks].map! do |location|
disk = disks.find { |disk| disk[:location] == location }
+ controller_number = controller[:number] - 1
device_number = disk[:device_number]
- device = Dir.glob("#{host}/device/target*:1:#{device_number}/*:1:#{device_number}:0/scsi_generic/*").first
disk[:device] = "/dev/#{File.basename(device)}"
+ disk[:smart_device] = "aacraid,#{controller_number},0,#{device_number}"
disk[:arrays] << array[:id]
disk[:id]