From 7ca564793a8a6200520ce0387aa8aaf9d6225452 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Mon, 26 Feb 2018 18:02:45 +0100 Subject: use /etc/os-release if it exists on the system --- lib/ohai/plugins/linux/platform.rb | 244 +++++++++++++++++++------------------ 1 file changed, 126 insertions(+), 118 deletions(-) diff --git a/lib/ohai/plugins/linux/platform.rb b/lib/ohai/plugins/linux/platform.rb index 55d939cf..22f64402 100644 --- a/lib/ohai/plugins/linux/platform.rb +++ b/lib/ohai/plugins/linux/platform.rb @@ -155,133 +155,141 @@ Ohai.plugin(:Platform) do end collect_data(:linux) do - # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching - if File.exist?("/etc/oracle-release") - contents = File.read("/etc/oracle-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/enterprise-release") - contents = File.read("/etc/enterprise-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/f5-release") - platform "bigip" - platform_version bigip_version - elsif File.exist?("/etc/debian_version") - # Ubuntu and Debian both have /etc/debian_version - # Ubuntu should always have a working lsb, debian does not by default - if lsb[:id] =~ /Ubuntu/i - platform "ubuntu" - platform_version lsb[:release] - elsif lsb[:id] =~ /LinuxMint/i - platform "linuxmint" - platform_version lsb[:release] - else - if File.exist?("/usr/bin/raspi-config") - platform "raspbian" - elsif Dir.exist?("/etc/cumulus") - platform "cumulus" + # use os-release (present on all modern linux distros) or use old *-release files as fallback + # platform_family also does not need to be hardcoded anymore + if File.exist?("/etc/os-release") + platform_family os_release_info["ID_LIKE"] + platform os_release_info["ID"] + platform_version os_release_info["VERSION_ID"] + else + # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching + if File.exist?("/etc/oracle-release") + contents = File.read("/etc/oracle-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/enterprise-release") + contents = File.read("/etc/enterprise-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/f5-release") + platform "bigip" + platform_version bigip_version + elsif File.exist?("/etc/debian_version") + # Ubuntu and Debian both have /etc/debian_version + # Ubuntu should always have a working lsb, debian does not by default + if lsb[:id] =~ /Ubuntu/i + platform "ubuntu" + platform_version lsb[:release] + elsif lsb[:id] =~ /LinuxMint/i + platform "linuxmint" + platform_version lsb[:release] else - platform "debian" + if File.exist?("/usr/bin/raspi-config") + platform "raspbian" + elsif Dir.exist?("/etc/cumulus") + platform "cumulus" + else + platform "debian" + end + platform_version debian_platform_version end - platform_version debian_platform_version - end - elsif File.exist?("/etc/parallels-release") - contents = File.read("/etc/parallels-release").chomp - platform get_redhatish_platform(contents) - platform_version contents.match(/(\d\.\d\.\d)/)[0] - elsif File.exist?("/etc/redhat-release") - if os_release_file_is_cisco? # Cisco guestshell - platform "nexus_centos" - platform_version os_release_info["VERSION"] - else - contents = File.read("/etc/redhat-release").chomp + elsif File.exist?("/etc/parallels-release") + contents = File.read("/etc/parallels-release").chomp + platform get_redhatish_platform(contents) + platform_version contents.match(/(\d\.\d\.\d)/)[0] + elsif File.exist?("/etc/redhat-release") + if os_release_file_is_cisco? # Cisco guestshell + platform "nexus_centos" + platform_version os_release_info["VERSION"] + else + contents = File.read("/etc/redhat-release").chomp + platform get_redhatish_platform(contents) + platform_version get_redhatish_version(contents) + end + elsif File.exist?("/etc/system-release") + contents = File.read("/etc/system-release").chomp platform get_redhatish_platform(contents) platform_version get_redhatish_version(contents) - end - elsif File.exist?("/etc/system-release") - contents = File.read("/etc/system-release").chomp - platform get_redhatish_platform(contents) - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/SuSE-release") - suse_release = File.read("/etc/SuSE-release") - suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") - suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" - platform_version suse_version - if suse_release =~ /^openSUSE/ - # opensuse releases >= 42 are openSUSE Leap - if platform_version.to_i < 42 - platform "opensuse" + elsif File.exist?("/etc/SuSE-release") + suse_release = File.read("/etc/SuSE-release") + suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") + suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" + platform_version suse_version + if suse_release =~ /^openSUSE/ + # opensuse releases >= 42 are openSUSE Leap + if platform_version.to_i < 42 + platform "opensuse" + else + platform "opensuseleap" + end else - platform "opensuseleap" + platform "suse" end - else - platform "suse" - end - elsif File.exist?("/etc/Eos-release") - platform "arista_eos" - platform_version File.read("/etc/Eos-release").strip.split[-1] - platform_family "fedora" - elsif os_release_file_is_cisco? - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if - os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") + elsif File.exist?("/etc/Eos-release") + platform "arista_eos" + platform_version File.read("/etc/Eos-release").strip.split[-1] + platform_family "fedora" + elsif os_release_file_is_cisco? + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if + os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") - case os_release_info["ID"] - when "nexus" - platform "nexus" - when "ios_xr" - platform "ios_xr" - else - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" - end + case os_release_info["ID"] + when "nexus" + platform "nexus" + when "ios_xr" + platform "ios_xr" + else + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" + end - platform_family "wrlinux" - platform_version os_release_info["VERSION"] - elsif File.exist?("/etc/gentoo-release") - platform "gentoo" - # the gentoo release version is the base version used to bootstrap - # a node and doesn't have a lot of meaning in a rolling release distro - # kernel release will be used - ex. 3.18.7-gentoo - platform_version `uname -r`.strip - elsif File.exist?("/etc/slackware-version") - platform "slackware" - platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join - elsif File.exist?("/etc/arch-release") - platform "arch" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 2.6.32-ARCH - platform_version `uname -r`.strip - elsif File.exist?("/etc/exherbo-release") - platform "exherbo" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 3.13 - platform_version `uname -r`.strip - elsif File.exist?("/etc/alpine-release") - platform "alpine" - platform_version File.read("/etc/alpine-release").strip - elsif File.exist?("/usr/lib/os-release") - contents = File.read("/usr/lib/os-release") - if /Clear Linux/ =~ contents - platform "clearlinux" - platform_version contents[/VERSION_ID=(\d+)/, 1] + platform_family "wrlinux" + platform_version os_release_info["VERSION"] + elsif File.exist?("/etc/gentoo-release") + platform "gentoo" + # the gentoo release version is the base version used to bootstrap + # a node and doesn't have a lot of meaning in a rolling release distro + # kernel release will be used - ex. 3.18.7-gentoo + platform_version `uname -r`.strip + elsif File.exist?("/etc/slackware-version") + platform "slackware" + platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join + elsif File.exist?("/etc/arch-release") + platform "arch" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 2.6.32-ARCH + platform_version `uname -r`.strip + elsif File.exist?("/etc/exherbo-release") + platform "exherbo" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 3.13 + platform_version `uname -r`.strip + elsif File.exist?("/etc/alpine-release") + platform "alpine" + platform_version File.read("/etc/alpine-release").strip + elsif File.exist?("/usr/lib/os-release") + contents = File.read("/usr/lib/os-release") + if /Clear Linux/ =~ contents + platform "clearlinux" + platform_version contents[/VERSION_ID=(\d+)/, 1] + end + elsif lsb[:id] =~ /RedHat/i + platform "redhat" + platform_version lsb[:release] + elsif lsb[:id] =~ /Amazon/i + platform "amazon" + platform_version lsb[:release] + elsif lsb[:id] =~ /ScientificSL/i + platform "scientific" + platform_version lsb[:release] + elsif lsb[:id] =~ /XenServer/i + platform "xenserver" + platform_version lsb[:release] + elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties + platform lsb[:id].downcase + platform_version lsb[:release] end - elsif lsb[:id] =~ /RedHat/i - platform "redhat" - platform_version lsb[:release] - elsif lsb[:id] =~ /Amazon/i - platform "amazon" - platform_version lsb[:release] - elsif lsb[:id] =~ /ScientificSL/i - platform "scientific" - platform_version lsb[:release] - elsif lsb[:id] =~ /XenServer/i - platform "xenserver" - platform_version lsb[:release] - elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties - platform lsb[:id].downcase - platform_version lsb[:release] - end - platform_family determine_platform_family + platform_family determine_platform_family + end end end -- cgit v1.2.1 From 0cb5f8d6ed92656968f243b470f025079926ec01 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Mon, 26 Feb 2018 18:03:18 +0100 Subject: os-release example for SLES 15 --- spec/unit/plugins/linux/platform_spec.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/unit/plugins/linux/platform_spec.rb b/spec/unit/plugins/linux/platform_spec.rb index efe2884e..6b6b4aee 100644 --- a/spec/unit/plugins/linux/platform_spec.rb +++ b/spec/unit/plugins/linux/platform_spec.rb @@ -686,6 +686,17 @@ CISCO_RELEASE describe "on suse" do + describe "with os-release results" do + let(:have_suse_release) { false } + it "should read the platform as sles on SLES 15" do + expect(File).to receive(:read).with("/etc/os-release"). and_return("VERSION=\"15\"\nVERSION_ID=\"15\"\nPRETTY_NAME=\"SUSE Linux Enterprise Server 15\"\nID=\"sles\"\nID_LIKE=\"suse\"\nANSI_COLOR=\"0;32\"\nCPE_NAME=\"cpe:/o:suse:sles:15\"\n") + @plugin.run + expect(@plugin[:platform_family]).to eq("suse") + expect(@plugin[:platform]).to eq("sles") + expect(@plugin[:platform_version]).to eq("15") + end + end + let(:have_suse_release) { true } describe "with lsb_release results" do -- cgit v1.2.1 From 88f4b8526d65f0e837c7bea78ba1869fa4a25ee4 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Mon, 26 Feb 2018 18:02:45 +0100 Subject: use /etc/os-release if it exists on the system --- lib/ohai/plugins/linux/platform.rb | 244 +++++++++++++++++++------------------ 1 file changed, 126 insertions(+), 118 deletions(-) diff --git a/lib/ohai/plugins/linux/platform.rb b/lib/ohai/plugins/linux/platform.rb index 55d939cf..22f64402 100644 --- a/lib/ohai/plugins/linux/platform.rb +++ b/lib/ohai/plugins/linux/platform.rb @@ -155,133 +155,141 @@ Ohai.plugin(:Platform) do end collect_data(:linux) do - # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching - if File.exist?("/etc/oracle-release") - contents = File.read("/etc/oracle-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/enterprise-release") - contents = File.read("/etc/enterprise-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/f5-release") - platform "bigip" - platform_version bigip_version - elsif File.exist?("/etc/debian_version") - # Ubuntu and Debian both have /etc/debian_version - # Ubuntu should always have a working lsb, debian does not by default - if lsb[:id] =~ /Ubuntu/i - platform "ubuntu" - platform_version lsb[:release] - elsif lsb[:id] =~ /LinuxMint/i - platform "linuxmint" - platform_version lsb[:release] - else - if File.exist?("/usr/bin/raspi-config") - platform "raspbian" - elsif Dir.exist?("/etc/cumulus") - platform "cumulus" + # use os-release (present on all modern linux distros) or use old *-release files as fallback + # platform_family also does not need to be hardcoded anymore + if File.exist?("/etc/os-release") + platform_family os_release_info["ID_LIKE"] + platform os_release_info["ID"] + platform_version os_release_info["VERSION_ID"] + else + # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching + if File.exist?("/etc/oracle-release") + contents = File.read("/etc/oracle-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/enterprise-release") + contents = File.read("/etc/enterprise-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/f5-release") + platform "bigip" + platform_version bigip_version + elsif File.exist?("/etc/debian_version") + # Ubuntu and Debian both have /etc/debian_version + # Ubuntu should always have a working lsb, debian does not by default + if lsb[:id] =~ /Ubuntu/i + platform "ubuntu" + platform_version lsb[:release] + elsif lsb[:id] =~ /LinuxMint/i + platform "linuxmint" + platform_version lsb[:release] else - platform "debian" + if File.exist?("/usr/bin/raspi-config") + platform "raspbian" + elsif Dir.exist?("/etc/cumulus") + platform "cumulus" + else + platform "debian" + end + platform_version debian_platform_version end - platform_version debian_platform_version - end - elsif File.exist?("/etc/parallels-release") - contents = File.read("/etc/parallels-release").chomp - platform get_redhatish_platform(contents) - platform_version contents.match(/(\d\.\d\.\d)/)[0] - elsif File.exist?("/etc/redhat-release") - if os_release_file_is_cisco? # Cisco guestshell - platform "nexus_centos" - platform_version os_release_info["VERSION"] - else - contents = File.read("/etc/redhat-release").chomp + elsif File.exist?("/etc/parallels-release") + contents = File.read("/etc/parallels-release").chomp + platform get_redhatish_platform(contents) + platform_version contents.match(/(\d\.\d\.\d)/)[0] + elsif File.exist?("/etc/redhat-release") + if os_release_file_is_cisco? # Cisco guestshell + platform "nexus_centos" + platform_version os_release_info["VERSION"] + else + contents = File.read("/etc/redhat-release").chomp + platform get_redhatish_platform(contents) + platform_version get_redhatish_version(contents) + end + elsif File.exist?("/etc/system-release") + contents = File.read("/etc/system-release").chomp platform get_redhatish_platform(contents) platform_version get_redhatish_version(contents) - end - elsif File.exist?("/etc/system-release") - contents = File.read("/etc/system-release").chomp - platform get_redhatish_platform(contents) - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/SuSE-release") - suse_release = File.read("/etc/SuSE-release") - suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") - suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" - platform_version suse_version - if suse_release =~ /^openSUSE/ - # opensuse releases >= 42 are openSUSE Leap - if platform_version.to_i < 42 - platform "opensuse" + elsif File.exist?("/etc/SuSE-release") + suse_release = File.read("/etc/SuSE-release") + suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") + suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" + platform_version suse_version + if suse_release =~ /^openSUSE/ + # opensuse releases >= 42 are openSUSE Leap + if platform_version.to_i < 42 + platform "opensuse" + else + platform "opensuseleap" + end else - platform "opensuseleap" + platform "suse" end - else - platform "suse" - end - elsif File.exist?("/etc/Eos-release") - platform "arista_eos" - platform_version File.read("/etc/Eos-release").strip.split[-1] - platform_family "fedora" - elsif os_release_file_is_cisco? - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if - os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") + elsif File.exist?("/etc/Eos-release") + platform "arista_eos" + platform_version File.read("/etc/Eos-release").strip.split[-1] + platform_family "fedora" + elsif os_release_file_is_cisco? + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if + os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") - case os_release_info["ID"] - when "nexus" - platform "nexus" - when "ios_xr" - platform "ios_xr" - else - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" - end + case os_release_info["ID"] + when "nexus" + platform "nexus" + when "ios_xr" + platform "ios_xr" + else + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" + end - platform_family "wrlinux" - platform_version os_release_info["VERSION"] - elsif File.exist?("/etc/gentoo-release") - platform "gentoo" - # the gentoo release version is the base version used to bootstrap - # a node and doesn't have a lot of meaning in a rolling release distro - # kernel release will be used - ex. 3.18.7-gentoo - platform_version `uname -r`.strip - elsif File.exist?("/etc/slackware-version") - platform "slackware" - platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join - elsif File.exist?("/etc/arch-release") - platform "arch" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 2.6.32-ARCH - platform_version `uname -r`.strip - elsif File.exist?("/etc/exherbo-release") - platform "exherbo" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 3.13 - platform_version `uname -r`.strip - elsif File.exist?("/etc/alpine-release") - platform "alpine" - platform_version File.read("/etc/alpine-release").strip - elsif File.exist?("/usr/lib/os-release") - contents = File.read("/usr/lib/os-release") - if /Clear Linux/ =~ contents - platform "clearlinux" - platform_version contents[/VERSION_ID=(\d+)/, 1] + platform_family "wrlinux" + platform_version os_release_info["VERSION"] + elsif File.exist?("/etc/gentoo-release") + platform "gentoo" + # the gentoo release version is the base version used to bootstrap + # a node and doesn't have a lot of meaning in a rolling release distro + # kernel release will be used - ex. 3.18.7-gentoo + platform_version `uname -r`.strip + elsif File.exist?("/etc/slackware-version") + platform "slackware" + platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join + elsif File.exist?("/etc/arch-release") + platform "arch" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 2.6.32-ARCH + platform_version `uname -r`.strip + elsif File.exist?("/etc/exherbo-release") + platform "exherbo" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 3.13 + platform_version `uname -r`.strip + elsif File.exist?("/etc/alpine-release") + platform "alpine" + platform_version File.read("/etc/alpine-release").strip + elsif File.exist?("/usr/lib/os-release") + contents = File.read("/usr/lib/os-release") + if /Clear Linux/ =~ contents + platform "clearlinux" + platform_version contents[/VERSION_ID=(\d+)/, 1] + end + elsif lsb[:id] =~ /RedHat/i + platform "redhat" + platform_version lsb[:release] + elsif lsb[:id] =~ /Amazon/i + platform "amazon" + platform_version lsb[:release] + elsif lsb[:id] =~ /ScientificSL/i + platform "scientific" + platform_version lsb[:release] + elsif lsb[:id] =~ /XenServer/i + platform "xenserver" + platform_version lsb[:release] + elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties + platform lsb[:id].downcase + platform_version lsb[:release] end - elsif lsb[:id] =~ /RedHat/i - platform "redhat" - platform_version lsb[:release] - elsif lsb[:id] =~ /Amazon/i - platform "amazon" - platform_version lsb[:release] - elsif lsb[:id] =~ /ScientificSL/i - platform "scientific" - platform_version lsb[:release] - elsif lsb[:id] =~ /XenServer/i - platform "xenserver" - platform_version lsb[:release] - elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties - platform lsb[:id].downcase - platform_version lsb[:release] - end - platform_family determine_platform_family + platform_family determine_platform_family + end end end -- cgit v1.2.1 From 7e27641a9b6ea8126eb14154b9ba7fdd073018ba Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Mon, 26 Feb 2018 18:03:18 +0100 Subject: os-release example for SLES 15 --- spec/unit/plugins/linux/platform_spec.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/unit/plugins/linux/platform_spec.rb b/spec/unit/plugins/linux/platform_spec.rb index efe2884e..6b6b4aee 100644 --- a/spec/unit/plugins/linux/platform_spec.rb +++ b/spec/unit/plugins/linux/platform_spec.rb @@ -686,6 +686,17 @@ CISCO_RELEASE describe "on suse" do + describe "with os-release results" do + let(:have_suse_release) { false } + it "should read the platform as sles on SLES 15" do + expect(File).to receive(:read).with("/etc/os-release"). and_return("VERSION=\"15\"\nVERSION_ID=\"15\"\nPRETTY_NAME=\"SUSE Linux Enterprise Server 15\"\nID=\"sles\"\nID_LIKE=\"suse\"\nANSI_COLOR=\"0;32\"\nCPE_NAME=\"cpe:/o:suse:sles:15\"\n") + @plugin.run + expect(@plugin[:platform_family]).to eq("suse") + expect(@plugin[:platform]).to eq("sles") + expect(@plugin[:platform_version]).to eq("15") + end + end + let(:have_suse_release) { true } describe "with lsb_release results" do -- cgit v1.2.1 From 6f35a70e7839c0f6bc85f7558b13be47efcb0c22 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Thu, 1 Mar 2018 17:53:27 +0100 Subject: add more suse distributions --- lib/ohai/plugins/linux/platform.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ohai/plugins/linux/platform.rb b/lib/ohai/plugins/linux/platform.rb index 22f64402..ec9d2ae5 100644 --- a/lib/ohai/plugins/linux/platform.rb +++ b/lib/ohai/plugins/linux/platform.rb @@ -131,7 +131,7 @@ Ohai.plugin(:Platform) do "rhel" when /amazon/ "amazon" - when /suse/ + when /suse/, /sles/, /opensuse/ "suse" when /fedora/, /pidora/, /arista_eos/ # In the broadest sense: RPM-based, fedora-derived distributions which are not strictly re-compiled RHEL (if it uses RPMs, and smells more like redhat and less like -- cgit v1.2.1 From e39362c9d50885745c424dad46455cb84d4574f0 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Thu, 1 Mar 2018 17:55:10 +0100 Subject: Use os-release (present on all modern linux distros) BUT use old *-release files as fallback. os-release will only be used if no other *-release file is present. We have to do this for compatibility reasons, or older OS releases might get different "platform" or "platform_version" attributes (e.g. SLES12, RHEL7). platform_family also does not need to be hardcoded anymore. This would be the correct way, but we stick with "determine_platform_family" for compatibility reasons. --- lib/ohai/plugins/linux/platform.rb | 254 +++++++++++++++++++------------------ 1 file changed, 128 insertions(+), 126 deletions(-) diff --git a/lib/ohai/plugins/linux/platform.rb b/lib/ohai/plugins/linux/platform.rb index ec9d2ae5..7bc5e1a7 100644 --- a/lib/ohai/plugins/linux/platform.rb +++ b/lib/ohai/plugins/linux/platform.rb @@ -155,141 +155,143 @@ Ohai.plugin(:Platform) do end collect_data(:linux) do - # use os-release (present on all modern linux distros) or use old *-release files as fallback - # platform_family also does not need to be hardcoded anymore - if File.exist?("/etc/os-release") - platform_family os_release_info["ID_LIKE"] - platform os_release_info["ID"] - platform_version os_release_info["VERSION_ID"] - else - # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching - if File.exist?("/etc/oracle-release") - contents = File.read("/etc/oracle-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/enterprise-release") - contents = File.read("/etc/enterprise-release").chomp - platform "oracle" - platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/f5-release") - platform "bigip" - platform_version bigip_version - elsif File.exist?("/etc/debian_version") - # Ubuntu and Debian both have /etc/debian_version - # Ubuntu should always have a working lsb, debian does not by default - if lsb[:id] =~ /Ubuntu/i - platform "ubuntu" - platform_version lsb[:release] - elsif lsb[:id] =~ /LinuxMint/i - platform "linuxmint" - platform_version lsb[:release] - else - if File.exist?("/usr/bin/raspi-config") - platform "raspbian" - elsif Dir.exist?("/etc/cumulus") - platform "cumulus" - else - platform "debian" - end - platform_version debian_platform_version - end - elsif File.exist?("/etc/parallels-release") - contents = File.read("/etc/parallels-release").chomp - platform get_redhatish_platform(contents) - platform_version contents.match(/(\d\.\d\.\d)/)[0] - elsif File.exist?("/etc/redhat-release") - if os_release_file_is_cisco? # Cisco guestshell - platform "nexus_centos" - platform_version os_release_info["VERSION"] + # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching + if File.exist?("/etc/oracle-release") + contents = File.read("/etc/oracle-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/enterprise-release") + contents = File.read("/etc/enterprise-release").chomp + platform "oracle" + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/f5-release") + platform "bigip" + platform_version bigip_version + elsif File.exist?("/etc/debian_version") + # Ubuntu and Debian both have /etc/debian_version + # Ubuntu should always have a working lsb, debian does not by default + if lsb[:id] =~ /Ubuntu/i + platform "ubuntu" + platform_version lsb[:release] + elsif lsb[:id] =~ /LinuxMint/i + platform "linuxmint" + platform_version lsb[:release] + else + if File.exist?("/usr/bin/raspi-config") + platform "raspbian" + elsif Dir.exist?("/etc/cumulus") + platform "cumulus" else - contents = File.read("/etc/redhat-release").chomp - platform get_redhatish_platform(contents) - platform_version get_redhatish_version(contents) + platform "debian" end - elsif File.exist?("/etc/system-release") - contents = File.read("/etc/system-release").chomp + platform_version debian_platform_version + end + elsif File.exist?("/etc/parallels-release") + contents = File.read("/etc/parallels-release").chomp + platform get_redhatish_platform(contents) + platform_version contents.match(/(\d\.\d\.\d)/)[0] + elsif File.exist?("/etc/redhat-release") + if os_release_file_is_cisco? # Cisco guestshell + platform "nexus_centos" + platform_version os_release_info["VERSION"] + else + contents = File.read("/etc/redhat-release").chomp platform get_redhatish_platform(contents) platform_version get_redhatish_version(contents) - elsif File.exist?("/etc/SuSE-release") - suse_release = File.read("/etc/SuSE-release") - suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") - suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" - platform_version suse_version - if suse_release =~ /^openSUSE/ - # opensuse releases >= 42 are openSUSE Leap - if platform_version.to_i < 42 - platform "opensuse" - else - platform "opensuseleap" - end - else - platform "suse" - end - elsif File.exist?("/etc/Eos-release") - platform "arista_eos" - platform_version File.read("/etc/Eos-release").strip.split[-1] - platform_family "fedora" - elsif os_release_file_is_cisco? - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if - os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") - - case os_release_info["ID"] - when "nexus" - platform "nexus" - when "ios_xr" - platform "ios_xr" + end + elsif File.exist?("/etc/system-release") + contents = File.read("/etc/system-release").chomp + platform get_redhatish_platform(contents) + platform_version get_redhatish_version(contents) + elsif File.exist?("/etc/SuSE-release") + suse_release = File.read("/etc/SuSE-release") + suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".") + suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == "" + platform_version suse_version + if suse_release =~ /^openSUSE/ + # opensuse releases >= 42 are openSUSE Leap + if platform_version.to_i < 42 + platform "opensuse" else - raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" + platform "opensuseleap" end + else + platform "suse" + end + elsif File.exist?("/etc/Eos-release") + platform "arista_eos" + platform_version File.read("/etc/Eos-release").strip.split[-1] + platform_family "fedora" + elsif os_release_file_is_cisco? + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if + os_release_info["ID_LIKE"].nil? || ! os_release_info["ID_LIKE"].include?("wrlinux") - platform_family "wrlinux" - platform_version os_release_info["VERSION"] - elsif File.exist?("/etc/gentoo-release") - platform "gentoo" - # the gentoo release version is the base version used to bootstrap - # a node and doesn't have a lot of meaning in a rolling release distro - # kernel release will be used - ex. 3.18.7-gentoo - platform_version `uname -r`.strip - elsif File.exist?("/etc/slackware-version") - platform "slackware" - platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join - elsif File.exist?("/etc/arch-release") - platform "arch" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 2.6.32-ARCH - platform_version `uname -r`.strip - elsif File.exist?("/etc/exherbo-release") - platform "exherbo" - # no way to determine platform_version in a rolling release distribution - # kernel release will be used - ex. 3.13 - platform_version `uname -r`.strip - elsif File.exist?("/etc/alpine-release") - platform "alpine" - platform_version File.read("/etc/alpine-release").strip - elsif File.exist?("/usr/lib/os-release") - contents = File.read("/usr/lib/os-release") - if /Clear Linux/ =~ contents - platform "clearlinux" - platform_version contents[/VERSION_ID=(\d+)/, 1] - end - elsif lsb[:id] =~ /RedHat/i - platform "redhat" - platform_version lsb[:release] - elsif lsb[:id] =~ /Amazon/i - platform "amazon" - platform_version lsb[:release] - elsif lsb[:id] =~ /ScientificSL/i - platform "scientific" - platform_version lsb[:release] - elsif lsb[:id] =~ /XenServer/i - platform "xenserver" - platform_version lsb[:release] - elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties - platform lsb[:id].downcase - platform_version lsb[:release] + case os_release_info["ID"] + when "nexus" + platform "nexus" + when "ios_xr" + platform "ios_xr" + else + raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field" end - platform_family determine_platform_family + platform_family "wrlinux" + platform_version os_release_info["VERSION"] + elsif File.exist?("/etc/gentoo-release") + platform "gentoo" + # the gentoo release version is the base version used to bootstrap + # a node and doesn't have a lot of meaning in a rolling release distro + # kernel release will be used - ex. 3.18.7-gentoo + platform_version `uname -r`.strip + elsif File.exist?("/etc/slackware-version") + platform "slackware" + platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join + elsif File.exist?("/etc/arch-release") + platform "arch" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 2.6.32-ARCH + platform_version `uname -r`.strip + elsif File.exist?("/etc/exherbo-release") + platform "exherbo" + # no way to determine platform_version in a rolling release distribution + # kernel release will be used - ex. 3.13 + platform_version `uname -r`.strip + elsif File.exist?("/etc/alpine-release") + platform "alpine" + platform_version File.read("/etc/alpine-release").strip + elsif File.exist?("/usr/lib/os-release") + contents = File.read("/usr/lib/os-release") + if /Clear Linux/ =~ contents + platform "clearlinux" + platform_version contents[/VERSION_ID=(\d+)/, 1] + end + elsif lsb[:id] =~ /RedHat/i + platform "redhat" + platform_version lsb[:release] + elsif lsb[:id] =~ /Amazon/i + platform "amazon" + platform_version lsb[:release] + elsif lsb[:id] =~ /ScientificSL/i + platform "scientific" + platform_version lsb[:release] + elsif lsb[:id] =~ /XenServer/i + platform "xenserver" + platform_version lsb[:release] + elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties + platform lsb[:id].downcase + platform_version lsb[:release] + # Use os-release (present on all modern linux distros) BUT use old *-release files as fallback. + # os-release will only be used if no other *-release file is present. + # We have to do this for compatibility reasons, or older OS releases might get different + # "platform" or "platform_version" attributes (e.g. SLES12, RHEL7). + elsif File.exist?("/etc/os-release") + platform os_release_info["ID"] + platform_version os_release_info["VERSION_ID"] + # platform_family also does not need to be hardcoded anymore. + # This would be the correct way, but we stick with "determine_platform_family" for compatibility reasons. + # platform_family os_release_info["ID_LIKE"] end + + platform_family determine_platform_family if platform_family.nil? end end -- cgit v1.2.1 From eb9d27269db147464f5d47ff704dd03f81d8895a Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Thu, 1 Mar 2018 17:56:36 +0100 Subject: add new testcases for SLES15 and restructure old tests --- spec/unit/plugins/linux/platform_spec.rb | 201 +++++++++++++++++++------------ 1 file changed, 125 insertions(+), 76 deletions(-) diff --git a/spec/unit/plugins/linux/platform_spec.rb b/spec/unit/plugins/linux/platform_spec.rb index 6b6b4aee..43d7bc54 100644 --- a/spec/unit/plugins/linux/platform_spec.rb +++ b/spec/unit/plugins/linux/platform_spec.rb @@ -686,97 +686,146 @@ CISCO_RELEASE describe "on suse" do - describe "with os-release results" do - let(:have_suse_release) { false } - it "should read the platform as sles on SLES 15" do - expect(File).to receive(:read).with("/etc/os-release"). and_return("VERSION=\"15\"\nVERSION_ID=\"15\"\nPRETTY_NAME=\"SUSE Linux Enterprise Server 15\"\nID=\"sles\"\nID_LIKE=\"suse\"\nANSI_COLOR=\"0;32\"\nCPE_NAME=\"cpe:/o:suse:sles:15\"\n") - @plugin.run - expect(@plugin[:platform_family]).to eq("suse") - expect(@plugin[:platform]).to eq("sles") - expect(@plugin[:platform_version]).to eq("15") - end - end + context "on versions that have /etc/os-release and no /etc/SuSE-release (e.g. SLES15)" do - let(:have_suse_release) { true } + let(:have_suse_release) { false } + let(:have_os_release) { true } - describe "with lsb_release results" do - before(:each) do - @plugin[:lsb][:id] = "SUSE LINUX" - end + let(:os_release_content) do + <<-OS_RELEASE +VERSION="15" +VERSION_ID="15" +PRETTY_NAME="SUSE Linux Enterprise Server 15" +ID="sles" +ID_LIKE="suse" +ANSI_COLOR="0;32" +CPE_NAME="cpe:/o:suse:sles:15" - it "should read the platform as opensuse on openSUSE" do - @plugin[:lsb][:release] = "12.1" - expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 12.1 (x86_64)\nVERSION = 12.1\nCODENAME = Asparagus\n") - @plugin.run - expect(@plugin[:platform]).to eq("opensuse") - expect(@plugin[:platform_family]).to eq("suse") - end - end +OS_RELEASE + end - describe "without lsb_release results" do - before(:each) do - @plugin.lsb = nil - end + before do + expect(File).to_not receive(:read).with("/etc/SuSE-release") + expect(File).to receive(:read).with("/etc/os-release").and_return(os_release_content) + end - it "should set platform and platform_family to suse and bogus verion to 10.0" do - expect(File).to receive(:read).with("/etc/SuSE-release").at_least(:once).and_return("VERSION = 10.0") - @plugin.run - expect(@plugin[:platform]).to eq("suse") - expect(@plugin[:platform_family]).to eq("suse") - end + it "correctly detects SLES15" do + @plugin.run + expect(@plugin[:platform]).to eq("sles") + expect(@plugin[:platform_version]).to eq("15") + expect(@plugin[:platform_family]).to eq("suse") + end - it "should read the version as 10.1 for bogus SLES 10" do - expect(File).to receive(:read).with("/etc/SuSE-release").and_return("SUSE Linux Enterprise Server 10 (i586)\nVERSION = 10\nPATCHLEVEL = 1\n") - @plugin.run - expect(@plugin[:platform]).to eq("suse") - expect(@plugin[:platform_version]).to eq("10.1") - expect(@plugin[:platform_family]).to eq("suse") end - it "should read the version as 11.2" do - expect(File).to receive(:read).with("/etc/SuSE-release").and_return("SUSE Linux Enterprise Server 11.2 (i586)\nVERSION = 11\nPATCHLEVEL = 2\n") - @plugin.run - expect(@plugin[:platform]).to eq("suse") - expect(@plugin[:platform_version]).to eq("11.2") - expect(@plugin[:platform_family]).to eq("suse") - end + context "on versions that have both /etc/os-release and /etc/SuSE-release (e.g. SLES12)" do + let(:have_suse_release) { true } + let(:have_os_release) { true } - it "[OHAI-272] should read the version as 11.3" do - expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("openSUSE 11.3 (x86_64)\nVERSION = 11.3") - @plugin.run - expect(@plugin[:platform]).to eq("opensuse") - expect(@plugin[:platform_version]).to eq("11.3") - expect(@plugin[:platform_family]).to eq("suse") + describe "with lsb_release results" do + before(:each) do + @plugin[:lsb][:id] = "SUSE LINUX" + end + + it "should read the platform as opensuse on openSUSE" do + @plugin[:lsb][:release] = "12.1" + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 12.1 (x86_64)\nVERSION = 12.1\nCODENAME = Asparagus\n") + @plugin.run + expect(@plugin[:platform]).to eq("opensuse") + expect(@plugin[:platform_family]).to eq("suse") + end + end end - it "[OHAI-272] should read the version as 9.1" do - expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("SuSE Linux 9.1 (i586)\nVERSION = 9.1") - @plugin.run - expect(@plugin[:platform]).to eq("suse") - expect(@plugin[:platform_version]).to eq("9.1") - expect(@plugin[:platform_family]).to eq("suse") - end + context "on versions that have no /etc/os-release but /etc/SuSE-release (e.g. SLES11)" do + let(:have_suse_release) { true } + let(:have_os_release) { false } - it "[OHAI-272] should read the version as 11.4" do - expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("openSUSE 11.4 (i586)\nVERSION = 11.4\nCODENAME = Celadon") - @plugin.run - expect(@plugin[:platform]).to eq("opensuse") - expect(@plugin[:platform_version]).to eq("11.4") - expect(@plugin[:platform_family]).to eq("suse") - end + describe "with lsb_release results" do + before(:each) do + @plugin[:lsb][:id] = "SUSE LINUX" + end - it "should read the platform as opensuse on openSUSE" do - expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 12.2 (x86_64)\nVERSION = 12.2\nCODENAME = Mantis\n") - @plugin.run - expect(@plugin[:platform]).to eq("opensuse") - expect(@plugin[:platform_family]).to eq("suse") + it "should read the platform as opensuse on openSUSE" do + @plugin[:lsb][:release] = "12.1" + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 12.1 (x86_64)\nVERSION = 12.1\nCODENAME = Asparagus\n") + @plugin.run + expect(@plugin[:platform]).to eq("opensuse") + expect(@plugin[:platform_family]).to eq("suse") + end + end end - it "should read the platform as opensuseleap on openSUSE Leap" do - expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 42.1 (x86_64)\nVERSION = 42.1\nCODENAME = Malachite\n") - @plugin.run - expect(@plugin[:platform]).to eq("opensuseleap") - expect(@plugin[:platform_family]).to eq("suse") + + context "on openSUSE and older SLES versions" do + let(:have_suse_release) { true } + let(:have_os_release) { true } + + describe "without lsb_release results" do + before(:each) do + @plugin.lsb = nil + end + + it "should set platform and platform_family to suse and bogus verion to 10.0" do + expect(File).to receive(:read).with("/etc/SuSE-release").at_least(:once).and_return("VERSION = 10.0") + @plugin.run + expect(@plugin[:platform]).to eq("suse") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "should read the version as 10.1 for bogus SLES 10" do + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("SUSE Linux Enterprise Server 10 (i586)\nVERSION = 10\nPATCHLEVEL = 1\n") + @plugin.run + expect(@plugin[:platform]).to eq("suse") + expect(@plugin[:platform_version]).to eq("10.1") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "should read the version as 11.2" do + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("SUSE Linux Enterprise Server 11.2 (i586)\nVERSION = 11\nPATCHLEVEL = 2\n") + @plugin.run + expect(@plugin[:platform]).to eq("suse") + expect(@plugin[:platform_version]).to eq("11.2") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "[OHAI-272] should read the version as 11.3" do + expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("openSUSE 11.3 (x86_64)\nVERSION = 11.3") + @plugin.run + expect(@plugin[:platform]).to eq("opensuse") + expect(@plugin[:platform_version]).to eq("11.3") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "[OHAI-272] should read the version as 9.1" do + expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("SuSE Linux 9.1 (i586)\nVERSION = 9.1") + @plugin.run + expect(@plugin[:platform]).to eq("suse") + expect(@plugin[:platform_version]).to eq("9.1") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "[OHAI-272] should read the version as 11.4" do + expect(File).to receive(:read).with("/etc/SuSE-release").exactly(1).times.and_return("openSUSE 11.4 (i586)\nVERSION = 11.4\nCODENAME = Celadon") + @plugin.run + expect(@plugin[:platform]).to eq("opensuse") + expect(@plugin[:platform_version]).to eq("11.4") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "should read the platform as opensuse on openSUSE" do + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 12.2 (x86_64)\nVERSION = 12.2\nCODENAME = Mantis\n") + @plugin.run + expect(@plugin[:platform]).to eq("opensuse") + expect(@plugin[:platform_family]).to eq("suse") + end + + it "should read the platform as opensuseleap on openSUSE Leap" do + expect(File).to receive(:read).with("/etc/SuSE-release").and_return("openSUSE 42.1 (x86_64)\nVERSION = 42.1\nCODENAME = Malachite\n") + @plugin.run + expect(@plugin[:platform]).to eq("opensuseleap") + expect(@plugin[:platform_family]).to eq("suse") + end end end end -- cgit v1.2.1