ohai 16.5.6 → 16.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -0
  3. data/lib/ohai/application.rb +39 -0
  4. data/lib/ohai/common/dmi.rb +7 -3
  5. data/lib/ohai/dsl/plugin.rb +7 -0
  6. data/lib/ohai/dsl/plugin/versionvii.rb +27 -15
  7. data/lib/ohai/mixin/chef_utils_wiring.rb +13 -1
  8. data/lib/ohai/mixin/os.rb +66 -1
  9. data/lib/ohai/mixin/train_helpers.rb +35 -0
  10. data/lib/ohai/plugins/azure.rb +24 -4
  11. data/lib/ohai/plugins/bsd/virtualization.rb +1 -1
  12. data/lib/ohai/plugins/chef.rb +1 -1
  13. data/lib/ohai/plugins/cpu.rb +4 -4
  14. data/lib/ohai/plugins/darwin/virtualization.rb +1 -1
  15. data/lib/ohai/plugins/dmi.rb +1 -1
  16. data/lib/ohai/plugins/ec2.rb +13 -7
  17. data/lib/ohai/plugins/filesystem.rb +3 -3
  18. data/lib/ohai/plugins/gce.rb +2 -2
  19. data/lib/ohai/plugins/init_package.rb +1 -1
  20. data/lib/ohai/plugins/joyent.rb +2 -2
  21. data/lib/ohai/plugins/kernel.rb +7 -3
  22. data/lib/ohai/plugins/linux/block_device.rb +8 -8
  23. data/lib/ohai/plugins/linux/interrupts.rb +3 -3
  24. data/lib/ohai/plugins/linux/lsb.rb +3 -3
  25. data/lib/ohai/plugins/linux/machineid.rb +4 -4
  26. data/lib/ohai/plugins/linux/mdadm.rb +2 -2
  27. data/lib/ohai/plugins/linux/memory.rb +1 -1
  28. data/lib/ohai/plugins/linux/network.rb +3 -3
  29. data/lib/ohai/plugins/linux/platform.rb +29 -29
  30. data/lib/ohai/plugins/linux/virtualization.rb +23 -23
  31. data/lib/ohai/plugins/ohai_time.rb +1 -1
  32. data/lib/ohai/plugins/os.rb +4 -0
  33. data/lib/ohai/plugins/passwd.rb +57 -1
  34. data/lib/ohai/plugins/scaleway.rb +1 -1
  35. data/lib/ohai/plugins/shells.rb +2 -2
  36. data/lib/ohai/plugins/solaris2/dmi.rb +1 -1
  37. data/lib/ohai/plugins/solaris2/platform.rb +2 -2
  38. data/lib/ohai/plugins/solaris2/virtualization.rb +1 -1
  39. data/lib/ohai/plugins/ssh_host_key.rb +12 -12
  40. data/lib/ohai/plugins/train.rb +35 -0
  41. data/lib/ohai/plugins/uptime.rb +1 -1
  42. data/lib/ohai/plugins/vmware.rb +1 -1
  43. data/lib/ohai/runner.rb +4 -0
  44. data/lib/ohai/system.rb +32 -4
  45. data/lib/ohai/train_transport.rb +28 -0
  46. data/lib/ohai/version.rb +1 -1
  47. data/ohai.gemspec +2 -1
  48. metadata +20 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bdf73dcd0e2c5c510ea32c222ba7d1af4518248bd7da383e830950fc6abae14f
4
- data.tar.gz: 670279df5019b42e10a62ccfef09a1c14ad23037ec419da228c5dc15ec9f3a9e
3
+ metadata.gz: 86cf0dbd863325b1c5104d78cb1b848d924bfc1c67375df2f42d4cc855cccf1a
4
+ data.tar.gz: 20131622886b909b75708612f8340e59366f9d74b109f4f4176e34b6578f750c
5
5
  SHA512:
