class MCollective::Agents

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.

Public Class Methods

agentlist() click to toggle source

Get a list of agents that we have

    # File lib/mcollective/agents.rb
145 def self.agentlist
146   @@agents.keys
147 end
new(agents = {}) click to toggle source
   # File lib/mcollective/agents.rb
 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

Public Instance Methods

activate_agent?(agent) click to toggle source

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
85 def activate_agent?(agent)
86   klass = Kernel.const_get("MCollective").const_get("Agent").const_get(agent.capitalize)
87 
88   if klass.respond_to?("activate?")
89     return klass.activate?
90   else
91     Log.debug("#{klass} does not have an activate? method, activating as default")
92     return true
93   end
94 rescue Exception => e
95   Log.warn("Agent activation check for #{agent} failed: #{e.class}: #{e}")
96   return false
97 end
class_for_agent(agent) click to toggle source

Builds a class name string given a Agent name

   # File lib/mcollective/agents.rb
78 def class_for_agent(agent)
79   "MCollective::Agent::#{agent.capitalize}"
80 end
clear!() click to toggle source

Deletes all agents

   # File lib/mcollective/agents.rb
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
dispatch(request, connection) { |replies| ... } click to toggle source

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
118 def dispatch(request, connection)
119   Log.debug("Dispatching a message to agent #{request.agent}")
120 
121   Thread.new do
122     begin
123       agent = PluginManager["#{request.agent}_agent"]
124 
125       Timeout::timeout(agent.timeout) do
126         replies = agent.handlemsg(request.payload, connection)
127 
128         # Agents can decide if they wish to reply or not,
129         # returning nil will mean nothing goes back to the
130         # requestor
131         unless replies == nil
132           yield(replies)
133         end
134       end
135     rescue Timeout::Error => e
136       Log.warn("Timeout while handling message for #{request.agent}")
137     rescue Exception => e
138       Log.error("Execution of #{request.agent} failed: #{e}")
139       Log.error(e.backtrace.join("\n\t\t"))
140     end
141   end
142 end
findagentfile(agentname) click to toggle source

searches the libdirs for agents

    # File lib/mcollective/agents.rb
100 def findagentfile(agentname)
101   @config.libdir.each do |libdir|
102     agentfile = File.join([libdir, "mcollective", "agent", "#{agentname}.rb"])
103     if File.exist?(agentfile)
104       Log.debug("Found #{agentname} at #{agentfile}")
105       return agentfile
106     end
107   end
108   return false
109 end
include?(agentname) click to toggle source

Determines if we have an agent with a certain name

    # File lib/mcollective/agents.rb
112 def include?(agentname)
113   PluginManager.include?("#{agentname}_agent")
114 end
loadagent(agentname) click to toggle source

Loads a specified agent from disk if available

   # File lib/mcollective/agents.rb
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       # Attempt to instantiate the agent once so any validation and hooks get run
58       # this does a basic sanity check on the agent as a whole, if this fails it
59       # will be removed from the plugin list
60       PluginManager["#{agentname}_agent"]
61 
62       Util.subscribe(Util.make_subscriptions(agentname, :broadcast)) unless @@agents.include?(agentname)
63 
64       @@agents[agentname] = {:file => agentfile}
65       return true
66     else
67       Log.debug("Not activating agent #{agentname} due to agent policy in activate? method")
68       return false
69     end
70   rescue Exception => e
71     Log.error("Loading agent #{agentname} failed: #{e}")
72     PluginManager.delete("#{agentname}_agent")
73     return false
74   end
75 end
loadagents() click to toggle source

Loads all agents from disk

   # File lib/mcollective/agents.rb
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