ohai 18.0.14 → 18.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3f13e229791bcb56c90dfc30f3fa5fea108b9d185c1c0492a5198c2e6bae93b
4
- data.tar.gz: 60134dedd0d7da72c1932dc987b143303d9f832bf123380ab22db9462e6799b2
3
+ metadata.gz: 6d6704f249d63eb6abebd08dd48e408fee70bd50d5ca2304471bdcc53b80941c
4
+ data.tar.gz: f761a02520c31d96e8a8bab3853f5a432d0fb9460b2901dd1a0abe4efdcdcc6b
5
5
  SHA512:
6
- metadata.gz: 735fb50fdd3ee96a1325eaae9847d0f998b72b50116963d829bd7b350d5b6af4e76089083612c7a66f7ec7e80a374e45b25b711b38e6ff5c0435f9ac66ae39ec
7
- data.tar.gz: ed81c806e9d91688e5c7aa5a4246aea55e62a8dbca35e3c89698795c29f45083572bafdf62382abcce201c53b736a1f11b2fcd17e4ff5aa61a114707fc2f1b11
6
+ metadata.gz: a58f353ea899d897e4fc3cd8aa5dabe9737b8002ceda5483482ac7fceded93d40ef5581ca4e403edaa049e6f43587932945e8f1f125cb88162e31ae424a80865
7
+ data.tar.gz: a58f4b0a239f206e2194abacbdbf137931057980745f0b5b9eee528ff314c21a042ae1b88a0325b12a68fc928c77817778d53d89e952bbd9d88410df35a93865
data/Gemfile CHANGED
@@ -16,7 +16,7 @@ group :development do
16
16
  gem "rspec-core", "~> 3.0"
17
17
  gem "rspec-expectations", "~> 3.0"
18
18
  gem "rspec-mocks", "~> 3.0"
19
- gem "rubocop-performance", "1.13.3"
19
+ gem "rubocop-performance", "1.16.0"
20
20
  gem "rubocop-rspec"
21
21
  end
22
22
 
@@ -25,57 +25,59 @@ module Ohai
25
25
  # all-lowercase, all non-alphanumeric converted to '_'
26
26
  # 128-255 are 'oem_data_[id]'
27
27
  # Everything else is 'unknown'
28
- ID_TO_DESCRIPTION = {
29
- 0 => "bios",
30
- 1 => "system",
31
- 2 => "base_board",
32
- 3 => "chassis",
33
- 4 => "processor",
34
- 5 => "memory_controller",
35
- 6 => "memory_module",
36
- 7 => "cache",
37
- 8 => "port_connector",
38
- 9 => "system_slots",
39
- 10 => "on_board_devices",
40
- 11 => "oem_strings",
41
- 12 => "system_configuration_options",
42
- 13 => "bios_language",
43
- 14 => "group_associations",
44
- 15 => "system_event_log",
45
- 16 => "physical_memory_array",
46
- 17 => "memory_device",
47
- 18 => "32_bit_memory_error",
48
- 19 => "memory_array_mapped_address",
49
- 20 => "memory_device_mapped_address",
50
- 21 => "built_in_pointing_device",
51
- 22 => "portable_battery",
52
- 23 => "system_reset",
53
- 24 => "hardware_security",
54
- 25 => "system_power_controls",
55
- 26 => "voltage_probe",
56
- 27 => "cooling_device",
57
- 28 => "temperature_probe",
58
- 29 => "electrical_current_probe",
59
- 30 => "out_of_band_remote_access",
60
- 31 => "boot_integrity_services",
61
- 32 => "system_boot",
62
- 33 => "64_bit_memory_error",
63
- 34 => "management_device",
64
- 35 => "management_device_component",
65
- 36 => "management_device_threshold_data",
66
- 37 => "memory_channel",
67
- 38 => "ipmi_device",
68
- 39 => "power_supply",
69
- 40 => "additional_information",
70
- 41 => "onboard_devices_extended_information",
71
- 42 => "management_controller_host_interfaces",
72
- 126 => "disabled_entries",
73
- 127 => "end_of_table_marker",
74
- }.freeze
28
+ unless defined?(ID_TO_DESCRIPTION)
29
+ ID_TO_DESCRIPTION = {
30
+ 0 => "bios",
31
+ 1 => "system",
32
+ 2 => "base_board",
33
+ 3 => "chassis",
34
+ 4 => "processor",
35
+ 5 => "memory_controller",
36
+ 6 => "memory_module",
37
+ 7 => "cache",
38
+ 8 => "port_connector",
39
+ 9 => "system_slots",
40
+ 10 => "on_board_devices",
41
+ 11 => "oem_strings",
42
+ 12 => "system_configuration_options",
43
+ 13 => "bios_language",
44
+ 14 => "group_associations",
45
+ 15 => "system_event_log",
46
+ 16 => "physical_memory_array",
47
+ 17 => "memory_device",
48
+ 18 => "32_bit_memory_error",
49
+ 19 => "memory_array_mapped_address",
50
+ 20 => "memory_device_mapped_address",
51
+ 21 => "built_in_pointing_device",
52
+ 22 => "portable_battery",
53
+ 23 => "system_reset",
54
+ 24 => "hardware_security",
55
+ 25 => "system_power_controls",
56
+ 26 => "voltage_probe",
57
+ 27 => "cooling_device",
58
+ 28 => "temperature_probe",
59
+ 29 => "electrical_current_probe",
60
+ 30 => "out_of_band_remote_access",
61
+ 31 => "boot_integrity_services",
62
+ 32 => "system_boot",
63
+ 33 => "64_bit_memory_error",
64
+ 34 => "management_device",
65
+ 35 => "management_device_component",
66
+ 36 => "management_device_threshold_data",
67
+ 37 => "memory_channel",
68
+ 38 => "ipmi_device",
69
+ 39 => "power_supply",
70
+ 40 => "additional_information",
71
+ 41 => "onboard_devices_extended_information",
72
+ 42 => "management_controller_host_interfaces",
73
+ 126 => "disabled_entries",
74
+ 127 => "end_of_table_marker",
75
+ }.freeze
76
+ end
75
77
 
