Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Message.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html 
3      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
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">
13   // <![CDATA[
14
15   function popupCode( url ) {
16     window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17   }
18
19   function toggleCode( id ) {
20     if ( document.getElementById )
21       elem = document.getElementById( id );
22     else if ( document.all )
23       elem = eval( "document.all." + id );
24     else
25       return false;
26
27     elemStyle = elem.style;
28     
29     if ( elemStyle.display != "block" ) {
30       elemStyle.display = "block"
31     } else {
32       elemStyle.display = "none"
33     }
34
35     return true;
36   }
37   
38   // Make codeblocks hidden by default
39   document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40   
41   // ]]>
42   </script>
43
44 </head>
45 <body>
46
47
48
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>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../files/lib/mcollective/message_rb.html">
59                 lib/mcollective/message.rb
60                 </a>
61         <br />
62             </td>
63         </tr>
64
65         <tr class="top-aligned-row">
66             <td><strong>Parent:</strong></td>
67             <td>
68                 Object
69             </td>
70         </tr>
71         </table>
72     </div>
73   <!-- banner header -->
74
75   <div id="bodyContent">
76
77
78
79   <div id="contextContent">
80
81     <div id="description">
82       <p>
83 container for a message, its headers, agent, collective and other meta data
84 </p>
85
86     </div>
87
88
89    </div>
90
91     <div id="method-list">
92       <h3 class="section-bar">Methods</h3>
93
94       <div class="name-list">
95       <a href="#M000338">base64?</a>&nbsp;&nbsp;
96       <a href="#M000336">base64_decode!</a>&nbsp;&nbsp;
97       <a href="#M000337">base64_encode!</a>&nbsp;&nbsp;
98       <a href="#M000344">create_reqid</a>&nbsp;&nbsp;
99       <a href="#M000341">decode!</a>&nbsp;&nbsp;
100       <a href="#M000339">encode!</a>&nbsp;&nbsp;
101       <a href="#M000335">expected_msgid=</a>&nbsp;&nbsp;
102       <a href="#M000332">new</a>&nbsp;&nbsp;
103       <a href="#M000343">publish</a>&nbsp;&nbsp;
104       <a href="#M000334">reply_to=</a>&nbsp;&nbsp;
105       <a href="#M000333">type=</a>&nbsp;&nbsp;
106       <a href="#M000342">validate</a>&nbsp;&nbsp;
107       <a href="#M000340">validate_compound_filter</a>&nbsp;&nbsp;
108       </div>
109     </div>
110
111   </div>
112
113
114     <!-- if includes -->
115
116     <div id="section">
117
118
119     <div id="constants-list">
120       <h3 class="section-bar">Constants</h3>
121
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>
126           <td>=</td>
127           <td class="context-item-value">[:message, :request, :direct_request, :reply]</td>
128         </tr>
129         </table>
130       </div>
131     </div>
132
133
134
135     <div id="attribute-list">
136       <h3 class="section-bar">Attributes</h3>
137
138       <div class="name-list">
139         <table>
140         <tr class="top-aligned-row context-row">
141           <td class="context-item-name">agent</td>
142           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
143           <td class="context-item-desc"></td>
144         </tr>
145         <tr class="top-aligned-row context-row">
146           <td class="context-item-name">collective</td>
147           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
148           <td class="context-item-desc"></td>
149         </tr>
150         <tr class="top-aligned-row context-row">
151           <td class="context-item-name">discovered_hosts</td>
152           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
153           <td class="context-item-desc"></td>
154         </tr>
155         <tr class="top-aligned-row context-row">
156           <td class="context-item-name">expected_msgid</td>
157           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
158           <td class="context-item-desc"></td>
159         </tr>
160         <tr class="top-aligned-row context-row">
161           <td class="context-item-name">filter</td>
162           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
163           <td class="context-item-desc"></td>
164         </tr>
165         <tr class="top-aligned-row context-row">
166           <td class="context-item-name">headers</td>
167           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
168           <td class="context-item-desc"></td>
169         </tr>
170         <tr class="top-aligned-row context-row">
171           <td class="context-item-name">message</td>
172           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
173           <td class="context-item-desc"></td>
174         </tr>
175         <tr class="top-aligned-row context-row">
176           <td class="context-item-name">msgtime</td>
177           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
178           <td class="context-item-desc"></td>
179         </tr>
180         <tr class="top-aligned-row context-row">
181           <td class="context-item-name">options</td>
182           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
183           <td class="context-item-desc"></td>
184         </tr>
185         <tr class="top-aligned-row context-row">
186           <td class="context-item-name">payload</td>
187           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
188           <td class="context-item-desc"></td>
189         </tr>
190         <tr class="top-aligned-row context-row">
191           <td class="context-item-name">reply_to</td>
192           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
193           <td class="context-item-desc"></td>
194         </tr>
195         <tr class="top-aligned-row context-row">
196           <td class="context-item-name">request</td>
197           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
198           <td class="context-item-desc"></td>
199         </tr>
200         <tr class="top-aligned-row context-row">
201           <td class="context-item-name">requestid</td>
202           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
203           <td class="context-item-desc"></td>
204         </tr>
205         <tr class="top-aligned-row context-row">
206           <td class="context-item-name">ttl</td>
207           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
208           <td class="context-item-desc"></td>
209         </tr>
210         <tr class="top-aligned-row context-row">
211           <td class="context-item-name">type</td>
212           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
213           <td class="context-item-desc"></td>
214         </tr>
215         <tr class="top-aligned-row context-row">
216           <td class="context-item-name">validated</td>
217           <td class="context-item-value">&nbsp;[R]&nbsp;</td>
218           <td class="context-item-desc"></td>
219         </tr>
220         </table>
221       </div>
222     </div>
223       
224
225
226     <!-- if method_list -->
227     <div id="methods">
228       <h3 class="section-bar">Public Class methods</h3>
229
230       <div id="method-M000332" class="method-detail">
231         <a name="M000332"></a>
232
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>
236           </a>
237         </div>
238       
239         <div class="method-description">
240           <p>
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
253 </p>
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">
257 <pre>
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">&gt;</span> <span class="ruby-keyword kw">false</span>,
261 25:                  <span class="ruby-identifier">:agent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
262 26:                  <span class="ruby-identifier">:headers</span> =<span class="ruby-operator">&gt;</span> {},
263 27:                  <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:message</span>,
264 28:                  <span class="ruby-identifier">:request</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
265 29:                  <span class="ruby-identifier">:filter</span> =<span class="ruby-operator">&gt;</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">&gt;</span> {},
267 31:                  <span class="ruby-identifier">:ttl</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">60</span>,
268 32:                  <span class="ruby-identifier">:expected_msgid</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
269 33:                  <span class="ruby-identifier">:requestid</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
270 34:                  <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>}.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">options</span>)
271 35: 
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>
277 41: 
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>]
284 48: 
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>
287 51: 
288 52:       <span class="ruby-ivar">@validated</span> = <span class="ruby-keyword kw">false</span>
289 53: 
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>
299 63: 
300 64:       <span class="ruby-identifier">base64_decode!</span>
301 65:     <span class="ruby-keyword kw">end</span>
302 </pre>
303           </div>
304         </div>
305       </div>
306
307       <h3 class="section-bar">Public Instance methods</h3>
308
309       <div id="method-M000338" class="method-detail">
310         <a name="M000338"></a>
311
312         <div class="method-heading">
313           <a href="#M000338" class="method-signature">
314           <span class="method-name">base64?</span><span class="method-args">()</span>
315           </a>
316         </div>
317       
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">
322 <pre>
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>
327 </pre>
328           </div>
329         </div>
330       </div>
331
332       <div id="method-M000336" class="method-detail">
333         <a name="M000336"></a>
334
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>
338           </a>
339         </div>
340       
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">
345 <pre>
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>
349 117: 
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>
353 </pre>
354           </div>
355         </div>
356       </div>
357
358       <div id="method-M000337" class="method-detail">
359         <a name="M000337"></a>
360
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>
364           </a>
365         </div>
366       
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">
371 <pre>
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>
375 124: 
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>
379 </pre>
380           </div>
381         </div>
382       </div>
383
384       <div id="method-M000344" class="method-detail">
385         <a name="M000344"></a>
386
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>
390           </a>
391         </div>
392       
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">
397 <pre>
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">&quot;-&quot;</span>, <span class="ruby-value str">&quot;&quot;</span>)
404 231:     <span class="ruby-keyword kw">end</span>
405 </pre>
406           </div>
407         </div>
408       </div>
409
410       <div id="method-M000341" class="method-detail">
411         <a name="M000341"></a>
412
413         <div class="method-heading">
414           <a href="#M000341" class="method-signature">
415           <span class="method-name">decode!</span><span class="method-args">()</span>
416           </a>
417         </div>
418       
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">
423 <pre>
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">&quot;Cannot decode message type #{type}&quot;</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>)
427 177: 
428 178:       <span class="ruby-ivar">@payload</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;security_plugin&quot;</span>].<span class="ruby-identifier">decodemsg</span>(<span class="ruby-keyword kw">self</span>)
429 179: 
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">&quot;security_plugin&quot;</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>
433 183: 
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">&quot;@#{prop}&quot;</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>
438 </pre>
439           </div>
440         </div>
441       </div>
442
443       <div id="method-M000339" class="method-detail">
444         <a name="M000339"></a>
445
446         <div class="method-heading">
447           <a href="#M000339" class="method-signature">
448           <span class="method-name">encode!</span><span class="method-args">()</span>
449           </a>
450         </div>
451       
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">
456 <pre>
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">&quot;Cannot encode a reply message if no request has been associated with it&quot;</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">&quot;security_plugin&quot;</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>])
463 138: 
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">&quot;security_plugin&quot;</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">&quot;compound&quot;</span>]) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@filter</span>[<span class="ruby-value str">&quot;compound&quot;</span>].<span class="ruby-identifier">empty?</span>
468 143: 
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">&quot;security_plugin&quot;</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">&quot;Cannot encode #{type} messages&quot;</span>
473 148:       <span class="ruby-keyword kw">end</span>
474 149:     <span class="ruby-keyword kw">end</span>
475 </pre>
476           </div>
477         </div>
478       </div>
479
480       <div id="method-M000335" class="method-detail">
481         <a name="M000335"></a>
482
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>
486           </a>
487         </div>
488       
489         <div class="method-description">
490           <p>
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.
495 </p>
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">
499 <pre>
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">&quot;Can only store the expected msgid for reply messages&quot;</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>
505 </pre>
506           </div>
507         </div>
508       </div>
509
510       <div id="method-M000343" class="method-detail">
511         <a name="M000343"></a>
512
513         <div class="method-heading">
514           <a href="#M000343" class="method-signature">
515           <span class="method-name">publish</span><span class="method-args">()</span>
516           </a>
517         </div>
518       
519         <div class="method-description">
520           <p>
521 <a href="Message.html#M000343">publish</a> a reply message by creating a
522 target name and sending it
523 </p>
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">
527 <pre>
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">&amp;&amp;</span> <span class="ruby-identifier">config</span>.<span class="ruby-identifier">direct_addressing</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-ivar">@discovered_hosts</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&lt;=</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">&quot;Handling #{requestid} as a direct request&quot;</span>)
537 221:       <span class="ruby-keyword kw">end</span>
538 222: 
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>
541 </pre>
542           </div>
543         </div>
544       </div>
545
546       <div id="method-M000334" class="method-detail">
547         <a name="M000334"></a>
548
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>
552           </a>
553         </div>
554       
555         <div class="method-description">
556           <p>
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
560 what it usually does
561 </p>
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">
565 <pre>
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">&quot;Custom reply targets can only be set on requests&quot;</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>)
569 101: 
570 102:       <span class="ruby-ivar">@reply_to</span> = <span class="ruby-identifier">target</span>
571 103:     <span class="ruby-keyword kw">end</span>
572 </pre>
573           </div>
574         </div>
575       </div>
576
577       <div id="method-M000333" class="method-detail">
578         <a name="M000333"></a>
579
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>
583           </a>
584         </div>
585       
586         <div class="method-description">
587           <p>
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.
594 </p>
595 <p>
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.
599 </p>
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">
603 <pre>
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">&quot;Unknown message type #{type}&quot;</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>)
607 78: 
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">&quot;Direct requests is not enabled using the direct_addressing config option&quot;</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>
610 81: 
611 82:         <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@discovered_hosts</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Can only set type to :direct_request if discovered_hosts have been set&quot;</span>
613 84:         <span class="ruby-keyword kw">end</span>
614 85: 
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">&quot;agent&quot;</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@agent</span>
620 91:       <span class="ruby-keyword kw">end</span>
621 92: 
622 93:       <span class="ruby-ivar">@type</span> = <span class="ruby-identifier">type</span>
623 94:     <span class="ruby-keyword kw">end</span>
624 </pre>
625           </div>
626         </div>
627       </div>
628
629       <div id="method-M000342" class="method-detail">
630         <a name="M000342"></a>
631
632         <div class="method-heading">
633           <a href="#M000342" class="method-signature">
634           <span class="method-name">validate</span><span class="method-args">()</span>
635           </a>
636         </div>
637       
638         <div class="method-description">
639           <p>
640 Perform validation against the message by checking filters and ttl
641 </p>
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">
645 <pre>
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">&quot;Can only validate request messages&quot;</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>
649 192: 
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>
651 194: 
652 195:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg_age</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ttl</span>
653 196:         <span class="ruby-identifier">cid</span> = <span class="ruby-value str">&quot;&quot;</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">&quot;@&quot;</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>]
656 199: 
657 200:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg_age</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ttl</span>
658 201:           <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;global_stats&quot;</span>].<span class="ruby-identifier">ttlexpired</span>
659 202: 
660 203:           <span class="ruby-identifier">raise</span>(<span class="ruby-constant">MsgTTLExpired</span>, <span class="ruby-node">&quot;message #{requestid} from #{cid} created at #{msgtime} is #{msg_age} seconds old, TTL is #{ttl}&quot;</span>)
661 204:         <span class="ruby-keyword kw">end</span>
662 205:       <span class="ruby-keyword kw">end</span>
663 206: 
664 207:       <span class="ruby-identifier">raise</span>(<span class="ruby-constant">NotTargettedAtUs</span>, <span class="ruby-value str">&quot;Received message is not targetted to us&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;security_plugin&quot;</span>].<span class="ruby-identifier">validate_filter?</span>(<span class="ruby-identifier">payload</span>[<span class="ruby-identifier">:filter</span>])
665 208: 
666 209:       <span class="ruby-ivar">@validated</span> = <span class="ruby-keyword kw">true</span>
667 210:     <span class="ruby-keyword kw">end</span>
668 </pre>
669           </div>
670         </div>
671       </div>
672
673       <div id="method-M000340" class="method-detail">
674         <a name="M000340"></a>
675
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>
679           </a>
680         </div>
681       
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">
686 <pre>
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">&quot;fstatement&quot;</span>]
692 155:             <span class="ruby-identifier">functionname</span> = <span class="ruby-identifier">statement</span>[<span class="ruby-value str">&quot;fstatement&quot;</span>][<span class="ruby-value str">&quot;name&quot;</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">&quot;fstatement&quot;</span>][<span class="ruby-value str">&quot;value&quot;</span>]
695 158: 
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>)
697 160: 
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">&quot;fstatement&quot;</span>][<span class="ruby-value str">&quot;params&quot;</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">&quot;fstatement&quot;</span>][<span class="ruby-value str">&quot;params&quot;</span>])
701 164: 
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">&quot;fstatement&quot;</span>][<span class="ruby-value str">&quot;params&quot;</span>])
703 166: 
704 167:             <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Data plugin '%{functionname}()' does not return a '%{value}' value&quot;</span>, <span class="ruby-identifier">:error</span>, {<span class="ruby-identifier">:functionname</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">functionname</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</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>
711 </pre>
712           </div>
713         </div>
714       </div>
715
716
717     </div>
718
719
720   </div>
721
722
723 <div id="validator-badges">
724   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
725 </div>
726
727 </body>
728 </html>