ohai 18.0.14 → 18.1.0

Sign up to get free protection for your applications and to get access to all the features.
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