ohai 16.10.6 → 17.1.0

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.
@@ -29,7 +29,7 @@ Ohai.plugin(:Eucalyptus) do
29
29
  provides "eucalyptus"
30
30
  depends "network/interfaces"
31
31
 
32
- MAC_MATCH = /^[dD]0:0[dD]:/.freeze
32
+ MAC_MATCH = /^[dD]0:0[dD]:/.freeze unless defined?(MAC_MATCH)
33
33
 
34
34
  # returns the mac address from the collection of all address types
35
35
  def get_mac_address(addresses)
@@ -98,14 +98,6 @@ Ohai.plugin(:Filesystem) do
98
98
  view
99
99
  end
100
100
 
101
- def generate_deprecated_windows_view(fs)
102
- view = generate_mountpoint_view(fs)
103
- view.each do |mp, entry|
104
- view[mp].delete("devices")
105
- end
106
- view
107
- end
108
-
109
101
  def parse_common_df(out)
110
102
  fs = {}
111
103
  out.each_line do |line|
@@ -466,9 +458,7 @@ Ohai.plugin(:Filesystem) do
466
458
  fs_data["by_mountpoint"] = by_mountpoint
467
459
  fs_data["by_pair"] = by_pair
468
460
 
469
- # @todo in Chef 17 the filesystem2 part of this goes away
470
461
  filesystem fs_data
471
- filesystem2 fs_data
472
462
  end
473
463
 
474
464
  collect_data(:darwin) do
@@ -613,9 +603,7 @@ Ohai.plugin(:Filesystem) do
613
603
  fs_data["by_mountpoint"] = by_mountpoint
614
604
  fs_data["by_pair"] = by_pair
615
605
 
616
- # @todo in Chef 17 the filesystem2 plugin goes away
617
606
  filesystem fs_data
618
- filesystem2 fs_data
619
607
  end
620
608
 
621
609
  collect_data(:aix) do
@@ -705,9 +693,7 @@ Ohai.plugin(:Filesystem) do
705
693
  fs_data["by_mountpoint"] = by_mountpoint
706
694
  fs_data["by_pair"] = by_pair
707
695
 
708
- # @todo in Chef 17 the filesystem2 plugin goes away here
709
696
  filesystem fs_data
710
- filesystem2 fs_data
711
697
  end
712
698
 
713
699
  collect_data(:windows) do
@@ -726,9 +712,10 @@ Ohai.plugin(:Filesystem) do
726
712
  fs_data["by_mountpoint"] = by_mountpoint
727
713
  fs_data["by_pair"] = by_pair
728
714
 
729
- # Set the filesystem data - Windows didn't do the conversion when everyone
730
- # else did, so 15 will have both be the new API and 16 will drop the old API
731
- filesystem generate_deprecated_windows_view(fs)
715
+ # Chef 16 added 'filesystem2'
716
+ # In Chef 17 we made 'filesystem' and 'filesystem2' match (both new-style)
717
+ # In Chef 18 we will drop 'filesystem2'
718
+ filesystem fs_data
732
719
  filesystem2 fs_data
733
720
  end
