Class | MCollective::Agents |
In: |
lib/mcollective/agents.rb
|
Parent: | Object |
A collection of agents, loads them, reloads them and dispatches messages to them. It uses the PluginManager to store, load and manage instances of plugins.
Get a list of agents that we have
# File lib/mcollective/agents.rb, line 123 123: def self.agentlist 124: @@agents.keys 125: end
# File lib/mcollective/agents.rb, line 5 5: def initialize 6: @config = Config.instance 7: raise ("Configuration has not been loaded, can't load agents") unless @config.configured 8: 9: @@agents = {} 10: 11: loadagents 12: end
Dispatches a message to an agent, accepts a block that will get run if there are any replies to process from the agent
# File lib/mcollective/agents.rb, line 96 96: def dispatch(msg, target, connection) 97: Log.debug("Dispatching a message to agent #{target}") 98: 99: Thread.new do 100: begin 101: agent = PluginManager["#{target}_agent"] 102: 103: Timeout::timeout(agent.timeout) do 104: replies = agent.handlemsg(msg, connection) 105: 106: # Agents can decide if they wish to reply or not, 107: # returning nil will mean nothing goes back to the 108: # requestor 109: unless replies == nil 110: yield(replies) 111: end 112: end 113: rescue Timeout::Error => e 114: Log.warn("Timeout while handling message for #{target}") 115: rescue Exception => e 116: Log.error("Execution of #{target} failed: #{e}") 117: Log.error(e.backtrace.join("\n\t\t")) 118: end 119: end 120: end
searches the libdirs for agents
# File lib/mcollective/agents.rb, line 62 62: def findagentfile(agentname) 63: @config.libdir.each do |libdir| 64: agentfile = "#{libdir}/mcollective/agent/#{agentname}.rb" 65: if File.exist?(agentfile) 66: Log.debug("Found #{agentname} at #{agentfile}") 67: return agentfile 68: end 69: end 70: return false 71: end
Returns the help for an agent after first trying to get rid of some indentation infront
# File lib/mcollective/agents.rb, line 80 80: def help(agentname) 81: raise("No such agent") unless include?(agentname) 82: 83: body = PluginManager["#{agentname}_agent"].help.split("\n") 84: 85: if body.first =~ /^(\s+)\S/ 86: indent = $1 87: 88: body = body.map {|b| b.gsub(/^#{indent}/, "")} 89: end 90: 91: body.join("\n") 92: end
Determines if we have an agent with a certain name
# File lib/mcollective/agents.rb, line 74 74: def include?(agentname) 75: PluginManager.include?("#{agentname}_agent") 76: end
Loads a specified agent from disk if available
# File lib/mcollective/agents.rb, line 38 38: def loadagent(agentname) 39: agentfile = findagentfile(agentname) 40: return false unless agentfile 41: classname = "MCollective::Agent::#{agentname.capitalize}" 42: 43: PluginManager.delete("#{agentname}_agent") 44: 45: begin 46: single_instance = ["registration", "discovery"].include?(agentname) 47: 48: PluginManager.loadclass(classname) 49: PluginManager << {:type => "#{agentname}_agent", :class => classname, :single_instance => single_instance} 50: 51: Util.subscribe(Util.make_target(agentname, :command)) unless @@agents.include?(agentname) 52: 53: @@agents[agentname] = {:file => agentfile} 54: return true 55: rescue Exception => e 56: Log.error("Loading agent #{agentname} failed: #{e}") 57: PluginManager.delete("#{agentname}_agent") 58: end 59: end
Loads all agents from disk
# File lib/mcollective/agents.rb, line 15 15: def loadagents 16: Log.debug("Reloading all agents from disk") 17: 18: # We're loading all agents so just nuke all the old agents and unsubscribe 19: @@agents.each_key do |agent| 20: PluginManager.delete "#{agent}_agent" 21: Util.unsubscribe(Util.make_target(agent, :command)) 22: end 23: 24: @@agents = {} 25: 26: @config.libdir.each do |libdir| 27: agentdir = "#{libdir}/mcollective/agent" 28: next unless File.directory?(agentdir) 29: 30: Dir.new(agentdir).grep(/\.rb$/).each do |agent| 31: agentname = File.basename(agent, ".rb") 32: loadagent(agentname) unless PluginManager.include?("#{agentname}_agent") 33: end 34: end 35: end