X-Git-Url: https://git.openstreetmap.org./chef.git/blobdiff_plain/4d81711580ed328384d60781d95df39df528a6b3..8b2c91f582ffd21baead62ce32f7619af96e307b:/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 e83343a8e..52c0752ea 100644 --- a/cookbooks/hardware/templates/default/ohai.rb.erb +++ b/cookbooks/hardware/templates/default/ohai.rb.erb @@ -5,12 +5,12 @@ Ohai.plugin(:Hardware) do def read_sysctl_link(file) File.basename(File.readlink(file)) - rescue Errno::ENOENT + rescue Errno::ENOENT, Errno::ENOTDIR end def read_sysctl_file(file) IO.read(file).strip - rescue Errno::ENOENT, Errno::EINVAL + rescue Errno::ENOENT, Errno::ENOTDIR, Errno::EINVAL end def parse_memory_size(size) @@ -148,9 +148,10 @@ 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") @@ -180,7 +181,7 @@ Ohai.plugin(:Hardware) do end end - disk[:model].sub!(/-.*$/, "") + disk[:model].sub!(/-.*$/, "") if disk[:model] end disk @@ -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, @@ -501,7 +502,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|