class Ohai::System

Attributes

data[RW]
hints[RW]
seen_plugins[RW]

Public Class Methods

new() click to toggle source
# File lib/ohai/system.rb, line 35
def initialize
  @data = Mash.new
  @seen_plugins = Hash.new
  @providers = Mash.new
  @plugin_path = ""
  @hints = Hash.new
end

Public Instance Methods

[](key) click to toggle source
# File lib/ohai/system.rb, line 43
def [](key)
  @data[key]
end
[]=(key, value) click to toggle source
# File lib/ohai/system.rb, line 47
def []=(key, value)
  @data[key] = value
end
_require_plugin(plugin_name, force=false)

Sneaky! Lets us stub out #require_plugin when testing plugins, but still call the real #require_plugin to kick the whole thing off.

Alias for: require_plugin
all_plugins() click to toggle source
# File lib/ohai/system.rb, line 128
def all_plugins
  require_plugin('os')

  Ohai::Config[:plugin_path].each do |path|
    [
      Dir[File.join(path, '*')],
      Dir[File.join(path, @data[:os], '**', '*')]
    ].flatten.each do |file|
      file_regex = Regexp.new("#{File.expand_path(path)}#{File::SEPARATOR}(.+).rb$")
      md = file_regex.match(file)
      if md
        plugin_name = md[1].gsub(File::SEPARATOR, "::")
        require_plugin(plugin_name) unless @seen_plugins.has_key?(plugin_name)
      end
    end
  end
  unless RUBY_PLATFORM =~ /mswin|mingw32|windows/
    # Catch any errant children who need to be reaped
    begin
      true while Process.wait(-1, Process::WNOHANG)
    rescue Errno::ECHILD
    end
  end
  true
end
attribute?(name) click to toggle source
# File lib/ohai/system.rb, line 57
def attribute?(name)
  @data.has_key?(name)
end
attributes_print(a) click to toggle source
# File lib/ohai/system.rb, line 242
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
collect_providers(providers) click to toggle source
# File lib/ohai/system.rb, line 154
def collect_providers(providers)
  refreshments = []
  if providers.is_a?(Mash)
    providers.keys.each do |provider|
      if provider.eql?("_providers")
        refreshments << providers[provider]
      else
        refreshments << collect_providers(providers[provider])
      end
    end
  else
    refreshments << providers
  end
  refreshments.flatten.uniq
end
each(&block) click to toggle source
# File lib/ohai/system.rb, line 51
def each(&block)
  @data.each do |key, value|
    block.call(key, value)
  end
end
from(cmd) click to toggle source
# File lib/ohai/system.rb, line 65
def from(cmd)
  status, stdout, stderr = run_command(:command => cmd)
  return "" if stdout.nil? || stdout.empty?
  stdout.strip
end
from_with_regex(cmd, *regex_list) click to toggle source

Set the value equal to the stdout of the command, plus run through a regex - the first piece of match data is the value.

# File lib/ohai/system.rb, line 88
def from_with_regex(cmd, *regex_list)
  regex_list.flatten.each do |regex|
    status, stdout, stderr = run_command(:command => cmd)
    return "" if stdout.nil? || stdout.empty?
    stdout.chomp!.strip
    md = stdout.match(regex)
    return md[1]
  end
end
get_attribute(name) click to toggle source
# File lib/ohai/system.rb, line 103
def get_attribute(name)
  @data[name]
end
hint?(name) click to toggle source
# File lib/ohai/system.rb, line 107
def hint?(name)
  @json_parser ||= Yajl::Parser.new
  
  return @hints[name] if @hints[name]
  
  Ohai::Config[:hints_path].each do |path|
    filename = File.join(path, "#{name}.json")
    if File.exist?(filename)
      begin
        hash = @json_parser.parse(File.read(filename))
        @hints[name] = hash || Hash.new # hint should exist because the file did, even if it didn't contain anything
      rescue Yajl::ParseError => e
        Ohai::Log.error("Could not parse hint file at #{filename}: #{e.message}")
      end
    end
  end

  @hints[name]
end
json_pretty_print(item=nil) click to toggle source

Pretty Print this object as JSON

# File lib/ohai/system.rb, line 238
def json_pretty_print(item=nil)
  Yajl::Encoder.new(:pretty => true).encode(item || @data)
end
method_missing(name, *args) click to toggle source
# File lib/ohai/system.rb, line 262
def method_missing(name, *args)
  return get_attribute(name) if args.length == 0

  set_attribute(name, *args)
end
provides(*paths) click to toggle source
# File lib/ohai/system.rb, line 71
def provides(*paths)
  paths.each do |path|
    parts = path.split('/')
    h = @providers
    unless parts.length == 0
      parts.shift if parts[0].length == 0
      parts.each do |part|
        h[part] ||= Mash.new
        h = h[part]
      end
    end
    h[:_providers] ||= []
    h[:_providers] << @plugin_path
  end
end
refresh_plugins(path = '/') click to toggle source
# File lib/ohai/system.rb, line 170
def refresh_plugins(path = '/')
  parts = path.split('/')
  if parts.length == 0
    h = @providers
  else
    parts.shift if parts[0].length == 0
    h = @providers
    parts.each do |part|
      break unless h.has_key?(part)
      h = h[part]
    end
  end

  refreshments = collect_providers(h)
  Ohai::Log.debug("Refreshing plugins: #{refreshments.join(", ")}")
  
  # remove the hints cache
  @hints = Hash.new

  refreshments.each do |r|
    @seen_plugins.delete(r) if @seen_plugins.has_key?(r)
  end
  refreshments.each do |r|
    require_plugin(r) unless @seen_plugins.has_key?(r)
  end
end
require_plugin(plugin_name, force=false) click to toggle source
# File lib/ohai/system.rb, line 197
def require_plugin(plugin_name, force=false)
  unless force
    return true if @seen_plugins[plugin_name]
  end

  if Ohai::Config[:disabled_plugins].include?(plugin_name)
    Ohai::Log.debug("Skipping disabled plugin #{plugin_name}")
    return false
  end

  @plugin_path = plugin_name

  filename = "#{plugin_name.gsub("::", File::SEPARATOR)}.rb"

  Ohai::Config[:plugin_path].each do |path|
    check_path = File.expand_path(File.join(path, filename))
    begin
      @seen_plugins[plugin_name] = true
      Ohai::Log.debug("Loading plugin #{plugin_name}")
      from_file(check_path)
      return true
    rescue Errno::ENOENT => e
      Ohai::Log.debug("No #{plugin_name} at #{check_path}")
    rescue SystemExit, Interrupt
      raise
    rescue Exception,Errno::ENOENT => e
      Ohai::Log.debug("Plugin #{plugin_name} threw exception #{e.inspect} #{e.backtrace.join("\n")}")
    end
  end
end
Also aliased as: _require_plugin
set(name, *value) click to toggle source
# File lib/ohai/system.rb, line 61
def set(name, *value)
  set_attribute(name, *value)
end
set_attribute(name, *values) click to toggle source
# File lib/ohai/system.rb, line 98
def set_attribute(name, *values)
  @data[name] = Array18(*values)
  @data[name]
end
to_json() click to toggle source

Serialize this object as a hash

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

Private Instance Methods

Array18(*args) click to toggle source
# File lib/ohai/system.rb, line 270
def Array18(*args)
  return nil if args.empty?
  return args.first if args.length == 1
  return *args
end