76
78
  # list of IDs to collect from config or default to a sane list that prunes
77
79
  # away some of the less useful IDs
78
- ID_TO_CAPTURE = [ 0, 1, 2, 3, 4, 6, 11 ].freeze
80
+ ID_TO_CAPTURE = [ 0, 1, 2, 3, 4, 6, 11 ].freeze unless defined?(ID_TO_CAPTURE)
79
81
 
80
82
  # the allowlisted DMI IDs. This is combination of the defaults + any additional
81
83
  # IDs defined in the :additional_dmi_ids config
@@ -116,14 +118,16 @@ module Ohai
116
118
  id
117
119
  end
118
120
 
119
- SKIPPED_CONVENIENCE_KEYS = %w{
120
- application_identifier
121
- caption
122
- creation_class_name
123
- size
124
- system_creation_class_name
125
- record_id
126
- }.freeze
121
+ unless defined?(SKIPPED_CONVENIENCE_KEYS)
122
+ SKIPPED_CONVENIENCE_KEYS = %w{
123
+ application_identifier
124
+ caption
125
+ creation_class_name
126
+ size
127
+ system_creation_class_name
128
+ record_id
129
+ }.freeze
130
+ end
127
131
 
128
132
  # create simplified convenience access keys for each record type
129
133
  # for single occurrences of one type, copy to top level all fields and values
@@ -27,7 +27,7 @@ module ::Ohai::Mixin::DmiDecode
27
27
  when /VMware/
28
28
  return "vmware"
29
29
  when /Microsoft/
30
- return "hyperv" if /Virtual Machine/.match?(product)
30
+ return "hyperv" if product.include?("Virtual Machine")
31
31
  when /Amazon EC2/
32
32
  return "amazonec2"
33
33
  when /QEMU/
@@ -23,10 +23,12 @@ require "socket" unless defined?(Socket)
23
23
  module Ohai
24
24
  module Mixin
25
25
  module NetworkHelper
26
- FAMILIES = {
27
- "inet" => "default",
28
- "inet6" => "default_inet6",
29
- }.freeze
26
+ unless defined?(FAMILIES)
27
+ FAMILIES = {
28
+ "inet" => "default",
29
+ "inet6" => "default_inet6",
30
+ }.freeze
31
+ end
30
32
 
31
33
  def hex_to_dec_netmask(netmask)
