Class: Ohai::System

Inherits:
Object
  • Object
show all
Includes:
Mixin::Command, Mixin::FromFile
Defined in:
lib/ohai/system.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Mixin::Command

popen4, run_command, #run_command_unix, #run_command_windows

Methods included from Mixin::FromFile

#from_file

Constructor Details

#initializeSystem

Returns a new instance of System.



34
35
36
37
38
39
40
# File 'lib/ohai/system.rb', line 34

def initialize
  @data = Mash.new
  @seen_plugins = Hash.new
  @providers = Mash.new
  @plugin_path = ""
  @hints = Hash.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



261
262
263
264
265
# File 'lib/ohai/system.rb', line 261

def method_missing(name, *args)
  return get_attribute(name) if args.length == 0

  set_attribute(name, *args)
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



29
30
31
# File 'lib/ohai/system.rb', line 29

def data
  @data
end

#hintsObject

Returns the value of attribute hints.



29
30
31
# File 'lib/ohai/system.rb', line 29

def hints
  @hints
end

#seen_pluginsObject

Returns the value of attribute seen_plugins.



29
30
31
# File 'lib/ohai/system.rb', line 29

def seen_plugins
  @seen_plugins
end

Instance Method Details

#[](key) ⇒ Object



42
43
44
# File 'lib/ohai/system.rb', line 42

def [](key)
  @data[key]
end

#[]=(key, value) ⇒ Object



46
47
48
# File 'lib/ohai/system.rb', line 46

def []=(key, value)
  @data[key] = value
end

#all_pluginsObject



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/ohai/system.rb', line 127

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("#{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) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/ohai/system.rb', line 56

def attribute?(name)
  @data.has_key?(name)
end

#attributes_print(a) ⇒ Object

Raises:

  • (ArgumentError)


241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/ohai/system.rb', line 241

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 a
  when Hash,Mash,Array
    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) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/ohai/system.rb', line 153

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) ⇒ Object



50
51
52
53
54
# File 'lib/ohai/system.rb', line 50

def each(&block)
  @data.each do |key, value|
    block.call(key, value)
  end
end

#from(cmd) ⇒ Object



64
65
66
67
68
# File 'lib/ohai/system.rb', line 64

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) ⇒ Object

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



87
88
89
90
91
92
93
94
95
# File 'lib/ohai/system.rb', line 87

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) ⇒ Object



102
103
104
# File 'lib/ohai/system.rb', line 102

def get_attribute(name)
  @data[name]
end

#hint?(name) ⇒ Boolean

Returns:

  • (Boolean)


106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/ohai/system.rb', line 106

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) ⇒ Object

Pretty Print this object as JSON



237
238
239
# File 'lib/ohai/system.rb', line 237

def json_pretty_print(item=nil)
  Yajl::Encoder.new(:pretty => true).encode(item || @data)
end

#provides(*paths) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/ohai/system.rb', line 70

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 = '/') ⇒ Object



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/ohai/system.rb', line 169

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) ⇒ Object Also known as: _require_plugin



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/ohai/system.rb', line 196

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

#set(name, *value) ⇒ Object



60
61
62
# File 'lib/ohai/system.rb', line 60

def set(name, *value)
  set_attribute(name, *value)
end

#set_attribute(name, *values) ⇒ Object



97
98
99
100
# File 'lib/ohai/system.rb', line 97

def set_attribute(name, *values)
  @data[name] = Array18(*values)
  @data[name]
end

#to_jsonObject

Serialize this object as a hash



232
233
234
# File 'lib/ohai/system.rb', line 232

def to_json
  Yajl::Encoder.new.encode(@data)
end