ohai 15.8.0 → 16.2.1

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.
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@chef.io>)
3
- # Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
3
+ # Copyright:: Copyright (c) Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,11 +23,6 @@ Ohai.plugin(:Platform) do
23
23
  so = shell_out((Ohai.abs_path( "/usr/bin/sw_vers" )).to_s)
24
24
  so.stdout.lines do |line|
25
25
  case line
26
- when /^ProductName:\s+(.+)$/
27
- macname = $1
28
- macname.downcase!
29
- macname.tr!(" ", "_")
30
- platform macname
31
26
  when /^ProductVersion:\s+(.+)$/
32
27
  platform_version $1
33
28
  when /^BuildVersion:\s+(.+)$/
@@ -35,6 +30,8 @@ Ohai.plugin(:Platform) do
35
30
  end
36
31
  end
37
32
 
33
+ # if we're on darwin assume we're on mac_os_x
34
+ platform "mac_os_x"
38
35
  platform_family "mac_os_x"
39
36
  end
40
37
  end
@@ -24,7 +24,7 @@ Ohai.plugin(:Docker) do
24
24
  def docker_info_json
25
25
  so = shell_out("docker info --format '{{json .}}'")
26
26
  if so.exitstatus == 0
27
- return JSON.parse(so.stdout)
27
+ JSON.parse(so.stdout)
28
28
  end
29
29
  rescue Ohai::Exceptions::Exec
30
30
  logger.trace('Plugin Docker: Could not shell_out "docker info --format \'{{json .}}\'". Skipping plugin')
@@ -86,7 +86,7 @@ Ohai.plugin(:EC2) do
86
86
  wmi = WmiLite::Wmi.new
87
87
  if wmi.first_of("Win32_ComputerSystemProduct")["identifyingnumber"] =~ /^ec2/
88
88
  logger.trace("Plugin EC2: has_ec2_identifying_number? == true")
89
- return true
89
+ true
90
90
  end
91
91
  else
92
92
  logger.trace("Plugin EC2: has_ec2_identifying_number? == false")
@@ -32,9 +32,9 @@ Ohai.plugin(:Eucalyptus) do
32
32
  def get_mac_address(addresses)
33
33
  detected_addresses = addresses.detect { |address, keypair| keypair == { "family" => "lladdr" } }
34
34
  if detected_addresses
35
- return detected_addresses.first
35
+ detected_addresses.first
36
36
  else
37
- return ""
37
+ ""
38
38
  end
39
39
  end
40
40
 
@@ -6,7 +6,7 @@
6
6
  # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
7
7
  # Author:: Isa Farnik (<isa@chef.io>)
8
8
  # Author:: James Gartrell (<jgartrel@gmail.com>)
9
- # Copyright:: Copyright (c) 2008-2017 Chef Software, Inc.
9
+ # Copyright:: Copyright (c) 2008-2020 Chef Software, Inc.
10
10
  # Copyright:: Copyright (c) 2015 Facebook, Inc.
11
11
  # License:: Apache License, Version 2.0
12
12
  #
@@ -23,6 +23,8 @@
23
23
  # limitations under the License.
24
24
  #
25
25
 
26
+ require "set"
27
+
26
28
  Ohai.plugin(:Filesystem) do
27
29
  provides "filesystem"
28
30
 
@@ -98,15 +100,6 @@ Ohai.plugin(:Filesystem) do
98
100
  view
99
101
  end
100
102
 
101
- def generate_deprecated_view(fs)
102
- view = generate_device_view(fs)
103
- view.each do |device, entry|
104
- view[device][:mount] = entry[:mounts].first
105
- view[device].delete(:mounts)
106
- end
107
- view
108
- end
109
-
110
103
  def generate_deprecated_windows_view(fs)
111
104
  view = generate_mountpoint_view(fs)
112
105
  view.each do |mp, entry|
@@ -115,22 +108,6 @@ Ohai.plugin(:Filesystem) do
115
108
  view
116
109
  end
117
110
 