6
- metadata.gz: 573ca2d973a564ca588904e7230f5db4c3aa5a97bdbbcafc8a833830a5530348b9c824a172b0e72bfe672393213e19dd276cabbbe054968a41dabe905a84f523
7
- data.tar.gz: ee0d263f7213fae70cb7d6a9230103cc5112d54b48669b1b17276dd873117e420222c418646ec5283c93be268083ad09103df0d62f3ffac9215173eb33979ca3
6
+ metadata.gz: 142be9e566d266d83e0561a662e5170c5d4b497d044279b51360393c9956004a4217ef5a3151d93f139fcd30fd9c6c07c35c9dde5d4e8b53c6b91532d3b884ce
7
+ data.tar.gz: 30d6872cb01724ae5bc88f1f65aa7b5693a47502be8f94492c28367c8408cd1fe82278efd1dc3e70ff9cbb83ea9ba9bd74ff4be2a850c9bf764b33c17d19297a
data/Gemfile CHANGED
@@ -2,6 +2,10 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ # pull these gems from master of chef/chef so that we're testing against what we will release
6
+ gem "chef-config", git: "https://github.com/chef/chef", glob: "chef-config/chef-config.gemspec"
7
+ gem "chef-utils", git: "https://github.com/chef/chef", glob: "chef-utils/chef-utils.gemspec"
8
+
5
9
  # NOTE: do not submit PRs to add pry as a dep, add to your Gemfile.local
6
10
  group :development do
7
11
  gem "chefstyle", git: "https://github.com/chef/chefstyle.git", branch: "master"
@@ -56,6 +56,15 @@ class Ohai::Application
56
56
  description: "Set the log file location, defaults to STDOUT - recommended for daemonizing",
57
57
  proc: nil
58
58
 
59
+ option :target,
60
+ short: "-t TARGET",
61
+ long: "--target TARGET",
62
+ description: "Target Ohai against a remote system or device",
63
+ proc: lambda { |target|
64
+ Ohai::Log.warn "-- EXPERIMENTAL -- Target mode activated -- EXPERIMENTAL --"
65
+ target
66
+ }
67
+
59
68
  option :help,
60
69
  short: "-h",
61
70
  long: "--help",
@@ -93,9 +102,39 @@ class Ohai::Application
93
102
 
94
103
  load_workstation_config
95
104
 
105
+ merge_configs
106
+
107
+ if config[:target]
108
+ Ohai::Config.target_mode.host = config[:target]
109
+ if URI.parse(Ohai::Config.target_mode.host).scheme
110
+ train_config = Train.unpack_target_from_uri(Ohai::Config.target_mode.host)
111
+ Ohai::Config.target_mode = train_config
112
+ end
113
+ Ohai::Config.target_mode.enabled = true
114
+ Ohai::Config.node_name = Ohai::Config.target_mode.host unless Ohai::Config.node_name
115
+ end
116
+
96
117
  Ohai::Log.init(Ohai.config[:log_location])
97
118
  end
98
119
 
120
+ # @api private
121
+ def config_file_defaults
122
+ Ohai::Config.save(true)
123
+ end
124
+
125
+ # @api private
126
+ def config_file_settings
127
+ Ohai::Config.save(false)
128
+ end
129
+
130
+ # See lib/chef/knife.rb in the chef/chef github repo
131
+ #
132
+ # @api private
133
+ def merge_configs
134
+ config.replace(config_file_defaults.merge(default_config).merge(config_file_settings).merge(config))
135
+ Ohai::Config.merge!(config) # make them both the same
136
+ end
137
+
99
138
  # Passes config and attributes arguments to Ohai::System then prints the results.
100
139
  # Called by the run method after config / logging have been initialized
101
140
  #
@@ -76,11 +76,11 @@ module Ohai
76
76
  # away some of the less useful IDs
77
77
  ID_TO_CAPTURE = [ 0, 1, 2, 3, 4, 6, 11 ].freeze
78
78
 
79
- # the whitelisted DMI IDs. This is combination of the defaults + any additional
79
+ # the allowlisted DMI IDs. This is combination of the defaults + any additional
80
80
  # IDs defined in the :additional_dmi_ids config
81
81
  #
82
82
  # @return [Array] the list of DMI IDs to capture
83
- def whitelisted_ids
83
+ def allowlisted_ids
84
84
  if Ohai.config[:additional_dmi_ids]
85
85
  if [ Integer, Array ].include?(Ohai.config[:additional_dmi_ids].class)
