lib/consolr.rb in consolr-1.1.4 vs lib/consolr.rb in consolr-1.1.5

- old
+ new

@@ -95,96 +95,98 @@ if options[:tag] and options[:hostname] abort("Please pass either the hostname OR the tag but not both.") end - if options[:runner].nil? - runners = load_runners(@config_params.fetch('runners', [])) - # Default to the ipmitool runner for backwards compatibility - if runners.empty? - require 'consolr/runners/ipmitool' - runners = [Consolr::Runners::Ipmitool.new(@config_params.fetch('ipmitool', {}))] - end - else - runners = load_runners([options[:runner]]) - if runners.empty? - abort('Specified runner could not be loaded. Aborting.') - end - end - # match assets like vm-67f5eh, zt-*, etc. nodes = options[:tag] ? (collins.find :tag => options[:tag]) : (collins.find :hostname => options[:hostname]) @node = nodes.length == 1 ? nodes.first : abort("Found #{nodes.length} assets, aborting.") - # select the first runner that support the node - runner = runners.select {|runner| - runner.can_run? @node - }.first - - if runner.nil? - abort("No runners available for node #{@node.hostname} (#{@node.tag})") - end - - if not runner.verify @node - abort("Cannot verify asset #{@node.hostname} (#{@node.tag})") - end - selected_dangerous_actions = dangerous_actions.select { |o| options[o] } if dangerous_assets.include?(@node.tag) and selected_dangerous_actions.any? abort "Asset #{@node.tag} is a crucial asset. Can't ever execute dangerous actions on this asset.\n#{dangerous_body}" end if options[:force].nil? and selected_dangerous_actions.any? and dangerous_status.include?(@node.status) abort "Cannot run dangerous commands on #{@node.hostname} (#{@node.tag} - #{@node.status}) because it is in a protected status. This can be overridden with the --force flag\n#{dangerous_body}" end - case - when options[:console] - puts '--> Opening SOL session (type ~~. to quit)' - puts runner.console @node - when options[:kick] - puts runner.kick @node - when options[:identify] - puts runner.identify @node - when options[:sdr] - puts runner.sdr @node - when options[:log] == 'list' - puts runner.log_list @node - when options[:log] == 'clear' - puts runner.log_clear @node - when options[:on] - puts runner.on @node - when options[:off] - puts runner.off @node - when options[:soft_off] - puts runner.soft_off @node - when options[:reboot] - puts runner.reboot @node - when options[:soft_reboot] - puts runner.soft_reboot @node - when options[:status] - puts runner.status @node - when options[:sensors] - puts runner.sensors @node - when options[:get_sol_info] - puts runner.sol_info @node - else - begin - puts "specify an action" - exit 1 - end + # use the command line runner, if it was provided + runner_names = [options[:runner]].compact + + # if no runner specified on command line, use the runners from the config + if runner_names.empty? + runner_names = @config_params.fetch('runners', []).compact end - end - private - def load_runners runners - runners.map {|runner| + # if neither of the above is true, default to using ipmitool + if runner_names.empty? + runner_names = ['ipmitool'] + end + + # select the first runner that support the node + runner_names.each do |runner_name| + + # load the runner begin - require "consolr/runners/#{runner}" - Consolr::Runners.const_get(runner.capitalize).new @config_params.fetch(runner, {}) + require "consolr/runners/#{runner_name}" + runner = Consolr::Runners.const_get(runner_name.capitalize).new @config_params.fetch(runner_name, {}) rescue NameError, LoadError => e - puts "Could not load runner #{runner.capitalize}, skipping." + puts "Could not load runner #{runner_name.capitalize}, skipping." + next end - }.compact + + # if this runner can't work for this node, try the next runner + if not runner.can_run? @node + next + end + + if not runner.verify @node + abort("Cannot verify asset #{@node.hostname} (#{@node.tag})") + end + + # run the command! + case + when options[:console] + puts '--> Opening SOL session (type ~~. to quit)' + puts runner.console @node + when options[:kick] + puts runner.kick @node + when options[:identify] + puts runner.identify @node + when options[:sdr] + puts runner.sdr @node + when options[:log] == 'list' + puts runner.log_list @node + when options[:log] == 'clear' + puts runner.log_clear @node + when options[:on] + puts runner.on @node + when options[:off] + puts runner.off @node + when options[:soft_off] + puts runner.soft_off @node + when options[:reboot] + puts runner.reboot @node + when options[:soft_reboot] + puts runner.soft_reboot @node + when options[:status] + puts runner.status @node + when options[:sensors] + puts runner.sensors @node + when options[:get_sol_info] + puts runner.sol_info @node + else + begin + abort("specify an action") + end + end + # everything worked! + exit 0 + end + + # if we got here, all the runners did not work for this node + abort("No runners available for node #{@node.hostname} (#{@node.tag})") end + end end