1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
8 <title>Class: MCollective::Message</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Class</strong></td>
53 <td class="class-name-in-header">MCollective::Message</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/message_rb.html">
59 lib/mcollective/message.rb
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
73 <!-- banner header -->
75 <div id="bodyContent">
79 <div id="contextContent">
81 <div id="description">
83 container for a message, its headers, agent, collective and other meta data
91 <div id="method-list">
92 <h3 class="section-bar">Methods</h3>
94 <div class="name-list">
95 <a href="#M000338">base64?</a>
96 <a href="#M000336">base64_decode!</a>
97 <a href="#M000337">base64_encode!</a>
98 <a href="#M000344">create_reqid</a>
99 <a href="#M000341">decode!</a>
100 <a href="#M000339">encode!</a>
101 <a href="#M000335">expected_msgid=</a>
102 <a href="#M000332">new</a>
103 <a href="#M000343">publish</a>
104 <a href="#M000334">reply_to=</a>
105 <a href="#M000333">type=</a>
106 <a href="#M000342">validate</a>
107 <a href="#M000340">validate_compound_filter</a>
119 <div id="constants-list">
120 <h3 class="section-bar">Constants</h3>
122 <div class="name-list">
123 <table summary="Constants">
124 <tr class="top-aligned-row context-row">
125 <td class="context-item-name">VALIDTYPES</td>
127 <td class="context-item-value">[:message, :request, :direct_request, :reply]</td>
135 <div id="attribute-list">
136 <h3 class="section-bar">Attributes</h3>
138 <div class="name-list">
140 <tr class="top-aligned-row context-row">
141 <td class="context-item-name">agent</td>
142 <td class="context-item-value"> [RW] </td>
143 <td class="context-item-desc"></td>
145 <tr class="top-aligned-row context-row">
146 <td class="context-item-name">collective</td>
147 <td class="context-item-value"> [RW] </td>
148 <td class="context-item-desc"></td>
150 <tr class="top-aligned-row context-row">
151 <td class="context-item-name">discovered_hosts</td>
152 <td class="context-item-value"> [RW] </td>
153 <td class="context-item-desc"></td>
155 <tr class="top-aligned-row context-row">
156 <td class="context-item-name">expected_msgid</td>
157 <td class="context-item-value"> [R] </td>
158 <td class="context-item-desc"></td>
160 <tr class="top-aligned-row context-row">
161 <td class="context-item-name">filter</td>
162 <td class="context-item-value"> [RW] </td>
163 <td class="context-item-desc"></td>
165 <tr class="top-aligned-row context-row">
166 <td class="context-item-name">headers</td>
167 <td class="context-item-value"> [RW] </td>
168 <td class="context-item-desc"></td>
170 <tr class="top-aligned-row context-row">
171 <td class="context-item-name">message</td>
172 <td class="context-item-value"> [R] </td>
173 <td class="context-item-desc"></td>
175 <tr class="top-aligned-row context-row">
176 <td class="context-item-name">msgtime</td>
177 <td class="context-item-value"> [R] </td>
178 <td class="context-item-desc"></td>
180 <tr class="top-aligned-row context-row">
181 <td class="context-item-name">options</td>
182 <td class="context-item-value"> [RW] </td>
183 <td class="context-item-desc"></td>
185 <tr class="top-aligned-row context-row">
186 <td class="context-item-name">payload</td>
187 <td class="context-item-value"> [R] </td>
188 <td class="context-item-desc"></td>
190 <tr class="top-aligned-row context-row">
191 <td class="context-item-name">reply_to</td>
192 <td class="context-item-value"> [R] </td>
193 <td class="context-item-desc"></td>
195 <tr class="top-aligned-row context-row">
196 <td class="context-item-name">request</td>
197 <td class="context-item-value"> [R] </td>
198 <td class="context-item-desc"></td>
200 <tr class="top-aligned-row context-row">
201 <td class="context-item-name">requestid</td>
202 <td class="context-item-value"> [RW] </td>
203 <td class="context-item-desc"></td>
205 <tr class="top-aligned-row context-row">
206 <td class="context-item-name">ttl</td>
207 <td class="context-item-value"> [RW] </td>
208 <td class="context-item-desc"></td>
210 <tr class="top-aligned-row context-row">
211 <td class="context-item-name">type</td>
212 <td class="context-item-value"> [R] </td>
213 <td class="context-item-desc"></td>
215 <tr class="top-aligned-row context-row">
216 <td class="context-item-name">validated</td>
217 <td class="context-item-value"> [R] </td>
218 <td class="context-item-desc"></td>
226 <!-- if method_list -->
228 <h3 class="section-bar">Public Class methods</h3>
230 <div id="method-M000332" class="method-detail">
231 <a name="M000332"></a>
233 <div class="method-heading">
234 <a href="#M000332" class="method-signature">
235 <span class="method-name">new</span><span class="method-args">(payload, message, options = {})</span>
239 <div class="method-description">
241 payload - the message body without headers etc, just the text message - the
242 original message received from the middleware options[:base64] - if the
243 body base64 encoded? options[:agent] - the agent the message is for/from
244 options[:collective] - the collective its for/from options[:headers] - the
245 message headers options[:type] - an indicator about the type of message,
246 :message, :request, :direct_request or :reply options[:request] - if this
247 is a reply this should old the message we are replying to options[:filter]
248 - for requests, the filter to encode into the message options[:options] -
249 the normal client options hash options[:ttl] - the maximum amount of
250 seconds this message can be valid for options[:expected_msgid] - in the
251 case of replies this is the msgid it is expecting in the replies
252 options[:requestid] - specific request id to use else one will be generated
254 <p><a class="source-toggle" href="#"
255 onclick="toggleCode('M000332-source');return false;">[Source]</a></p>
256 <div class="method-source-code" id="M000332-source">
258 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 23</span>
259 23: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">payload</span>, <span class="ruby-identifier">message</span>, <span class="ruby-identifier">options</span> = {})
260 24: <span class="ruby-identifier">options</span> = {<span class="ruby-identifier">:base64</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">false</span>,
261 25: <span class="ruby-identifier">:agent</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
262 26: <span class="ruby-identifier">:headers</span> =<span class="ruby-operator">></span> {},
263 27: <span class="ruby-identifier">:type</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">:message</span>,
264 28: <span class="ruby-identifier">:request</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
265 29: <span class="ruby-identifier">:filter</span> =<span class="ruby-operator">></span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">empty_filter</span>,
266 30: <span class="ruby-identifier">:options</span> =<span class="ruby-operator">></span> {},
267 31: <span class="ruby-identifier">:ttl</span> =<span class="ruby-operator">></span> <span class="ruby-value">60</span>,
268 32: <span class="ruby-identifier">:expected_msgid</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
269 33: <span class="ruby-identifier">:requestid</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
270 34: <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>}.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">options</span>)
272 36: <span class="ruby-ivar">@payload</span> = <span class="ruby-identifier">payload</span>
273 37: <span class="ruby-ivar">@message</span> = <span class="ruby-identifier">message</span>
274 38: <span class="ruby-ivar">@requestid</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:requestid</span>]
275 39: <span class="ruby-ivar">@discovered_hosts</span> = <span class="ruby-keyword kw">nil</span>
276 40: <span class="ruby-ivar">@reply_to</span> = <span class="ruby-keyword kw">nil</span>
278 42: <span class="ruby-ivar">@type</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:type</span>]
279 43: <span class="ruby-ivar">@headers</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:headers</span>]
280 44: <span class="ruby-ivar">@base64</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:base64</span>]
281 45: <span class="ruby-ivar">@filter</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:filter</span>]
282 46: <span class="ruby-ivar">@expected_msgid</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:expected_msgid</span>]
283 47: <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:options</span>]
285 49: <span class="ruby-ivar">@ttl</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:ttl</span>] <span class="ruby-operator">||</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">ttl</span>
286 50: <span class="ruby-ivar">@msgtime</span> = <span class="ruby-value">0</span>
288 52: <span class="ruby-ivar">@validated</span> = <span class="ruby-keyword kw">false</span>
290 54: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:request</span>]
291 55: <span class="ruby-ivar">@request</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:request</span>]
292 56: <span class="ruby-ivar">@agent</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">agent</span>
293 57: <span class="ruby-ivar">@collective</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">collective</span>
294 58: <span class="ruby-ivar">@type</span> = <span class="ruby-identifier">:reply</span>
295 59: <span class="ruby-keyword kw">else</span>
296 60: <span class="ruby-ivar">@agent</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:agent</span>]
297 61: <span class="ruby-ivar">@collective</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:collective</span>]
298 62: <span class="ruby-keyword kw">end</span>
300 64: <span class="ruby-identifier">base64_decode!</span>
301 65: <span class="ruby-keyword kw">end</span>
307 <h3 class="section-bar">Public Instance methods</h3>
309 <div id="method-M000338" class="method-detail">
310 <a name="M000338"></a>
312 <div class="method-heading">
313 <a href="#M000338" class="method-signature">
314 <span class="method-name">base64?</span><span class="method-args">()</span>
318 <div class="method-description">
319 <p><a class="source-toggle" href="#"
320 onclick="toggleCode('M000338-source');return false;">[Source]</a></p>
321 <div class="method-source-code" id="M000338-source">
323 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 129</span>
324 129: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">base64?</span>
325 130: <span class="ruby-ivar">@base64</span>
326 131: <span class="ruby-keyword kw">end</span>
332 <div id="method-M000336" class="method-detail">
333 <a name="M000336"></a>
335 <div class="method-heading">
336 <a href="#M000336" class="method-signature">
337 <span class="method-name">base64_decode!</span><span class="method-args">()</span>
341 <div class="method-description">
342 <p><a class="source-toggle" href="#"
343 onclick="toggleCode('M000336-source');return false;">[Source]</a></p>
344 <div class="method-source-code" id="M000336-source">
346 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 115</span>
347 115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">base64_decode!</span>
348 116: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@base64</span>
350 118: <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">SSL</span>.<span class="ruby-identifier">base64_decode</span>(<span class="ruby-ivar">@payload</span>)
351 119: <span class="ruby-ivar">@base64</span> = <span class="ruby-keyword kw">false</span>
352 120: <span class="ruby-keyword kw">end</span>
358 <div id="method-M000337" class="method-detail">
359 <a name="M000337"></a>
361 <div class="method-heading">
362 <a href="#M000337" class="method-signature">
363 <span class="method-name">base64_encode!</span><span class="method-args">()</span>
367 <div class="method-description">
368 <p><a class="source-toggle" href="#"
369 onclick="toggleCode('M000337-source');return false;">[Source]</a></p>
370 <div class="method-source-code" id="M000337-source">
372 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 122</span>
373 122: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">base64_encode!</span>
374 123: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@base64</span>
376 125: <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">SSL</span>.<span class="ruby-identifier">base64_encode</span>(<span class="ruby-ivar">@payload</span>)
377 126: <span class="ruby-ivar">@base64</span> = <span class="ruby-keyword kw">true</span>
378 127: <span class="ruby-keyword kw">end</span>
384 <div id="method-M000344" class="method-detail">
385 <a name="M000344"></a>
387 <div class="method-heading">
388 <a href="#M000344" class="method-signature">
389 <span class="method-name">create_reqid</span><span class="method-args">()</span>
393 <div class="method-description">
394 <p><a class="source-toggle" href="#"
395 onclick="toggleCode('M000344-source');return false;">[Source]</a></p>
396 <div class="method-source-code" id="M000344-source">
398 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 226</span>
399 226: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">create_reqid</span>
400 227: <span class="ruby-comment cmt"># we gsub out the -s so that the format of the id does not</span>
401 228: <span class="ruby-comment cmt"># change from previous versions, these should just be more</span>
402 229: <span class="ruby-comment cmt"># unique than previous ones</span>
403 230: <span class="ruby-constant">SSL</span>.<span class="ruby-identifier">uuid</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">"-"</span>, <span class="ruby-value str">""</span>)
404 231: <span class="ruby-keyword kw">end</span>
410 <div id="method-M000341" class="method-detail">
411 <a name="M000341"></a>
413 <div class="method-heading">
414 <a href="#M000341" class="method-signature">
415 <span class="method-name">decode!</span><span class="method-args">()</span>
419 <div class="method-description">
420 <p><a class="source-toggle" href="#"
421 onclick="toggleCode('M000341-source');return false;">[Source]</a></p>
422 <div class="method-source-code" id="M000341-source">
424 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 175</span>
425 175: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">decode!</span>
426 176: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Cannot decode message type #{type}"</span> <span class="ruby-keyword kw">unless</span> [<span class="ruby-identifier">:request</span>, <span class="ruby-identifier">:reply</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">type</span>)
428 178: <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">decodemsg</span>(<span class="ruby-keyword kw">self</span>)
430 180: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:request</span>
431 181: <span class="ruby-identifier">raise</span> <span class="ruby-value str">'callerid in request is not valid, surpressing reply to potentially forged request'</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">valid_callerid?</span>(<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:callerid</span>])
432 182: <span class="ruby-keyword kw">end</span>
434 184: [<span class="ruby-identifier">:collective</span>, <span class="ruby-identifier">:agent</span>, <span class="ruby-identifier">:filter</span>, <span class="ruby-identifier">:requestid</span>, <span class="ruby-identifier">:ttl</span>, <span class="ruby-identifier">:msgtime</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">prop</span><span class="ruby-operator">|</span>
435 185: <span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-node">"@#{prop}"</span>, <span class="ruby-identifier">payload</span>[<span class="ruby-identifier">prop</span>]) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">prop</span>)
436 186: <span class="ruby-keyword kw">end</span>
437 187: <span class="ruby-keyword kw">end</span>
443 <div id="method-M000339" class="method-detail">
444 <a name="M000339"></a>
446 <div class="method-heading">
447 <a href="#M000339" class="method-signature">
448 <span class="method-name">encode!</span><span class="method-args">()</span>
452 <div class="method-description">
453 <p><a class="source-toggle" href="#"
454 onclick="toggleCode('M000339-source');return false;">[Source]</a></p>
455 <div class="method-source-code" id="M000339-source">
457 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 133</span>
458 133: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">encode!</span>
459 134: <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">type</span>
460 135: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:reply</span>
461 136: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Cannot encode a reply message if no request has been associated with it"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">request</span>
462 137: <span class="ruby-identifier">raise</span> <span class="ruby-value str">'callerid in original request is not valid, surpressing reply to potentially forged request'</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">valid_callerid?</span>(<span class="ruby-identifier">request</span>.<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:callerid</span>])
464 139: <span class="ruby-ivar">@requestid</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:requestid</span>]
465 140: <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">encodereply</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">payload</span>, <span class="ruby-identifier">requestid</span>, <span class="ruby-identifier">request</span>.<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:callerid</span>])
466 141: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:request</span>, <span class="ruby-identifier">:direct_request</span>
467 142: <span class="ruby-identifier">validate_compound_filter</span>(<span class="ruby-ivar">@filter</span>[<span class="ruby-value str">"compound"</span>]) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@filter</span>[<span class="ruby-value str">"compound"</span>].<span class="ruby-identifier">empty?</span>
469 144: <span class="ruby-ivar">@requestid</span> = <span class="ruby-identifier">create_reqid</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@requestid</span>
470 145: <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">encoderequest</span>(<span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">identity</span>, <span class="ruby-identifier">payload</span>, <span class="ruby-identifier">requestid</span>, <span class="ruby-identifier">filter</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">collective</span>, <span class="ruby-identifier">ttl</span>)
471 146: <span class="ruby-keyword kw">else</span>
472 147: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Cannot encode #{type} messages"</span>
473 148: <span class="ruby-keyword kw">end</span>
474 149: <span class="ruby-keyword kw">end</span>
480 <div id="method-M000335" class="method-detail">
481 <a name="M000335"></a>
483 <div class="method-heading">
484 <a href="#M000335" class="method-signature">
485 <span class="method-name">expected_msgid=</span><span class="method-args">(msgid)</span>
489 <div class="method-description">
491 in the case of reply messages we are expecting replies to a previously
492 created message. This stores a hint to that previously sent message id and
493 can be used by other classes like the security plugins as a means of
494 optimizing their behavior like by ignoring messages not directed at us.
496 <p><a class="source-toggle" href="#"
497 onclick="toggleCode('M000335-source');return false;">[Source]</a></p>
498 <div class="method-source-code" id="M000335-source">
500 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 110</span>
501 110: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">expected_msgid=</span>(<span class="ruby-identifier">msgid</span>)
502 111: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Can only store the expected msgid for reply messages"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@type</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:reply</span>
503 112: <span class="ruby-ivar">@expected_msgid</span> = <span class="ruby-identifier">msgid</span>
504 113: <span class="ruby-keyword kw">end</span>
510 <div id="method-M000343" class="method-detail">
511 <a name="M000343"></a>
513 <div class="method-heading">
514 <a href="#M000343" class="method-signature">
515 <span class="method-name">publish</span><span class="method-args">()</span>
519 <div class="method-description">
521 <a href="Message.html#M000343">publish</a> a reply message by creating a
522 target name and sending it
524 <p><a class="source-toggle" href="#"
525 onclick="toggleCode('M000343-source');return false;">[Source]</a></p>
526 <div class="method-source-code" id="M000343-source">
528 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 213</span>
529 213: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">publish</span>
530 214: <span class="ruby-comment cmt"># If we've been specificaly told about hosts that were discovered</span>
531 215: <span class="ruby-comment cmt"># use that information to do P2P calls if appropriate else just</span>
532 216: <span class="ruby-comment cmt"># send it as is.</span>
533 217: <span class="ruby-identifier">config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
534 218: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@discovered_hosts</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">config</span>.<span class="ruby-identifier">direct_addressing</span> <span class="ruby-operator">&&</span> (<span class="ruby-ivar">@discovered_hosts</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator"><=</span> <span class="ruby-identifier">config</span>.<span class="ruby-identifier">direct_addressing_threshold</span>)
535 219: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">type</span> = <span class="ruby-identifier">:direct_request</span>
536 220: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Handling #{requestid} as a direct request"</span>)
537 221: <span class="ruby-keyword kw">end</span>
539 223: <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">'connector_plugin'</span>].<span class="ruby-identifier">publish</span>(<span class="ruby-keyword kw">self</span>)
540 224: <span class="ruby-keyword kw">end</span>
546 <div id="method-M000334" class="method-detail">
547 <a name="M000334"></a>
549 <div class="method-heading">
550 <a href="#M000334" class="method-signature">
551 <span class="method-name">reply_to=</span><span class="method-args">(target)</span>
555 <div class="method-description">
557 Sets a custom reply-to target for requests. The connector plugin should
558 inspect this when constructing requests and set this header ensuring
559 replies will go to the custom target otherwise the connector should just do
562 <p><a class="source-toggle" href="#"
563 onclick="toggleCode('M000334-source');return false;">[Source]</a></p>
564 <div class="method-source-code" id="M000334-source">
566 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 99</span>
567 99: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reply_to=</span>(<span class="ruby-identifier">target</span>)
568 100: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Custom reply targets can only be set on requests"</span> <span class="ruby-keyword kw">unless</span> [<span class="ruby-identifier">:request</span>, <span class="ruby-identifier">:direct_request</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@type</span>)
570 102: <span class="ruby-ivar">@reply_to</span> = <span class="ruby-identifier">target</span>
571 103: <span class="ruby-keyword kw">end</span>
577 <div id="method-M000333" class="method-detail">
578 <a name="M000333"></a>
580 <div class="method-heading">
581 <a href="#M000333" class="method-signature">
582 <span class="method-name">type=</span><span class="method-args">(type)</span>
586 <div class="method-description">
588 Sets the message type to one of the known types. In the case of
589 :direct_request the list of hosts to communicate with should have been set
590 with discovered_hosts else an exception will be raised. This is for extra
591 security, we never accidentally want to send a direct request without a
592 list of hosts or something weird like that as it might result in a
593 filterless broadcast being sent.
596 Additionally you simply cannot set :direct_request if direct_addressing was
597 not enabled this is to force a workflow that doesnt not yield in a mistake
598 when someone might assume direct_addressing is enabled when its not.
600 <p><a class="source-toggle" href="#"
601 onclick="toggleCode('M000333-source');return false;">[Source]</a></p>
602 <div class="method-source-code" id="M000333-source">
604 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 76</span>
605 76: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">type=</span>(<span class="ruby-identifier">type</span>)
606 77: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Unknown message type #{type}"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">VALIDTYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">type</span>)
608 79: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:direct_request</span>
609 80: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Direct requests is not enabled using the direct_addressing config option"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">direct_addressing</span>
611 82: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@discovered_hosts</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@discovered_hosts</span>.<span class="ruby-identifier">empty?</span>
612 83: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Can only set type to :direct_request if discovered_hosts have been set"</span>
613 84: <span class="ruby-keyword kw">end</span>
615 86: <span class="ruby-comment cmt"># clear out the filter, custom discovery sources might interpret the filters</span>
616 87: <span class="ruby-comment cmt"># different than the remote mcollectived and in directed mode really the only</span>
617 88: <span class="ruby-comment cmt"># filter that matters is the agent filter</span>
618 89: <span class="ruby-ivar">@filter</span> = <span class="ruby-constant">Util</span>.<span class="ruby-identifier">empty_filter</span>
619 90: <span class="ruby-ivar">@filter</span>[<span class="ruby-value str">"agent"</span>] <span class="ruby-operator"><<</span> <span class="ruby-ivar">@agent</span>
620 91: <span class="ruby-keyword kw">end</span>
622 93: <span class="ruby-ivar">@type</span> = <span class="ruby-identifier">type</span>
623 94: <span class="ruby-keyword kw">end</span>
629 <div id="method-M000342" class="method-detail">
630 <a name="M000342"></a>
632 <div class="method-heading">
633 <a href="#M000342" class="method-signature">
634 <span class="method-name">validate</span><span class="method-args">()</span>
638 <div class="method-description">
640 Perform validation against the message by checking filters and ttl
642 <p><a class="source-toggle" href="#"
643 onclick="toggleCode('M000342-source');return false;">[Source]</a></p>
644 <div class="method-source-code" id="M000342-source">
646 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 190</span>
647 190: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">validate</span>
648 191: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Can only validate request messages"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:request</span>
650 193: <span class="ruby-identifier">msg_age</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">utc</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">msgtime</span>
652 195: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg_age</span> <span class="ruby-operator">></span> <span class="ruby-identifier">ttl</span>
653 196: <span class="ruby-identifier">cid</span> = <span class="ruby-value str">""</span>
654 197: <span class="ruby-identifier">cid</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:callerid</span>] <span class="ruby-operator">+</span> <span class="ruby-value str">"@"</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:callerid</span>)
655 198: <span class="ruby-identifier">cid</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:senderid</span>]
657 200: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg_age</span> <span class="ruby-operator">></span> <span class="ruby-identifier">ttl</span>
658 201: <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"global_stats"</span>].<span class="ruby-identifier">ttlexpired</span>
660 203: <span class="ruby-identifier">raise</span>(<span class="ruby-constant">MsgTTLExpired</span>, <span class="ruby-node">"message #{requestid} from #{cid} created at #{msgtime} is #{msg_age} seconds old, TTL is #{ttl}"</span>)
661 204: <span class="ruby-keyword kw">end</span>
662 205: <span class="ruby-keyword kw">end</span>
664 207: <span class="ruby-identifier">raise</span>(<span class="ruby-constant">NotTargettedAtUs</span>, <span class="ruby-value str">"Received message is not targetted to us"</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"security_plugin"</span>].<span class="ruby-identifier">validate_filter?</span>(<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:filter</span>])
666 209: <span class="ruby-ivar">@validated</span> = <span class="ruby-keyword kw">true</span>
667 210: <span class="ruby-keyword kw">end</span>
673 <div id="method-M000340" class="method-detail">
674 <a name="M000340"></a>
676 <div class="method-heading">
677 <a href="#M000340" class="method-signature">
678 <span class="method-name">validate_compound_filter</span><span class="method-args">(compound_filter)</span>
682 <div class="method-description">
683 <p><a class="source-toggle" href="#"
684 onclick="toggleCode('M000340-source');return false;">[Source]</a></p>
685 <div class="method-source-code" id="M000340-source">
687 <span class="ruby-comment cmt"># File lib/mcollective/message.rb, line 151</span>
688 151: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">validate_compound_filter</span>(<span class="ruby-identifier">compound_filter</span>)
689 152: <span class="ruby-identifier">compound_filter</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">filter</span><span class="ruby-operator">|</span>
690 153: <span class="ruby-identifier">filter</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">statement</span><span class="ruby-operator">|</span>
691 154: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>]
692 155: <span class="ruby-identifier">functionname</span> = <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"name"</span>]
693 156: <span class="ruby-identifier">pluginname</span> = <span class="ruby-constant">Data</span>.<span class="ruby-identifier">pluginname</span>(<span class="ruby-identifier">functionname</span>)
694 157: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"value"</span>]
696 159: <span class="ruby-identifier">ddl</span> = <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pluginname</span>, <span class="ruby-identifier">:data</span>)
698 161: <span class="ruby-comment cmt"># parses numbers and booleans entered as strings into proper</span>
699 162: <span class="ruby-comment cmt"># types of data so that DDL validation will pass</span>
700 163: <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"params"</span>] = <span class="ruby-constant">Data</span>.<span class="ruby-identifier">ddl_transform_input</span>(<span class="ruby-identifier">ddl</span>, <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"params"</span>])
702 165: <span class="ruby-constant">Data</span>.<span class="ruby-identifier">ddl_validate</span>(<span class="ruby-identifier">ddl</span>, <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"params"</span>])
704 167: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">&&</span> <span class="ruby-constant">Data</span>.<span class="ruby-identifier">ddl_has_output?</span>(<span class="ruby-identifier">ddl</span>, <span class="ruby-identifier">value</span>)
705 168: <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">validation_fail!</span>(<span class="ruby-identifier">:PLMC41</span>, <span class="ruby-value str">"Data plugin '%{functionname}()' does not return a '%{value}' value"</span>, <span class="ruby-identifier">:error</span>, {<span class="ruby-identifier">:functionname</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">functionname</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">value</span>})
706 169: <span class="ruby-keyword kw">end</span>
707 170: <span class="ruby-keyword kw">end</span>
708 171: <span class="ruby-keyword kw">end</span>
709 172: <span class="ruby-keyword kw">end</span>
710 173: <span class="ruby-keyword kw">end</span>
723 <div id="validator-badges">
724 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>