86
86
  return ID_TO_CAPTURE + Array(Ohai.config[:additional_dmi_ids])
@@ -91,6 +91,10 @@ module Ohai
91
91
  ID_TO_CAPTURE
92
92
  end
93
93
 
94
+ ##
95
+ # @deprecated Use the `allowlisted_ids` method instead.
96
+ alias whitelisted_ids allowlisted_ids
97
+
94
98
  # the human readable description from a DMI ID
95
99
  #
96
100
  # @param id [String, Integer] the ID to lookup
@@ -152,7 +156,7 @@ module Ohai
152
156
  end
153
157
  end
154
158
 
155
- module_function :id_lookup, :convenience_keys, :whitelisted_ids
159
+ module_function :id_lookup, :convenience_keys, :allowlisted_ids, :whitelisted_ids
156
160
  end
157
161
  end
158
162
  end
@@ -22,6 +22,7 @@ require_relative "../mixin/os"
22
22
  require_relative "../mixin/shell_out"
23
23
  require_relative "../mixin/seconds_to_human"
24
24
  require_relative "../mixin/which"
25
+ require_relative "../mixin/train_helpers"
25
26
  require_relative "../hints"
26
27
 
27
28
  module Ohai
@@ -86,10 +87,12 @@ module Ohai
86
87
  include Ohai::Mixin::ShellOut
87
88
  include Ohai::Mixin::SecondsToHuman
88
89
  include Ohai::Mixin::Which
90
+ include Ohai::Mixin::TrainHelpers
89
91
 
90
92
  attr_reader :data
91
93
  attr_reader :failed
92
94
  attr_reader :logger
95
+ attr_accessor :transport_connection
93
96
 
94
97
  def initialize(data, logger)
95
98
  @data = data
@@ -98,6 +101,10 @@ module Ohai
98
101
  @failed = false
99
102
  end
100
103
 
104
+ def target_mode?
105
+ !!@transport_connection
106
+ end
107
+
101
108
  def run
102
109
  @has_run = true
103
110
 
@@ -46,7 +46,8 @@ module Ohai
46
46
  :version7
47
47
  end
48
48
 
49
- # the source of the plugin on disk. This is an array since a plugin may exist for multiple platforms and this would include each of those platform specific file paths
49
+ # The source of the plugin on disk. This is an array since a plugin may exist for multiple
50
+ # oses and this would include each of those os specific file paths
50
51
  #
51
52
  # @return [Array]
52
53
  def self.sources
@@ -61,7 +62,7 @@ module Ohai
61
62
  @depends_attrs ||= []
62
63
  end
63
64
 
64
- # A block per platform for actually performing data collection constructed
65
+ # A block per os for actually performing data collection constructed
65
66
  # by the collect_data method
66
67
  #
67
68
  # @return [Mash]
@@ -101,15 +102,16 @@ module Ohai
101
102
  !!@optional
102
103
  end
103
104
 
104
- # define data collection methodology per platform
105
+ # define data collection methodology per os
105
106
  #
106
- # @param platform [Symbol] the platform to collect data for
107
- # @param other_platforms [Array] additional platforms to collect data for
108
- # @param block [block] the actual code to collect data for the specified platforms
109
- def self.collect_data(platform = :default, *other_platforms, &block)
110
- [platform, other_platforms].flatten.each do |plat|
111
- Ohai::Log.warn("collect_data already defined on platform '#{plat}' for #{self}, last plugin seen will be used") if data_collector.key?(plat)
112
- data_collector[plat] = block
107
+ # @param os [Array<Symbol>] the list of oses to collect data for
108
+ # @param block [block] the actual code to collect data for the specified os
109
+ #
110
+ def self.collect_data(*os_list, &block)
111
+ os_list = [ :default ] if os_list.empty?
112
+ os_list.flatten.each do |os|
113
+ Ohai::Log.warn("collect_data already defined on os '#{os}' for #{self}, last plugin seen will be used") if data_collector.key?(os)
114
+ data_collector[os] = block
113
115
  end
114
116
  end
115
117
 
@@ -120,12 +122,22 @@ module Ohai
120
122
 
