X-Git-Url: https://git.openstreetmap.org./chef.git/blobdiff_plain/7ae6e279d071fb3facc32dbc5e1154aee20ca35b..5b06782fb9ac3ba77b39f8c5f2a98590479885c2:/cookbooks/hardware/templates/default/ohai.rb.erb diff --git a/cookbooks/hardware/templates/default/ohai.rb.erb b/cookbooks/hardware/templates/default/ohai.rb.erb index 132d5bcac..074f5cbf6 100644 --- a/cookbooks/hardware/templates/default/ohai.rb.erb +++ b/cookbooks/hardware/templates/default/ohai.rb.erb @@ -148,16 +148,17 @@ Ohai.plugin(:Hardware) do 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_mpt_disks(disk) if File.exist?("/usr/sbin/sas2ircu") + find_mpt1_disks(disk) if File.exist?("/usr/sbin/lsiutil") + find_mpt2_disks(disk) if File.exist?("/usr/sbin/sas2ircu") find_adaptec_disks(disk) if File.exist?("/usr/sbin/arcconf") find_areca_disks(disk) if File.exist?("/opt/areca/x86_64/cli64") 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" @@ -285,7 +286,7 @@ Ohai.plugin(:Hardware) do array = nil disk = nil - IO.popen(%w(hpssacli controller all show config detail)).each do |line| + IO.popen(%w(ssacli controller all show config detail)).each do |line| if line =~ /^Smart Array (\S+) / controller = { :id => devices[:controllers].count, @@ -358,7 +359,7 @@ Ohai.plugin(:Hardware) do 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 @@ -439,8 +440,10 @@ Ohai.plugin(:Hardware) do 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[:spun_down] = false when "Spun down" then disk[:spun_down] = true end @@ -478,8 +481,10 @@ Ohai.plugin(:Hardware) do 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 @@ -501,7 +506,86 @@ Ohai.plugin(:Hardware) do end end - def find_mpt_disks(devices) + def find_mpt1_disks(devices) + controllers = [] + disks = [] + + controller = nil + + IO.popen(%w(lsiutil -s)).each do |line| + if line =~ /^\/proc\/mpt\/ioc(\d+)\s+LSI Logic\s+(\S+)\s+/ + controller = { + :id => devices[:controllers].count, + :model => Regexp.last_match(1), + :arrays => [], + :disks => [] + } + + controllers << controller + devices[:controllers] << controller + elsif line =~ /^\s+(\d+)\s+(\d+)\s+PhysDisk (\d+)\s+(\S+)\s+(\S+)\s+\d+\s+(\S+)\s+/ + disks[Regexp.last_match(3).to_i] = { + :id => devices[:disks].count, + :controller => controller[:id], + :vendor => Regexp.last_match(4), + :model => Regexp.last_match(5), + :sas_address => Regexp.last_match(6), + :arrays => [] + } + + controller[:disks] << devices[:disks].count + devices[:disks] << disks[Regexp.last_match(3).to_i] + end + end + + controllers.each_with_index do |controller, index| + port = index + 1 + array = nil + + IO.popen(["lsiutil", "-p", port.to_s, "-a", "69,0"]).each do |line| + if line =~ /^ (\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+RAID/ + seg = Regexp.last_match(1).to_i + bus = Regexp.last_match(2).to_i + dev = Regexp.last_match(3).to_i + fun = Regexp.last_match(4).to_i + + controller[:pci_slot] = sprintf("%04x:%02x:%02x.%01x", seg, bus, dev, fun) + end + end + + IO.popen(["lsiutil", "-p", port.to_s, "-a", "21,1,0,0"]).each do |line| + if line =~ /^Volume (\d+) is/ + array = { + :id => devices[:arrays].count, + :controller => controller[:id], + :number => Regexp.last_match(1), + :disks => [] + } + + devices[:arrays] << array + controller[:arrays] << array[:id] + elsif line =~ /^ Member \d+ is PhysDisk (\d+) / + array[:disks] << disks[Regexp.last_match(1).to_i][:id] + disks[Regexp.last_match(1).to_i][:arrays] << array[:id] + end + end + end + + disks.each do |disk| + slot = controllers[disk[:controller]][:pci_slot] + sas_address = "0x#{disk[:sas_address]}" + + 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 + + def find_mpt2_disks(devices) controllers = [] IO.popen(%w(sas2ircu list)).each do |line|