32
34
  # example 'ffff0000' -> '255.255.0.0'
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Author:: Renato Covarrubias (<rnt@rnt.cl>)
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
+ require "net/http" unless defined?(Net::HTTP)
20
+
21
+ module Ohai
22
+ module Mixin
23
+ module OCIMetadata
24
+ OCI_METADATA_ADDR = "169.254.169.254"
25
+ OCI_METADATA_URL = "/opc/v2"
26
+ CHASSIS_ASSET_TAG_FILE = "/sys/devices/virtual/dmi/id/chassis_asset_tag"
27
+
28
+ # fetch the meta content with a timeout and the required header
29
+ def http_get(uri)
30
+ conn = Net::HTTP.start(OCI_METADATA_ADDR)
31
+ conn.read_timeout = 6
32
+ conn.get(
33
+ uri,
34
+ {
35
+ "Authorization" => "Bearer Oracle",
36
+ "User-Agent" => "chef-ohai/#{Ohai::VERSION}",
37
+ }
38
+ )
39
+ end
40
+
41
+ # parse JSON data from a String to a Hash
42
+ #
43
+ # @param [String] response_body json as string to parse
44
+ #
45
+ # @return [Hash]
46
+ def parse_json(response_body)
47
+ data = String(response_body)
48
+ parser = FFI_Yajl::Parser.new
49
+ parser.parse(data)
50
+ rescue FFI_Yajl::ParseError
51
+ logger.warn("Mixin OciMetadata: Metadata response is NOT valid JSON")
52
+ nil
53
+ end
54
+
55
+ # Fetch metadata from api
56
+ def fetch_metadata(metadata = "instance")
57
+ response = http_get("#{OCI_METADATA_URL}/#{metadata}")
58
+ return nil unless response.code == "200"
59
+
60
+ if response.code == "200"
61
+ parse_json(response.body)
62
+ else
63
+ logger.warn("Mixin OciMetadata: Received response code #{response.code} requesting metadata")
64
+ nil
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -33,7 +33,7 @@ Ohai.plugin(:Alibaba) do
33
33
  # this works even if the system lacks dmidecode use by the Dmi plugin
34
34
  # @return [Boolean] do we have Alibaba DMI data?
35
35
  def has_ali_dmi?
36
- if /Alibaba/.match?(file_val_if_exists("/sys/class/dmi/id/sys_vendor"))
36
+ if file_val_if_exists("/sys/class/dmi/id/sys_vendor").to_s.include?("Alibaba")
37
37
  logger.trace("Plugin Alibaba: has_ali_dmi? == true")
38
38
  true
39
39
  else
@@ -58,7 +58,7 @@ Ohai.plugin(:Azure) do
58
58
  has_245 = false
59
59
  if file_exist?("/var/lib/dhcp/dhclient.eth0.leases")
60
60
  file_open("/var/lib/dhcp/dhclient.eth0.leases").each do |line|
61
- if /unknown-245/.match?(line)
61
+ if line.include?("unknown-245")
62
62
  logger.trace("Plugin Azure: Found unknown-245 DHCP option used by Azure.")
63
63
  has_245 = true
64
64
  break
@@ -28,6 +28,7 @@ Ohai.plugin(:Cloud) do
28
28
  depends "azure"
29
29
  depends "digital_ocean"
30
30
  depends "softlayer"
31
+ depends "oci"
31
32
 
32
33
  # Class to help enforce the interface exposed to node[:cloud] (OHAI-542)
33
34
  #
@@ -336,6 +337,26 @@ Ohai.plugin(:Cloud) do
336
337
  @cloud_attr_obj.provider = "softlayer"
337
338
  end
338
339
 
340
+ # ----------------------------------------
341
+ # OCI
342
+ # ----------------------------------------
343
+
344
+ # Is current Oracle Cloud Infrastructure?
345
+ #
346
+ # === Return
347
+ # true:: If oci Hash is defined
348
+ # false:: Otherwise
349
+ def on_oci?
350
+ oci != nil
351
+ end
352
+
353
+ # Fill cloud hash with OCI values
354
+ def oci_values
355
+ oci["metadata"]["network"]["interface"].each { |vnic| @cloud_attr_obj.add_ipv4_addr(vnic["privateIp"], :private) }
356
+ @cloud_attr_obj.local_hostname = oci["metadata"]["compute"]["hostname"]
357
+ @cloud_attr_obj.provider = "oci"
358
+ end
359
+
339
360
  collect_data do
340
361
  require "ipaddr" unless defined?(IPAddr)
341
362
 
@@ -351,6 +372,7 @@ Ohai.plugin(:Cloud) do
351
372
  get_digital_ocean_values if on_digital_ocean?
