ohai 8.17.1 → 8.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ohai/dsl/plugin.rb +2 -0
- data/lib/ohai/plugins/bsd/virtualization.rb +1 -2
- data/lib/ohai/plugins/darwin/hardware.rb +98 -0
- data/lib/ohai/plugins/darwin/virtualization.rb +23 -8
- data/lib/ohai/plugins/linux/block_device.rb +1 -1
- data/lib/ohai/plugins/linux/memory.rb +11 -0
- data/lib/ohai/plugins/linux/sessions.rb +0 -4
- data/lib/ohai/plugins/linux/virtualization.rb +1 -4
- data/lib/ohai/plugins/php.rb +1 -1
- data/lib/ohai/plugins/shells.rb +31 -0
- data/lib/ohai/plugins/solaris2/virtualization.rb +1 -1
- data/lib/ohai/version.rb +1 -1
- data/ohai.gemspec +1 -1
- data/spec/unit/plugins/darwin/hardware_spec.rb +116 -0
- data/spec/unit/plugins/darwin/hardware_system_profiler_output.rb +1110 -0
- data/spec/unit/plugins/darwin/virtualization_spec.rb +28 -9
- data/spec/unit/plugins/linux/memory_spec.rb +28 -3
- data/spec/unit/plugins/php_spec.rb +39 -32
- data/spec/unit/plugins/shells_spec.rb +56 -0
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b422d14afdb82f8fe3f07aa0aaa8dd82c30fa06
|
4
|
+
data.tar.gz: f99bb4675dcbfca6ffbb28420fbcae88072b55ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0755c29277022af57f5535a3ced25262ab34e190f8c25d2ed390e0b0324374511ed9ec9c2ca93848fcf2287dfd34d83a849a369ab3271a5e950c9268c8ab430f
|
7
|
+
data.tar.gz: 99d5e61254335f5e2274c2ef0f36cf401fa11c0b2ea69cfd3a5514025297e5fdca1d9546670a7364a1c765a434fc57979da777b39c9390391ce766ece3b3d270
|
data/lib/ohai/dsl/plugin.rb
CHANGED
@@ -22,6 +22,7 @@ require "ohai/mixin/os"
|
|
22
22
|
require "ohai/mixin/command"
|
23
23
|
require "ohai/mixin/seconds_to_human"
|
24
24
|
require "ohai/hints"
|
25
|
+
require "ohai/util/file_helper"
|
25
26
|
|
26
27
|
module Ohai
|
27
28
|
|
@@ -81,6 +82,7 @@ module Ohai
|
|
81
82
|
include Ohai::Mixin::OS
|
82
83
|
include Ohai::Mixin::Command
|
83
84
|
include Ohai::Mixin::SecondsToHuman
|
85
|
+
include Ohai::Util::FileHelper
|
84
86
|
|
85
87
|
attr_reader :data
|
86
88
|
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Nate Walck (<nate.walck@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2016-present 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
|
+
Ohai.plugin(:Hardware) do
|
20
|
+
provides "hardware"
|
21
|
+
|
22
|
+
def system_profiler(datatype)
|
23
|
+
sp_cmd = "system_profiler #{datatype} -xml"
|
24
|
+
# Hardware queries
|
25
|
+
sp_std = shell_out(sp_cmd)
|
26
|
+
sp_hash = Plist.parse_xml(sp_std.stdout)
|
27
|
+
end
|
28
|
+
|
29
|
+
collect_data(:darwin) do
|
30
|
+
unless hardware
|
31
|
+
hardware Mash.new
|
32
|
+
else
|
33
|
+
Ohai::Log.debug("Plugin Darwin Hardware: namespace already exists")
|
34
|
+
next
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
require "plist"
|
39
|
+
rescue LoadError => e
|
40
|
+
# In case the plist gem isn't present, skip this plugin.
|
41
|
+
Ohai::Log.debug("Plugin Hardware: Can't load gem: #{e}. Cannot continue.")
|
42
|
+
next
|
43
|
+
end
|
44
|
+
|
45
|
+
hw_hash = system_profiler("SPHardwareDataType")
|
46
|
+
hw_hash[0]["_items"][0].delete("_name")
|
47
|
+
hardware.merge!(hw_hash[0]["_items"][0])
|
48
|
+
|
49
|
+
{
|
50
|
+
"operating_system" => "sw_vers -productName",
|
51
|
+
"operating_system_version" => "sw_vers -productVersion",
|
52
|
+
"build_version" => "sw_vers -buildVersion",
|
53
|
+
"architecture" => "uname -m",
|
54
|
+
}.each do |var, cmd|
|
55
|
+
os_info = shell_out(cmd).stdout
|
56
|
+
hardware[var] = os_info.strip unless os_info.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
# Storage queries
|
60
|
+
storage = []
|
61
|
+
storage_hash = system_profiler("SPStorageDataType")
|
62
|
+
drives = storage_hash[0]["_items"]
|
63
|
+
drives.each do |drive_entry|
|
64
|
+
drive = Mash.new
|
65
|
+
drive[:name] = drive_entry["_name"]
|
66
|
+
drive[:bsd_name] = drive_entry["bsd_name"]
|
67
|
+
drive[:capacity] = drive_entry["size_in_bytes"]
|
68
|
+
if drive_entry.has_key?("com.apple.corestorage.pv")
|
69
|
+
drive[:drive_type] = drive_entry["com.apple.corestorage.pv"][0]["medium_type"]
|
70
|
+
drive[:smart_status] = drive_entry["com.apple.corestorage.pv"][0]["smart_status"]
|
71
|
+
drive[:partitions] = drive_entry["com.apple.corestorage.pv"].count
|
72
|
+
end
|
73
|
+
storage << drive
|
74
|
+
end
|
75
|
+
|
76
|
+
hardware["storage"] = storage
|
77
|
+
|
78
|
+
# Battery queries
|
79
|
+
battery_hash = system_profiler("SPPowerDataType")
|
80
|
+
power_entries = battery_hash[0]["_items"]
|
81
|
+
battery = Mash.new
|
82
|
+
power_entries.each do |entry|
|
83
|
+
if entry.value?("spbattery_information")
|
84
|
+
charge = entry["sppower_battery_charge_info"]
|
85
|
+
health = entry["sppower_battery_health_info"]
|
86
|
+
battery[:current_capacity] = charge["sppower_battery_current_capacity"]
|
87
|
+
battery[:max_capacity] = charge["sppower_battery_max_capacity"]
|
88
|
+
battery[:fully_charged] = charge["sppower_battery_fully_charged"].eql?("TRUE")
|
89
|
+
battery[:is_charging] = charge["sppower_battery_is_charging"].eql?("TRUE")
|
90
|
+
battery[:charge_cycle_count] = health["sppower_battery_cycle_count"]
|
91
|
+
battery[:health] = health["sppower_battery_health"]
|
92
|
+
battery[:serial] = entry["sppower_battery_model_info"]["sppower_battery_serial_number"]
|
93
|
+
battery[:remaining] = (battery["current_capacity"].to_f / battery["max_capacity"].to_f * 100).to_i
|
94
|
+
end
|
95
|
+
end
|
96
|
+
hardware[:battery] = battery
|
97
|
+
end
|
98
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Pavel Yudin (<pyudin@parallels.com>)
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
3
4
|
# Copyright:: Copyright (c) 2015 Pavel Yudin
|
5
|
+
# Copyright:: Copyright (c) 2016 Chef Software, Inc.
|
4
6
|
# License:: Apache License, Version 2.0
|
5
7
|
#
|
6
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,13 +18,13 @@
|
|
16
18
|
# limitations under the License.
|
17
19
|
#
|
18
20
|
|
19
|
-
require "ohai/util/file_helper"
|
20
|
-
|
21
|
-
include Ohai::Util::FileHelper
|
22
|
-
|
23
21
|
Ohai.plugin(:Virtualization) do
|
24
22
|
provides "virtualization"
|
25
23
|
|
24
|
+
def vboxmanage_exists?
|
25
|
+
which("VBoxManage")
|
26
|
+
end
|
27
|
+
|
26
28
|
def prlctl_exists?
|
27
29
|
which("prlctl")
|
28
30
|
end
|
@@ -31,18 +33,31 @@ Ohai.plugin(:Virtualization) do
|
|
31
33
|
which("ioreg")
|
32
34
|
end
|
33
35
|
|
36
|
+
def fusion_exists?
|
37
|
+
::File.exist?("/Applications/VMware\ Fusion.app/")
|
38
|
+
end
|
39
|
+
|
34
40
|
collect_data(:darwin) do
|
35
41
|
virtualization Mash.new unless virtualization
|
36
42
|
virtualization[:systems] = Mash.new unless virtualization[:systems]
|
37
43
|
|
44
|
+
if vboxmanage_exists?
|
45
|
+
virtualization[:system] = "vbox"
|
46
|
+
virtualization[:role] = "host"
|
47
|
+
virtualization[:systems][:vbox] = "host"
|
48
|
+
end
|
49
|
+
|
50
|
+
if fusion_exists?
|
51
|
+
virtualization[:system] = "vmware"
|
52
|
+
virtualization[:role] = "host"
|
53
|
+
virtualization[:systems][:vmware] = "host"
|
54
|
+
end
|
55
|
+
|
38
56
|
if prlctl_exists?
|
39
57
|
virtualization[:system] = "parallels"
|
40
58
|
virtualization[:role] = "host"
|
41
59
|
virtualization[:systems][:parallels] = "host"
|
42
|
-
|
43
|
-
|
44
|
-
# Detect Parallels virtual machine from pci devices
|
45
|
-
if ioreg_exists?
|
60
|
+
elsif ioreg_exists?
|
46
61
|
so = shell_out("ioreg -l")
|
47
62
|
if so.stdout =~ /pci1ab8,4000/
|
48
63
|
virtualization[:system] = "parallels"
|
@@ -35,7 +35,7 @@ Ohai.plugin(:BlockDevice) do
|
|
35
35
|
File.open("/sys/block/#{dir}/device/#{check}") { |f| block[dir][check] = f.read_nonblock(1024).strip }
|
36
36
|
end
|
37
37
|
end
|
38
|
-
%w{rotational}.each do |check|
|
38
|
+
%w{rotational physical_block_size logical_block_size}.each do |check|
|
39
39
|
if File.exists?("/sys/block/#{dir}/queue/#{check}")
|
40
40
|
File.open("/sys/block/#{dir}/queue/#{check}") { |f| block[dir][check] = f.read_nonblock(1024).strip }
|
41
41
|
end
|
@@ -22,6 +22,7 @@ Ohai.plugin(:Memory) do
|
|
22
22
|
collect_data(:linux) do
|
23
23
|
memory Mash.new
|
24
24
|
memory[:swap] = Mash.new
|
25
|
+
memory[:hugepages] = Mash.new
|
25
26
|
|
26
27
|
File.open("/proc/meminfo").each do |line|
|
27
28
|
case line
|
@@ -81,6 +82,16 @@ Ohai.plugin(:Memory) do
|
|
81
82
|
memory[:swap][:total] = "#{$1}#{$2}"
|
82
83
|
when /^SwapFree:\s+(\d+) (.+)$/
|
83
84
|
memory[:swap][:free] = "#{$1}#{$2}"
|
85
|
+
when /^HugePages_Total:\s+(\d+)$/
|
86
|
+
memory[:hugepages][:total] = "#{$1}"
|
87
|
+
when /^HugePages_Free:\s+(\d+)$/
|
88
|
+
memory[:hugepages][:free] = "#{$1}"
|
89
|
+
when /^HugePages_Rsvd:\s+(\d+)$/
|
90
|
+
memory[:hugepages][:reserved] = "#{$1}"
|
91
|
+
when /^HugePages_Surp:\s+(\d+)$/
|
92
|
+
memory[:hugepages][:surplus] = "#{$1}"
|
93
|
+
when /^Hugepagesize:\s+(\d+) (.+)$/
|
94
|
+
memory[:hugepage_size] = "#{$1}#{$2}"
|
84
95
|
end
|
85
96
|
end
|
86
97
|
end
|
@@ -16,13 +16,10 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require "ohai/util/file_helper"
|
20
19
|
require "ohai/mixin/dmi_decode"
|
21
20
|
|
22
|
-
include Ohai::Util::FileHelper
|
23
|
-
include Ohai::Mixin::DmiDecode
|
24
|
-
|
25
21
|
Ohai.plugin(:Virtualization) do
|
22
|
+
include Ohai::Mixin::DmiDecode
|
26
23
|
provides "virtualization"
|
27
24
|
|
28
25
|
def lxc_version_exists?
|
data/lib/ohai/plugins/php.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2016 Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
Ohai.plugin(:Shells) do
|
20
|
+
provides "shells"
|
21
|
+
|
22
|
+
collect_data do
|
23
|
+
if ::File.exist?("/etc/shells")
|
24
|
+
shells []
|
25
|
+
::File.readlines("/etc/shells").each do |line|
|
26
|
+
# remove carriage returns and skip over comments / empty lines
|
27
|
+
shells << line.chomp if line[0] == "/"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/ohai/version.rb
CHANGED
data/ohai.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.email = "adam@chef.io"
|
14
14
|
s.homepage = "https://docs.chef.io/ohai.html"
|
15
15
|
|
16
|
-
s.required_ruby_version = ">= 2.
|
16
|
+
s.required_ruby_version = ">= 2.1.0"
|
17
17
|
|
18
18
|
s.add_dependency "systemu", "~> 2.6.4"
|
19
19
|
s.add_dependency "ffi-yajl", "~> 2.2"
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Nate Walck (<nate.walck@gmail.com>)
|
3
|
+
# Copyright:: Copyright (c) 2016-present 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 File.expand_path(File.dirname(__FILE__) + "/../../../spec_helper.rb")
|
20
|
+
require File.expand_path("#{File.dirname(__FILE__)}/hardware_system_profiler_output.rb")
|
21
|
+
|
22
|
+
describe Ohai::System, "Darwin hardware plugin", :unix_only do
|
23
|
+
let (:plugin) { get_plugin("darwin/hardware") }
|
24
|
+
before(:each) do
|
25
|
+
allow(plugin).to receive(:collect_os).and_return(:darwin)
|
26
|
+
# Make sure it always runs correct commands and mock the data as it calls them
|
27
|
+
allow(plugin).to receive(:shell_out).with(
|
28
|
+
"system_profiler SPHardwareDataType -xml"
|
29
|
+
).and_return(
|
30
|
+
mock_shell_out(0, HardwareSystemProfilerOutput::Hardware, "")
|
31
|
+
)
|
32
|
+
|
33
|
+
allow(plugin).to receive(:shell_out).with(
|
34
|
+
"sw_vers -productName"
|
35
|
+
).and_return(
|
36
|
+
mock_shell_out(0, "Mac OS X", "")
|
37
|
+
)
|
38
|
+
|
39
|
+
allow(plugin).to receive(:shell_out).with(
|
40
|
+
"sw_vers -productVersion"
|
41
|
+
).and_return(
|
42
|
+
mock_shell_out(0, "10.12", "")
|
43
|
+
)
|
44
|
+
|
45
|
+
allow(plugin).to receive(:shell_out).with(
|
46
|
+
"sw_vers -buildVersion"
|
47
|
+
).and_return(
|
48
|
+
mock_shell_out(0, "16A239j", "")
|
49
|
+
)
|
50
|
+
|
51
|
+
allow(plugin).to receive(:shell_out).with(
|
52
|
+
"uname -m"
|
53
|
+
).and_return(
|
54
|
+
mock_shell_out(0, "x86_64", "")
|
55
|
+
)
|
56
|
+
|
57
|
+
allow(plugin).to receive(:shell_out).with(
|
58
|
+
"system_profiler SPStorageDataType -xml"
|
59
|
+
).and_return(
|
60
|
+
mock_shell_out(0, HardwareSystemProfilerOutput::Storage, "")
|
61
|
+
)
|
62
|
+
|
63
|
+
allow(plugin).to receive(:shell_out).with(
|
64
|
+
"system_profiler SPPowerDataType -xml"
|
65
|
+
).and_return(
|
66
|
+
mock_shell_out(0, HardwareSystemProfilerOutput::Power, "")
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "parses hardware data correctly" do
|
71
|
+
plugin.run
|
72
|
+
expect(plugin["hardware"]["SMC_version_system"]).to eq("2.16f68")
|
73
|
+
expect(plugin["hardware"]["boot_rom_version"]).to eq("MBP111.0138.B17")
|
74
|
+
expect(plugin["hardware"]["cpu_type"]).to eq("Intel Core i7")
|
75
|
+
expect(plugin["hardware"]["current_processor_speed"]).to eq("3 GHz")
|
76
|
+
expect(plugin["hardware"]["l2_cache_core"]).to eq("256 KB")
|
77
|
+
expect(plugin["hardware"]["l3_cache"]).to eq("4 MB")
|
78
|
+
expect(plugin["hardware"]["machine_model"]).to eq("MacBookPro11,1")
|
79
|
+
expect(plugin["hardware"]["machine_name"]).to eq("MacBook Pro")
|
80
|
+
expect(plugin["hardware"]["number_processors"]).to eq(2)
|
81
|
+
expect(plugin["hardware"]["packages"]).to eq(1)
|
82
|
+
expect(plugin["hardware"]["physical_memory"]).to eq("16 GB")
|
83
|
+
expect(plugin["hardware"]["platform_UUID"]).to eq("F1A4AE0F-84A8-45D8-83C7-F3F904464FC5")
|
84
|
+
expect(plugin["hardware"]["serial_number"]).to eq("ABCDEFG12345")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "parses sw_vers and uname data correctly" do
|
88
|
+
plugin.run
|
89
|
+
expect(plugin["hardware"]["operating_system"]).to eq("Mac OS X")
|
90
|
+
expect(plugin["hardware"]["operating_system_version"]).to eq("10.12")
|
91
|
+
expect(plugin["hardware"]["build_version"]).to eq("16A239j")
|
92
|
+
expect(plugin["hardware"]["architecture"]).to eq("x86_64")
|
93
|
+
end
|
94
|
+
|
95
|
+
it "parses storage data correctly" do
|
96
|
+
plugin.run
|
97
|
+
expect(plugin["hardware"]["storage"][0]["name"]).to eq("Macintosh HD")
|
98
|
+
expect(plugin["hardware"]["storage"][0]["bsd_name"]).to eq("disk1")
|
99
|
+
expect(plugin["hardware"]["storage"][0]["capacity"]).to eq(249661751296)
|
100
|
+
expect(plugin["hardware"]["storage"][0]["drive_type"]).to eq("ssd")
|
101
|
+
expect(plugin["hardware"]["storage"][0]["smart_status"]).to eq("Verified")
|
102
|
+
expect(plugin["hardware"]["storage"][0]["partitions"]).to eq(1)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "parses storage data correctly" do
|
106
|
+
plugin.run
|
107
|
+
expect(plugin["hardware"]["battery"]["current_capacity"]).to eq(5841)
|
108
|
+
expect(plugin["hardware"]["battery"]["max_capacity"]).to eq(5841)
|
109
|
+
expect(plugin["hardware"]["battery"]["fully_charged"]).to eq(true)
|
110
|
+
expect(plugin["hardware"]["battery"]["is_charging"]).to eq(false)
|
111
|
+
expect(plugin["hardware"]["battery"]["charge_cycle_count"]).to eq(201)
|
112
|
+
expect(plugin["hardware"]["battery"]["health"]).to eq("Good")
|
113
|
+
expect(plugin["hardware"]["battery"]["serial"]).to eq("D123456789ABCDEFG")
|
114
|
+
expect(plugin["hardware"]["battery"]["remaining"]).to eq(100)
|
115
|
+
end
|
116
|
+
end
|