118
- def generate_deprecated_solaris_view(fs, old_zfs)
119
- view = generate_deprecated_view(fs)
120
- old_zfs.each do |fsname, attributes|
121
- view[fsname] ||= Mash.new
122
- view[fsname][:fs_type] = "zfs"
123
- view[fsname][:mount] = attributes[:values][:mountpoint] if attributes[:values].key?("mountpoint")
124
- view[fsname][:device] = fsname
125
- view[fsname][:zfs_values] = attributes[:values]
126
- view[fsname][:zfs_sources] = attributes[:sources]
127
- # parents will already be here
128
- # but we want to nuke "zfs_properties"
129
- view[fsname].delete("zfs_properties")
130
- end
131
- view
132
- end
133
-
134
111
  def parse_common_df(out)
135
112
  fs = {}
136
113
  out.each_line do |line|
@@ -496,9 +473,8 @@ Ohai.plugin(:Filesystem) do
496
473
  fs_data["by_mountpoint"] = by_mountpoint
497
474
  fs_data["by_pair"] = by_pair
498
475
 
499
- # Set the filesystem data - BSD didn't do the conversion when everyone else
500
- # did, so 15 will have both be the new API and 16 will drop the old API
501
- filesystem generate_deprecated_view(fs)
476
+ # @todo in Chef 17 the filesystem2 part of this goes away
477
+ filesystem fs_data
502
478
  filesystem2 fs_data
503
479
  end
504
480
 
@@ -595,7 +571,6 @@ Ohai.plugin(:Filesystem) do
595
571
 
596
572
  # Grab any zfs data from "zfs get"
597
573
  zfs = Mash.new
598
- old_zfs = Mash.new
599
574
  zfs_get = "zfs get -p -H all"
600
575
  run_with_check("zfs") do
601
576
  so = shell_out(zfs_get)
@@ -612,13 +587,6 @@ Ohai.plugin(:Filesystem) do
612
587
  value: value,
613
588
  source: source,
614
589
  }
615
- # needed for old v1 view
616
- old_zfs[filesystem] ||= Mash.new
617
- old_zfs[filesystem][:values] ||= Mash.new
618
- old_zfs[filesystem][:sources] ||= Mash.new
619
- old_zfs[filesystem][:values][property] = value
620
- old_zfs[filesystem][:values][property] = value
621
- old_zfs[filesystem][:sources][property] = source
622
590
  end
623
591
  end
624
592
 
@@ -652,9 +620,8 @@ Ohai.plugin(:Filesystem) do
652
620
  fs_data["by_mountpoint"] = by_mountpoint
653
621
  fs_data["by_pair"] = by_pair
654
622
 
655
- # Set the filesystem data - Solaris didn't do the conversion when everyone
656
- # else did, so 15 will have both be the new API and 16 will drop the old API
657
- filesystem generate_deprecated_solaris_view(fs, old_zfs)
623
+ # @todo in Chef 17 the filesystem2 plugin goes away
624
+ filesystem fs_data
658
625
  filesystem2 fs_data
659
626
  end
660
627
 
@@ -745,9 +712,8 @@ Ohai.plugin(:Filesystem) do
745
712
  fs_data["by_mountpoint"] = by_mountpoint
746
713
  fs_data["by_pair"] = by_pair
747
714
 
748
- # Set the filesystem data - AIX didn't do the conversion when everyone
749
- # else did, so 15 will have both be the new API and 16 will drop the old API
750
- filesystem generate_deprecated_view(fs)
715
+ # @todo in Chef 17 the filesystem2 plugin goes away here
716
+ filesystem fs_data
751
717
  filesystem2 fs_data
752
718
  end
753
719
 
@@ -25,7 +25,7 @@
25
25
  Ohai.plugin(:Fips) do
26
26
  provides "fips"
27
27
 
28
- collect_data(:linux) do
28
+ collect_data(:linux, :windows) do
29
29
  fips Mash.new
30
30
 
31
31
  require "openssl" unless defined?(OpenSSL)