352
373
  get_softlayer_values if on_softlayer?
353
374
  get_alibaba_values if on_alibaba?
375
+ oci_values if on_oci?
354
376
 
355
377
  cloud @cloud_attr_obj.cloud_mash
356
378
  end
@@ -193,7 +193,8 @@ Ohai.plugin(:CPU) do
193
193
  lscpu_real = lscpu_info[:sockets]
194
194
  lscpu_cores = lscpu_info[:sockets] * lscpu_info[:cores_per_socket]
195
195
  else
196
- lscpu_total = lscpu_info[:sockets] * lscpu_info[:cores_per_socket] * lscpu_info[:threads_per_core]
196
+ threads_per_core = [lscpu_info[:threads_per_core], 1].max
197
+ lscpu_total = lscpu_info[:sockets] * lscpu_info[:cores_per_socket] * threads_per_core
197
198
  lscpu_real = lscpu_info[:sockets]
198
199
  lscpu_cores = lscpu_info[:sockets] * lscpu_info[:cores_per_socket]
199
200
  end
@@ -344,15 +345,23 @@ Ohai.plugin(:CPU) do
344
345
  cpuinfo
345
346
  end
346
347
 
348
+ # Check if the `lscpu` data looks reasonable
349
+ def valid_lscpu?(lscpu)
350
+ return false if lscpu.empty?
351
+ return false if %i{total real cores}.any? { |key| lscpu[key].to_i == 0 }
352
+
353
+ true
354
+ end
355
+
347
356
  collect_data(:linux) do
348
357
  cpuinfo = parse_cpuinfo
349
358
  lscpu = parse_lscpu(cpuinfo)
350
359
 
351
- # If we don't have any data from lscpu then get it from /proc/cpuinfo
352
- if lscpu.empty?
353
- cpu cpuinfo
354
- else
360
+ # If we don't have any sensible data from lscpu then get it from /proc/cpuinfo
361
+ if valid_lscpu?(lscpu)
355
362
  cpu lscpu
363
+ else
364
+ cpu cpuinfo
356
365
  end
357
366
  end
358
367
 
@@ -515,7 +524,7 @@ Ohai.plugin(:CPU) do
515
524
  cpu[index] = Mash.new
516
525
  cpu[index][:status] = status
517
526
  cpu[index][:location] = location
518
- if /Available/.match?(status)
527
+ if status.include?("Available")
519
528
  cpu[:available] += 1
520
529
  lsattr = shell_out("lsattr -El #{name}").stdout.lines
521
530
  lsattr.each do |attribute|
@@ -77,17 +77,14 @@ Ohai.plugin(:Virtualization) do
77
77
  virtualization[:systems][:vmware] = "guest"
78
78
  end
79
79
 
80
- if prlctl_exists?
80
+ if ioreg_exists? && shell_out("ioreg -l").stdout.include?("pci1ab8,4000")
81
+ virtualization[:system] = "parallels"
82
+ virtualization[:role] = "guest"
83
+ virtualization[:systems][:parallels] = "guest"
84
+ elsif prlctl_exists?
81
85
  virtualization[:system] = "parallels"
82
86
  virtualization[:role] = "host"
83
87
  virtualization[:systems][:parallels] = "host"
84
- elsif ioreg_exists?
85
- so = shell_out("ioreg -l")
86
- if /pci1ab8,4000/.match?(so.stdout)
87
- virtualization[:system] = "parallels"
88
- virtualization[:role] = "guest"
89
- virtualization[:systems][:parallels] = "guest"
90
- end
91
88
  end
92
89
  end
93
- end
90
+ end
@@ -28,10 +28,8 @@
28
28
 
29
29
  Ohai.plugin(:EC2) do
30
30
  require_relative "../mixin/ec2_metadata"
31
- require_relative "../mixin/http_helper"
32
31
 
33
32
  include Ohai::Mixin::Ec2Metadata
34
- include Ohai::Mixin::HttpHelper
35
33
 
36
34
  provides "ec2"
37
35
 
@@ -41,7 +39,7 @@ Ohai.plugin(:EC2) do
41
39
  # @return [Boolean] do we have Amazon DMI data?
42
40
  def has_ec2_amazon_dmi?
43
41
  # detect a version of '4.2.amazon'
