X-Git-Url: https://git.openstreetmap.org/chef.git/blobdiff_plain/9b16c488583cfb9ecc5f85bb765da68b92434bce..8da30477d3cb48132c68297060dd37e4da30f3d1:/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 5854de82d..e8e01845e 100644 --- a/cookbooks/hardware/templates/default/ohai.rb.erb +++ b/cookbooks/hardware/templates/default/ohai.rb.erb @@ -61,9 +61,10 @@ Ohai.plugin(:Hardware) do end def pci_devices + devices = {} device = nil - IO.popen(["lspci", "-Dkvmm"]).each_with_object(Mash.new) do |line, devices| + IO.popen(["lspci", "-Dkvmm"]).each do |line| if line =~ /^Slot:\s+((\h{4}):(\h{2}):(\h{2}).(\h))\s*$/ device = { :slot => Regexp.last_match(1), @@ -90,6 +91,24 @@ Ohai.plugin(:Hardware) do device = nil end end + + IO.popen(["lspci", "-Dkvmmn"]).each do |line| + if line =~ /^Slot:\s+((\h{4}):(\h{2}):(\h{2}).(\h))\s*$/ + device = devices[Regexp.last_match(1)] + elsif device && line =~ /^([A-Z]+):\s+(.*)\s*$/i + case Regexp.last_match(1) + when "Class" then device[:class_id] = Regexp.last_match(2) + when "Vendor" then device[:vendor_id] = Regexp.last_match(2) + when "Device" then device[:device_id] = Regexp.last_match(2) + when "SVendor" then device[:subsystem_vendor_id] = Regexp.last_match(2) + when "SDevice" then device[:subsystem_device_id] = Regexp.last_match(2) + end + elsif device && line =~ /^\s*$/ + device = nil + end + end + + devices end def network_devices @@ -137,6 +156,33 @@ Ohai.plugin(:Hardware) do find_md_arrays(disk) + disk[:disks].each do |disk| + if disk[:vendor] =~ /^CVPR/ && disk[:model] == "INTEL" + disk[:model] = disk[:serial_number] + disk[:serial_number] = disk[:vendor] + disk[:vendor] = "INTEL" + end + + if disk[:vendor].nil? && disk[:model] =~ /^ATA\s+(.*)$/ + disk[:vendor] = "ATA" + disk[:model] = Regexp.last_match(1) + end + + if disk[:vendor].nil? || disk[:vendor] == "ATA" + if disk[:model] =~ /^(\S+)\s+(.*)$/ + disk[:vendor] = Regexp.last_match(1) + disk[:model] = Regexp.last_match(2) + elsif disk[:model] =~ /^ST/ + disk[:vendor] = "SEAGATE" + elsif disk[:model] =~ /^C300-(.*)$/ + disk[:vendor] = "CRUCIAL" + disk[:model] = Regexp.last_match(1) + end + end + + disk[:model].sub!(/-.*$/, "") + end + disk end @@ -151,20 +197,13 @@ Ohai.plugin(:Hardware) do next unless File.exist?("#{device}/scsi_disk") block = Dir.glob("#{device}/block/*").first - vendor = read_sysctl_file("#{device}/vendor") - model = read_sysctl_file("#{device}/model") size = read_sysctl_file("#{block}/size").to_f / 2 - if vendor == "ATA" && model =~ /^(\S+)\s+(.*)$/ - vendor = Regexp.last_match(1) - model = Regexp.last_match(2) - end - devices[:disks] << { :id => devices[:disks].count, :device => "/dev/#{File.basename(block)}", - :vendor => vendor, - :model => model, + :vendor => read_sysctl_file("#{device}/vendor"), + :model => read_sysctl_file("#{device}/model"), :firmware_version => read_sysctl_file("#{device}/rev"), :size => format_disk_size(size), :arrays => [] @@ -294,16 +333,16 @@ Ohai.plugin(:Hardware) do devices[:disks] << disk controller[:disks] << disk[:id] array[:disks] << disk[:id] - elsif disk && line =~ /^ (\S[^:]+):\s+(.*)$/ + elsif disk && line =~ /^ (\S[^:]+):\s+(.*\S)\s*$/ case Regexp.last_match(1) when "Interface Type" then disk[:interface] = Regexp.last_match(2) when "Size" then disk[:size] = Regexp.last_match(2) when "Rotational Speed" then disk[:rpm] = Regexp.last_match(2) when "Firmware Revision" then disk[:firmware_version] = Regexp.last_match(2) when "Serial Number" then disk[:serial_number] = Regexp.last_match(2) - when "Model" then disk[:vendor], disk[:model] = Regexp.last_match(2).squeeze(" ").strip.sub(/^ATA /, "").split + when "Model" then disk[:model] = Regexp.last_match(2) end - elsif array && line =~ /^ (\S[^:]+):\s+(.*)$/ + elsif array && line =~ /^ (\S[^:]+):\s+(.*\S)\s*$/ case Regexp.last_match(1) when "Size" then array[:size] = Regexp.last_match(2) when "Fault Tolerance" then array[:raid_level] = Regexp.last_match(2) @@ -401,7 +440,7 @@ Ohai.plugin(:Hardware) do when "WWN" then disk[:wwn] = Regexp.last_match(2) when "PD Type" then disk[:interface] = Regexp.last_match(2) when "Raw Size" then disk[:size] = memory_to_disk_size(Regexp.last_match(2).sub(/\s*\[.*\]$/, "")) - when "Inquiry Data" then disk[:vendor], disk[:model], disk[:serial] = Regexp.last_match(2).split + when "Inquiry Data" then disk[:vendor], disk[:model], disk[:serial_number] = Regexp.last_match(2).split end elsif array && line =~ /^(\S.*\S)\s*:\s+(\S.*)$/ case Regexp.last_match(1) @@ -431,7 +470,7 @@ Ohai.plugin(:Hardware) do when "WWN" then disk[:wwn] = Regexp.last_match(2) when "PD Type" then disk[:interface] = Regexp.last_match(2) when "Raw Size" then disk[:size] = memory_to_disk_size(Regexp.last_match(2).sub(/\s*\[.*\]$/, "")) - when "Inquiry Data" then disk[:vendor], disk[:model], disk[:serial] = Regexp.last_match(2).split + when "Inquiry Data" then disk[:vendor], disk[:model], disk[:serial_number] = Regexp.last_match(2).split end end end @@ -738,6 +777,21 @@ Ohai.plugin(:Hardware) do end end + def psu_devices + device = nil + + IO.popen(["dmidecode", "-t", "39"]).each_with_object([]) do |line, devices| + if line =~ /^System Power Supply\s*$/ + device = {} + elsif device && line =~ /^\s+([A-Z ]+):\s+(.*)\s*$/i + device[Regexp.last_match(1).tr(" ", "_").downcase.to_sym] = Regexp.last_match(2).strip + elsif device && line =~ /^\s*$/ + devices << device + device = nil + end + end + end + collect_data(:default) do hardware Mash.new @@ -745,5 +799,6 @@ Ohai.plugin(:Hardware) do hardware[:network] = network_devices hardware[:memory] = memory_devices hardware[:disk] = disk_devices + hardware[:psu] = psu_devices end end