ohai 8.25.1 → 8.26.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
- SHA1:
3
- metadata.gz: 5a1b3302250943cf188557ec78a2f4680599ba9a
4
- data.tar.gz: 02bce3c0c52a84b45a434ef78804f4f33e341333
2
+ SHA256:
3
+ metadata.gz: cd104199be412d5cd0393ceba805110d171918f2905e8243cb9d7b34e2e5c841
4
+ data.tar.gz: e2d4ede2e672df83e36fb16cfb44e84724c42aa7b19dec4cf8c97a2bf8406ef1
5
5
  SHA512:
6
- metadata.gz: 6dbc95ed3640a4ae09726ae2e6dcd7895fd6470110c72539fdb8f0383a535cfcac6a03bc71397c1ef64651611ee244e696d7094e9dbce3d266452e8a71eaceee
7
- data.tar.gz: 98806579f7b734f843fdcdbf1c636ee8da12be4d295078e1ca6742c13a9f708470157de4e392a19944301ca6e90de850e5dc0f7d5dbc263c396cee5af57bb0c7
6
+ metadata.gz: 5c4bf1435c0f135060dddfafc0d55106ba6bf40f627f4da9fcd45b1ca64ef5864194754211b235b03348b1f7aa3093579c9e1565c0fbe5e40f3d4270d9d839ee
7
+ data.tar.gz: 2651bbb8601e41097a0f64c6f5da5653e3b4291796cee530849659a5127ed966295879498d5b7c14455c757e5dbfb2b3abd23752632f39a27f1a7f2cdad40ac4
@@ -21,65 +21,94 @@
21
21
  # How we detect EC2 from easiest to hardest & least reliable
22
22
  # 1. Ohai ec2 hint exists. This always works
23
23
  # 2. Xen hypervisor UUID starts with 'ec2'. This catches Linux HVM & paravirt instances
24
- # 3. DMI data mentions amazon. This catches HVM instances in a VPC
24
+ # 3. DMI bios version data mentions amazon. This catches HVM instances in a VPC on the Xen based hypervisor
25
+ # 3. DMI bios vendor data mentions amazon. This catches HVM instances in a VPC on the non-Xen based hypervisor
25
26
  # 4. Kernel data mentioned Amazon. This catches Windows HVM & paravirt instances
26
27
 
27
- require "ohai/mixin/ec2_metadata"
28
- require "base64"
29
-
30
28
  Ohai.plugin(:EC2) do
29
+ require "ohai/mixin/ec2_metadata"
30
+ require "base64"
31
+
31
32
  include Ohai::Mixin::Ec2Metadata
32
33
 
33
34
  provides "ec2"
34
35
 
35
- depends "dmi"
36
- depends "kernel"
36
+ # look for amazon string in dmi vendor bios data within the sys tree.
37
+ # this works even if the system lacks dmidecode use by the Dmi plugin
38
+ # this gets us detection of new Xen-less HVM instances that are within a VPC
39
+ # @return [Boolean] do we have Amazon DMI data?
40
+ def has_ec2_amazon_dmi?
41
+ # detect a version of '4.2.amazon'
42
+ if file_val_if_exists("/sys/class/dmi/id/bios_vendor") =~ /Amazon/
43
+ Ohai::Log.debug("Plugin EC2: has_ec2_amazon_dmi? == true")
44
+ true
45
+ else
46
+ Ohai::Log.debug("Plugin EC2: has_ec2_amazon_dmi? == false")
47
+ false
48
+ end
49
+ end
37
50
 
38
- # look for amazon string in dmi bios data
51
+ # look for amazon string in dmi bios version data within the sys tree.
52
+ # this works even if the system lacks dmidecode use by the Dmi plugin
39
53
  # this gets us detection of HVM instances that are within a VPC
40
- def has_ec2_dmi?
54
+ # @return [Boolean] do we have Amazon DMI data?
55
+ def has_ec2_xen_dmi?
41
56
  # detect a version of '4.2.amazon'