44
- if /Amazon/.match?(file_val_if_exists("/sys/class/dmi/id/bios_vendor"))
42
+ if file_val_if_exists("/sys/class/dmi/id/bios_vendor").to_s.include?("Amazon")
45
43
  logger.trace("Plugin EC2: has_ec2_amazon_dmi? == true")
46
44
  true
47
45
  else
@@ -56,7 +54,7 @@ Ohai.plugin(:EC2) do
56
54
  # @return [Boolean] do we have Amazon DMI data?
57
55
  def has_ec2_xen_dmi?
58
56
  # detect a version of '4.2.amazon'
59
- if /amazon/.match?(file_val_if_exists("/sys/class/dmi/id/bios_version"))
57
+ if file_val_if_exists("/sys/class/dmi/id/bios_version").to_s.include?("amazon")
60
58
  logger.trace("Plugin EC2: has_ec2_xen_dmi? == true")
61
59
  true
62
60
  else
@@ -106,12 +104,7 @@ Ohai.plugin(:EC2) do
106
104
  # a single check that combines all the various detection methods for EC2
107
105
  # @return [Boolean] Does the system appear to be on EC2
108
106
  def looks_like_ec2?
109
- return true if hint?("ec2")
110
-
111
- # Even if it looks like EC2 try to connect first
112
- if has_ec2_xen_uuid? || has_ec2_amazon_dmi? || has_ec2_xen_dmi? || has_ec2_identifying_number?
113
- return true if can_socket_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
114
- end
107
+ hint?("ec2") || has_ec2_xen_uuid? || has_ec2_amazon_dmi? || has_ec2_xen_dmi? || has_ec2_identifying_number?
115
108
  end
116
109
 
117
110
  collect_data do
@@ -30,6 +30,7 @@ Ohai.plugin(:Fips) do
30
30
  fips Mash.new
31
31
 
32
32
  require "openssl" unless defined?(OpenSSL)
33
- fips["kernel"] = { "enabled" => OpenSSL::OPENSSL_FIPS }
33
+
34
+ fips["kernel"] = { "enabled" => defined?(OpenSSL.fips_mode) && OpenSSL.fips_mode }
34
35
  end
35
36
  end
@@ -28,7 +28,7 @@ Ohai.plugin(:GCE) do
28
28
  # this works even if the system lacks dmidecode use by the Dmi plugin
29
29
  # @return [Boolean] do we have Google Compute Engine DMI data?
30
30
  def has_gce_dmi?
31
- if /Google Compute Engine/.match?(file_val_if_exists("/sys/class/dmi/id/product_name"))
31
+ if file_val_if_exists("/sys/class/dmi/id/product_name").to_s.include?("Google Compute Engine")
32
32
  logger.trace("Plugin GCE: has_gce_dmi? == true")
33
33
  true
34
34
  else
@@ -79,7 +79,7 @@ Ohai.plugin(:Network) do
79
79
  so.stdout.lines do |line|
80
80
  line.strip!
81
81
  logger.trace("Plugin Network: Parsing #{line}")
82
- if /\\/.match?(line)
82
+ if line.include?("\\")
83
83
  # If we have multipath routing, then the first part will be a normal
84
84
  # looking route:
85
85
  # default proto ra metric 1024 <other options>
@@ -218,11 +218,11 @@ Ohai.plugin(:Network) do
218
218
  next if line.start_with?("Ring parameters for")
219
219
  next if line.strip.nil?
220
220
 
221
- if /Pre-set maximums/.match?(line)
221
+ if line.include?("Pre-set maximums")
222
222
  type = "max"
223
223
  next
224
224
  end
225
- if /Current hardware settings/.match?(line)
225
+ if line.include?("Current hardware settings")
226
226
  type = "current"
227
227
  next
228
228
  end
@@ -251,11 +251,11 @@ Ohai.plugin(:Network) do
251
251
  next if line.start_with?("Channel parameters for")
252
252
  next if line.strip.nil?
253
253
 
254
- if /Pre-set maximums/.match?(line)
254
+ if line.include?("Pre-set maximums")
255
255
  type = "max"
256
256
  next
257
257
  end
258
- if /Current hardware settings/.match?(line)
258
+ if line.include?("Current hardware settings")
259
259
  type = "current"
260
260
  next
261
261
  end
@@ -149,7 +149,8 @@ Ohai.plugin(:Platform) do
149
149
  "rhel"
150
150
  when /amazon/
151
151
  "amazon"