734
721
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright:: Copyright (c) Chef Software Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ #
19
+ Ohai.plugin(:Habitat) do
20
+ provides "habitat"
21
+
22
+ def habitat_binary
23
+ @habitat_binary ||= which("hab")
24
+ end
25
+
26
+ def fetch_habitat_version
27
+ shell_out([habitat_binary, "-V"]).stdout.gsub(/hab\s*/, "").strip
28
+ rescue Ohai::Exceptions::Exec
29
+ logger.trace("Plugin Habitat: Unable to determine the installed version of Habitat, skipping collection.")
30
+ end
31
+
32
+ def fetch_habitat_packages
33
+ shell_out([habitat_binary, "pkg", "list", "--all"]).stdout.split.sort.select { |pkg| pkg.match?(%r{.*/.*/.*/.*}) }
34
+ rescue Ohai::Exceptions::Exec
35
+ logger.trace("Plugin Habitat: Unable to determine the installed Habitat packages, skipping collection.")
36
+ end
37
+
38
+ def load_habitat_service_via_cli(status_stdout)
39
+ # package type desired state elapsed (s) pid group
40
+ # core/httpd/2.4.35/20190307151146 standalone up up 158169 1410 httpd.default
41
+ @services = []
42
+ status_stdout.each_line do |line|
43
+ fields = line.split(/\s+/)
44
+ next unless fields[0].match?(%r{.*/.*/.*/.*}) # ignore header line
45
+
46
+ service = {}
47
+ service[:identity] = fields[0]
48
+ service[:topology] = fields[1]
49
+ service[:state_desired] = fields[2]
50
+ service[:state_actual] = fields[2]
51
+ (@services).push(service)
52
+ end
53
+ @services
54
+ end
55
+
56
+ def fetch_habitat_services
57
+ services_shell_out = shell_out([habitat_binary, "svc", "status"]).stdout
58
+ load_habitat_service_via_cli(services_shell_out) if services_shell_out
59
+ rescue Ohai::Exceptions::Exec
60
+ logger.trace("Plugin Habitat: Unable to determine the installed Habitat services, skipping collection.")
61
+ end
62
+
63
+ collect_data(:default) do
64
+ if habitat_binary
65
+ habitat Mash.new
66
+ habitat["version"] = fetch_habitat_version
67
+ habitat["packages"] = fetch_habitat_packages
68
+ habitat["services"] = fetch_habitat_services
69
+ else
70
+ logger.trace("Plugin Habitat: Could not find hab binary. Skipping plugin.")
71
+ end
72
+ end
73
+ end
@@ -48,7 +48,28 @@ Ohai.plugin(:Hostname) do
48
48
  require "ipaddr" unless defined?(IPAddr)
49
49
 
50
50
  hostname = from_cmd("hostname")
51
- addrinfo = Socket.getaddrinfo(hostname, nil).first
51
+ begin
52
+ addrinfo = Socket.getaddrinfo(hostname, nil).first
53
+ rescue SocketError
54
+ # In the event that we got an exception from Socket, it's possible
55
+ # that it will work if we restrict it to IPv4 only either because of
56
+ # IPv6 misconfiguration or other bugs.
57
+ #
58
+ # Specifically it's worth noting that on macOS, getaddrinfo() will choke
59
+ # if it gets back a link-local address (say if you have 'fe80::1 myhost'
60
+ # in /etc/hosts). This will raise:
61
+ # SocketError (getnameinfo: Non-recoverable failure in name resolution)
62
+ #
63
+ # But general misconfiguration could cause similar issues, so attempt to
64
+ # fall back to v4-only
65
+ begin
66
+ addrinfo = Socket.getaddrinfo(hostname, nil, :INET).first
67
+ rescue
68
+ # and if *that* fails, then try v6-only, in case we're in a v6-only
69
+ # environment with v4 config issues
70
+ addrinfo = Socket.getaddrinfo(hostname, nil, :INET6).first
71
+ end
72
+ end
52
73
  iaddr = IPAddr.new(addrinfo[3])
53
74
  Socket.gethostbyaddr(iaddr.hton)[0]
54
75
  rescue
@@ -141,13 +141,13 @@ Ohai.plugin(:Network) do
141
141
 
142
142
  # using a temporary var to hold routes and their interface name
143
143
  def parse_routes(family, iface)
144
- iface.collect do |i, iv|
144
+ iface.filter_map do |i, iv|
145
145
  next unless iv[:routes]
146
146
 
147
- iv[:routes].collect do |r|
147
+ iv[:routes].filter_map do |r|
148
148
  r.merge(dev: i) if r[:family] == family[:name]
149
- end.compact # @todo: when we drop ruby 2.6 this should be a filter_map
150
- end.compact.flatten # @todo: when we drop ruby 2.6 this should be a filter_map
149
+ end
150
+ end.flatten
151
151
  end
152
152
 
153
153
  # determine layer 1 details for the interface using ethtool
