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 156 156: def self.agentlist 157: @@agents.keys 158: end
# File lib/mcollective/agents.rb, line 5 5: def initialize(agents = {}) 6: @config = Config.instance 7: raise ("Configuration has not been loaded, can't load agents") unless @config.configured 8: 9: @@agents = agents 10: 11: loadagents 12: end
Checks if a plugin should be activated by calling activate? on it if it responds to that method else always activate it
# File lib/mcollective/agents.rb, line 80 80: def activate_agent?(agent) 81: klass = Kernel.const_get("MCollective").const_get("Agent").const_get(agent.capitalize) 82: 83: if klass.respond_to?("activate?") 84: return klass.activate? 85: else 86: Log.debug("#{klass} does not have an activate? method, activating as default") 87: return true 88: end 89: rescue Exception => e 90: Log.warn("Agent activation check for #{agent} failed: #{e.class}: #{e}") 91: return false 92: end
Builds a class name string given a Agent name
# File lib/mcollective/agents.rb, line 73 73: def class_for_agent(agent) 74: "MCollective::Agent::#{agent.capitalize}" 75: end
Deletes all agents
# File lib/mcollective/agents.rb, line 15 15: def clear! 16: @@agents.each_key do |agent| 17: PluginManager.delete "#{agent}_agent" 18: Util.unsubscribe(Util.make_subscriptions(agent, :broadcast)) 19: end 20: 21: @@agents = {} 22: 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 129 129: def dispatch(request, connection) 130: Log.debug("Dispatching a message to agent #{request.agent}") 131: 132: Thread.new do 133: begin 134: agent = PluginManager["#{request.agent}_agent"] 135: 136: Timeout::timeout(agent.timeout) do 137: replies = agent.handlemsg(request.payload, connection) 138: 139: # Agents can decide if they wish to reply or not, 140: # returning nil will mean nothing goes back to the 141: # requestor 142: unless replies == nil 143: yield(replies) 144: end 145: end 146: rescue Timeout::Error => e 147: Log.warn("Timeout while handling message for #{request.agent}") 148: rescue Exception => e 149: Log.error("Execution of #{request.agent} failed: #{e}") 150: Log.error(e.backtrace.join("\n\t\t")) 151: end 152: end 153: end
searches the libdirs for agents
# File lib/mcollective/agents.rb, line 95 95: def findagentfile(agentname) 96: @config.libdir.each do |libdir| 97: agentfile = File.join([libdir, "mcollective", "agent", "#{agentname}.rb"]) 98: if File.exist?(agentfile) 99: Log.debug("Found #{agentname} at #{agentfile}") 100: return agentfile 101: end 102: end 103: return false 104: end
Returns the help for an agent after first trying to get rid of some indentation infront
# File lib/mcollective/agents.rb, line 113 113: def help(agentname) 114: raise("No such agent") unless include?(agentname) 115: 116: body = PluginManager["#{agentname}_agent"].help.split("\n") 117: 118: if body.first =~ /^(\s+)\S/ 119: indent = $1 120: 121: body = body.map {|b| b.gsub(/^#{indent}/, "")} 122: end 123: 124: body.join("\n") 125: end
Determines if we have an agent with a certain name
# File lib/mcollective/agents.rb, line 107 107: def include?(agentname) 108: PluginManager.include?("#{agentname}_agent") 109: end
Loads a specified agent from disk if available
# File lib/mcollective/agents.rb, line 42 42: def loadagent(agentname) 43: agentfile = findagentfile(agentname) 44: return false unless agentfile 45: classname = class_for_agent(agentname) 46: 47: PluginManager.delete("#{agentname}_agent") 48: 49: begin 50: single_instance = ["registration", "discovery"].include?(agentname) 51: 52: PluginManager.loadclass(classname) 53: 54: if activate_agent?(agentname) 55: PluginManager << {:type => "#{agentname}_agent", :class => classname, :single_instance => single_instance} 56: 57: Util.subscribe(Util.make_subscriptions(agentname, :broadcast)) unless @@agents.include?(agentname) 58: 59: @@agents[agentname] = {:file => agentfile} 60: return true 61: else 62: Log.debug("Not activating agent #{agentname} due to agent policy in activate? method") 63: return false 64: end 65: rescue Exception => e 66: Log.error("Loading agent #{agentname} failed: #{e}") 67: PluginManager.delete("#{agentname}_agent") 68: return false 69: end 70: end
Loads all agents from disk
# File lib/mcollective/agents.rb, line 25 25: def loadagents 26: Log.debug("Reloading all agents from disk") 27: 28: clear! 29: 30: @config.libdir.each do |libdir| 31: agentdir = "#{libdir}/mcollective/agent" 32: next unless File.directory?(agentdir) 33: 34: Dir.new(agentdir).grep(/\.rb$/).each do |agent| 35: agentname = File.basename(agent, ".rb") 36: loadagent(agentname) unless PluginManager.include?("#{agentname}_agent") 37: end 38: end 39: end