121
123
  def run_plugin
122
124
  collector = self.class.data_collector
123
- platform = collect_os
124
-
125
- if collector.key?(platform)
126
- instance_eval(&collector[platform])
127
- elsif collector.key?(:default)
125
+ os = collect_os
126
+
127
+ # :default - means any remote or local unix or windows host
128
+ # :target - means any remote API which is not unix/windows or otherwise rubyable (cisco switches, IPMI console, HTTP API, etc)
129
+ #
130
+ # Do not be confused by the fact that collectors tagged :target do not run against e.g. target-mode ubuntu boxes, that is not
131
+ # what :target is intended for. Also, do not be confused by the fact that collectors tagged :default do not run by default against
132
+ # pure-target mode targets like switches. That is all intended behavior, the names are problematic. The :default nomenclature was
133
+ # invented 10 years before target mode and we are stuck with it.
134
+ #
135
+ if collector.key?(os)
136
+ instance_eval(&collector[os])
137
+ elsif collector.key?(:default) && !nonruby_target?
128
138
  instance_eval(&collector[:default])
139
+ elsif collector.key?(:target) && nonruby_target?
140
+ instance_eval(&collector[:target])
129
141
  else
130
142
  logger.trace("Plugin #{name}: No data to collect. Skipping...")
131
143
  end
@@ -16,6 +16,7 @@
16
16
  #
17
17
 
18
18
  require_relative "../config"
19
+ require "singleton" unless defined?(Singleton)
19
20
 
20
21
  module Ohai
21
22
  module Mixin
@@ -32,7 +33,18 @@ module Ohai
32
33
  end
33
34
 
34
35
  def __transport_connection
35
- # Chef.run_context&.transport_connection
36
+ transport_connection
37
+ end
38
+
39
+ # because of target mode we cache the PATH to avoid massive amounts of `echo $PATH` remote queries
40
+ #
41
+ def __env_path
42
+ PathCache.instance.path_cache ||= super
43
+ end
44
+
45
+ class PathCache
46
+ include Singleton
47
+ attr_accessor :path_cache
36
48
  end
37
49
  end
38
50
  end
@@ -27,6 +27,71 @@ module Ohai
27
27
  #
28
28
  # @return [String] the OS
29
29
  def collect_os
30
+ if target_mode?
31
+ collect_os_target
32
+ else
33
+ collect_os_local
34
+ end
35
+ end
36
+
37
+ # This should exactly preserve the semantics of collect_os_local below, which is authoritative
38
+ # for the API and must adhere to pre-existing ohai semantics and not follow inspec's notion of
39
+ # os/family/hierarchy.
40
+ #
41
+ # Right or wrong the ohai `os` variable has matched the ruby `host_os` definition for the past
42
+ # 10+ years, preceding inspec/train's definitions and this is the documented correct API of
43
+ # these methods. Mismatches between the ruby notion and the train version will be fixed as
44
+ # bugfixes in these methods and may not be considered semver violating even though they make
45
+ # break downstream consumers. Please ensure that both methods produce the same results if
46
+ # you are on a platform which supports running ruby (train is considered authoritative for
47
+ # any "OS" which cannot run ruby -- server consoles, REST APIs, etc...)
48
+ #
49
+ # @api private
50
+ def collect_os_target
51
+ case
52
+ when transport_connection.os.aix?
53
+ "aix"
54
+ when transport_connection.os.darwin?
55
+ "darwin"
56
+ when transport_connection.os.linux?
57
+ "linux"
58
+ when transport_connection.os.family == "freebsd"
59
+ "freebsd"
60
+ when transport_connection.os.family == "openbsd"
61
+ "openbsd"
62
+ when transport_connection.os.family == "netbsd"
63
+ "netbsd"
64
+ when transport_connection.os.family == "dragonflybsd"
65
+ "dragonflybsd"
66
+ when transport_connection.os.solaris?
67
+ "solaris2"
68
+ when transport_connection.os.windows?
69
+ "windows"
70
+
71
+ #
72
+ # The purpose of the next two lines is that anything which runs Unix is presumed to be able to run ruby, and
73
+ # if it was not caught above, we MUST translate whatever train uses as the 'os' into the proper ruby host_os
74
+ # string. If it is not unix and not caught above we assume it is something like a REST API which cannot run
75
+ # ruby. If these assumptions are incorrect then it is a bug, which should be submitted to fix it, and the
76
+ # values should not be relied upon until that bug is fixed. The train os is NEVER considered authoritative
77
+ # for any target which can run ruby.
78
+ #
79
+ when transport_connection.os.unix?
80
+ raise "Target mode unsupported on this Unix-like host, please update the collect_os_target case statement with the correct ruby host_os value."
81
+ else
82
+ # now we have something like an IPMI console that isn't Unix-like or Windows, presumably cannot run ruby, and
83
+ # so we just trust the train O/S information.
84
+ transport_connection.os
85
+ end
86
+ end
87
+
88
+ # @api private
89
+ def nonruby_target?
90
+ transport_connection && !transport_connection.os.unix? && !transport_connection.os.windows
91
+ end
92
+
93
+ # @api private
94
+ def collect_os_local
30
95
  case ::RbConfig::CONFIG["host_os"]