152
- when /suse/, /sles/, /opensuseleap/, /opensuse/, /sled/
152
+ # suse matches opensuse, suse-* opensuse-*, etc. sle[sd\-_] intends to match sles, sled, sle-*, sle_*
153
+ when /suse/, /sle[sd\-_]/
153
154
  "suse"
154
155
  when /fedora/, /arista_eos/
155
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
@@ -257,7 +258,7 @@ Ohai.plugin(:Platform) do
257
258
  platform_version shell_out("/bin/uname -r").stdout.strip
258
259
  elsif file_exist?("/usr/lib/os-release")
259
260
  contents = file_read("/usr/lib/os-release")
260
- if /clear-linux-os/.match?(contents) # Clear Linux https://clearlinux.org/
261
+ if contents.include?("clear-linux-os") # Clear Linux https://clearlinux.org/
261
262
  platform "clearlinux"
262
263
  platform_version contents[/VERSION_ID=(\d+)/, 1]
263
264
  end
@@ -118,7 +118,7 @@ Ohai.plugin(:Virtualization) do
118
118
  # guests will have the hypervisor cpu feature that hosts don't have
119
119
  if file_exist?("/sys/devices/virtual/misc/kvm")
120
120
  virtualization[:system] = "kvm"
121
- if /hypervisor/.match?(file_read("/proc/cpuinfo"))
121
+ if file_read("/proc/cpuinfo").include?("hypervisor")
122
122
  logger.trace("Plugin Virtualization: /sys/devices/virtual/misc/kvm present and /proc/cpuinfo lists the hypervisor feature. Detecting as kvm guest")
123
123
  virtualization[:role] = "guest"
124
124
  virtualization[:systems][:kvm] = "guest"
@@ -220,17 +220,17 @@ Ohai.plugin(:Virtualization) do
220
220
  virtualization[:system] = $1
221
221
  virtualization[:role] = "guest"
222
222
  virtualization[:systems][$1.to_sym] = "guest"
223
- elsif /container=lxc/.match?(file_read("/proc/1/environ"))
223
+ elsif file_read("/proc/1/environ").include?("container=lxc")
224
224
  logger.trace("Plugin Virtualization: /proc/1/environ indicates lxc container. Detecting as lxc guest")
225
225
  virtualization[:system] = "lxc"
226
226
  virtualization[:role] = "guest"
227
227
  virtualization[:systems][:lxc] = "guest"
228
- elsif /container=systemd-nspawn/.match?(file_read("/proc/1/environ"))
228
+ elsif file_read("/proc/1/environ").include?("container=systemd-nspawn")
229
229
  logger.trace("Plugin Virtualization: /proc/1/environ indicates nspawn container. Detecting as nspawn guest")
230
230
  virtualization[:system] = "nspawn"
231
231
  virtualization[:role] = "guest"
232
232
  virtualization[:systems][:nspawn] = "guest"
233
- elsif /container=podman/.match?(file_read("/proc/1/environ"))
233
+ elsif file_read("/proc/1/environ").include?("container=podman")
234
234
  logger.trace("Plugin Virtualization: /proc/1/environ indicates podman container. Detecting as podman guest")
235
235
  virtualization[:system] = "podman"
