Class: Ohai::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/ohai/runner.rb

Instance Method Summary collapse

Constructor Details

#initialize(controller, safe_run = false) ⇒ Runner

safe_run: set to true if this runner will run plugins in safe-mode. default false.



27
28
29
30
# File 'lib/ohai/runner.rb', line 27

def initialize(controller, safe_run = false)
  @provides_map = controller.provides_map
  @safe_run = safe_run
end

Instance Method Details

#fetch_plugins(attributes) ⇒ Object



89
90
91
# File 'lib/ohai/runner.rb', line 89

def fetch_plugins(attributes)
  @provides_map.find_closest_providers_for(attributes)
end

#get_cycle(plugins, cycle_start) ⇒ Object

Given a list of plugins and the first plugin in the cycle, returns the list of plugin source files responsible for the cycle. Does not include plugins that aren’t a part of the cycle



96
97
98
99
100
101
# File 'lib/ohai/runner.rb', line 96

def get_cycle(plugins, cycle_start)
  cycle = plugins.drop_while { |plugin| !plugin.eql?(cycle_start) }
  names = []
  cycle.each { |plugin| names << plugin.name }
  names
end

#run_plugin(plugin) ⇒ Object

Runs plugins and any un-run dependencies. If force is set to true, then this plugin and its dependencies will be run even if they have been run before.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/ohai/runner.rb', line 35

def run_plugin(plugin)
  unless plugin.kind_of?(Ohai::DSL::Plugin)
    raise Ohai::Exceptions::InvalidPlugin, "Invalid plugin #{plugin} (must be an Ohai::DSL::Plugin or subclass)"
  end

  begin
    case plugin.version
    when :version7
      run_v7_plugin(plugin)
    when :version6
      run_v6_plugin(plugin)
    else
      raise Ohai::Exceptions::InvalidPlugin, "Invalid plugin version #{plugin.version} for plugin #{plugin}"
    end
  rescue Ohai::Exceptions::Error
    raise
  rescue Exception,Errno::ENOENT => e
    Ohai::Log.debug("Plugin #{plugin.name} threw exception #{e.inspect} #{e.backtrace.join("\n")}")
  end
end

#run_v6_plugin(plugin) ⇒ Object



56
57
58
59
60
# File 'lib/ohai/runner.rb', line 56

def run_v6_plugin(plugin)
  return true if plugin.has_run?

  @safe_run ? plugin.safe_run : plugin.run
end

#run_v7_plugin(plugin) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ohai/runner.rb', line 62

def run_v7_plugin(plugin)
  visited = [ plugin ]
  while !visited.empty?
    next_plugin = visited.pop

    next if next_plugin.has_run?

    if visited.include?(next_plugin)
      raise Ohai::Exceptions::DependencyCycle, "Dependency cycle detected. Please refer to the following plugins: #{get_cycle(visited, plugin).join(", ") }"
    end

    dependency_providers = fetch_plugins(next_plugin.dependencies)

    # Remove the already ran plugins from dependencies if force is not set
    # Also remove the plugin that we are about to run from dependencies as well.
    dependency_providers.delete_if { |dep_plugin|
      dep_plugin.has_run? || dep_plugin.eql?(next_plugin)
    }

    if dependency_providers.empty?
      @safe_run ? next_plugin.safe_run : next_plugin.run
    else
      visited << next_plugin << dependency_providers.first
    end
  end
end