lib/ohai/system.rb in ohai-8.5.0 vs lib/ohai/system.rb in ohai-8.5.1
- old
+ new
@@ -1,204 +1,204 @@
-#
-# Author:: Adam Jacob (<adam@opscode.com>)
-# Copyright:: Copyright (c) 2008 Opscode, Inc.
-# License:: Apache License, Version 2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-require 'ohai/loader'
-require 'ohai/log'
-require 'ohai/mash'
-require 'ohai/runner'
-require 'ohai/dsl'
-require 'ohai/mixin/command'
-require 'ohai/mixin/os'
-require 'ohai/mixin/string'
-require 'ohai/mixin/constant_helper'
-require 'ohai/provides_map'
-require 'ohai/hints'
-require 'mixlib/shellout'
-
-module Ohai
- class System
- include Ohai::Mixin::ConstantHelper
-
- attr_accessor :data
- attr_reader :provides_map
- attr_reader :v6_dependency_solver
-
- def initialize
- @plugin_path = ""
- reset_system
- end
-
- def reset_system
- @data = Mash.new
- @provides_map = ProvidesMap.new
-
- @v6_dependency_solver = Hash.new
-
- @loader = Ohai::Loader.new(self)
- @runner = Ohai::Runner.new(self, true)
-
- Ohai::Hints.refresh_hints()
-
- # Remove the previously defined plugins
- recursive_remove_constants(Ohai::NamedPlugin)
- end
-
- def [](key)
- @data[key]
- end
-
- def all_plugins(attribute_filter=nil)
- # Reset the system when all_plugins is called since this function
- # can be run multiple times in order to pick up any changes in the
- # config or plugins with Chef.
- reset_system
-
- load_plugins
- run_plugins(true, attribute_filter)
- end
-
- def load_plugins
- @loader.load_all
- end
-
- def run_plugins(safe = false, attribute_filter = nil)
- # First run all the version 6 plugins
- @v6_dependency_solver.values.each do |v6plugin|
- @runner.run_plugin(v6plugin)
- end
-
- # Users who are migrating from ohai 6 may give one or more Ohai 6 plugin
- # names as the +attribute_filter+. In this case we return early because
- # the v7 plugin provides map will not have an entry for this plugin.
- if attribute_filter and Array(attribute_filter).all? {|filter_item| have_v6_plugin?(filter_item) }
- return true
- end
-
- # Then run all the version 7 plugins
- begin
- @provides_map.all_plugins(attribute_filter).each { |plugin|
- @runner.run_plugin(plugin)
- }
- rescue Ohai::Exceptions::AttributeNotFound, Ohai::Exceptions::DependencyCycle => e
- Ohai::Log.error("Encountered error while running plugins: #{e.inspect}")
- raise
- end
- end
-
- def have_v6_plugin?(name)
- @v6_dependency_solver.values.any? {|v6plugin| v6plugin.name == name }
- end
-
- def pathify_v6_plugin(plugin_name)
- path_components = plugin_name.split("::")
- File.join(path_components) + ".rb"
- end
-
- #
- # Below APIs are from V6.
- # Make sure that you are not breaking backwards compatibility
- # if you are changing any of the APIs below.
- #
- def require_plugin(plugin_ref, force=false)
- plugins = [ ]
- # This method is only callable by version 6 plugins.
- # First we check if there exists a v6 plugin that fulfills the dependency.
- if @v6_dependency_solver.has_key? pathify_v6_plugin(plugin_ref)
- # Note that: partial_path looks like Plugin::Name
- # keys for @v6_dependency_solver are in form 'plugin/name.rb'
- plugins << @v6_dependency_solver[pathify_v6_plugin(plugin_ref)]
- else
- # While looking up V7 plugins we need to convert the plugin_ref to an attribute.
- attribute = plugin_ref.gsub("::", "/")
- begin
- plugins = @provides_map.find_providers_for([attribute])
- rescue Ohai::Exceptions::AttributeNotFound
- Ohai::Log.debug("Can not find any v7 plugin that provides #{attribute}")
- plugins = [ ]
- end
- end
-
- if plugins.empty?
- raise Ohai::Exceptions::DependencyNotFound, "Can not find a plugin for dependency #{plugin_ref}"
- else
- plugins.each do |plugin|
- begin
- @runner.run_plugin(plugin)
- rescue SystemExit, Interrupt
- raise
- rescue Ohai::Exceptions::DependencyCycle, Ohai::Exceptions::AttributeNotFound => e
- Ohai::Log.error("Encountered error while running plugins: #{e.inspect}")
- raise
- rescue Exception,Errno::ENOENT => e
- Ohai::Log.debug("Plugin #{plugin.name} threw exception #{e.inspect} #{e.backtrace.join("\n")}")
- end
- end
- end
- end
-
- # Re-runs plugins that provide the attributes specified by
- # +attribute_filter+. If +attribute_filter+ is not given, re-runs all
- # plugins.
- #
- # Note that dependencies will not be re-run, so you must specify all of the
- # attributes you want refreshed in the +attribute_filter+
- #
- # This method takes a naive approach to v6 plugins: it simply re-runs all
- # of them whenever called.
- def refresh_plugins(attribute_filter=nil)
- Ohai::Hints.refresh_hints()
- @provides_map.all_plugins(attribute_filter).each do |plugin|
- plugin.reset!
- end
- run_plugins(true, attribute_filter)
- end
-
- #
- # Serialize this object as a hash
- #
- def to_json
- FFI_Yajl::Encoder.new.encode(@data)
- end
-
- #
- # Pretty Print this object as JSON
- #
- def json_pretty_print(item=nil)
- FFI_Yajl::Encoder.new(pretty: true, validate_utf8: false).encode(item || @data)
- end
-
- def attributes_print(a)
- data = @data
- a.split("/").each do |part|
- data = data[part]
- end
- raise ArgumentError, "I cannot find an attribute named #{a}!" if data.nil?
- case data
- when Hash,Mash,Array,Fixnum
- json_pretty_print(data)
- when String
- if data.respond_to?(:lines)
- json_pretty_print(data.lines.to_a)
- else
- json_pretty_print(data.to_a)
- end
- else
- raise ArgumentError, "I can only generate JSON for Hashes, Mashes, Arrays and Strings. You fed me a #{data.class}!"
- end
- end
- end
-end
+#
+# Author:: Adam Jacob (<adam@opscode.com>)
+# Copyright:: Copyright (c) 2008 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'ohai/loader'
+require 'ohai/log'
+require 'ohai/mash'
+require 'ohai/runner'
+require 'ohai/dsl'
+require 'ohai/mixin/command'
+require 'ohai/mixin/os'
+require 'ohai/mixin/string'
+require 'ohai/mixin/constant_helper'
+require 'ohai/provides_map'
+require 'ohai/hints'
+require 'mixlib/shellout'
+
+module Ohai
+ class System
+ include Ohai::Mixin::ConstantHelper
+
+ attr_accessor :data
+ attr_reader :provides_map
+ attr_reader :v6_dependency_solver
+
+ def initialize
+ @plugin_path = ""
+ reset_system
+ end
+
+ def reset_system
+ @data = Mash.new
+ @provides_map = ProvidesMap.new
+
+ @v6_dependency_solver = Hash.new
+
+ @loader = Ohai::Loader.new(self)
+ @runner = Ohai::Runner.new(self, true)
+
+ Ohai::Hints.refresh_hints()
+
+ # Remove the previously defined plugins
+ recursive_remove_constants(Ohai::NamedPlugin)
+ end
+
+ def [](key)
+ @data[key]
+ end
+
+ def all_plugins(attribute_filter=nil)
+ # Reset the system when all_plugins is called since this function
+ # can be run multiple times in order to pick up any changes in the
+ # config or plugins with Chef.
+ reset_system
+
+ load_plugins
+ run_plugins(true, attribute_filter)
+ end
+
+ def load_plugins
+ @loader.load_all
+ end
+
+ def run_plugins(safe = false, attribute_filter = nil)
+ # First run all the version 6 plugins
+ @v6_dependency_solver.values.each do |v6plugin|
+ @runner.run_plugin(v6plugin)
+ end
+
+ # Users who are migrating from ohai 6 may give one or more Ohai 6 plugin
+ # names as the +attribute_filter+. In this case we return early because
+ # the v7 plugin provides map will not have an entry for this plugin.
+ if attribute_filter and Array(attribute_filter).all? {|filter_item| have_v6_plugin?(filter_item) }
+ return true
+ end
+
+ # Then run all the version 7 plugins
+ begin
+ @provides_map.all_plugins(attribute_filter).each { |plugin|
+ @runner.run_plugin(plugin)
+ }
+ rescue Ohai::Exceptions::AttributeNotFound, Ohai::Exceptions::DependencyCycle => e
+ Ohai::Log.error("Encountered error while running plugins: #{e.inspect}")
+ raise
+ end
+ end
+
+ def have_v6_plugin?(name)
+ @v6_dependency_solver.values.any? {|v6plugin| v6plugin.name == name }
+ end
+
+ def pathify_v6_plugin(plugin_name)
+ path_components = plugin_name.split("::")
+ File.join(path_components) + ".rb"
+ end
+
+ #
+ # Below APIs are from V6.
+ # Make sure that you are not breaking backwards compatibility
+ # if you are changing any of the APIs below.
+ #
+ def require_plugin(plugin_ref, force=false)
+ plugins = [ ]
+ # This method is only callable by version 6 plugins.
+ # First we check if there exists a v6 plugin that fulfills the dependency.
+ if @v6_dependency_solver.has_key? pathify_v6_plugin(plugin_ref)
+ # Note that: partial_path looks like Plugin::Name
+ # keys for @v6_dependency_solver are in form 'plugin/name.rb'
+ plugins << @v6_dependency_solver[pathify_v6_plugin(plugin_ref)]
+ else
+ # While looking up V7 plugins we need to convert the plugin_ref to an attribute.
+ attribute = plugin_ref.gsub("::", "/")
+ begin
+ plugins = @provides_map.find_providers_for([attribute])
+ rescue Ohai::Exceptions::AttributeNotFound
+ Ohai::Log.debug("Can not find any v7 plugin that provides #{attribute}")
+ plugins = [ ]
+ end
+ end
+
+ if plugins.empty?
+ raise Ohai::Exceptions::DependencyNotFound, "Can not find a plugin for dependency #{plugin_ref}"
+ else
+ plugins.each do |plugin|
+ begin
+ @runner.run_plugin(plugin)
+ rescue SystemExit, Interrupt
+ raise
+ rescue Ohai::Exceptions::DependencyCycle, Ohai::Exceptions::AttributeNotFound => e
+ Ohai::Log.error("Encountered error while running plugins: #{e.inspect}")
+ raise
+ rescue Exception,Errno::ENOENT => e
+ Ohai::Log.debug("Plugin #{plugin.name} threw exception #{e.inspect} #{e.backtrace.join("\n")}")
+ end
+ end
+ end
+ end
+
+ # Re-runs plugins that provide the attributes specified by
+ # +attribute_filter+. If +attribute_filter+ is not given, re-runs all
+ # plugins.
+ #
+ # Note that dependencies will not be re-run, so you must specify all of the
+ # attributes you want refreshed in the +attribute_filter+
+ #
+ # This method takes a naive approach to v6 plugins: it simply re-runs all
+ # of them whenever called.
+ def refresh_plugins(attribute_filter=nil)
+ Ohai::Hints.refresh_hints()
+ @provides_map.all_plugins(attribute_filter).each do |plugin|
+ plugin.reset!
+ end
+ run_plugins(true, attribute_filter)
+ end
+
+ #
+ # Serialize this object as a hash
+ #
+ def to_json
+ FFI_Yajl::Encoder.new.encode(@data)
+ end
+
+ #
+ # Pretty Print this object as JSON
+ #
+ def json_pretty_print(item=nil)
+ FFI_Yajl::Encoder.new(pretty: true, validate_utf8: false).encode(item || @data)
+ end
+
+ def attributes_print(a)
+ data = @data
+ a.split("/").each do |part|
+ data = data[part]
+ end
+ raise ArgumentError, "I cannot find an attribute named #{a}!" if data.nil?
+ case data
+ when Hash,Mash,Array,Fixnum
+ json_pretty_print(data)
+ when String
+ if data.respond_to?(:lines)
+ json_pretty_print(data.lines.to_a)
+ else
+ json_pretty_print(data.to_a)
+ end
+ else
+ raise ArgumentError, "I can only generate JSON for Hashes, Mashes, Arrays and Strings. You fed me a #{data.class}!"
+ end
+ end
+ end
+end