31
96
  when /aix(.+)$/
32
97
  "aix"
@@ -56,7 +121,7 @@ module Ohai
56
121
  end
57
122
  end
58
123
 
59
- module_function :collect_os
124
+ extend self
60
125
  end
61
126
  end
62
127
  end
@@ -0,0 +1,35 @@
1
+ #
2
+ # Copyright:: Copyright (c) Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "chef-utils/dsl/train_helpers" unless defined?(ChefUtils::DSL::TrainHelpers)
18
+ require_relative "chef_utils_wiring" unless defined?(Ohai::Mixin::ChefUtilsWiring)
19
+
20
+ module Ohai
21
+ module Mixin
22
+ module TrainHelpers
23
+ include ChefUtils::DSL::TrainHelpers
24
+ include ChefUtilsWiring
25
+
26
+ # anything added to this file temporarily should be pushed back up
27
+ # into ChefUtils::DSL::TrainHelpers
28
+
29
+ # XXX: this needs better support directly in train
30
+ def dir_glob(path)
31
+ shell_out!("ls -d #{path}").stdout.split
32
+ end
33
+ end
34
+ end
35
+ end
@@ -34,7 +34,7 @@ Ohai.plugin(:Azure) do
34
34
  azure Mash.new
35
35
  azure_metadata_from_hints.each { |k, v| azure[k] = v }
36
36
  azure["metadata"] = parse_metadata
37
- elsif has_waagent? || has_dhcp_option_245?
37
+ elsif has_waagent? || has_dhcp_option_245? || has_reddog_dhcp_domain?
38
38
  logger.trace("Plugin Azure: No hints present, but system appears to be on Azure.")
39
39
  azure Mash.new
40
40
  azure["metadata"] = parse_metadata
@@ -47,7 +47,7 @@ Ohai.plugin(:Azure) do
47
47
  # check for either the waagent or the unknown-245 DHCP option that Azure uses
48
48
  # http://blog.mszcool.com/index.php/2015/04/detecting-if-a-virtual-machine-runs-in-microsoft-azure-linux-windows-to-protect-your-software-when-distributed-via-the-azure-marketplace/
49
49
  def has_waagent?
50
- if File.exist?("/usr/sbin/waagent") || Dir.exist?('C:\WindowsAzure')
50
+ if file_exist?("/usr/sbin/waagent") || dir_exist?('C:\WindowsAzure')
51
51
  logger.trace("Plugin Azure: Found waagent used by Azure.")
52
52
  true
53
53
  end
@@ -55,8 +55,8 @@ Ohai.plugin(:Azure) do
55
55
 
56
56
  def has_dhcp_option_245?
57
57
  has_245 = false
58
- if File.exist?("/var/lib/dhcp/dhclient.eth0.leases")
59
- File.open("/var/lib/dhcp/dhclient.eth0.leases").each do |line|
58
+ if file_exist?("/var/lib/dhcp/dhclient.eth0.leases")
59
+ file_open("/var/lib/dhcp/dhclient.eth0.leases").each do |line|
60
60
  if /unknown-245/.match?(line)