@@ -273,6 +273,30 @@ Ohai.plugin(:Network) do
273
273
  iface
274
274
  end
275
275
 
276
+ # determine offload features for the interface using ethtool
277
+ def ethernet_offload_parameters(iface)
278
+ return iface unless ethtool_binary_path
279
+
280
+ iface.each_key do |tmp_int|
281
+ next unless iface[tmp_int][:encapsulation] == "Ethernet"
282
+
283
+ so = shell_out("#{ethtool_binary_path} -k #{tmp_int}")
284
+ Ohai::Log.debug("Plugin Network: Parsing ethtool output: #{so.stdout}")
285
+ iface[tmp_int]["offload_params"] = {}
286
+ so.stdout.lines.each do |line|
287
+ next if line.start_with?("Features for")
288
+ next if line.strip.nil?
289
+
290
+ key, val = line.split(/:\s+/)
291
+ if val
292
+ offload_key = key.downcase.strip.tr(" ", "_").to_s
293
+ iface[tmp_int]["offload_params"][offload_key] = val.downcase.gsub(/\[.*\]/, "").strip.to_s
294
+ end
295
+ end
296
+ end
297
+ iface
298
+ end
299
+
276
300
  # determine pause parameters for the interface using ethtool
277
301
  def ethernet_pause_parameters(iface)
278
302
  return iface unless ethtool_binary_path
@@ -793,6 +817,7 @@ Ohai.plugin(:Network) do
793
817
  iface = ethernet_ring_parameters(iface)
794
818
  iface = ethernet_channel_parameters(iface)
795
819
  iface = ethernet_coalesce_parameters(iface)
820
+ iface = ethernet_offload_parameters(iface)
796
821
  iface = ethernet_driver_info(iface)
797
822
  iface = ethernet_pause_parameters(iface)
798
823
  counters[:network][:interfaces] = net_counters
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Lance Albertson (lance@osuosl.org>)
4
+ # Copyright:: Copyright (c) 2021 Oregon State University
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(:OsRelease) do
21
+ provides "os_release"
22
+
23
+ collect_data(:linux) do
24
+ os_release Mash.new unless os_release
25
+
26
+ # https://www.freedesktop.org/software/systemd/man/os-release.html
27
+ if file_exist?("/etc/os-release")
28
+ file_read("/etc/os-release").each_line do |line|
29
+ key, value = line.split("=")
30
+ if key == "ID_LIKE"
31
+ os_release[key.downcase] = value.chomp.gsub(/\A"|"\Z/, "").split(" ") if value
32
+ else
33
+ os_release[key.downcase] = value.chomp.gsub(/\A"|"\Z/, "") if value
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -54,7 +54,7 @@ Ohai.plugin(:Platform) do
54
54
  end
55
55
 
56
56
  #
57
- # Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
57
+ # Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
58
58
  # switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
59
59
  # distros can also reuse this method safely).
60
60
  #
@@ -112,16 +112,17 @@ Ohai.plugin(:Platform) do
112
112
  # ohai uses. If you're adding a new platform here and you want to change the name
113
113
  # you'll want to add it here and then add a spec for the platform_id_remap method
114
114
  {
115
- "rhel" => "redhat",
115
+ "alinux" => "alibabalinux",
116
116
  "amzn" => "amazon",
117
+ "archarm" => "arch",
118
+ "cumulus-linux" => "cumulus",
117
119
  "ol" => "oracle",
118
- "sles" => "suse",
119
- "sles_sap" => "suse",
120
120
  "opensuse-leap" => "opensuseleap",
121
+ "rhel" => "redhat",
122
+ "sles_sap" => "suse",
123
+ "sles" => "suse",
121
124
  "xenenterprise" => "xenserver",
122
- "cumulus-linux" => "cumulus",
123
- "archarm" => "arch",
124
- }[id] || id
125
+ }[id.downcase] || id.downcase
125
126
  end
126
127
 
127
128
  #
@@ -133,22 +134,24 @@ Ohai.plugin(:Platform) do
133
134
  #
