ohai 8.19.2 → 8.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/ohai/common/dmi.rb +12 -12
- data/lib/ohai/config.rb +30 -28
- data/lib/ohai/loader.rb +1 -1
- data/lib/ohai/mixin/command.rb +2 -2
- data/lib/ohai/plugins/dmi.rb +1 -1
- data/lib/ohai/plugins/ip_scopes.rb +3 -3
- data/lib/ohai/plugins/kernel.rb +4 -0
- data/lib/ohai/plugins/linux/hostnamectl.rb +34 -0
- data/lib/ohai/plugins/linux/machineid.rb +35 -0
- data/lib/ohai/plugins/linux/network.rb +1 -1
- data/lib/ohai/plugins/linux/virtualization.rb +10 -0
- data/lib/ohai/plugins/rackspace.rb +4 -4
- data/lib/ohai/plugins/solaris2/dmi.rb +1 -1
- data/lib/ohai/plugins/solaris2/filesystem.rb +6 -6
- data/lib/ohai/plugins/solaris2/network.rb +8 -8
- data/lib/ohai/plugins/windows/cpu.rb +5 -3
- data/lib/ohai/plugins/windows/network.rb +59 -37
- data/lib/ohai/runner.rb +2 -2
- data/lib/ohai/system.rb +2 -2
- data/lib/ohai/version.rb +1 -1
- data/spec/functional/application_spec.rb +1 -1
- data/spec/support/integration_helper.rb +3 -3
- data/spec/unit/application_spec.rb +1 -1
- data/spec/unit/dsl/plugin_spec.rb +22 -22
- data/spec/unit/mixin/ec2_metadata_spec.rb +2 -2
- data/spec/unit/mixin/softlayer_metadata_spec.rb +2 -2
- data/spec/unit/plugin_config_spec.rb +6 -6
- data/spec/unit/plugins/aix/cpu_spec.rb +6 -6
- data/spec/unit/plugins/aix/filesystem_spec.rb +8 -8
- data/spec/unit/plugins/aix/virtualization_spec.rb +2 -2
- data/spec/unit/plugins/azure_spec.rb +2 -2
- data/spec/unit/plugins/darwin/hardware_spec.rb +3 -3
- data/spec/unit/plugins/darwin/hardware_system_profiler_output.rb +3 -3
- data/spec/unit/plugins/digital_ocean_spec.rb +2 -2
- data/spec/unit/plugins/init_package_spec.rb +2 -2
- data/spec/unit/plugins/ip_scopes_spec.rb +3 -2
- data/spec/unit/plugins/linux/hostnamectl_spec.rb +59 -0
- data/spec/unit/plugins/linux/machineid_spec.rb +46 -0
- data/spec/unit/plugins/linux/network_spec.rb +113 -77
- data/spec/unit/plugins/linux/platform_spec.rb +2 -2
- data/spec/unit/plugins/linux/virtualization_spec.rb +20 -0
- data/spec/unit/plugins/ruby_spec.rb +3 -2
- data/spec/unit/plugins/solaris2/kernel_spec.rb +23 -0
- data/spec/unit/runner_spec.rb +74 -74
- data/spec/unit/util/ip_helper_spec.rb +2 -2
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09b47a615ee064d16781e8ce7a847d71035d535a
|
4
|
+
data.tar.gz: fd200214865bb27d7ebce651d06798ac8d1b401a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42971e6add7b1e917f52bd5d416d622555c03764ae6c7e8090cf945ab77e0fba561719c7e8c4210169f164b2967a68df5cda3d6c5ed8ce87522a618466bf22de
|
7
|
+
data.tar.gz: b34aa2275ff4f580d1c37de0234a92ff7a0e6b1a98161e38e8c0ebbe4f7c0fa9aef36c1dcccc21a42a7deb99d920e9830214932ef6720adf247a81b17752772e
|
data/Gemfile
CHANGED
data/lib/ohai/common/dmi.rb
CHANGED
@@ -24,7 +24,7 @@ module Ohai
|
|
24
24
|
# all-lowercase, all non-alphanumeric converted to '_'
|
25
25
|
# 128-255 are 'oem_data_[id]'
|
26
26
|
# Everything else is 'unknown'
|
27
|
-
|
27
|
+
ID_TO_DESCRIPTION = {
|
28
28
|
0 => "bios",
|
29
29
|
1 => "system",
|
30
30
|
2 => "base_board",
|
@@ -71,7 +71,7 @@ module Ohai
|
|
71
71
|
|
72
72
|
# list of IDs to collect, otherwise we generate pages of hashes about cache chip size and whatnot
|
73
73
|
# See OHAI-260. When we can give the user a choice, this will be a default.
|
74
|
-
|
74
|
+
ID_TO_CAPTURE = [ 0, 1, 2, 3, 4, 6, 11 ]
|
75
75
|
|
76
76
|
# look up DMI ID
|
77
77
|
def id_lookup(id)
|
@@ -79,8 +79,8 @@ module Ohai
|
|
79
79
|
id = id.to_i
|
80
80
|
if (id >= 128) && (id <= 255)
|
81
81
|
id = "oem_data_#{id}"
|
82
|
-
elsif DMI::
|
83
|
-
id = DMI::
|
82
|
+
elsif DMI::ID_TO_DESCRIPTION.has_key?(id)
|
83
|
+
id = DMI::ID_TO_DESCRIPTION[id]
|
84
84
|
else
|
85
85
|
Ohai::Log.debug("unrecognized header id; falling back to 'unknown'")
|
86
86
|
id = "unknown"
|
@@ -95,12 +95,12 @@ module Ohai
|
|
95
95
|
# for single occurrences of one type, copy to top level all fields and values
|
96
96
|
# for multiple occurrences of same type, copy to top level all fields and values that are common to all records
|
97
97
|
def convenience_keys(dmi)
|
98
|
-
dmi.each
|
98
|
+
dmi.each do |type, records|
|
99
99
|
in_common = Mash.new
|
100
100
|
next unless records.class.to_s == "Mash"
|
101
101
|
next unless records.has_key?("all_records")
|
102
|
-
records[:all_records].each
|
103
|
-
record.each
|
102
|
+
records[:all_records].each do |record|
|
103
|
+
record.each do |field, value|
|
104
104
|
next if value.class.to_s == "Mash"
|
105
105
|
next if field.to_s == "application_identifier"
|
106
106
|
next if field.to_s == "size"
|
@@ -112,13 +112,13 @@ module Ohai
|
|
112
112
|
else
|
113
113
|
in_common[translated] = value
|
114
114
|
end
|
115
|
-
|
116
|
-
|
117
|
-
in_common.each
|
115
|
+
end
|
116
|
+
end
|
117
|
+
in_common.each do |field, value|
|
118
118
|
next if value == nil
|
119
119
|
dmi[type][field] = value.strip
|
120
|
-
|
121
|
-
|
120
|
+
end
|
121
|
+
end
|
122
122
|
end
|
123
123
|
|
124
124
|
module_function :id_lookup, :convenience_keys
|
data/lib/ohai/config.rb
CHANGED
@@ -31,29 +31,28 @@ module Ohai
|
|
31
31
|
# These methods need to be defined before they are used as config defaults,
|
32
32
|
# otherwise they will get method_missing'd to nil.
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
[ File.expand_path(File.join(File.dirname(__FILE__), "plugins")) ]
|
42
|
-
end
|
34
|
+
class << self
|
35
|
+
def merge_deprecated_config
|
36
|
+
[ :hints_path, :plugin_path ].each do |option|
|
37
|
+
if has_key?(option) && send(option) != send("default_#{option}".to_sym)
|
38
|
+
Ohai::Log.warn(option_deprecated(option))
|
39
|
+
end
|
40
|
+
end
|
43
41
|
|
44
|
-
|
42
|
+
ohai.merge!(configuration)
|
43
|
+
end
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
[ :hints_path, :plugin_path ].each do |option|
|
49
|
-
if has_key?(option) && send(option) != send("default_#{option}".to_sym)
|
50
|
-
Ohai::Log.warn(option_deprecated(option))
|
51
|
-
end
|
45
|
+
def default_hints_path
|
46
|
+
[ ChefConfig::Config.platform_specific_path("/etc/chef/ohai/hints") ]
|
52
47
|
end
|
53
48
|
|
54
|
-
|
49
|
+
def default_plugin_path
|
50
|
+
[ File.expand_path(File.join(File.dirname(__FILE__), "plugins")) ]
|
51
|
+
end
|
55
52
|
end
|
56
53
|
|
54
|
+
# Copy deprecated configuration options into the ohai config context.
|
55
|
+
|
57
56
|
# Keep "old" config defaults around so anyone calling Ohai::Config[:key]
|
58
57
|
# won't be broken. Also allows users to append to configuration options
|
59
58
|
# (e.g., Ohai::Config[:plugin_path] << some_path) in their config files.
|
@@ -86,8 +85,11 @@ module Ohai
|
|
86
85
|
# Furthermore, when the top-level config settings are removed we will
|
87
86
|
# need to ensure that Ohai.config[:log_level] can be set by writing
|
88
87
|
# log_level in a configuration file for consistent behavior with chef.
|
89
|
-
deprecation_warning = [ :log_level, :log_location ].include?(value)
|
90
|
-
|
88
|
+
deprecation_warning = if [ :log_level, :log_location ].include?(value)
|
89
|
+
option_might_be_deprecated(option)
|
90
|
+
else
|
91
|
+
option_deprecated(option)
|
92
|
+
end
|
91
93
|
Ohai::Log.warn(deprecation_warning)
|
92
94
|
value
|
93
95
|
end
|
@@ -102,22 +104,22 @@ module Ohai
|
|
102
104
|
default :plugin_path, Ohai::Config.default_plugin_path
|
103
105
|
end
|
104
106
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
<<-EOM.chomp!.tr("\n", " ")
|
107
|
+
class << self
|
108
|
+
def option_deprecated(option)
|
109
|
+
<<-EOM.chomp!.tr("\n", " ")
|
109
110
|
Ohai::Config[:#{option}] is set. Ohai::Config[:#{option}] is deprecated and will
|
110
111
|
be removed in future releases of ohai. Use ohai.#{option} in your configuration
|
111
112
|
file to configure :#{option} for ohai.
|
112
|
-
EOM
|
113
|
-
|
113
|
+
EOM
|
114
|
+
end
|
114
115
|
|
115
|
-
|
116
|
-
|
116
|
+
def option_might_be_deprecated(option)
|
117
|
+
option_deprecated(option) + <<-EOM.chomp!.tr("\n", " ")
|
117
118
|
If your configuration file is used with other applications which configure
|
118
119
|
:#{option}, and you have not configured Ohai::Config[:#{option}], you may
|
119
120
|
disregard this warning.
|
120
|
-
EOM
|
121
|
+
EOM
|
122
|
+
end
|
121
123
|
end
|
122
124
|
end
|
123
125
|
|
data/lib/ohai/loader.rb
CHANGED
@@ -35,7 +35,7 @@ module Ohai
|
|
35
35
|
# specified by calling `require_plugin` with a relative path. To manage
|
36
36
|
# this, we track the path and root of each file as we discover them so we
|
37
37
|
# can feed this into the v6 "dependency solver" as we load them.
|
38
|
-
|
38
|
+
PluginFile = Struct.new(:path, :plugin_root) do
|
39
39
|
|
40
40
|
# Finds all the *.rb files under the configured paths in :plugin_path
|
41
41
|
def self.find_all_in(plugin_dir)
|
data/lib/ohai/mixin/command.rb
CHANGED
@@ -177,7 +177,7 @@ module Ohai
|
|
177
177
|
$VERBOSE = nil
|
178
178
|
ps.last.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
179
179
|
|
180
|
-
cid = fork
|
180
|
+
cid = fork do
|
181
181
|
Process.setsid
|
182
182
|
|
183
183
|
pw.last.close
|
@@ -226,7 +226,7 @@ module Ohai
|
|
226
226
|
end
|
227
227
|
ps.last.close unless ps.last.closed?
|
228
228
|
exit!
|
229
|
-
|
229
|
+
end
|
230
230
|
ensure
|
231
231
|
$VERBOSE = verbose
|
232
232
|
end
|
data/lib/ohai/plugins/dmi.rb
CHANGED
@@ -75,7 +75,7 @@ Ohai.plugin(:DMI) do
|
|
75
75
|
|
76
76
|
elsif handle = handle_line.match(line)
|
77
77
|
# Don't overcapture for now (OHAI-260)
|
78
|
-
unless Ohai::Common::DMI::
|
78
|
+
unless Ohai::Common::DMI::ID_TO_CAPTURE.include?(handle[2].to_i)
|
79
79
|
dmi_record = nil
|
80
80
|
next
|
81
81
|
end
|
@@ -24,10 +24,10 @@ Ohai.plugin(:IpScopes) do
|
|
24
24
|
begin
|
25
25
|
require "ipaddr_extensions"
|
26
26
|
|
27
|
-
network["interfaces"].keys.sort.each do |
|
28
|
-
next if network["interfaces"][
|
27
|
+
network["interfaces"].keys.sort.each do |if_name|
|
28
|
+
next if network["interfaces"][if_name]["addresses"].nil?
|
29
29
|
|
30
|
-
interface = network["interfaces"][
|
30
|
+
interface = network["interfaces"][if_name]
|
31
31
|
interface["addresses"].each do |address, attrs|
|
32
32
|
begin
|
33
33
|
attrs["ip_scope"] = address.to_ip.scope
|
data/lib/ohai/plugins/kernel.rb
CHANGED
@@ -156,6 +156,10 @@ Ohai.plugin(:Kernel) do
|
|
156
156
|
so = shell_out("uname -s")
|
157
157
|
kernel[:os] = so.stdout.split($/)[0]
|
158
158
|
|
159
|
+
so = File.open("/etc/release") { |file| file.gets }
|
160
|
+
md = /(?<update>\d.*\d)/.match(so)
|
161
|
+
kernel[:update] = md[:update] if md
|
162
|
+
|
159
163
|
modules = Mash.new
|
160
164
|
|
161
165
|
so = shell_out("modinfo")
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Davide Cavalca (<dcavalca@fb.com>)
|
3
|
+
# Copyright:: Copyright (c) 2016 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(:Hostnamectl) do
|
20
|
+
provides "hostnamectl"
|
21
|
+
|
22
|
+
collect_data(:linux) do
|
23
|
+
hostnamectl Mash.new unless hostnamectl
|
24
|
+
|
25
|
+
hostnamectl_path = which("hostnamectl")
|
26
|
+
if hostnamectl_path
|
27
|
+
hostnamectl_cmd = shell_out(hostnamectl_path)
|
28
|
+
hostnamectl_cmd.stdout.split("\n").each do |line|
|
29
|
+
key, val = line.split(":")
|
30
|
+
hostnamectl[key.chomp.lstrip.tr(" ", "_").downcase] = val.chomp.lstrip
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Davide Cavalca (<dcavalca@fb.com>)
|
3
|
+
# Copyright:: Copyright (c) 2016 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(:Machineid) do
|
20
|
+
provides "machine_id"
|
21
|
+
|
22
|
+
collect_data(:linux) do
|
23
|
+
mid = nil
|
24
|
+
|
25
|
+
if File.exists?("/etc/machine-id")
|
26
|
+
mid = File.read("/etc/machine-id").chomp
|
27
|
+
elsif File.exists?("/var/lib/dbus/machine-id")
|
28
|
+
mid = File.read("/var/lib/dbus/machine-id").chomp
|
29
|
+
end
|
30
|
+
|
31
|
+
if mid
|
32
|
+
machine_id mid
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -380,7 +380,7 @@ Ohai.plugin(:Network) do
|
|
380
380
|
end
|
381
381
|
|
382
382
|
def interface_address_not_link_level?(iface, address)
|
383
|
-
iface[:addresses][address][:scope].
|
383
|
+
!iface[:addresses][address][:scope].casecmp("link").zero?
|
384
384
|
end
|
385
385
|
|
386
386
|
def interface_valid_for_route?(iface, address, family)
|
@@ -194,5 +194,15 @@ Ohai.plugin(:Virtualization) do
|
|
194
194
|
virtualization[:role] = "guest"
|
195
195
|
virtualization[:systems][:docker] = "guest"
|
196
196
|
end
|
197
|
+
|
198
|
+
# Detect LXD
|
199
|
+
# See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
|
200
|
+
if File.exist?("/dev/lxd/sock")
|
201
|
+
virtualization[:system] = "lxd"
|
202
|
+
virtualization[:role] = "guest"
|
203
|
+
elsif File.exist?("/var/lib/lxd/devlxd")
|
204
|
+
virtualization[:system] = "lxd"
|
205
|
+
virtualization[:role] = "host"
|
206
|
+
end
|
197
207
|
end
|
198
208
|
end
|
@@ -38,7 +38,7 @@ Ohai.plugin(:Rackspace) do
|
|
38
38
|
def has_rackspace_metadata?
|
39
39
|
so = shell_out("xenstore-read vm-data/provider_data/provider")
|
40
40
|
if so.exitstatus == 0
|
41
|
-
so.stdout.strip.
|
41
|
+
so.stdout.strip.casecmp("rackspace").zero?
|
42
42
|
end
|
43
43
|
rescue Ohai::Exceptions::Exec
|
44
44
|
false
|
@@ -115,9 +115,9 @@ Ohai.plugin(:Rackspace) do
|
|
115
115
|
if so.exitstatus == 0
|
116
116
|
networks = []
|
117
117
|
so.stdout.split("\n").map { |l| l.split("=").first.strip }.map do |item|
|
118
|
-
|
119
|
-
if
|
120
|
-
networks.push(FFI_Yajl::Parser.new.parse(
|
118
|
+
so = shell_out("xenstore-read vm-data/networking/#{item}")
|
119
|
+
if so.exitstatus == 0
|
120
|
+
networks.push(FFI_Yajl::Parser.new.parse(so.stdout))
|
121
121
|
else
|
122
122
|
Ohai::Log.debug("rackspace plugin: Unable to capture custom private networking information for Rackspace cloud")
|
123
123
|
return false
|
@@ -129,7 +129,7 @@ Ohai.plugin(:DMI) do
|
|
129
129
|
id = smb_to_id[header_information[3]]
|
130
130
|
|
131
131
|
# Don't overcapture for now (OHAI-260)
|
132
|
-
unless Ohai::Common::DMI::
|
132
|
+
unless Ohai::Common::DMI::ID_TO_CAPTURE.include?(id)
|
133
133
|
dmi_record = nil
|
134
134
|
next
|
135
135
|
end
|
@@ -44,10 +44,10 @@ Ohai.plugin(:Filesystem) do
|
|
44
44
|
so.stdout.lines do |line|
|
45
45
|
next unless line =~ /^(.+?)\s*: (\S+)\s*$/
|
46
46
|
mount = $1
|
47
|
-
fs.each
|
47
|
+
fs.each do |filesystem, fs_attributes|
|
48
48
|
next unless fs_attributes[:mount] == mount
|
49
49
|
fs[filesystem][:fs_type] = $2
|
50
|
-
|
50
|
+
end
|
51
51
|
end
|
52
52
|
|
53
53
|
# Grab mount information from /bin/mount
|
@@ -82,7 +82,7 @@ Ohai.plugin(:Filesystem) do
|
|
82
82
|
zfs[filesystem][:sources][$2] = $4.chomp
|
83
83
|
end
|
84
84
|
|
85
|
-
zfs.each
|
85
|
+
zfs.each do |filesystem, attributes|
|
86
86
|
fs[filesystem] = Mash.new unless fs.has_key?(filesystem)
|
87
87
|
fs[filesystem][:fs_type] = "zfs"
|
88
88
|
fs[filesystem][:mount] = attributes[:values][:mountpoint] if attributes[:values].has_key?("mountpoint")
|
@@ -91,14 +91,14 @@ Ohai.plugin(:Filesystem) do
|
|
91
91
|
# find all zfs parents
|
92
92
|
parents = filesystem.split("/")
|
93
93
|
zfs_parents = []
|
94
|
-
(0..parents.length - 1).to_a.each
|
94
|
+
(0..parents.length - 1).to_a.each do |parent_indexes|
|
95
95
|
next_parent = parents[0..parent_indexes].join("/")
|
96
96
|
zfs_parents.push(next_parent)
|
97
|
-
|
97
|
+
end
|
98
98
|
zfs_parents.pop
|
99
99
|
fs[filesystem][:zfs_parents] = zfs_parents
|
100
100
|
fs[filesystem][:zfs_zpool] = (zfs_parents.length == 0)
|
101
|
-
|
101
|
+
end
|
102
102
|
|
103
103
|
# Set the filesystem data
|
104
104
|
filesystem fs
|
@@ -170,14 +170,14 @@ Ohai.plugin(:Network) do
|
|
170
170
|
matches = /interface: (?<name>\S+)\s+index\s+(?<index>\d+)/.match(line)
|
171
171
|
if matches
|
172
172
|
network[:default_interface] =
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
173
|
+
case
|
174
|
+
when iface[matches[:name]]
|
175
|
+
matches[:name]
|
176
|
+
when int_name = full_interface_name(iface, matches[:name], matches[:index])
|
177
|
+
int_name
|
178
|
+
else
|
179
|
+
matches[:name]
|
180
|
+
end
|
181
181
|
Ohai::Log.debug("found interface device: #{network[:default_interface]} #{matches[:name]}")
|
182
182
|
end
|
183
183
|
matches = /gateway: (\S+)/.match(line)
|
@@ -54,9 +54,11 @@ Ohai.plugin(:CPU) do
|
|
54
54
|
cpu[current_cpu]["vendor_id"] = processor["manufacturer"]
|
55
55
|
cpu[current_cpu]["family"] = processor["family"].to_s
|
56
56
|
cpu[current_cpu]["model"] = processor["revision"].to_s
|
57
|
-
cpu[current_cpu]["stepping"] = processor["stepping"].nil?
|
58
|
-
|
59
|
-
|
57
|
+
cpu[current_cpu]["stepping"] = if processor["stepping"].nil?
|
58
|
+
processor["description"].match(/Stepping\s+(\d+)/)[1]
|
59
|
+
else
|
60
|
+
processor["stepping"]
|
61
|
+
end
|
60
62
|
cpu[current_cpu]["physical_id"] = processor["deviceid"]
|
61
63
|
cpu[current_cpu]["model_name"] = processor["description"]
|
62
64
|
cpu[current_cpu]["mhz"] = processor["maxclockspeed"].to_s
|