ohai 18.2.6 → 19.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +28 -28
- data/LICENSE +201 -201
- data/bin/ohai +25 -25
- data/lib/ohai/application.rb +189 -189
- data/lib/ohai/common/dmi.rb +167 -167
- data/lib/ohai/config.rb +51 -51
- data/lib/ohai/dsl/plugin/versionvii.rb +203 -203
- data/lib/ohai/dsl/plugin.rb +232 -232
- data/lib/ohai/dsl.rb +22 -22
- data/lib/ohai/exception.rb +36 -36
- data/lib/ohai/hints.rb +68 -68
- data/lib/ohai/loader.rb +178 -178
- data/lib/ohai/log.rb +34 -34
- data/lib/ohai/mash.rb +22 -22
- data/lib/ohai/mixin/alibaba_metadata.rb +83 -83
- data/lib/ohai/mixin/azure_metadata.rb +105 -105
- data/lib/ohai/mixin/chef_utils_wiring.rb +52 -52
- data/lib/ohai/mixin/command.rb +4 -4
- data/lib/ohai/mixin/constant_helper.rb +55 -55
- data/lib/ohai/mixin/dmi_decode.rb +54 -54
- data/lib/ohai/mixin/do_metadata.rb +48 -48
- data/lib/ohai/mixin/ec2_metadata.rb +264 -270
- data/lib/ohai/mixin/gce_metadata.rb +79 -79
- data/lib/ohai/mixin/http_helper.rb +64 -64
- data/lib/ohai/mixin/json_helper.rb +36 -36
- data/lib/ohai/mixin/network_helper.rb +92 -92
- data/lib/ohai/mixin/oci_metadata.rb +60 -60
- data/lib/ohai/mixin/os.rb +128 -128
- data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
- data/lib/ohai/mixin/seconds_to_human.rb +52 -52
- data/lib/ohai/mixin/shell_out.rb +51 -51
- data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
- data/lib/ohai/mixin/string.rb +31 -31
- data/lib/ohai/mixin/train_helpers.rb +36 -36
- data/lib/ohai/mixin/which.rb +39 -39
- data/lib/ohai/plugin_config.rb +47 -47
- data/lib/ohai/plugins/aix/kernel.rb +50 -50
- data/lib/ohai/plugins/aix/memory.rb +37 -37
- data/lib/ohai/plugins/aix/network.rb +142 -142
- data/lib/ohai/plugins/aix/platform.rb +30 -30
- data/lib/ohai/plugins/aix/uptime.rb +54 -54
- data/lib/ohai/plugins/aix/virtualization.rb +154 -154
- data/lib/ohai/plugins/alibaba.rb +72 -72
- data/lib/ohai/plugins/azure.rb +154 -154
- data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
- data/lib/ohai/plugins/c.rb +178 -178
- data/lib/ohai/plugins/chef.rb +50 -50
- data/lib/ohai/plugins/cloud.rb +379 -379
- data/lib/ohai/plugins/command.rb +26 -26
- data/lib/ohai/plugins/cpu.rb +642 -642
- data/lib/ohai/plugins/darwin/hardware.rb +99 -99
- data/lib/ohai/plugins/darwin/memory.rb +62 -62
- data/lib/ohai/plugins/darwin/network.rb +207 -207
- data/lib/ohai/plugins/darwin/platform.rb +40 -40
- data/lib/ohai/plugins/darwin/virtualization.rb +104 -104
- data/lib/ohai/plugins/digital_ocean.rb +67 -67
- data/lib/ohai/plugins/dmi.rb +134 -134
- data/lib/ohai/plugins/docker.rb +58 -58
- data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
- data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
- data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
- data/lib/ohai/plugins/ec2.rb +148 -148
- data/lib/ohai/plugins/elixir.rb +36 -36
- data/lib/ohai/plugins/erlang.rb +60 -60
- data/lib/ohai/plugins/eucalyptus.rb +86 -86
- data/lib/ohai/plugins/filesystem.rb +753 -753
- data/lib/ohai/plugins/fips.rb +36 -36
- data/lib/ohai/plugins/freebsd/memory.rb +60 -60
- data/lib/ohai/plugins/freebsd/network.rb +128 -128
- data/lib/ohai/plugins/freebsd/platform.rb +28 -28
- data/lib/ohai/plugins/gce.rb +89 -89
- data/lib/ohai/plugins/go.rb +34 -34
- data/lib/ohai/plugins/groovy.rb +38 -38
- data/lib/ohai/plugins/grub2.rb +40 -40
- data/lib/ohai/plugins/habitat.rb +73 -73
- data/lib/ohai/plugins/haskell.rb +96 -96
- data/lib/ohai/plugins/hostname.rb +133 -133
- data/lib/ohai/plugins/init_package.rb +26 -26
- data/lib/ohai/plugins/java.rb +78 -78
- data/lib/ohai/plugins/kernel.rb +292 -292
- data/lib/ohai/plugins/keys.rb +27 -27
- data/lib/ohai/plugins/languages.rb +26 -26
- data/lib/ohai/plugins/libvirt.rb +114 -114
- data/lib/ohai/plugins/linode.rb +73 -73
- data/lib/ohai/plugins/linux/block_device.rb +48 -48
- data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
- data/lib/ohai/plugins/linux/interrupts.rb +84 -83
- data/lib/ohai/plugins/linux/ipc.rb +52 -52
- data/lib/ohai/plugins/linux/livepatch.rb +38 -38
- data/lib/ohai/plugins/linux/lsb.rb +46 -46
- data/lib/ohai/plugins/linux/lspci.rb +80 -80
- data/lib/ohai/plugins/linux/machineid.rb +36 -36
- data/lib/ohai/plugins/linux/mdadm.rb +120 -120
- data/lib/ohai/plugins/linux/memory.rb +106 -106
- data/lib/ohai/plugins/linux/network.rb +879 -879
- data/lib/ohai/plugins/linux/os_release.rb +38 -38
- data/lib/ohai/plugins/linux/platform.rb +314 -314
- data/lib/ohai/plugins/linux/selinux.rb +69 -69
- data/lib/ohai/plugins/linux/sessions.rb +54 -54
- data/lib/ohai/plugins/linux/sysctl.rb +39 -39
- data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
- data/lib/ohai/plugins/linux/tc.rb +61 -61
- data/lib/ohai/plugins/linux/virtualization.rb +300 -300
- data/lib/ohai/plugins/lua.rb +39 -39
- data/lib/ohai/plugins/mono.rb +50 -50
- data/lib/ohai/plugins/netbsd/memory.rb +99 -99
- data/lib/ohai/plugins/netbsd/network.rb +122 -122
- data/lib/ohai/plugins/netbsd/platform.rb +28 -28
- data/lib/ohai/plugins/network.rb +186 -186
- data/lib/ohai/plugins/nodejs.rb +40 -40
- data/lib/ohai/plugins/oci.rb +94 -94
- data/lib/ohai/plugins/ohai.rb +29 -29
- data/lib/ohai/plugins/ohai_time.rb +26 -26
- data/lib/ohai/plugins/openbsd/memory.rb +99 -99
- data/lib/ohai/plugins/openbsd/network.rb +122 -122
- data/lib/ohai/plugins/openbsd/platform.rb +28 -28
- data/lib/ohai/plugins/openstack.rb +84 -84
- data/lib/ohai/plugins/os.rb +55 -55
- data/lib/ohai/plugins/packages.rb +234 -234
- data/lib/ohai/plugins/passwd.rb +104 -104
- data/lib/ohai/plugins/perl.rb +45 -45
- data/lib/ohai/plugins/php.rb +52 -52
- data/lib/ohai/plugins/platform.rb +41 -41
- data/lib/ohai/plugins/powershell.rb +82 -82
- data/lib/ohai/plugins/ps.rb +35 -35
- data/lib/ohai/plugins/python.rb +43 -43
- data/lib/ohai/plugins/rackspace.rb +177 -177
- data/lib/ohai/plugins/root_group.rb +41 -41
- data/lib/ohai/plugins/rpm.rb +121 -121
- data/lib/ohai/plugins/ruby.rb +66 -66
- data/lib/ohai/plugins/rust.rb +34 -34
- data/lib/ohai/plugins/scala.rb +38 -38
- data/lib/ohai/plugins/scaleway.rb +58 -58
- data/lib/ohai/plugins/scsi.rb +52 -52
- data/lib/ohai/plugins/shard.rb +142 -142
- data/lib/ohai/plugins/shells.rb +32 -32
- data/lib/ohai/plugins/softlayer.rb +48 -48
- data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
- data/lib/ohai/plugins/solaris2/memory.rb +32 -32
- data/lib/ohai/plugins/solaris2/network.rb +192 -192
- data/lib/ohai/plugins/solaris2/platform.rb +58 -58
- data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
- data/lib/ohai/plugins/ssh_host_key.rb +84 -84
- data/lib/ohai/plugins/sysconf.rb +46 -46
- data/lib/ohai/plugins/timezone.rb +45 -45
- data/lib/ohai/plugins/train.rb +35 -35
- data/lib/ohai/plugins/uptime.rb +95 -95
- data/lib/ohai/plugins/virtualbox.rb +197 -197
- data/lib/ohai/plugins/vmware.rb +109 -109
- data/lib/ohai/plugins/windows/dmi.rb +95 -95
- data/lib/ohai/plugins/windows/drivers.rb +52 -52
- data/lib/ohai/plugins/windows/memory.rb +39 -39
- data/lib/ohai/plugins/windows/network.rb +222 -222
- data/lib/ohai/plugins/windows/platform.rb +34 -34
- data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
- data/lib/ohai/plugins/windows/virtualization.rb +45 -45
- data/lib/ohai/plugins/zpools.rb +94 -94
- data/lib/ohai/provides_map.rb +208 -208
- data/lib/ohai/runner.rb +128 -126
- data/lib/ohai/system.rb +258 -258
- data/lib/ohai/train_transport.rb +29 -29
- data/lib/ohai/util/file_helper.rb +6 -6
- data/lib/ohai/util/ip_helper.rb +56 -56
- data/lib/ohai/util/win32.rb +47 -47
- data/lib/ohai/version.rb +23 -23
- data/lib/ohai.rb +23 -23
- data/ohai.gemspec +35 -35
- metadata +9 -15
@@ -1,314 +1,314 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
-
# Copyright:: Copyright (c) Chef Software Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
Ohai.plugin(:Platform) do
|
21
|
-
provides "platform", "platform_version", "platform_family"
|
22
|
-
depends "lsb"
|
23
|
-
|
24
|
-
# @deprecated
|
25
|
-
def get_redhatish_platform(contents)
|
26
|
-
contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
|
27
|
-
end
|
28
|
-
|
29
|
-
# See https://rubular.com/r/78c1yXYa7zDhdV for example matches
|
30
|
-
#
|
31
|
-
# @param contents [String] the contents of /etc/redhat-release
|
32
|
-
#
|
33
|
-
# @returns [String] the version string
|
34
|
-
#
|
35
|
-
def get_redhatish_version(contents)
|
36
|
-
contents[/(release)? ([\d\.]+)/, 2]
|
37
|
-
end
|
38
|
-
|
39
|
-
#
|
40
|
-
# Reads an os-release-info file and parse it into a hash
|
41
|
-
#
|
42
|
-
# @param file [String] the filename to read (e.g. '/etc/os-release')
|
43
|
-
#
|
44
|
-
# @returns [Hash] the file parsed into a Hash or nil
|
45
|
-
#
|
46
|
-
def read_os_release_info(file)
|
47
|
-
return nil unless file_exist?(file)
|
48
|
-
|
49
|
-
file_read(file).split.inject({}) do |map, line|
|
50
|
-
key, value = line.split("=")
|
51
|
-
map[key] = value.gsub(/\A"|"\Z/, "") if value
|
52
|
-
map
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
#
|
57
|
-
# Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
|
58
|
-
# switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
|
59
|
-
# distros can also reuse this method safely).
|
60
|
-
#
|
61
|
-
# @returns [Hash] the canonical, cached Hash of /etc/os-release info or nil
|
62
|
-
#
|
63
|
-
def os_release_info
|
64
|
-
@os_release_info ||=
|
65
|
-
begin
|
66
|
-
os_release_info = read_os_release_info("/etc/os-release")
|
67
|
-
cisco_release_info = os_release_info["CISCO_RELEASE_INFO"] if os_release_info
|
68
|
-
if cisco_release_info && file_exist?(cisco_release_info)
|
69
|
-
os_release_info.merge!(read_os_release_info(cisco_release_info))
|
70
|
-
end
|
71
|
-
os_release_info
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
#
|
76
|
-
# If /etc/os-release indicates we are Cisco based
|
77
|
-
#
|
78
|
-
# @returns [Boolean] if we are Cisco according to /etc/os-release
|
79
|
-
#
|
80
|
-
def os_release_file_is_cisco?
|
81
|
-
file_exist?("/etc/os-release") && os_release_info["CISCO_RELEASE_INFO"]
|
82
|
-
end
|
83
|
-
|
84
|
-
#
|
85
|
-
# Determines the platform version for F5 Big-IP systems
|
86
|
-
#
|
87
|
-
# @deprecated
|
88
|
-
#
|
89
|
-
# @returns [String] bigip Linux version from /etc/f5-release
|
90
|
-
#
|
91
|
-
def bigip_version
|
92
|
-
release_contents = file_read("/etc/f5-release")
|
93
|
-
release_contents.match(/BIG-IP release (\S*)/)[1] # http://rubular.com/r/O8nlrBVqSb
|
94
|
-
rescue NoMethodError, Errno::ENOENT, Errno::EACCES # rescue regex failure, file missing, or permission denied
|
95
|
-
logger.warn("Detected F5 Big-IP, but /etc/f5-release could not be parsed to determine platform_version")
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
# our platform names don't match os-release. given a time machine they would but ohai
|
100
|
-
# came before the os-release file. This method remaps the os-release names to
|
101
|
-
# the ohai names
|
102
|
-
#
|
103
|
-
# @param id [String] the platform ID from /etc/os-release
|
104
|
-
#
|
105
|
-
# @returns [String] the platform name to use in Ohai
|
106
|
-
#
|
107
|
-
def platform_id_remap(id)
|
108
|
-
# this catches the centos guest shell in the nexus switch which identifies itself as centos
|
109
|
-
return "nexus_centos" if id == "centos" && os_release_file_is_cisco?
|
110
|
-
|
111
|
-
# the platform mappings between the 'ID' field in /etc/os-release and the value
|
112
|
-
# ohai uses. If you're adding a new platform here and you want to change the name
|
113
|
-
# you'll want to add it here and then add a spec for the platform_id_remap method
|
114
|
-
{
|
115
|
-
"alinux" => "alibabalinux",
|
116
|
-
"amzn" => "amazon",
|
117
|
-
"archarm" => "arch",
|
118
|
-
"cumulus-linux" => "cumulus",
|
119
|
-
"ol" => "oracle",
|
120
|
-
"opensuse-leap" => "opensuseleap",
|
121
|
-
"rhel" => "redhat",
|
122
|
-
"sles_sap" => "suse",
|
123
|
-
"sles" => "suse",
|
124
|
-
"xenenterprise" => "xenserver",
|
125
|
-
}[id.downcase] || id.downcase
|
126
|
-
end
|
127
|
-
|
128
|
-
#
|
129
|
-
# Determines the platform_family based on the platform
|
130
|
-
#
|
131
|
-
# @param plat [String] the platform name
|
132
|
-
#
|
133
|
-
# @returns [String] platform_family value
|
134
|
-
#
|
135
|
-
def platform_family_from_platform(plat)
|
136
|
-
case plat
|
137
|
-
when /ubuntu/, /debian/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
|
138
|
-
# apt-get+dpkg almost certainly goes here
|
139
|
-
"debian"
|
140
|
-
when /centos/, /redhat/, /oracle/, /almalinux/, /rocky/, /scientific/, /enterpriseenterprise/, /xenserver/, /xcp-ng/, /cloudlinux/, /alibabalinux/, /sangoma/, /clearos/, /parallels/, /ibm_powerkvm/, /nexus_centos/, /bigip/, /virtuozzo/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
|
141
|
-
# NOTE: "rhel" should be reserved exclusively for recompiled rhel versions that are nearly perfectly compatible down to the platform_version.
|
142
|
-
# The operating systems that are "rhel" should all be as compatible as rhel7 = centos7 = oracle7 = scientific7 (98%-ish core RPM version compatibility
|
143
|
-
# and the version numbers MUST track the upstream). The appropriate EPEL version repo should work nearly perfectly. Some variation like the
|
144
|
-
# oracle kernel version differences and tuning and extra packages are clearly acceptable. Almost certainly some distros above (xenserver?)
|
145
|
-
# should not be in this list. Please use fedora, below, instead. Also note that this is the only platform_family with this strict of a rule,
|
146
|
-
# see the example of the debian platform family for how the rest of the platform_family designations should be used.
|
147
|
-
#
|
148
|
-
# TODO: when XCP-NG 7.4 support ends we can remove the xcp-ng match. 7.5+ reports as xenenterprise which we remap to xenserver
|
149
|
-
"rhel"
|
150
|
-
when /amazon/
|
151
|
-
"amazon"
|
152
|
-
# suse matches opensuse, suse-* opensuse-*, etc. sle[sd\-_] intends to match sles, sled, sle-*, sle_*
|
153
|
-
when /suse/, /sle[sd\-_]/
|
154
|
-
"suse"
|
155
|
-
when /fedora/, /arista_eos/
|
156
|
-
# 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
|
157
|
-
# SuSE it probably goes here).
|
158
|
-
"fedora"
|
159
|
-
when /nexus/, /ios_xr/
|
160
|
-
"wrlinux"
|
161
|
-
when /gentoo/
|
162
|
-
"gentoo"
|
163
|
-
when /arch/, /manjaro/
|
164
|
-
"arch"
|
165
|
-
when /exherbo/
|
166
|
-
"exherbo"
|
167
|
-
when /alpine/
|
168
|
-
"alpine"
|
169
|
-
when /clearlinux/
|
170
|
-
"clearlinux"
|
171
|
-
when /mangeia/
|
172
|
-
"mandriva"
|
173
|
-
when /slackware/
|
174
|
-
"slackware"
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
# modern linux distros include a /etc/os-release file, which we now rely on for
|
179
|
-
# OS detection. For older distros that do not include that file we fall back to
|
180
|
-
# our pre-Ohai 15 detection logic, which is the method below. No new functionality
|
181
|
-
# should be added to this logic.
|
182
|
-
#
|
183
|
-
# @deprecated
|
184
|
-
def legacy_platform_detection
|
185
|
-
# platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
|
186
|
-
if file_exist?("/etc/oracle-release")
|
187
|
-
contents = file_read("/etc/oracle-release").chomp
|
188
|
-
platform "oracle"
|
189
|
-
platform_version get_redhatish_version(contents)
|
190
|
-
elsif file_exist?("/etc/enterprise-release")
|
191
|
-
contents = file_read("/etc/enterprise-release").chomp
|
192
|
-
platform "oracle"
|
193
|
-
platform_version get_redhatish_version(contents)
|
194
|
-
elsif file_exist?("/etc/f5-release")
|
195
|
-
platform "bigip"
|
196
|
-
platform_version bigip_version
|
197
|
-
elsif file_exist?("/etc/debian_version")
|
198
|
-
# Ubuntu and Debian both have /etc/debian_version
|
199
|
-
# Ubuntu should always have a working lsb, debian does not by default
|
200
|
-
if /Ubuntu/i.match?(lsb[:id])
|
201
|
-
platform "ubuntu"
|
202
|
-
platform_version lsb[:release]
|
203
|
-
else
|
204
|
-
platform "debian"
|
205
|
-
platform_version file_read("/etc/debian_version").chomp
|
206
|
-
end
|
207
|
-
elsif file_exist?("/etc/parallels-release")
|
208
|
-
contents = file_read("/etc/parallels-release").chomp
|
209
|
-
platform get_redhatish_platform(contents)
|
210
|
-
platform_version contents.match(/(\d\.\d\.\d)/)[0]
|
211
|
-
elsif file_exist?("/etc/Eos-release")
|
212
|
-
platform "arista_eos"
|
213
|
-
platform_version file_read("/etc/Eos-release").strip.split[-1]
|
214
|
-
elsif file_exist?("/etc/redhat-release")
|
215
|
-
contents = file_read("/etc/redhat-release").chomp
|
216
|
-
platform get_redhatish_platform(contents)
|
217
|
-
platform_version get_redhatish_version(contents)
|
218
|
-
elsif file_exist?("/etc/system-release")
|
219
|
-
contents = file_read("/etc/system-release").chomp
|
220
|
-
platform get_redhatish_platform(contents)
|
221
|
-
platform_version get_redhatish_version(contents)
|
222
|
-
elsif file_exist?("/etc/SuSE-release")
|
223
|
-
suse_release = file_read("/etc/SuSE-release")
|
224
|
-
suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
|
225
|
-
suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == ""
|
226
|
-
platform_version suse_version
|
227
|
-
if /^openSUSE/.match?(suse_release)
|
228
|
-
# opensuse releases >= 42 are openSUSE Leap
|
229
|
-
if platform_version.to_i < 42
|
230
|
-
platform "opensuse"
|
231
|
-
else
|
232
|
-
platform "opensuseleap"
|
233
|
-
end
|
234
|
-
else
|
235
|
-
platform "suse"
|
236
|
-
end
|
237
|
-
elsif os_release_file_is_cisco?
|
238
|
-
raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if
|
239
|
-
os_release_info["ID_LIKE"].nil? || !os_release_info["ID_LIKE"].include?("wrlinux")
|
240
|
-
|
241
|
-
case os_release_info["ID"]
|
242
|
-
when "nexus"
|
243
|
-
platform "nexus"
|
244
|
-
when "ios_xr"
|
245
|
-
platform "ios_xr"
|
246
|
-
else
|
247
|
-
raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field"
|
248
|
-
end
|
249
|
-
|
250
|
-
platform_version os_release_info["VERSION"]
|
251
|
-
elsif file_exist?("/etc/slackware-version")
|
252
|
-
platform "slackware"
|
253
|
-
platform_version file_read("/etc/slackware-version").scan(/(\d+|\.+)/).join
|
254
|
-
elsif file_exist?("/etc/exherbo-release")
|
255
|
-
platform "exherbo"
|
256
|
-
# no way to determine platform_version in a rolling release distribution
|
257
|
-
# kernel release will be used - ex. 3.13
|
258
|
-
platform_version shell_out("/bin/uname -r").stdout.strip
|
259
|
-
elsif file_exist?("/usr/lib/os-release")
|
260
|
-
contents = file_read("/usr/lib/os-release")
|
261
|
-
if contents.include?("clear-linux-os") # Clear Linux https://clearlinux.org/
|
262
|
-
platform "clearlinux"
|
263
|
-
platform_version contents[/VERSION_ID=(\d+)/, 1]
|
264
|
-
end
|
265
|
-
elsif /RedHat/i.match?(lsb[:id])
|
266
|
-
platform "redhat"
|
267
|
-
platform_version lsb[:release]
|
268
|
-
elsif /Amazon/i.match?(lsb[:id])
|
269
|
-
platform "amazon"
|
270
|
-
platform_version lsb[:release]
|
271
|
-
elsif /ScientificSL/i.match?(lsb[:id])
|
272
|
-
platform "scientific"
|
273
|
-
platform_version lsb[:release]
|
274
|
-
elsif /XenServer/i.match?(lsb[:id])
|
275
|
-
platform "xenserver"
|
276
|
-
platform_version lsb[:release]
|
277
|
-
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
|
278
|
-
platform lsb[:id].downcase
|
279
|
-
platform_version lsb[:release]
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
# Grab the version from the VERSION_ID field and use the kernel release if that's not
|
284
|
-
# available. It should be there for everything, but rolling releases like arch / gentoo
|
285
|
-
# where we've traditionally used the kernel as the version
|
286
|
-
# @return String the OS version
|
287
|
-
def determine_os_version
|
288
|
-
# centos only includes the major version in os-release for some reason
|
289
|
-
if os_release_info["ID"] == "centos"
|
290
|
-
get_redhatish_version(file_read("/etc/redhat-release").chomp)
|
291
|
-
# debian testing and unstable don't have VERSION_ID set
|
292
|
-
elsif os_release_info["ID"] == "debian"
|
293
|
-
os_release_info["VERSION_ID"] || file_read("/etc/debian_version").chomp
|
294
|
-
else
|
295
|
-
os_release_info["VERSION_ID"] || shell_out("/bin/uname -r").stdout.strip
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
collect_data(:linux) do
|
300
|
-
if file_exist?("/etc/os-release")
|
301
|
-
logger.trace("Plugin platform: Using /etc/os-release for platform detection")
|
302
|
-
|
303
|
-
# fixup os-release names to ohai platform names
|
304
|
-
platform platform_id_remap(os_release_info["ID"])
|
305
|
-
|
306
|
-
platform_version determine_os_version
|
307
|
-
else # we're on an old Linux distro
|
308
|
-
legacy_platform_detection
|
309
|
-
end
|
310
|
-
|
311
|
-
# unless we set it in a specific way with the platform logic above set based on platform data
|
312
|
-
platform_family platform_family_from_platform(platform) if platform_family.nil?
|
313
|
-
end
|
314
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
5
|
+
# License:: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
|
20
|
+
Ohai.plugin(:Platform) do
|
21
|
+
provides "platform", "platform_version", "platform_family"
|
22
|
+
depends "lsb"
|
23
|
+
|
24
|
+
# @deprecated
|
25
|
+
def get_redhatish_platform(contents)
|
26
|
+
contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
|
27
|
+
end
|
28
|
+
|
29
|
+
# See https://rubular.com/r/78c1yXYa7zDhdV for example matches
|
30
|
+
#
|
31
|
+
# @param contents [String] the contents of /etc/redhat-release
|
32
|
+
#
|
33
|
+
# @returns [String] the version string
|
34
|
+
#
|
35
|
+
def get_redhatish_version(contents)
|
36
|
+
contents[/(release)? ([\d\.]+)/, 2]
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Reads an os-release-info file and parse it into a hash
|
41
|
+
#
|
42
|
+
# @param file [String] the filename to read (e.g. '/etc/os-release')
|
43
|
+
#
|
44
|
+
# @returns [Hash] the file parsed into a Hash or nil
|
45
|
+
#
|
46
|
+
def read_os_release_info(file)
|
47
|
+
return nil unless file_exist?(file)
|
48
|
+
|
49
|
+
file_read(file).split.inject({}) do |map, line|
|
50
|
+
key, value = line.split("=")
|
51
|
+
map[key] = value.gsub(/\A"|"\Z/, "") if value
|
52
|
+
map
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
|
58
|
+
# switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
|
59
|
+
# distros can also reuse this method safely).
|
60
|
+
#
|
61
|
+
# @returns [Hash] the canonical, cached Hash of /etc/os-release info or nil
|
62
|
+
#
|
63
|
+
def os_release_info
|
64
|
+
@os_release_info ||=
|
65
|
+
begin
|
66
|
+
os_release_info = read_os_release_info("/etc/os-release")
|
67
|
+
cisco_release_info = os_release_info["CISCO_RELEASE_INFO"] if os_release_info
|
68
|
+
if cisco_release_info && file_exist?(cisco_release_info)
|
69
|
+
os_release_info.merge!(read_os_release_info(cisco_release_info))
|
70
|
+
end
|
71
|
+
os_release_info
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# If /etc/os-release indicates we are Cisco based
|
77
|
+
#
|
78
|
+
# @returns [Boolean] if we are Cisco according to /etc/os-release
|
79
|
+
#
|
80
|
+
def os_release_file_is_cisco?
|
81
|
+
file_exist?("/etc/os-release") && os_release_info["CISCO_RELEASE_INFO"]
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Determines the platform version for F5 Big-IP systems
|
86
|
+
#
|
87
|
+
# @deprecated
|
88
|
+
#
|
89
|
+
# @returns [String] bigip Linux version from /etc/f5-release
|
90
|
+
#
|
91
|
+
def bigip_version
|
92
|
+
release_contents = file_read("/etc/f5-release")
|
93
|
+
release_contents.match(/BIG-IP release (\S*)/)[1] # http://rubular.com/r/O8nlrBVqSb
|
94
|
+
rescue NoMethodError, Errno::ENOENT, Errno::EACCES # rescue regex failure, file missing, or permission denied
|
95
|
+
logger.warn("Detected F5 Big-IP, but /etc/f5-release could not be parsed to determine platform_version")
|
96
|
+
nil
|
97
|
+
end
|
98
|
+
|
99
|
+
# our platform names don't match os-release. given a time machine they would but ohai
|
100
|
+
# came before the os-release file. This method remaps the os-release names to
|
101
|
+
# the ohai names
|
102
|
+
#
|
103
|
+
# @param id [String] the platform ID from /etc/os-release
|
104
|
+
#
|
105
|
+
# @returns [String] the platform name to use in Ohai
|
106
|
+
#
|
107
|
+
def platform_id_remap(id)
|
108
|
+
# this catches the centos guest shell in the nexus switch which identifies itself as centos
|
109
|
+
return "nexus_centos" if id == "centos" && os_release_file_is_cisco?
|
110
|
+
|
111
|
+
# the platform mappings between the 'ID' field in /etc/os-release and the value
|
112
|
+
# ohai uses. If you're adding a new platform here and you want to change the name
|
113
|
+
# you'll want to add it here and then add a spec for the platform_id_remap method
|
114
|
+
{
|
115
|
+
"alinux" => "alibabalinux",
|
116
|
+
"amzn" => "amazon",
|
117
|
+
"archarm" => "arch",
|
118
|
+
"cumulus-linux" => "cumulus",
|
119
|
+
"ol" => "oracle",
|
120
|
+
"opensuse-leap" => "opensuseleap",
|
121
|
+
"rhel" => "redhat",
|
122
|
+
"sles_sap" => "suse",
|
123
|
+
"sles" => "suse",
|
124
|
+
"xenenterprise" => "xenserver",
|
125
|
+
}[id.downcase] || id.downcase
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# Determines the platform_family based on the platform
|
130
|
+
#
|
131
|
+
# @param plat [String] the platform name
|
132
|
+
#
|
133
|
+
# @returns [String] platform_family value
|
134
|
+
#
|
135
|
+
def platform_family_from_platform(plat)
|
136
|
+
case plat
|
137
|
+
when /ubuntu/, /debian/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
|
138
|
+
# apt-get+dpkg almost certainly goes here
|
139
|
+
"debian"
|
140
|
+
when /centos/, /redhat/, /oracle/, /almalinux/, /rocky/, /scientific/, /enterpriseenterprise/, /xenserver/, /xcp-ng/, /cloudlinux/, /alibabalinux/, /sangoma/, /clearos/, /parallels/, /ibm_powerkvm/, /nexus_centos/, /bigip/, /virtuozzo/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
|
141
|
+
# NOTE: "rhel" should be reserved exclusively for recompiled rhel versions that are nearly perfectly compatible down to the platform_version.
|
142
|
+
# The operating systems that are "rhel" should all be as compatible as rhel7 = centos7 = oracle7 = scientific7 (98%-ish core RPM version compatibility
|
143
|
+
# and the version numbers MUST track the upstream). The appropriate EPEL version repo should work nearly perfectly. Some variation like the
|
144
|
+
# oracle kernel version differences and tuning and extra packages are clearly acceptable. Almost certainly some distros above (xenserver?)
|
145
|
+
# should not be in this list. Please use fedora, below, instead. Also note that this is the only platform_family with this strict of a rule,
|
146
|
+
# see the example of the debian platform family for how the rest of the platform_family designations should be used.
|
147
|
+
#
|
148
|
+
# TODO: when XCP-NG 7.4 support ends we can remove the xcp-ng match. 7.5+ reports as xenenterprise which we remap to xenserver
|
149
|
+
"rhel"
|
150
|
+
when /amazon/
|
151
|
+
"amazon"
|
152
|
+
# suse matches opensuse, suse-* opensuse-*, etc. sle[sd\-_] intends to match sles, sled, sle-*, sle_*
|
153
|
+
when /suse/, /sle[sd\-_]/
|
154
|
+
"suse"
|
155
|
+
when /fedora/, /arista_eos/
|
156
|
+
# 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
|
157
|
+
# SuSE it probably goes here).
|
158
|
+
"fedora"
|
159
|
+
when /nexus/, /ios_xr/
|
160
|
+
"wrlinux"
|
161
|
+
when /gentoo/
|
162
|
+
"gentoo"
|
163
|
+
when /arch/, /manjaro/
|
164
|
+
"arch"
|
165
|
+
when /exherbo/
|
166
|
+
"exherbo"
|
167
|
+
when /alpine/
|
168
|
+
"alpine"
|
169
|
+
when /clearlinux/
|
170
|
+
"clearlinux"
|
171
|
+
when /mangeia/
|
172
|
+
"mandriva"
|
173
|
+
when /slackware/
|
174
|
+
"slackware"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# modern linux distros include a /etc/os-release file, which we now rely on for
|
179
|
+
# OS detection. For older distros that do not include that file we fall back to
|
180
|
+
# our pre-Ohai 15 detection logic, which is the method below. No new functionality
|
181
|
+
# should be added to this logic.
|
182
|
+
#
|
183
|
+
# @deprecated
|
184
|
+
def legacy_platform_detection
|
185
|
+
# platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
|
186
|
+
if file_exist?("/etc/oracle-release")
|
187
|
+
contents = file_read("/etc/oracle-release").chomp
|
188
|
+
platform "oracle"
|
189
|
+
platform_version get_redhatish_version(contents)
|
190
|
+
elsif file_exist?("/etc/enterprise-release")
|
191
|
+
contents = file_read("/etc/enterprise-release").chomp
|
192
|
+
platform "oracle"
|
193
|
+
platform_version get_redhatish_version(contents)
|
194
|
+
elsif file_exist?("/etc/f5-release")
|
195
|
+
platform "bigip"
|
196
|
+
platform_version bigip_version
|
197
|
+
elsif file_exist?("/etc/debian_version")
|
198
|
+
# Ubuntu and Debian both have /etc/debian_version
|
199
|
+
# Ubuntu should always have a working lsb, debian does not by default
|
200
|
+
if /Ubuntu/i.match?(lsb[:id])
|
201
|
+
platform "ubuntu"
|
202
|
+
platform_version lsb[:release]
|
203
|
+
else
|
204
|
+
platform "debian"
|
205
|
+
platform_version file_read("/etc/debian_version").chomp
|
206
|
+
end
|
207
|
+
elsif file_exist?("/etc/parallels-release")
|
208
|
+
contents = file_read("/etc/parallels-release").chomp
|
209
|
+
platform get_redhatish_platform(contents)
|
210
|
+
platform_version contents.match(/(\d\.\d\.\d)/)[0]
|
211
|
+
elsif file_exist?("/etc/Eos-release")
|
212
|
+
platform "arista_eos"
|
213
|
+
platform_version file_read("/etc/Eos-release").strip.split[-1]
|
214
|
+
elsif file_exist?("/etc/redhat-release")
|
215
|
+
contents = file_read("/etc/redhat-release").chomp
|
216
|
+
platform get_redhatish_platform(contents)
|
217
|
+
platform_version get_redhatish_version(contents)
|
218
|
+
elsif file_exist?("/etc/system-release")
|
219
|
+
contents = file_read("/etc/system-release").chomp
|
220
|
+
platform get_redhatish_platform(contents)
|
221
|
+
platform_version get_redhatish_version(contents)
|
222
|
+
elsif file_exist?("/etc/SuSE-release")
|
223
|
+
suse_release = file_read("/etc/SuSE-release")
|
224
|
+
suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
|
225
|
+
suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == ""
|
226
|
+
platform_version suse_version
|
227
|
+
if /^openSUSE/.match?(suse_release)
|
228
|
+
# opensuse releases >= 42 are openSUSE Leap
|
229
|
+
if platform_version.to_i < 42
|
230
|
+
platform "opensuse"
|
231
|
+
else
|
232
|
+
platform "opensuseleap"
|
233
|
+
end
|
234
|
+
else
|
235
|
+
platform "suse"
|
236
|
+
end
|
237
|
+
elsif os_release_file_is_cisco?
|
238
|
+
raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if
|
239
|
+
os_release_info["ID_LIKE"].nil? || !os_release_info["ID_LIKE"].include?("wrlinux")
|
240
|
+
|
241
|
+
case os_release_info["ID"]
|
242
|
+
when "nexus"
|
243
|
+
platform "nexus"
|
244
|
+
when "ios_xr"
|
245
|
+
platform "ios_xr"
|
246
|
+
else
|
247
|
+
raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field"
|
248
|
+
end
|
249
|
+
|
250
|
+
platform_version os_release_info["VERSION"]
|
251
|
+
elsif file_exist?("/etc/slackware-version")
|
252
|
+
platform "slackware"
|
253
|
+
platform_version file_read("/etc/slackware-version").scan(/(\d+|\.+)/).join
|
254
|
+
elsif file_exist?("/etc/exherbo-release")
|
255
|
+
platform "exherbo"
|
256
|
+
# no way to determine platform_version in a rolling release distribution
|
257
|
+
# kernel release will be used - ex. 3.13
|
258
|
+
platform_version shell_out("/bin/uname -r").stdout.strip
|
259
|
+
elsif file_exist?("/usr/lib/os-release")
|
260
|
+
contents = file_read("/usr/lib/os-release")
|
261
|
+
if contents.include?("clear-linux-os") # Clear Linux https://clearlinux.org/
|
262
|
+
platform "clearlinux"
|
263
|
+
platform_version contents[/VERSION_ID=(\d+)/, 1]
|
264
|
+
end
|
265
|
+
elsif /RedHat/i.match?(lsb[:id])
|
266
|
+
platform "redhat"
|
267
|
+
platform_version lsb[:release]
|
268
|
+
elsif /Amazon/i.match?(lsb[:id])
|
269
|
+
platform "amazon"
|
270
|
+
platform_version lsb[:release]
|
271
|
+
elsif /ScientificSL/i.match?(lsb[:id])
|
272
|
+
platform "scientific"
|
273
|
+
platform_version lsb[:release]
|
274
|
+
elsif /XenServer/i.match?(lsb[:id])
|
275
|
+
platform "xenserver"
|
276
|
+
platform_version lsb[:release]
|
277
|
+
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
|
278
|
+
platform lsb[:id].downcase
|
279
|
+
platform_version lsb[:release]
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
# Grab the version from the VERSION_ID field and use the kernel release if that's not
|
284
|
+
# available. It should be there for everything, but rolling releases like arch / gentoo
|
285
|
+
# where we've traditionally used the kernel as the version
|
286
|
+
# @return String the OS version
|
287
|
+
def determine_os_version
|
288
|
+
# centos only includes the major version in os-release for some reason
|
289
|
+
if os_release_info["ID"] == "centos"
|
290
|
+
get_redhatish_version(file_read("/etc/redhat-release").chomp)
|
291
|
+
# debian testing and unstable don't have VERSION_ID set
|
292
|
+
elsif os_release_info["ID"] == "debian"
|
293
|
+
os_release_info["VERSION_ID"] || file_read("/etc/debian_version").chomp
|
294
|
+
else
|
295
|
+
os_release_info["VERSION_ID"] || shell_out("/bin/uname -r").stdout.strip
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
collect_data(:linux) do
|
300
|
+
if file_exist?("/etc/os-release")
|
301
|
+
logger.trace("Plugin platform: Using /etc/os-release for platform detection")
|
302
|
+
|
303
|
+
# fixup os-release names to ohai platform names
|
304
|
+
platform platform_id_remap(os_release_info["ID"])
|
305
|
+
|
306
|
+
platform_version determine_os_version
|
307
|
+
else # we're on an old Linux distro
|
308
|
+
legacy_platform_detection
|
309
|
+
end
|
310
|
+
|
311
|
+
# unless we set it in a specific way with the platform logic above set based on platform data
|
312
|
+
platform_family platform_family_from_platform(platform) if platform_family.nil?
|
313
|
+
end
|
314
|
+
end
|