61
61
  logger.trace("Plugin Azure: Found unknown-245 DHCP option used by Azure.")
62
62
  has_245 = true
@@ -67,6 +67,26 @@ Ohai.plugin(:Azure) do
67
67
  has_245
68
68
  end
69
69
 
70
+ def has_reddog_dhcp_domain?
71
+ tcp_ip_dhcp_domain == "reddog.microsoft.com"
72
+ end
73
+
74
+ def tcp_ip_dhcp_domain
75
+ return unless RUBY_PLATFORM.match?(/mswin|mingw32|windows/)
76
+
77
+ require "win32/registry" unless defined?(Win32::Registry)
78
+
79
+ begin
80
+ key = Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters")
81
+ dhcp_domain = key["DhcpDomain"]
82
+ Ohai::Log.trace("Plugin Azure: DhcpDomain registry value is #{dhcp_domain}")
83
+ rescue Win32::Registry::Error
84
+ Ohai::Log.trace("Plugin Azure: DhcpDomain registry value cannot be found")
85
+ end
86
+
87
+ dhcp_domain
88
+ end
89
+
70
90
  # create the basic structure we'll store our data in
71
91
  def initialize_metadata_mash_compute
72
92
  metadata = Mash.new
@@ -66,7 +66,7 @@ Ohai.plugin(:Virtualization) do
66
66
  end
67
67
 
68
68
  # Detect bhyve by presence of /dev/vmm
69
- if File.exist?("/dev/vmm")
69
+ if file_exist?("/dev/vmm")
70
70
  virtualization[:system] = "bhyve"
71
71
  virtualization[:role] = "host"
72
72
  virtualization[:systems][:bhyve] = "host"
@@ -19,7 +19,7 @@
19
19
  Ohai.plugin(:Chef) do
20
20
  provides "chef_packages/chef"
21
21
 
22
- collect_data do
22
+ collect_data(:default, :target) do
23
23
  begin
24
24
  require "chef/version"
25
25
  rescue Gem::LoadError
@@ -30,7 +30,7 @@ Ohai.plugin(:CPU) do
30
30
  def parse_bsd_dmesg(&block)
31
31
  cpuinfo = Mash.new
32
32
  cpuinfo["flags"] = []
33
- File.open("/var/run/dmesg.boot").each do |line|
33
+ file_open("/var/run/dmesg.boot").each do |line|
34
34
  case line
35
35
  when /CPU:\s+(.+) \(([\d.]+).+\)/
36
36
  cpuinfo["model_name"] = $1
@@ -53,7 +53,7 @@ Ohai.plugin(:CPU) do
53
53
  cpu_number = 0
54
54
  current_cpu = nil
55
55
 
56
- File.open("/proc/cpuinfo").each do |line|
56
+ file_open("/proc/cpuinfo").each do |line|
57
57
  case line
58
58
  when /processor\s+:\s(.+)/
59
59
  cpuinfo[$1] = Mash.new
@@ -212,7 +212,7 @@ Ohai.plugin(:CPU) do
212
212
  # to scrape from dmesg.boot is the cpu feature list.
213
213
  # cpu0: FPU,V86,DE,PSE,TSC,MSR,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PAT,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,TM,SBF,EST,TM2
214
214
 
215
- File.open("/var/run/dmesg.boot").each do |line|
215
+ file_open("/var/run/dmesg.boot").each do |line|
216
216
  case line
217
217
  when /cpu\d+:\s+([A-Z]+$|[A-Z]+,.*$)/
218
218
  cpuinfo["flags"] = $1.downcase.split(",")
@@ -235,7 +235,7 @@ Ohai.plugin(:CPU) do
235
235
  # available instruction set
236
236
  # cpu0 at mainbus0 apid 0: Intel 686-class, 2134MHz, id 0x6f6
237
237
 
238
- File.open("/var/run/dmesg.boot").each do |line|
238
+ file_open("/var/run/dmesg.boot").each do |line|
239
239
  case line
240
240
  when /cpu[\d\w\s]+:\s([\w\s\-]+),\s+(\w+),/
241
241
  cpuinfo[:model_name] = $1