42
- if get_attribute(:dmi, :bios, :all_records, 0, :Version) =~ /amazon/
43
- Ohai::Log.debug("Plugin EC2: has_ec2_dmi? == true")
44
- return true
57
+ if file_val_if_exists("/sys/class/dmi/id/bios_version") =~ /amazon/
58
+ Ohai::Log.debug("Plugin EC2: has_ec2_xen_dmi? == true")
59
+ true
45
60
  else
46
- Ohai::Log.debug("Plugin EC2: has_ec2_dmi? == false")
47
- return false
61
+ Ohai::Log.debug("Plugin EC2: has_ec2_xen_dmi? == false")
62
+ false
48
63
  end
49
64
  end
50
65
 
51
- # looks for a xen UUID that starts with ec2
52
- # this gets us detection of Linux HVM and Paravirt hosts
66
+ # looks for a xen UUID that starts with ec2 from within the Linux sys tree
67
+ # @return [Boolean] do we have a Xen UUID or not?
53
68
  def has_ec2_xen_uuid?
54
- if ::File.exist?("/sys/hypervisor/uuid")
55
- if ::File.read("/sys/hypervisor/uuid") =~ /^ec2/
56
- Ohai::Log.debug("Plugin EC2: has_ec2_xen_uuid? == true")
57
- return true
58
- end
69
+ if file_val_if_exists("/sys/hypervisor/uuid") =~ /^ec2/
70
+ Ohai::Log.debug("Plugin EC2: has_ec2_xen_uuid? == true")
71
+ return true
59
72
  end
60
73
  Ohai::Log.debug("Plugin EC2: has_ec2_xen_uuid? == false")
61
- return false
74
+ false
62
75
  end
63
76
 
64
- # looks for the Amazon.com Organization in Windows Kernel data
65
- # this gets us detection of Windows systems
66
- def has_amazon_org?
67
- # detect an Organization of 'Amazon.com'
68
- if get_attribute(:kernel, :os_info, :organization) =~ /Amazon/
69
- Ohai::Log.debug("Plugin EC2: has_amazon_org? == true")
70
- return true
77
+ # looks at the identifying number WMI value to see if it starts with ec2.
78
+ # this is actually the same value we're looking at in has_ec2_xen_uuid? on
79
+ # linux hosts
80
+ # @return [Boolean] do we have a Xen Identifying Number or not?
81
+ def has_ec2_identifying_number?
82
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
83
+ require "wmi-lite/wmi"
84
+ wmi = WmiLite::Wmi.new
85
+ if wmi.first_of("Win32_ComputerSystemProduct")["identifyingnumber"] =~ /^ec2/
86
+ Ohai::Log.debug("Plugin EC2: has_ec2_identifying_number? == true")
87
+ return true
88
+ end
71
89
  else
72
- Ohai::Log.debug("Plugin EC2: has_amazon_org? == false")
73
- return false
90
+ Ohai::Log.debug("Plugin EC2: has_ec2_identifying_number? == false")
91
+ false
92
+ end
93
+ end
94
+
95
+ # return the contents of a file if the file exists
96
+ # @param path[String] abs path to the file
97
+ # @return [String] contents of the file if it exists
98
+ def file_val_if_exists(path)
99
+ if ::File.exist?(path)
100
+ ::File.read(path)
74
101
  end
75
102
  end
76
103
 
104
+ # a single check that combines all the various detection methods for EC2
105
+ # @return [Boolean] Does the system appear to be on EC2
77
106
  def looks_like_ec2?
78
107
  return true if hint?("ec2")
79
108
 
80
109
  # Even if it looks like EC2 try to connect first
81
- if has_ec2_xen_uuid? || has_ec2_dmi? || has_amazon_org?
82
- return true if can_metadata_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
110
+ if has_ec2_xen_uuid? || has_ec2_amazon_dmi? || has_ec2_xen_dmi? || has_ec2_identifying_number?
111
+ return true if can_socket_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR, 80)
83
112
  end
84
113
  end
85
114
 
