| Class | MCollective::RPC::Agent |
| In: |
lib/mcollective/rpc/agent.rb
|
| Parent: | Object |
A wrapper around the traditional agent, it takes care of a lot of the tedious setup you would do for each agent allowing you to just create methods following a naming standard leaving the heavy lifting up to this clas.
See marionette-collective.org/simplerpc/agents.html
It only really makes sense to use this with a Simple RPC client on the other end, basic usage would be:
module MCollective
module Agent
class Helloworld<RPC::Agent
matadata :name => "Test SimpleRPC Agent",
:description => "A simple test",
:author => "You",
:license => "1.1",
:url => "http://your.com/,
:timeout => 60
action "hello" do
reply[:msg] = "Hello #{request[:name]}"
end
end
end
end
We also currently have the validation code in here, this will be moved to plugins soon.
| config | [R] | |
| ddl | [R] | |
| logger | [R] | |
| meta | [RW] | |
| reply | [RW] | |
| request | [RW] | |
| timeout | [R] |
# File lib/mcollective/rpc/agent.rb, line 34
34: def initialize
35: # Default meta data unset
36: @meta = {:timeout => 10,
37: :name => "Unknown",
38: :description => "Unknown",
39: :author => "Unknown",
40: :license => "Unknown",
41: :version => "Unknown",
42: :url => "Unknown"}
43:
44: @timeout = meta[:timeout] || 10
45: @logger = Log.instance
46: @config = Config.instance
47: @agent_name = self.class.to_s.split("::").last.downcase
48:
49: # Loads the DDL so we can later use it for validation
50: # and help generation
51: begin
52: @ddl = DDL.new(@agent_name)
53: rescue
54: @ddl = nil
55: end
56:
57: # if we have a global authorization provider enable it
58: # plugins can still override it per plugin
59: self.class.authorized_by(@config.rpcauthprovider) if @config.rpcauthorization
60:
61: startup_hook
62: end
# File lib/mcollective/rpc/agent.rb, line 64
64: def handlemsg(msg, connection)
65: @request = RPC.request(msg)
66: @reply = RPC.reply
67:
68: begin
69: # Calls the authorization plugin if any is defined
70: # if this raises an exception we wil just skip processing this
71: # message
72: authorization_hook(@request) if respond_to?("authorization_hook")
73:
74:
75: # Audits the request, currently continues processing the message
76: # we should make this a configurable so that an audit failure means
77: # a message wont be processed by this node depending on config
78: audit_request(@request, connection)
79:
80: before_processing_hook(msg, connection)
81:
82: if respond_to?("#{@request.action}_action")
83: send("#{@request.action}_action")
84: else
85: raise UnknownRPCAction, "Unknown action: #{@request.action}"
86: end
87: rescue RPCAborted => e
88: @reply.fail e.to_s, 1
89:
90: rescue UnknownRPCAction => e
91: @reply.fail e.to_s, 2
92:
93: rescue MissingRPCData => e
94: @reply.fail e.to_s, 3
95:
96: rescue InvalidRPCData => e
97: @reply.fail e.to_s, 4
98:
99: rescue UnknownRPCError => e
100: @reply.fail e.to_s, 5
101:
102: rescue Exception => e
103: @reply.fail e.to_s, 5
104:
105: end
106:
107: after_processing_hook
108:
109: @reply.to_hash
110: end