@@ -54,7 +54,7 @@ Ohai.plugin(:GCE) do
54
54
  computer_system = wmi.first_of("Win32_ComputerSystem")
55
55
  if computer_system["Manufacturer"] =~ /^Google/ && computer_system["Model"] =~ /^Google/
56
56
  logger.trace("Plugin GCE: has_gce_system_info? == true")
57
- return true
57
+ true
58
58
  end
59
59
  else
60
60
  logger.trace("Plugin GCE: has_gce_system_info? == false")
@@ -4,7 +4,7 @@
4
4
  # Author:: Bryan McLellan (<btm@loftninjas.org>)
5
5
  # Author:: Claire McQuin (<claire@chef.io>)
6
6
  # Author:: James Gartrell (<jgartrel@gmail.com>)
7
- # Copyright:: Copyright (c) 2008-2018 Chef Software, Inc.
7
+ # Copyright:: Copyright (c) Chef Software, Inc.
8
8
  # Copyright:: Copyright (c) 2009 Bryan McLellan
9
9
  # License:: Apache License, Version 2.0
10
10
  #
@@ -137,11 +137,12 @@ Ohai.plugin(:Kernel) do
137
137
  end
138
138
  end
139
139
 
140
- # see if a WMI name is blacklisted so we can avoid writing out
141
- # useless data to ohai
140
+ # see if a WMI name is in the blocked list so we can avoid writing
141
+ # out useless data to ohai
142
+ #
142
143
  # @param [String] name the wmi name to check