134
135
  def platform_family_from_platform(plat)
135
136
  case plat
136
- when /debian/, /ubuntu/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
137
+ when /ubuntu/, /debian/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
137
138
  # apt-get+dpkg almost certainly goes here
138
139
  "debian"
139
- when /oracle/, /centos/, /redhat/, /almalinux/, /scientific/, /enterpriseenterprise/, /xcp/, /xenserver/, /cloudlinux/, /ibm_powerkvm/, /parallels/, /nexus_centos/, /clearos/, /bigip/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
140
+ when /centos/, /redhat/, /oracle/, /almalinux/, /rocky/, /scientific/, /enterpriseenterprise/, /xenserver/, /xcp-ng/, /cloudlinux/, /alibabalinux/, /sangoma/, /clearos/, /parallels/, /ibm_powerkvm/, /nexus_centos/, /bigip/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
140
141
  # NOTE: "rhel" should be reserved exclusively for recompiled rhel versions that are nearly perfectly compatible down to the platform_version.
141
142
  # The operating systems that are "rhel" should all be as compatible as rhel7 = centos7 = oracle7 = scientific7 (98%-ish core RPM version compatibility
142
143
  # and the version numbers MUST track the upstream). The appropriate EPEL version repo should work nearly perfectly. Some variation like the
143
- # oracle kernel version differences and tuning and extra packages are clearly acceptable. Almost certainly some distros above (xenserver?)
144
- # 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,
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,
145
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
146
149
  "rhel"
147
150
  when /amazon/
148
151
  "amazon"
149
- when /suse/, /sles/, /opensuse/, /opensuseleap/, /sled/
152
+ when /suse/, /sles/, /opensuseleap/, /opensuse/, /sled/
150
153
  "suse"
151
- when /fedora/, /pidora/, /arista_eos/
154
+ when /fedora/, /arista_eos/
152
155
  # 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
153
156
  # SuSE it probably goes here).
154
157
  "fedora"
@@ -156,9 +159,7 @@ Ohai.plugin(:Platform) do
156
159
  "wrlinux"
157
160
  when /gentoo/
158
161
  "gentoo"
159
- when /slackware/
160
- "slackware"
161
- when /arch/, /manjaro/, /antergos/
162
+ when /arch/, /manjaro/
162
163
  "arch"
163
164
  when /exherbo/
164
165
  "exherbo"
@@ -168,6 +169,8 @@ Ohai.plugin(:Platform) do
168
169
  "clearlinux"
169
170
  when /mangeia/
170
171
  "mandriva"
172
+ when /slackware/
173
+ "slackware"
171
174
  end
172
175
  end
173
176
 
@@ -270,9 +273,6 @@ Ohai.plugin(:Platform) do
270
273
  elsif /XenServer/i.match?(lsb[:id])
271
274
  platform "xenserver"
272
275
  platform_version lsb[:release]
273
- elsif /XCP/i.match?(lsb[:id])
274
- platform "xcp"
275
- platform_version lsb[:release]
276
276
  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
277
277
  platform lsb[:id].downcase
278
278
  platform_version lsb[:release]
@@ -20,6 +20,7 @@
20
20
  Ohai.plugin(:Virtualization) do
21
21
  provides "virtualization"
22
22
  depends "dmi"
23
+ depends "cpu"
23
24
  require_relative "../../mixin/dmi_decode"
24
25
  include Ohai::Mixin::DmiDecode
25
26
 
@@ -35,6 +36,10 @@ Ohai.plugin(:Virtualization) do
35
36
  which("docker")
36
37
  end
37
38
 
39
+ def podman_exists?
40
+ which("podman")
41
+ end
42
+
38
43
  collect_data(:linux) do
39
44
  virtualization Mash.new unless virtualization
40
45
  virtualization[:systems] ||= Mash.new
@@ -46,6 +51,13 @@ Ohai.plugin(:Virtualization) do
46
51
  virtualization[:systems][:docker] = "host"
47
52
  end
48
53
 
