| 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