@@ -0,0 +1,76 @@
1
+ #
2
+ # Author:: Joerg Herzinger <joerg.herzinger@oiml.at>
3
+ # Author:: Phil Dibowitz <phil@ipom.com>
4
+ # Copyright:: Copyright (c) 2011 GLOBAL 2000/Friends of the Earth Austria
5
+ # Copyright:: Copyright (c) 2017 Facebook, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+
20
+ Ohai.plugin(:Lspci) do
21
+ depends "platform"
22
+ provides "pci"
23
+
24
+ collect_data(:linux) do
25
+ devices = Mash.new
26
+ lspci = shell_out("lspci -vnnmk")
27
+
28
+ h = /[0-9a-fA-F]/ #any hex digit
29
+ hh = /#{h}#{h}/ #any 2 hex digits
30
+ hhhh = /#{h}#{h}#{h}#{h}/ #any 4 hex digits
31
+
32
+ d_id = String.new #This identifies our pci devices
33
+
34
+ def standard_form(devices, d_id, hhhh, tag, line)
35
+ tmp = line.scan(/(.*)\s\[(#{hhhh})\]/)[0]
36
+ devices[d_id]["#{tag}_name"] = tmp[0]
37
+ devices[d_id]["#{tag}_id"] = tmp[1]
38
+ end
39
+
40
+ def standard_array(devices, d_id, tag, line)
41
+ if !devices[d_id][tag].kind_of?(Array)
42
+ devices[d_id][tag] = [line]
43
+ else
44
+ devices[d_id][tag].push(line)
45
+ end
46
+ end
47
+
48
+ lspci.stdout.split("\n").each do |line|
49
+ dev = line.scan(/^(.*):\s(.*)$/)[0]
50
+ next if dev.nil?
51
+ case dev[0]
52
+ when "Device" # There are two different Device tags
53
+ if tmp = dev[1].match(/(#{hh}:#{hh}.#{h})/)
54
+ # We have a device id
55
+ d_id = tmp[0] # From now on we will need this id
56
+ devices[d_id] = Mash.new
57
+ else
58
+ standard_form(devices, d_id, hhhh, "device", dev[1])
59
+ end
60
+ when "Class"
61
+ standard_form(devices, d_id, hhhh, "class", dev[1])
62
+ when "Vendor"
63
+ standard_form(devices, d_id, hhhh, "vendor", dev[1])
64
+ when "Driver"
65
+ standard_array(devices, d_id, "driver", dev[1])
66
+ when "Module"
67
+ standard_array(devices, d_id, "module", dev[1])
68
+ when "SDevice"
69
+ standard_form(devices, d_id, hhhh, "sdevice", dev[1])
70
+ else
71
+ end
72
+ end
73
+
74
+ pci devices
75
+ end
76
+ end
@@ -64,10 +64,35 @@ Ohai.plugin(:Mdadm) do
64
64
  # unless the array is inactive, in which case you don't get a raid
65
65
  # level.
66
66
  members = pieces.drop_while { |x| !x.start_with?("raid", "inactive") }
67
- # drop the 'raid' too
68
-
67
+ # and drop that too
69
68
  members.shift unless members.empty?
70
- devices[device] = members.map { |s| s.match(/(.+)\[\d+\]/)[1] }
69
+ devices[device] = {
70
+ "active" => [],
71
+ "spare" => [],
72
+ "journal" => nil,
73
+ }
74
+ members.each do |member|
75
+ # We want to match the device, and optionally the type
76
+ # most entries will look like:
77
+ # sdc1[5]
78
+ # but some will look like:
79
+ # sdc1[5](J)
80
+ # where the format is:
81
+ # <device>[<number in array>](<type>)
82
+ # Type can be things like "J" for a journal device, or "S" for
83
+ # a spare device.
84
+ m = member.match(/(.+)\[\d+\](?:\((\w)\))?/)
85
+ member_device = m[1]
86
+ member_type = m[2]
87
+ case member_type
88
+ when "J"
89
+ devices[device]["journal"] = member_device
90
+ when "S"
91
+ devices[device]["spare"] << member_device
92
+ else
93
+ devices[device]["active"] << member_device
94
+ end
95
+ end
71
96
  end
72
97
  end
73
98
 
@@ -82,7 +107,9 @@ Ohai.plugin(:Mdadm) do
82
107
 
83
108
  # if the mdadm command was sucessful pass so.stdout to create_raid_device_mash to grab the tidbits we want
84
109
  mdadm[device] = create_raid_device_mash(so.stdout) if so.stdout
85
- mdadm[device]["members"] = devices[device]
110
+ mdadm[device]["members"] = devices[device]["active"]
111
+ mdadm[device]["spares"] = devices[device]["spare"]
112
+ mdadm[device]["journal"] = devices[device]["journal"]
86
113
  end
87
114
  end
88
115
  end
@@ -215,6 +215,31 @@ Ohai.plugin(:Network) do
215
215
  net_counters[tmp_int] = Mash.new unless net_counters[tmp_int]
216
216
  end
217
217
 
218
+ if line =~ /^\s+(ip6tnl|ipip)/
219
+ iface[tmp_int][:tunnel_info] = {}
220
+ words = line.split
221
+ words.each_with_index do |word, index|
222
+ case word
223
+ when "external"
224
+ iface[tmp_int][:tunnel_info][word] = true
225
+ when "any", "ipip6", "ip6ip6"
226
+ iface[tmp_int][:tunnel_info][:proto] = word
227
+ when "remote",
228
+ "local",
229
+ "encaplimit",
230
+ "hoplimit",
231
+ "tclass",
232
+ "flowlabel",
233
+ "addrgenmode",
234
+ "numtxqueues",
235
+ "numrxqueues",
236
+ "gso_max_size",
237
+ "gso_max_segs"
238
+ iface[tmp_int][:tunnel_info][word] = words[index + 1]
239
+ end
240
+ end
241
+ end
242
+
218
243
  if line =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/
219
244
  int = on_rx ? :rx : :tx
220
245
  net_counters[tmp_int][int] = Mash.new unless net_counters[tmp_int][int]
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Ohai
20
20
  OHAI_ROOT = File.expand_path(File.dirname(__FILE__))
21
- VERSION = "8.25.1"
21
+ VERSION = "8.26.0"
22
22
  end
@@ -17,20 +17,22 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper.rb")
20
+ require_relative "../../spec_helper.rb"
21
21
  require "open-uri"
22
22
  require "base64"
23
23
 
24
24
  describe Ohai::System, "plugin ec2" do
25
25
 
26
+ let(:plugin) { get_plugin("ec2") }
27
+
26
28
  before(:each) do
27
29
  allow(plugin).to receive(:hint?).with("ec2").and_return(false)
28
30
  allow(File).to receive(:exist?).with("/sys/hypervisor/uuid").and_return(false)
31
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_vendor").and_return(false)
32
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_version").and_return(false)
29
33
  end
30
34
 
31
35
  shared_examples_for "!ec2" do
32
- let(:plugin) { get_plugin("ec2") }
33
-
34
36
  it "DOESN'T attempt to fetch the ec2 metadata or set ec2 attribute" do
35
37
  expect(plugin).not_to receive(:http_client)
36
38
  expect(plugin[:ec2]).to be_nil
@@ -39,8 +41,6 @@ describe Ohai::System, "plugin ec2" do
39
41
  end
40
42
 
41
43
  shared_examples_for "ec2" do
42
- let(:plugin) { get_plugin("ec2") }
43
-
44
44
  before(:each) do
45
45
  @http_client = double("Net::HTTP client")
46
46
  allow(plugin).to receive(:http_client).and_return(@http_client)
@@ -334,19 +334,39 @@ describe Ohai::System, "plugin ec2" do
334
334
  end
335
335
  end # shared examples for ec2
336
336
 
337
- describe "with ec2 dmi data" do
337
+ describe "with amazon dmi bios version data" do
338
338
  it_behaves_like "ec2"
339
339
 
340
340
  before(:each) do
341
- plugin[:dmi] = { :bios => { :all_records => [ { :Version => "4.2.amazon" } ] } }
341
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_version").and_return(true)
342
+ allow(File).to receive(:read).with("/sys/class/dmi/id/bios_version").and_return("4.2.amazon\n")
342
343
  end
343
344
  end
344
345
 
345
- describe "with amazon kernel data" do
346
+ describe "with non-amazon dmi bios version data" do
347
+ it_behaves_like "!ec2"
348
+
349
+ before(:each) do
350
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_version").and_return(true)
351
+ allow(File).to receive(:read).with("/sys/class/dmi/id/bios_version").and_return("1.0\n")
352
+ end
353
+ end
354
+
355
+ describe "with amazon dmi bios vendor data" do
346
356
  it_behaves_like "ec2"
347
357
 
348
358
  before(:each) do
349
- plugin[:kernel] = { :os_info => { :organization => "Amazon.com" } }
359
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_vendor").and_return(true)
360
+ allow(File).to receive(:read).with("/sys/class/dmi/id/bios_vendor").and_return("Amazon EC2\n")
361
+ end
362
+ end
363
+
364
+ describe "with non-amazon dmi bios vendor data" do
365
+ it_behaves_like "!ec2"
366
+
367
+ before(:each) do
368
+ allow(File).to receive(:exist?).with("/sys/class/dmi/id/bios_vendor").and_return(true)
369
+ allow(File).to receive(:read).with("/sys/class/dmi/id/bios_vendor").and_return("Xen\n")
350
370
  end
351
371
  end
352
372
 
@@ -355,7 +375,7 @@ describe Ohai::System, "plugin ec2" do
355
375
 
356
376
  before(:each) do
357
377
  allow(File).to receive(:exist?).with("/sys/hypervisor/uuid").and_return(true)
358
- allow(File).to receive(:read).with("/sys/hypervisor/uuid").and_return("ec2a0561-e4d6-8e15-d9c8-2e0e03adcde8")
378
+ allow(File).to receive(:read).with("/sys/hypervisor/uuid").and_return("ec2a0561-e4d6-8e15-d9c8-2e0e03adcde8\n")
359
379
  end
360
380
  end
361
381
 
@@ -364,7 +384,39 @@ describe Ohai::System, "plugin ec2" do
364
384
 
365
385
  before(:each) do
366
386
  allow(File).to receive(:exist?).with("/sys/hypervisor/uuid").and_return(true)
367
- allow(File).to receive(:read).with("/sys/hypervisor/uuid").and_return("123a0561-e4d6-8e15-d9c8-2e0e03adcde8")
387
+ allow(File).to receive(:read).with("/sys/hypervisor/uuid").and_return("123a0561-e4d6-8e15-d9c8-2e0e03adcde8\n")
388
+ end
389
+ end
390
+
391
+ describe "with EC2 Identifying Number", :windows_only do
392
+ it_behaves_like "ec2"
393
+
394
+ before do
395
+ allow_any_instance_of(WmiLite::Wmi).to receive(:first_of).and_return(
396
+ { "caption" => "Computer System Product",
397
+ "description" => "Computer System Product",
398
+ "identifyingnumber" => "ec2a355a-91cd-5fe8-bbfc-cc891d0bf9d6",
399
+ "name" => "HVM domU",
400
+ "skunumber" => nil,
401
+ "uuid" => "5A352AEC-CD91-E85F-BBFC-CC891D0BF9D6",
402
+ "vendor" => "Xen",
403
+ "version" => "4.2.amazon" })
404
+ end
405
+ end
406
+
407
+ describe "without EC2 Identifying Number", :windows_only do
408
+ it_behaves_like "!ec2"
409
+
410
+ before do
411
+ allow_any_instance_of(WmiLite::Wmi).to receive(:first_of).and_return(
412
+ { "caption" => "Computer System Product",
413
+ "description" => "Computer System Product",
414
+ "identifyingnumber" => "1234",
415
+ "name" => "HVM domU",
416
+ "skunumber" => nil,
417
+ "uuid" => "5A352AEC-CD91-E85F-BBFC-CC891D0BF9D6",
418
+ "vendor" => "Xen",
419
+ "version" => "1.2.3" })
368
420
  end
369
421
  end
370
422
 
@@ -0,0 +1,133 @@
1
+ #
2
+ # Author:: Phil Dibowitz <phil@ipom.com>
3
+ # Copyright:: Copyright (c) 2017 Facebook, 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
+ require_relative "../../../spec_helper.rb"
20
+
21
+ describe Ohai::System, "Linux lspci plugin" do
22
+ let (:plugin) { get_plugin("linux/lspci") }
23
+
24
+ before(:each) do
25
+ @stdout = <<LSPCI
26
+ Device: 00:1f.3
27
+ Class: Audio device [0403]
28
+ Vendor: Intel Corporation [8086]
29
+ Device: Sunrise Point-LP HD Audio [9d71]
30
+ SVendor: Lenovo [17aa]
31
+ SDevice: Sunrise Point-LP HD Audio [224e]
32
+ Rev: 21
33
+ Driver: snd_hda_intel
34
+ Module: snd_hda_intel
35
+ Module: snd_soc_skl
36
+
37
+ Device: 00:1f.4
38
+ Class: SMBus [0c05]
39
+ Vendor: Intel Corporation [8086]
40
+ Device: Sunrise Point-LP SMBus [9d23]
41
+ SVendor: Lenovo [17aa]
42
+ SDevice: Sunrise Point-LP SMBus [224e]
43
+ Rev: 21
44
+ Driver: i801_smbus
45
+ Module: i2c_i801
46
+
47
+ Device: 00:1f.6
48
+ Class: Ethernet controller [0200]
49
+ Vendor: Intel Corporation [8086]
50
+ Device: Ethernet Connection (4) I219-LM [15d7]
51
+ SVendor: Lenovo [17aa]
52
+ SDevice: Ethernet Connection (4) I219-LM [224e]
53
+ Rev: 21
54
+ Driver: e1000e
55
+ Module: e1000e
56
+
57
+ Device: 02:00.0
58
+ Class: Unassigned class [ff00]
59
+ Vendor: Realtek Semiconductor Co., Ltd. [10ec]
60
+ Device: RTS525A PCI Express Card Reader [525a]
61
+ SVendor: Lenovo [17aa]
62
+ SDevice: RTS525A PCI Express Card Reader [224e]
63
+ Rev: 01
64
+ Driver: rtsx_pci
65
+ Module: rtsx_pci
66
+
67
+ Device: 04:00.0
68
+ Class: Network controller [0280]
69
+ Vendor: Intel Corporation [8086]
70
+ Device: Wireless 8265 / 8275 [24fd]
71
+ SVendor: Intel Corporation [8086]
72
+ SDevice: Wireless 8265 / 8275 [0130]
73
+ Rev: 88
74
+ Driver: iwlwifi
75
+ Module: iwlwifi
76
+
77
+ Device: 05:00.0
78
+ Class: Non-Volatile memory controller [0108]
79
+ Vendor: Toshiba America Info Systems [1179]
80
+ Device: Device [0115]
81
+ SVendor: Toshiba America Info Systems [1179]
82
+ SDevice: Device [0001]
83
+ Rev: 01
84
+ ProgIf: 02
85
+ Driver: nvme
86
+ Module: nvme
87
+ NUMANode: 0
88
+ LSPCI
89
+ allow(plugin).to receive(:shell_out).with("lspci -vnnmk").and_return(
90
+ mock_shell_out(0, @stdout, ""))
91
+
92
+ allow(plugin).to receive(:collect_os).and_return(:linux)
93
+ end
94
+
95
+ describe "when gathering data from lspci" do
96
+ it "lists all devices" do
97
+ plugin.run
98
+ expect(plugin[:pci].keys).to eq(
99
+ ["00:1f.3", "00:1f.4", "00:1f.6", "02:00.0", "04:00.0", "05:00.0"]
100
+ )
101
+ end
102
+
103
+ it "parses out device name vs id" do
104
+ plugin.run
105
+ expect(plugin[:pci]["04:00.0"]["device_name"]).to eq("Wireless 8265 / 8275")
106
+ expect(plugin[:pci]["04:00.0"]["device_id"]).to eq("24fd")
107
+ end
108
+
109
+ it "parses out sdevice name vs id" do
110
+ plugin.run
111
+ expect(plugin[:pci]["04:00.0"]["sdevice_name"]).to eq("Wireless 8265 / 8275")
112
+ expect(plugin[:pci]["04:00.0"]["sdevice_id"]).to eq("0130")
113
+ end
114
+
115
+ it "parses out class name vs id" do
116
+ plugin.run
117
+ expect(plugin[:pci]["04:00.0"]["class_name"]).to eq("Network controller")
118
+ expect(plugin[:pci]["04:00.0"]["class_id"]).to eq("0280")
119
+ end
120
+
121
+ it "parses out vendor name vs id" do
122
+ plugin.run
123
+ expect(plugin[:pci]["04:00.0"]["vendor_name"]).to eq("Intel Corporation")
124
+ expect(plugin[:pci]["04:00.0"]["vendor_id"]).to eq("8086")
125
+ end
126
+
127
+ it "provides drivers and modules" do
128
+ plugin.run
129
+ expect(plugin[:pci]["04:00.0"]["driver"]).to eq(["iwlwifi"])
130
+ expect(plugin[:pci]["04:00.0"]["module"]).to eq(["iwlwifi"])
131
+ end
132
+ end
133
+ end
@@ -142,8 +142,29 @@ MD
142
142
  allow(File).to receive(:open).with("/proc/mdstat").and_return(new_mdstat)
143
143
 
144
144
  @plugin.run
145
- expect(@plugin[:mdadm][:md0][:members].sort).to eq(%w{nvme2n1p3})
145
+ expect(@plugin[:mdadm][:md0][:spares]).to eq(%w{nvme2n1p3})
146
+ end
147
+
148
+ it "should report journal devices" do
149
+ new_mdstat = double("/proc/mdstat_journal")
150
+ allow(new_mdstat).to receive(:each).
151
+ and_yield("Personalies : [raid6]").
152
+ and_yield("md0 : active (somecraphere) <morestuff raid6 sdbc1[7] sdd1[6] sde1[5] sdd1[4] sde1[3] sdf1[2] sdg1[1] nvme2n1p3[0](J)")
153
+ allow(File).to receive(:open).with("/proc/mdstat").and_return(new_mdstat)
154
+
155
+ @plugin.run
156
+ expect(@plugin[:mdadm][:md0][:journal]).to eq("nvme2n1p3")
146
157
  end
147
- end
148
158
 
159
+ it "should report spare devices" do
160
+ new_mdstat = double("/proc/mdstat_spare")
161
+ allow(new_mdstat).to receive(:each).
162
+ and_yield("Personalies : [raid6]").
163
+ and_yield("md0 : active (somecraphere) <morestuff raid6 sdbc1[7] sdd1[6] sde1[5] sdd1[4] sde1[3] sdf1[2] sdg1[1] sdh1[0](S)")
164
+ allow(File).to receive(:open).with("/proc/mdstat").and_return(new_mdstat)
165
+
166
+ @plugin.run
167
+ expect(@plugin[:mdadm][:md0][:spares]).to eq(%w{sdh1})
168
+ end
169
+ end
149
170
  end
@@ -240,6 +240,10 @@ EOM
240
240
  valid_lft forever preferred_lft forever
241
241
  13: fwdintf: <MULTICAST,NOARP,UP,LOWER_UP> mtu 1496 qdisc pfifo_fast state UNKNOWN group default qlen 1000
242
242
  link/ether 00:00:00:00:00:0a brd ff:ff:ff:ff:ff:ff
243
+ 14: ip6tnl0@NONE: <NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1
244
+ link/tunnel6 :: brd ::
245
+ inet6 fe80::f47a:2aff:fef0:c6ef/64 scope link
246
+ valid_lft forever preferred_lft forever
243
247
  EOM
244
248
  end
245
249
 
@@ -300,6 +304,13 @@ EOM
300
304
  0 0 0 0 0 0
301
305
  TX: bytes packets errors dropped carrier collsns
302
306
  140 2 0 1 0 0
307
+ 14: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1
308
+ link/tunnel6 :: brd :: promiscuity 0
309
+ ip6tnl ip6ip6 remote :: local :: encaplimit 0 hoplimit 0 tclass 0x00 flowlabel 0x00000 (flowinfo 0x00000000) addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
310
+ RX: bytes packets errors dropped overrun mcast
311
+ 0 0 0 0 0 0
312
+ TX: bytes packets errors dropped carrier collsns
313
+ 0 0 0 0 0 0
303
314
  EOM
304
315
  end
305
316
 
@@ -572,7 +583,11 @@ EOM
572
583
  end
573
584
 
574
585
  it "detects the interfaces" do
575
- expect(plugin["network"]["interfaces"].keys.sort).to eq(["eth0", "eth0.11", "eth0.151", "eth0.152", "eth0.153", "eth0:5", "eth3", "foo:veth0@eth0", "fwdintf", "lo", "ovs-system", "tun0", "venet0", "venet0:0", "xapi1"])
586
+ if network_method == "iproute2"
587
+ expect(plugin["network"]["interfaces"].keys.sort).to eq(["eth0", "eth0.11", "eth0.151", "eth0.152", "eth0.153", "eth0:5", "eth3", "foo:veth0@eth0", "fwdintf", "ip6tnl0", "lo", "ovs-system", "tun0", "venet0", "venet0:0", "xapi1"])
588
+ else
589
+ expect(plugin["network"]["interfaces"].keys.sort).to eq(["eth0", "eth0.11", "eth0.151", "eth0.152", "eth0.153", "eth0:5", "eth3", "foo:veth0@eth0", "fwdintf", "lo", "ovs-system", "tun0", "venet0", "venet0:0", "xapi1"])
590
+ end
576
591
  end
577
592
 
578
593
  it "detects the layer one details of an ethernet interface" do
@@ -676,6 +691,26 @@ EOM
676
691
  expect(plugin["network"]["interfaces"]["eth0"]["arp"]["10.116.201.1"]).to eq("fe:ff:ff:ff:ff:ff")
677
692
  end
678
693
 
694
+ if network_method == "iproute2"
695
+ it "detects the tunnel information" do
696
+ expect(plugin["network"]["interfaces"]["ip6tnl0"]["tunnel_info"]).to eq(
697
+ {
698
+ "proto" => "ip6ip6",
699
+ "remote" => "::",
700
+ "local" => "::",
701
+ "encaplimit" => "0",
702
+ "hoplimit" => "0",
703
+ "tclass" => "0x00",
704
+ "flowlabel" => "0x00000",
705
+ "addrgenmode" => "eui64",
706
+ "numtxqueues" => "1",
707
+ "numrxqueues" => "1",
708
+ "gso_max_size" => "65536",
709
+ "gso_max_segs" => "65535",
710
+ }
711
+ )
712
+ end
713
+ end
679
714
  end
680
715
 
681
716
  describe "gathering interface counters via #{network_method}" do
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: 8.25.1
4
+ version: 8.26.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: 2017-11-15 00:00:00.000000000 Z
11
+ date: 2018-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: systemu
@@ -275,6 +275,7 @@ files:
275
275
  - lib/ohai/plugins/linux/fips.rb
276
276
  - lib/ohai/plugins/linux/hostnamectl.rb
277
277
  - lib/ohai/plugins/linux/lsb.rb
278
+ - lib/ohai/plugins/linux/lspci.rb
278
279
  - lib/ohai/plugins/linux/machineid.rb
279
280
  - lib/ohai/plugins/linux/mdadm.rb
280
281
  - lib/ohai/plugins/linux/memory.rb
@@ -463,6 +464,7 @@ files:
463
464
  - spec/unit/plugins/linux/hostnamectl_spec.rb
464
465
  - spec/unit/plugins/linux/kernel_spec.rb
465
466
  - spec/unit/plugins/linux/lsb_spec.rb
467
+ - spec/unit/plugins/linux/lspci_spec.rb
466
468
  - spec/unit/plugins/linux/machineid_spec.rb
467
469
  - spec/unit/plugins/linux/mdadm_spec.rb
468
470
  - spec/unit/plugins/linux/memory_spec.rb
@@ -546,7 +548,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
546
548
  version: '0'
547
549
  requirements: []
548
550
  rubyforge_project:
549
- rubygems_version: 2.6.13
551
+ rubygems_version: 2.7.3
550
552
  signing_key:
551
553
  specification_version: 4
552
554
  summary: Ohai profiles your system and emits JSON