143
- # @return [Boolean] is the wmi name blacklisted
144
- def blacklisted_wmi_name?(name)
144
+ # @return [Boolean] is the wmi name in the blocked list
145
+ def blocked_wmi_name?(name)
145
146
  [
146
147
  "creation_class_name", # this is just the wmi name
147
148
  "cs_creation_class_name", # this is just the wmi name
@@ -262,7 +263,7 @@ Ohai.plugin(:Kernel) do
262
263
  host = wmi.first_of("Win32_OperatingSystem")
263
264
  kernel[:os_info] = Mash.new
264
265
  host.wmi_ole_object.properties_.each do |p|
265
- next if blacklisted_wmi_name?(p.name.wmi_underscore)
266
+ next if blocked_wmi_name?(p.name.wmi_underscore)
266
267
 
267
268
  kernel[:os_info][p.name.wmi_underscore.to_sym] = host[p.name.downcase]
268
269
  end
@@ -277,7 +278,7 @@ Ohai.plugin(:Kernel) do
277
278
  kernel[:cs_info] = Mash.new
278
279
  host = wmi.first_of("Win32_ComputerSystem")
279
280
  host.wmi_ole_object.properties_.each do |p|
280
- next if blacklisted_wmi_name?(p.name.wmi_underscore)
281
+ next if blocked_wmi_name?(p.name.wmi_underscore)
281
282
 
282
283
  kernel[:cs_info][p.name.wmi_underscore.to_sym] = host[p.name.downcase]
283
284
  end
@@ -0,0 +1,83 @@
1
+ #
2
+ # Author:: Davide Cavalca <dcavalca@fb.com>
3
+ # Copyright:: Copyright (c) 2020 Facebook
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(:Interrupts) do
20
+ depends "cpu"
21
+ provides "interrupts", "interrupts/irq", "interrupts/smp_affinity_by_cpu"
22
+ optional true
23
+
24
+ # Documentation: https://www.kernel.org/doc/Documentation/IRQ-affinity.txt
25
+ # format: comma-separate list of 32bit bitmask in hex
26
+ # each bit is a CPU, right to left ordering (i.e. CPU0 is rightmost)
27
+ def parse_smp_affinity(path, cpus)
28
+ masks = File.read(path).strip
29
+ bit_masks = []
30
+ masks.split(",").each do |mask|
31
+ bit_masks << mask.rjust(8, "0").to_i(16).to_s(2)
32
+ end
33
+ affinity_mask = bit_masks.join
34
+ affinity_by_cpu = affinity_mask.split("").reverse
35
+ smp_affinity_by_cpu = Mash.new
36
+ (0..cpus - 1).each do |cpu|
37
+ smp_affinity_by_cpu[cpu] = affinity_by_cpu[cpu].to_i == 1
38
+ end
39
+ smp_affinity_by_cpu
40
+ end
41
+
42
+ collect_data(:linux) do
43
+ interrupts Mash.new
44
+
45
+ cpus = cpu["total"]
46
+ interrupts[:smp_affinity_by_cpu] =
47
+ parse_smp_affinity("/proc/irq/default_smp_affinity", cpus)
48
+
49
+ interrupts[:irq] = Mash.new
50
+ File.open("/proc/interrupts").each do |line|
51
+ # Documentation: https://www.kernel.org/doc/Documentation/filesystems/proc.txt
52
+ # format is "{irqn}: {CPUn...} [type] [vector] [device]"
53
+ irqn, fields = line.split(":", 2)
54
+ # skip the header
55
+ next if fields.nil?
56
+
57
+ irqn.strip!
58
+ Ohai::Log.debug("irq: processing #{irqn}")
59
+
60
+ interrupts[:irq][irqn] = Mash.new
61
+ interrupts[:irq][irqn][:events_by_cpu] = Mash.new
62
+
63
+ fields = fields.split(nil, cpus + 1)
64
+ (0..cpus - 1).each do |cpu|
65
+ interrupts[:irq][irqn][:events_by_cpu][cpu] = fields[cpu].to_i
66
+ end
67
+ # Only regular IRQs have extra fields and affinity settings
68
+ if /^\d+$/.match(irqn)
69
+ interrupts[:irq][irqn][:type],
70
+ interrupts[:irq][irqn][:vector],
71
+ interrupts[:irq][irqn][:device] =
72
+ fields[cpus].split
73
+ if File.exist?("/proc/irq/#{irqn}/smp_affinity")
74
+ interrupts[:irq][irqn][:smp_affinity_by_cpu] =
75
+ parse_smp_affinity("/proc/irq/#{irqn}/smp_affinity", cpus)
76
+ end
77
+ # ERR and MIS do not have any extra fields
78
+ elsif fields[cpus]
79
+ interrupts[:irq][irqn][:type] = fields[cpus].strip
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,51 @@
1
+ #
2
+ # Author:: Jay Vana <jsvana@fb.com>
3
+ # Author:: Davide Cavalca <dcavalca@fb.com>
4
+ # Copyright:: Copyright (c) 2016-2020 Facebook, 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(:IPC) do
21
+ provides "ipc"
22
+ optional true
23
+
24
+ collect_data(:linux) do
25
+ ipcs_path = which("ipcs")
26
+ if ipcs_path
27
+ # NOTE: currently only supports shared memory
28
+ cmd = "#{ipcs_path} -m"
29
+ ipcs = shell_out(cmd)
30
+
31
+ ipc Mash.new unless ipc
32
+ ipc["shm"] = Mash.new unless ipc["shm"]
33
+
34
+ ipcs.stdout.split("\n").each do |line|
35
+ next unless line.start_with?("0x")
36
+
37
+ parts = line.split
38
+ segment = {
39
+ "key" => parts[0],
40
+ "owner" => parts[2],
41
+ "perms" => parts[3],
42
+ "bytes" => parts[4].to_i,
43
+ "nattch" => parts[5].to_i,
44
+ "status" => parts[6] ? parts[6] : "",
45
+ }
46
+
47
+ ipc["shm"][parts[1].to_i] = segment
48
+ end
49
+ end
50
+ end
51
+ end
@@ -207,6 +207,93 @@ Ohai.plugin(:Network) do
207
207
  iface
208
208
  end
209
209
 
210
+ # determine channel parameters for the interface using ethtool
211
+ def ethernet_channel_parameters(iface)
212
+ return iface unless ethtool_binary_path
213
+
214
+ iface.each_key do |tmp_int|
215
+ next unless iface[tmp_int][:encapsulation] == "Ethernet"
216
+
217
+ so = shell_out("#{ethtool_binary_path} -l #{tmp_int}")
218
+ logger.trace("Plugin Network: Parsing ethtool output: #{so.stdout}")
219
+ type = nil
220
+ iface[tmp_int]["channel_params"] = {}
221
+ so.stdout.lines.each do |line|
222
+ next if line.start_with?("Channel parameters for")
223
+ next if line.strip.nil?
224
+
225
+ if line =~ /Pre-set maximums/
226
+ type = "max"
227
+ next
228
+ end
229
+ if line =~ /Current hardware settings/
230
+ type = "current"
231
+ next
232
+ end
233
+ key, val = line.split(/:\s+/)
234
+ if type && val
235
+ channel_key = "#{type}_#{key.downcase.tr(" ", "_")}"
236
+ iface[tmp_int]["channel_params"][channel_key] = val.to_i
237
+ end
238
+ end
239
+ end
240
+ iface
241
+ end
242
+
243
+ # determine coalesce parameters for the interface using ethtool
244
+ def ethernet_coalesce_parameters(iface)
245
+ return iface unless ethtool_binary_path
246
+
247
+ iface.each_key do |tmp_int|
248
+ next unless iface[tmp_int][:encapsulation] == "Ethernet"
249
+
250
+ so = shell_out("#{ethtool_binary_path} -c #{tmp_int}")
251
+ logger.trace("Plugin Network: Parsing ethtool output: #{so.stdout}")
252
+ iface[tmp_int]["coalesce_params"] = {}
253
+ so.stdout.lines.each do |line|
254
+ next if line.start_with?("Coalesce parameters for")
255
+ next if line.strip.nil?
256
+
257
+ if line.start_with?("Adaptive")
258
+ _, adaptive_rx, _, adaptive_tx = line.split(/:\s+|\s+TX|\n/)
259
+ iface[tmp_int]["coalesce_params"]["adaptive_rx"] = adaptive_rx
260
+ iface[tmp_int]["coalesce_params"]["adaptive_tx"] = adaptive_tx
261
+ next
262
+ end
263
+ key, val = line.split(/:\s+/)
264
+ if val
265
+ coalesce_key = "#{key.downcase.tr(" ", "_")}"
266
+ iface[tmp_int]["coalesce_params"][coalesce_key] = val.to_i
267
+ end
268
+ end
269
+ end
270
+ iface
271
+ end
272
+
273
+ # determine driver info for the interface using ethtool
274
+ def ethernet_driver_info(iface)
275
+ return iface unless ethtool_binary_path
276
+
277
+ iface.each_key do |tmp_int|
278
+ next unless iface[tmp_int][:encapsulation] == "Ethernet"
279
+
280
+ so = shell_out("#{ethtool_binary_path} -i #{tmp_int}")
281
+ logger.trace("Plugin Network: Parsing ethtool output: #{so.stdout}")
282
+ iface[tmp_int]["driver_info"] = {}
283
+ so.stdout.lines.each do |line|
284
+ next if line.strip.nil?
285
+
286
+ key, val = line.split(/:\s+/)
287
+ if val.nil?
288
+ val = ""
289
+ end
290
+ driver_key = "#{key.downcase.tr(" ", "_")}"
291
+ iface[tmp_int]["driver_info"][driver_key] = val.chomp
292
+ end
293
+ end
294
+ iface
295
+ end
296
+
210
297
  # determine link stats, vlans, queue length, and state for an interface using ip
211
298
  def link_statistics(iface, net_counters)
212
299
  so = shell_out("ip -d -s link")
@@ -669,6 +756,9 @@ Ohai.plugin(:Network) do
669
756
 
670
757
  iface = ethernet_layer_one(iface)
671
758
  iface = ethernet_ring_parameters(iface)
759
+ iface = ethernet_channel_parameters(iface)
760
+ iface = ethernet_coalesce_parameters(iface)
761
+ iface = ethernet_driver_info(iface)
672
762
  counters[:network][:interfaces] = net_counters
673
763
  network["interfaces"] = iface
674
764
  end