236
236
  virtualization[:role] = "guest"
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Author:: Renato Covarrubias (<rnt@rnt.cl>)
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(:Oci) do
21
+ require_relative "../mixin/oci_metadata"
22
+ require_relative "../mixin/http_helper"
23
+
24
+ include Ohai::Mixin::OCIMetadata
25
+ include Ohai::Mixin::HttpHelper
26
+
27
+ provides "oci"
28
+
29
+ collect_data do
30
+ oci_metadata_from_hints = hint?("oci")
31
+ if oci_metadata_from_hints
32
+ logger.trace("Plugin OCI: oci hint is present. Parsing any hint data.")
33
+ oci Mash.new
34
+ oci_metadata_from_hints.each { |k, v| oci[k] = v }
35
+ oci["metadata"] = parse_metadata
36
+ elsif oci_chassis_asset_tag?
37
+ logger.trace("Plugin oci: No hints present, but system appears to be on oci.")
38
+ oci Mash.new
39
+ oci["metadata"] = parse_metadata
40
+ else
41
+ logger.trace("Plugin oci: No hints present and doesn't appear to be on oci.")
42
+ false
43
+ end
44
+ end
45
+
46
+ def oci_chassis_asset_tag?
47
+ has_oci_chassis_asset_tag = false
48
+ if file_exist?(Ohai::Mixin::OCIMetadata::CHASSIS_ASSET_TAG_FILE)
49
+ file_open(Ohai::Mixin::OCIMetadata::CHASSIS_ASSET_TAG_FILE).each do |line|
50
+ next unless /OracleCloud.com/.match?(line)
51
+
52
+ logger.trace("Plugin oci: Found OracleCloud.com chassis_asset_tag used by oci.")
53
+ has_oci_chassis_asset_tag = true
54
+ break
55
+ end
56
+ end
57
+ has_oci_chassis_asset_tag
58
+ end
59
+
60
+ def parse_metadata
61
+ return nil unless can_socket_connect?(Ohai::Mixin::OCIMetadata::OCI_METADATA_ADDR, 80)
62
+
63
+ instance_data = fetch_metadata("instance")
64
+ return nil if instance_data.nil?
65
+
66
+ metadata = Mash.new
67
+ metadata["compute"] = Mash.new
68
+
69
+ instance_data.each do |k, v|
70
+ metadata["compute"][k] = v
71
+ end
72
+
73
+ vnics_data = fetch_metadata("vnics")
74
+
75
+ unless vnics_data.nil?
76
+ metadata["network"] = Mash.new
77
+ metadata["network"]["interface"] = []
78
+ vnics_data.each do |v|
79
+ metadata["network"]["interface"].append(v)
80
+ end
81
+ end
82
+
83
+ volume_attachments_data = fetch_metadata("volumeAttachments")
84
+
85
+ unless volume_attachments_data.nil?
86
+ metadata["volumes"] = Mash.new
87
+ volume_attachments_data.each do |k, v|
88
+ metadata["volumes"][k] = v
89
+ end
90
+ end
91
+
92
+ metadata
93
+ end
94
+ end
@@ -22,16 +22,18 @@ Ohai.plugin(:Rpm) do
22
22
  provides "rpm"
23
23
  optional "true"
24
24
 
25
- MACROS_MARKER = /========================/.freeze
25
+ MACROS_MARKER = /========================/.freeze unless defined?(MACROS_MARKER)
26
26
 
27
- DO_NOT_SPLIT = %w{
28
- build_arch
29
- build_os
30
- install_arch
31
- install_os
32
- archcolor
33
- optflags
34
- }.freeze
27
+ unless defined?(DO_NOT_SPLIT)
28
+ DO_NOT_SPLIT = %w{
29
+ build_arch
30
+ build_os
31
+ install_arch
32
+ install_os
33
+ archcolor
34
+ optflags
35
+ }.freeze
36
+ end
35
37
 
36
38
  collect_data(:aix, :darwin, :dragonflybsd, :freebsd, :linux, :netbsd, :openbsd, :solaris2) do
37
39
  rpm_path = which("rpm")
@@ -27,7 +27,7 @@ Ohai.plugin(:Scaleway) do
27
27
  # looks for `scaleway` keyword in kernel command line
28
28
  # @return [Boolean] do we have the keyword or not?
29
29
  def has_scaleway_cmdline?
30
- if file_exist?("/proc/cmdline") && /scaleway/.match?(file_read("/proc/cmdline"))
30
+ if file_exist?("/proc/cmdline") && file_read("/proc/cmdline").include?("scaleway")
31
31
  logger.trace("Plugin Scaleway: has_scaleway_cmdline? == true")
32
32
  return true
33
33
  end
@@ -21,5 +21,25 @@ Ohai.plugin(:Timezone) do
21
21
  collect_data(:default) do
22
22
  time Mash.new unless time
23
23
  time[:timezone] = Time.now.getlocal.zone
24
+
25
+ # Windows in German display language outputs LATIN1 bytes for .zone, but marks them as
26
+ # IBM437, which somehow fails any attempt at conversion to other encodings when
27
+ # ä is present, as in the timezone name "Mitteleuropäische Zeit" (Central Europe Time)
28
+ #
29
+ # Windows-1252 is the legacy encoding for Windows for German that actually
30
+ # translates (ISO-8859-1 works as well), but going with the more correct
31
+ # encoding name for Windows' implementation of Latin-1
32
+ #
33
+ # References
34
+ # * [Code Page 437/IBM437](https://en.wikipedia.org/wiki/Code_page_437)
35
+ # * [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)
36
+ # * [Windows-1252](https://en.wikipedia.org/wiki/Windows-1252)
37
+ if time[:timezone].encoding == Encoding::IBM437
38
+ # Assume encoding is WINDOWS_1252
39
+ time[:timezone] = time[:timezone].force_encoding(Encoding::WINDOWS_1252)
40
+ # Re-encode in UTF_8. Note: If other encodings have problems converting
41
+ # it might be worth re-encode everything in UTF_8.
42
+ time[:timezone] = time[:timezone].encode(Encoding::UTF_8)
43
+ end
24
44
  end
