class Ohai::System

Attributes

config[R]
data[RW]
provides_map[R]
v6_dependency_solver[R]

Public Class Methods

new(config = {}) click to toggle source

the cli flag is used to determine if we're being constructed by something like chef-client (which doesn't not set this flag) and which sets up its own loggers, or if we're coming from Ohai::Application and therefore need to configure Ohai's own logger.

# File lib/ohai/system.rb, line 46
def initialize(config = {})
  @cli = config[:invoked_from_cli]
  @plugin_path = ""
  @config = config
  @failed_plugins = []
  reset_system
end

Public Instance Methods

[](key) click to toggle source
# File lib/ohai/system.rb, line 71
def [](key)
  @data[key]
end
all_plugins(attribute_filter = nil) click to toggle source
# File lib/ohai/system.rb, line 75
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
attributes_print(a) click to toggle source
# File lib/ohai/system.rb, line 217
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, Integer
    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
have_v6_plugin?(name) click to toggle source
# File lib/ohai/system.rb, line 135
def have_v6_plugin?(name)
  @v6_dependency_solver.values.any? { |v6plugin| v6plugin.name == name }
end
json_pretty_print(item = nil) click to toggle source

Pretty Print this object as JSON

# File lib/ohai/system.rb, line 213
def json_pretty_print(item = nil)
  FFI_Yajl::Encoder.new(pretty: true, validate_utf8: false).encode(item || @data)
end
load_plugins() click to toggle source
# File lib/ohai/system.rb, line 85
def load_plugins
  @loader.load_all
end
pathify_v6_plugin(plugin_name) click to toggle source
# File lib/ohai/system.rb, line 139
def pathify_v6_plugin(plugin_name)
  path_components = plugin_name.split("::")
  File.join(path_components) + ".rb"
end
refresh_plugins(attribute_filter = nil) click to toggle source

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.

# File lib/ohai/system.rb, line 195
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
require_plugin(plugin_ref, force = false) click to toggle source

Below APIs are from V6. Make sure that you are not breaking backwards compatibility if you are changing any of the APIs below.

# File lib/ohai/system.rb, line 149
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
reset_system() click to toggle source
# File lib/ohai/system.rb, line 54
def reset_system
  @data = Mash.new
  @provides_map = ProvidesMap.new
  @v6_dependency_solver = Hash.new

  configure_ohai
  configure_logging if @cli

  @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
run_additional_plugins(plugin_path) click to toggle source
# File lib/ohai/system.rb, line 126
def run_additional_plugins(plugin_path)
  @loader.load_additional(plugin_path).each do |plugin|
    Ohai::Log.debug "Running plugin #{plugin}"
    @runner.run_plugin(plugin)
  end

  freeze_strings!
end
run_plugins(safe = false, attribute_filter = nil) click to toggle source
# File lib/ohai/system.rb, line 89
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 && 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 do |plugin|
      @runner.run_plugin(plugin)
    end
  rescue Ohai::Exceptions::AttributeNotFound, Ohai::Exceptions::DependencyCycle => e
    Ohai::Log.error("Encountered error while running plugins: #{e.inspect}")
    raise
  end
  critical_failed = Ohai::Config.ohai[:critical_plugins] & @runner.failed_plugins
  unless critical_failed.empty?
    msg = "The following Ohai plugins marked as critical failed: #{critical_failed}"
    if @cli
      Ohai::Log.error(msg)
      exit(true)
    else
      raise Ohai::Exceptions::CriticalPluginFailure, "#{msg}. Failing Chef run."
    end
  end

  # Freeze all strings.
  freeze_strings!
end
to_json() click to toggle source

Serialize this object as a hash

# File lib/ohai/system.rb, line 206
def to_json
  FFI_Yajl::Encoder.new.encode(@data)
end

Private Instance Methods

configure_logging() click to toggle source
# File lib/ohai/system.rb, line 250
def configure_logging
  if Ohai.config[:log_level] == :auto
    Ohai::Log.level = :info
  else
    Ohai::Log.level = Ohai.config[:log_level]
  end
end
configure_ohai() click to toggle source
# File lib/ohai/system.rb, line 239
def configure_ohai
  Ohai.config.merge!(@config)

  if Ohai.config[:directory] &&
      !Ohai.config[:plugin_path].include?(Ohai.config[:directory])
    Ohai.config[:plugin_path] << Ohai.config[:directory]
  end

  Ohai::Log.debug("Running Ohai with the following configuration: #{Ohai.config.configuration}")
end
freeze_strings!() click to toggle source

Freeze all string values in @data. This makes them immutable and saves a bit of RAM.

@api private @return [void]

# File lib/ohai/system.rb, line 263
def freeze_strings!
  # Recursive visitor pattern helper.
  visitor = lambda do |val|
    case val
    when Hash
      val.each_value { |v| visitor.call(v) }
    when Array
      val.each { |v| visitor.call(v) }
    when String
      val.freeze
    end
  end
  visitor.call(@data)
end