diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ohai/mixin/dmi_decode.rb | 53 | ||||
-rw-r--r-- | lib/ohai/plugins/bsd/virtualization.rb | 22 | ||||
-rw-r--r-- | lib/ohai/plugins/linux/virtualization.rb | 30 | ||||
-rw-r--r-- | lib/ohai/plugins/solaris2/virtualization.rb | 18 | ||||
-rw-r--r-- | lib/ohai/plugins/windows/virtualization.rb | 44 |
5 files changed, 66 insertions, 101 deletions
diff --git a/lib/ohai/mixin/dmi_decode.rb b/lib/ohai/mixin/dmi_decode.rb index 018b8813..4ef4ef6c 100644 --- a/lib/ohai/mixin/dmi_decode.rb +++ b/lib/ohai/mixin/dmi_decode.rb @@ -1,6 +1,6 @@ # # Author:: Tim Smith <tsmith@chef.io> -# Copyright:: Copyright (c) 2015-2016 Chef Software, Inc. +# Copyright:: Copyright (c) 2015-2018 Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,29 +17,34 @@ # http://www.dmo.ca/blog/detecting-virtualization-on-linux module ::Ohai::Mixin::DmiDecode - def guest_from_dmi(dmi_data) - dmi_data.each_line do |line| - case line - when /Manufacturer: Microsoft/ - return "hyperv" if dmi_data =~ /Version: (7.0|Hyper-V)/ - when /Manufacturer: VMware/ - return "vmware" - when /Manufacturer: Xen/ - return "xen" - when /Product.*: VirtualBox/ - return "vbox" - when /Product.*: OpenStack/ - return "openstack" - when /Manufacturer: QEMU|Product Name: (KVM|RHEV)/ - return "kvm" - when /Product.*: BHYVE/ - return "bhyve" - when /Manufacturer: Veertu/ - return "veertu" - when /Manufacturer: Amazon EC2/ - return "amazonec2" - end + def guest_from_dmi_data(manufacturer, product, version) + case manufacturer + when /Xen/ + return "xen" + when /VMware/ + return "vmware" + when /Microsoft/ + return "hyperv" if product =~ /Virtual Machine/ + when /Amazon EC2/ + return "amazonec2" + when /QEMU/ + return "kvm" + when /Veertu/ + return "veertu" + when /Parallels/ + return "parallels" end - nil + + case product + when /VirtualBox/ + return "vbox" + when /OpenStack/ + return "openstack" + when /(KVM|RHEV)/ + return "kvm" + when /BHYVE/ + return "bhyve" + end + nil # doesn't look like a virt end end diff --git a/lib/ohai/plugins/bsd/virtualization.rb b/lib/ohai/plugins/bsd/virtualization.rb index f6913340..9635070f 100644 --- a/lib/ohai/plugins/bsd/virtualization.rb +++ b/lib/ohai/plugins/bsd/virtualization.rb @@ -17,11 +17,11 @@ # limitations under the License. # -require "ohai/mixin/dmi_decode" - Ohai.plugin(:Virtualization) do - include Ohai::Mixin::DmiDecode provides "virtualization" + depends "dmi" + require "ohai/mixin/dmi_decode" + include Ohai::Mixin::DmiDecode collect_data(:freebsd, :openbsd, :netbsd, :dragonflybsd) do @@ -108,15 +108,13 @@ Ohai.plugin(:Virtualization) do logger.trace("Plugin Virtualization: Guest running on #{hypervisor} detected") end - # parse dmidecode to discover various virtualization guests - if File.exist?("/usr/local/sbin/dmidecode") || File.exist?("/usr/pkg/sbin/dmidecode") - guest = guest_from_dmi(shell_out("dmidecode").stdout) - if guest - virtualization[:system] = guest - virtualization[:role] = "guest" - virtualization[:systems][guest.to_sym] = "guest" - logger.trace("Plugin Virtualization: Guest running on #{guest} detected") - end + # parse dmi to discover various virtualization guests + guest = guest_from_dmi_data(get_attribute(:dmi, :system, :manufacturer), get_attribute(:dmi, :system, :product), get_attribute(:dmi, :system, :version)) + if guest + logger.trace("Plugin Virtualization: DMI data indicates #{guest} guest") + virtualization[:system] = guest + virtualization[:role] = "guest" + virtualization[:systems][guest.to_sym] = "guest" end end end diff --git a/lib/ohai/plugins/linux/virtualization.rb b/lib/ohai/plugins/linux/virtualization.rb index a605bd9c..fdc4b197 100644 --- a/lib/ohai/plugins/linux/virtualization.rb +++ b/lib/ohai/plugins/linux/virtualization.rb @@ -17,9 +17,10 @@ # Ohai.plugin(:Virtualization) do + provides "virtualization" + depends "dmi" require "ohai/mixin/dmi_decode" include Ohai::Mixin::DmiDecode - provides "virtualization" def lxc_version_exists? which("lxc-version") || which("lxc-start") @@ -129,25 +130,14 @@ Ohai.plugin(:Virtualization) do virtualization[:systems][:openvz] = "guest" end - # Detect Parallels virtual machine from pci devices - if File.exist?("/proc/bus/pci/devices") - if File.read("/proc/bus/pci/devices") =~ /1ab84000/ - logger.trace("Plugin Virtualization: /proc/bus/pci/devices contains '1ab84000' pci device. Detecting as parallels guest") - virtualization[:system] = "parallels" - virtualization[:role] = "guest" - virtualization[:systems][:parallels] = "guest" - end - end - - # parse dmidecode to discover various virtualization guests - if File.exist?("/usr/sbin/dmidecode") - guest = guest_from_dmi(shell_out("dmidecode").stdout) - if guest - logger.trace("Plugin Virtualization: dmidecode contains string indicating #{guest} guest") - virtualization[:system] = guest - virtualization[:role] = "guest" - virtualization[:systems][guest.to_sym] = "guest" - end + # parse dmi to discover various virtualization guests + logger.trace("Looking up #{get_attribute(:dmi, :system, :manufacturer)}, #{get_attribute(:dmi, :system, :product)} #{get_attribute(:dmi, :system, :version)}") + guest = guest_from_dmi_data(get_attribute(:dmi, :system, :manufacturer), get_attribute(:dmi, :system, :product), get_attribute(:dmi, :system, :version)) + if guest + logger.trace("Plugin Virtualization: DMI data indicates #{guest} guest") + virtualization[:system] = guest + virtualization[:role] = "guest" + virtualization[:systems][guest.to_sym] = "guest" end # Detect Hyper-V guest and the hostname of the host diff --git a/lib/ohai/plugins/solaris2/virtualization.rb b/lib/ohai/plugins/solaris2/virtualization.rb index 3c15a1ef..d0187e87 100644 --- a/lib/ohai/plugins/solaris2/virtualization.rb +++ b/lib/ohai/plugins/solaris2/virtualization.rb @@ -22,6 +22,7 @@ Ohai.plugin(:Virtualization) do require "ohai/mixin/dmi_decode" include Ohai::Mixin::DmiDecode provides "virtualization" + depends "dmi" def collect_solaris_guestid command = "/usr/sbin/zoneadm list -p" @@ -44,16 +45,13 @@ Ohai.plugin(:Virtualization) do end end - # Pass smbios information to the dmi_decode mixin to - # identify possible virtualization systems - smbios_path = Ohai.abs_path("/usr/sbin/smbios") - if File.exist?(smbios_path) - guest = guest_from_dmi(shell_out(smbios_path).stdout) - if guest - virtualization[:system] = guest - virtualization[:role] = "guest" - virtualization[:systems][guest.to_sym] = "guest" - end + # parse dmi to discover various virtualization guests + guest = guest_from_dmi_data(get_attribute(:dmi, :system, :manufacturer), get_attribute(:dmi, :system, :product), get_attribute(:dmi, :system, :version)) + if guest + logger.trace("Plugin Virtualization: DMI data indicates #{guest} guest") + virtualization[:system] = guest + virtualization[:role] = "guest" + virtualization[:systems][guest.to_sym] = "guest" end if File.executable?("/usr/sbin/zoneadm") diff --git a/lib/ohai/plugins/windows/virtualization.rb b/lib/ohai/plugins/windows/virtualization.rb index 16d750ea..b60aff8b 100644 --- a/lib/ohai/plugins/windows/virtualization.rb +++ b/lib/ohai/plugins/windows/virtualization.rb @@ -20,6 +20,8 @@ Ohai.plugin(:Virtualization) do provides "virtualization" + require "ohai/mixin/dmi_decode" + include Ohai::Mixin::DmiDecode collect_data(:windows) do require "wmi-lite/wmi" @@ -27,44 +29,16 @@ Ohai.plugin(:Virtualization) do virtualization Mash.new unless virtualization virtualization[:systems] = Mash.new unless virtualization[:systems] - # Grab BIOS data from WMI to determine vendor information + # Grab system DMI data from WMI to determine vendor information wmi = WmiLite::Wmi.new - bios = wmi.instances_of("Win32_BIOS") + dmi = wmi.first_of("Win32_ComputerSystemProduct") - case bios[0]["manufacturer"] - when "innotek GmbH" - virtualization[:system] = "vbox" + guest = guest_from_dmi_data(dmi["vendor"], dmi["name"], dmi["version"]) + if guest + logger.trace("Plugin Virtualization: DMI data in Win32_ComputerSystemProduct indicates #{guest} guest") + virtualization[:system] = guest virtualization[:role] = "guest" - virtualization[:systems][:vbox] = "guest" - when "Parallels Software International Inc." - virtualization[:system] = "parallels" - virtualization[:role] = "guest" - virtualization[:systems][:parallels] = "guest" - when "Bochs" - virtualization[:system] = "kvm" - virtualization[:role] = "guest" - virtualization[:systems][:kvm] = "guest" - when "American Megatrends Inc." - if bios[0]["version"] =~ /VRTUAL -/ - virtualization[:system] = "hyper-v" - virtualization[:role] = "guest" - virtualization[:systems][:hyperv] = "guest" - end - when "Xen" - virtualization[:system] = "xen" - virtualization[:role] = "guest" - virtualization[:systems][:xen] = "guest" - when "Veertu" - virtualization[:system] = "veertu" - virtualization[:role] = "guest" - virtualization[:systems][:veertu] = "guest" - end - - # vmware fusion detection - if bios[0]["serialnumber"] =~ /VMware/ - virtualization[:system] = "vmware" - virtualization[:role] = "guest" - virtualization[:systems][:vmware] = "guest" + virtualization[:systems][guest.to_sym] = "guest" end end end |