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.

Methods

agentlist   dispatch   help   include?   loadagent   loadagents   new   send   timeout  

Public Class methods

Get a list of agents that we have

[Source]

     # File lib/mcollective/agents.rb, line 121
121:         def self.agentlist
122:             @@agents.keys
123:         end

[Source]

    # 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:             @log = Log.instance
10:             @@agents = {}
11: 
12:             loadagents
13:         end

Public Instance methods

Dispatches a message to an agent, accepts a block that will get run if there are any replies to process from the agent

[Source]

     # 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:                     Timeout::timeout(timeout(target)) do
102:                         replies = send(target, msg, connection)
103: 
104:                         # Agents can decide if they wish to reply or not,
105:                         # returning nil will mean nothing goes back to the
106:                         # requestor
107:                         unless replies == nil
108:                             yield(replies)
109:                         end
110:                     end
111:                 rescue Timeout::Error => e
112:                     @log.warn("Timeout while handling message for #{target}")
113:                 rescue Exception => e
114:                     @log.error("Execution of #{target} failed: #{e}")
115:                     @log.error(e.backtrace.join("\n\t\t"))
116:                 end
117:             end
118:         end

Returns the help for an agent after first trying to get rid of some indentation infront

[Source]

    # File lib/mcollective/agents.rb, line 73
73:         def help(agentname)
74:             raise("No such agent") unless include?(agentname)
75: 
76:             body = PluginManager["#{agentname}_agent"].help.split("\n")
77: 
78:             if body.first =~ /^(\s+)\S/
79:                 indent = $1
80: 
81:                 body = body.map {|b| b.gsub(/^#{indent}/, "")}
82:             end
83: 
84:             body.join("\n")
85:         end

Determines if we have an agent with a certain name

[Source]

    # File lib/mcollective/agents.rb, line 60
60:         def include?(agentname)
61:             PluginManager.include?("#{agentname}_agent")
62:         end

Loads a specified agent from disk if available

[Source]

    # File lib/mcollective/agents.rb, line 37
37:         def loadagent(agentname)
38:             agentfile = "#{@config.libdir}/mcollective/agent/#{agentname}.rb"
39:             classname = "MCollective::Agent::#{agentname.capitalize}"
40: 
41:             return false unless File.exist?(agentfile)
42: 
43:             PluginManager.delete("#{agentname}_agent")
44: 
45:             begin
46:                 PluginManager.loadclass(classname)
47:                 PluginManager << {:type => "#{agentname}_agent", :class => classname}
48: 
49:                 PluginManager["connector_plugin"].subscribe(Util.make_target(agentname, :command)) unless @@agents.include?(agentname)
50: 
51:                 @@agents[agentname] = {:file => agentfile}
52:                 return true
53:             rescue Exception => e
54:                 @log.error("Loading agent #{agentname} failed: #{e}")
55:                 PluginManager.delete("#{agentname}_agent")
56:             end
57:         end

Loads all agents from disk

[Source]

    # File lib/mcollective/agents.rb, line 16
16:         def loadagents
17:             @log.debug("Reloading all agents from disk")
18: 
19:             # We're loading all agents so just nuke all the old agents and unsubscribe
20:             connector = PluginManager["connector_plugin"]
21:             @@agents.each_key do |agent|
22:                 connector.unsubscribe(Util.make_target(agent, :command))
23:             end
24: 
25:             @@agents = {}
26: 
27:             agentdir = "#{@config.libdir}/mcollective/agent"
28:             raise("Cannot find agents directory") unless File.directory?(agentdir)
29: 
30:             Dir.new(agentdir).grep(/\.rb$/).each do |agent|
31:                 agentname = File.basename(agent, ".rb")
32:                 loadagent(agentname)
33:             end
34:         end

Sends a message to a specific agent

[Source]

    # File lib/mcollective/agents.rb, line 65
65:         def send(agentname, msg, connection)
66:             raise("No such agent") unless include?(agentname)
67: 
68:             PluginManager["#{agentname}_agent"].handlemsg(msg, connection)
69:         end

Determine the max amount of time a specific agent should be running

[Source]

    # File lib/mcollective/agents.rb, line 88
88:         def timeout(agentname)
89:             raise("No such agent") unless include?(agentname)
90: 
91:             PluginManager["#{agentname}_agent"].timeout
92:         end

[Validate]