25
45
  end
@@ -53,7 +53,22 @@ Ohai.plugin(:VMware) do
53
53
  # to attribute "vmware[:<parameter>]"
54
54
  %w{hosttime speed sessionid balloon swap memlimit memres cpures cpulimit}.each do |param|
55
55
  vmware[param] = from_cmd([vmtools_path, "stat", param])
56
- if /UpdateInfo failed/.match?(vmware[param])
56
+ if param == "hosttime" && vmtools_path.include?("Program Files")
57
+ # popen and %x return stdout encoded as IBM437 in Windows but in a string marked
58
+ # UTF-8. The string doesn't throw an exception when encoded to "UTF-8" but
59
+ # displays [?] character in Windows without this.
60
+ #
61
+ # .force_encoding(Encoding::ISO_8859_1) causes the character to be dropped
62
+ # and .force_encoding(Encoding::Windows_1252) displays the „ character in place
63
+ # of an ä. .force_encoding(Encoding::IBM437) allows for the correct characters
64
+ # to be displayed.
65
+ #
66
+ # Note:
67
+ # * this is broken for at least Ruby 2.7 through 3.1.3
68
+ # * confirmed that this is broken on Windows Server 2022
69
+ vmware[param] = vmware[param].force_encoding(Encoding::IBM437).encode("UTF-8")
70
+ end
71
+ if vmware[param].include?("UpdateInfo failed")
57
72
  vmware[param] = nil
58
73
  end
59
74
  end
@@ -21,8 +21,8 @@ module Ohai
21
21
  require "ipaddress" unless defined?(IPAddress)
22
22
 
23
23
  # Corresponding to RFC 4192 + RFC 4193
24
- IPV6_LINK_LOCAL_UNICAST_BLOCK = IPAddress("fe80::/10")
25
- IPV6_PRIVATE_ADDRESS_BLOCK = IPAddress("fc00::/7")
24
+ IPV6_LINK_LOCAL_UNICAST_BLOCK = IPAddress("fe80::/10") unless defined?(IPV6_LINK_LOCAL_UNICAST_BLOCK)
25
+ IPV6_PRIVATE_ADDRESS_BLOCK = IPAddress("fc00::/7") unless defined?(IPV6_PRIVATE_ADDRESS_BLOCK)
26
26
 
27
27
  def private_address?(addr)
28
28
  ip = IPAddress(addr)
data/lib/ohai/version.rb CHANGED
@@ -19,5 +19,5 @@
19
19
 
20
20
  module Ohai
21
21
  OHAI_ROOT = File.expand_path(__dir__)
22
- VERSION = "18.0.14"
22
+ VERSION = "18.1.0"
23
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ohai
3
3
  version: !ruby/object:Gem::Version
4
- version: 18.0.14
4
+ version: 18.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Jacob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-02 00:00:00.000000000 Z
11
+ date: 2023-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-config
@@ -241,6 +241,7 @@ files:
241
241
  - lib/ohai/mixin/gce_metadata.rb
242
242
  - lib/ohai/mixin/http_helper.rb
243
243
  - lib/ohai/mixin/network_helper.rb
244
+ - lib/ohai/mixin/oci_metadata.rb
244
245
  - lib/ohai/mixin/os.rb
245
246
  - lib/ohai/mixin/scaleway_metadata.rb
246
247
  - lib/ohai/mixin/seconds_to_human.rb
@@ -324,6 +325,7 @@ files:
324
325
  - lib/ohai/plugins/netbsd/platform.rb
325
326
  - lib/ohai/plugins/network.rb
326
327
  - lib/ohai/plugins/nodejs.rb
328
+ - lib/ohai/plugins/oci.rb
327
329
  - lib/ohai/plugins/ohai.rb
328
330
  - lib/ohai/plugins/ohai_time.rb
329
331
  - lib/ohai/plugins/openbsd/memory.rb