54
+ # Podman hosts
55
+ if podman_exists?
56
+ virtualization[:system] = "podman"
57
+ virtualization[:role] = "host"
58
+ virtualization[:systems][:podman] = "host"
59
+ end
60
+
49
61
  # Xen Notes:
50
62
  # - /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
51
63
  # - cpuid of guests, if we could get it, would also be a clue
@@ -115,6 +127,14 @@ Ohai.plugin(:Virtualization) do
115
127
  virtualization[:role] = "host"
116
128
  virtualization[:systems][:kvm] = "host"
117
129
  end
130
+ elsif get_attribute(:cpu, :hypervisor_vendor)
131
+ if get_attribute(:cpu, :hypervisor_vendor) == "KVM"
132
+ virtualization[:system] = "kvm"
133
+ if /(para|full)/.match?(get_attribute(:cpu, :virtualization_type))
134
+ virtualization[:role] = "guest"
135
+ virtualization[:systems][:kvm] = "guest"
136
+ end
137
+ end
118
138
  end
119
139
 
120
140
  # parse dmi to discover various virtualization guests
@@ -188,7 +208,7 @@ Ohai.plugin(:Virtualization) do
188
208
  # <index #>:<subsystem>:/
189
209
  #
190
210
  # Full notes, https://tickets.opscode.com/browse/OHAI-551
191
- # Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
211
+ # Kernel docs, https://web.archive.org/web/20100514070914/http://www.kernel.org/doc/Documentation/cgroups/
192
212
  if file_exist?("/proc/self/cgroup")
193
213
  cgroup_content = file_read("/proc/self/cgroup")
194
214
  # These two REs catch many different examples. Here's a specific one
@@ -210,6 +230,20 @@ Ohai.plugin(:Virtualization) do
210
230
  virtualization[:system] = "nspawn"
211
231
  virtualization[:role] = "guest"
212
232
  virtualization[:systems][:nspawn] = "guest"
233
+ elsif /container=podman/.match?(file_read("/proc/1/environ"))
234
+ logger.trace("Plugin Virtualization: /proc/1/environ indicates podman container. Detecting as podman guest")
235
+ virtualization[:system] = "podman"
236
+ virtualization[:role] = "guest"
237
+ virtualization[:systems][:podman] = "guest"
238
+ # Detect any containers that appear to be using docker such as those running on Github Actions virtual machines
239
+ # but aren't triggered by the cgroup regex above. It's pretty safe to assume if the cgroup contains containerd,
240
+ # it's likely using docker.
241
+ # https://rubular.com/r/qhSmV113cPmEBT
242
+ elsif %r{^\d+:[^:]*:/[^/]+/(containerd)-?.+$}.match?(cgroup_content)
243
+ logger.trace("Plugin Virtualization: /proc/self/cgroup indicates docker container. Detecting as docker guest")
244
+ virtualization[:system] = "docker"
245
+ virtualization[:role] = "guest"
246
+ virtualization[:systems][:docker] = "guest"
213
247
  elsif lxc_version_exists? && file_read("/proc/self/cgroup") =~ %r{\d:[^:]+:/$}
214
248
  # lxc-version shouldn't be installed by default
215
249
  # Even so, it is likely we are on an LXC capable host that is not being used as such
@@ -225,7 +259,11 @@ Ohai.plugin(:Virtualization) do
225
259
  # If so, we may need to look further for a differentiator (OHAI-573)
226
260
  virtualization[:systems][:lxc] = "host"
227
261
  end
228
- elsif file_exist?("/.dockerenv") || file_exist?("/.dockerinit")
262
+ end
263
+
264
+ # regardless of what we found above, if we're a docker container inside
265
+ # of the above, lets report as a docker container
266
+ if file_exist?("/.dockerenv") || file_exist?("/.dockerinit")
229
267
  logger.trace("Plugin Virtualization: .dockerenv or .dockerinit exist. Detecting as docker guest")
230
268
  virtualization[:system] = "docker"
231
269
  virtualization[:role] = "guest"