Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Client.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::Client</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::Client</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../files/lib/mcollective/client_rb.html">
59                 lib/mcollective/client.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 Helpers for writing clients that can talk to agents, do discovery and so
84 forth
85 </p>
86
87     </div>
88
89
90    </div>
91
92     <div id="method-list">
93       <h3 class="section-bar">Methods</h3>
94
95       <div class="name-list">
96       <a href="#M000457">collective</a>&nbsp;&nbsp;
97       <a href="#M000460">createreq</a>&nbsp;&nbsp;
98       <a href="#M000458">disconnect</a>&nbsp;&nbsp;
99       <a href="#M000464">discover</a>&nbsp;&nbsp;
100       <a href="#M000471">discovered_req</a>&nbsp;&nbsp;
101       <a href="#M000472">display_stats</a>&nbsp;&nbsp;
102       <a href="#M000456">new</a>&nbsp;&nbsp;
103       <a href="#M000463">receive</a>&nbsp;&nbsp;
104       <a href="#M000465">req</a>&nbsp;&nbsp;
105       <a href="#M000459">sendreq</a>&nbsp;&nbsp;
106       <a href="#M000468">start_publisher</a>&nbsp;&nbsp;
107       <a href="#M000469">start_receiver</a>&nbsp;&nbsp;
108       <a href="#M000461">subscribe</a>&nbsp;&nbsp;
109       <a href="#M000467">threaded_req</a>&nbsp;&nbsp;
110       <a href="#M000462">unsubscribe</a>&nbsp;&nbsp;
111       <a href="#M000466">unthreaded_req</a>&nbsp;&nbsp;
112       <a href="#M000470">update_stat</a>&nbsp;&nbsp;
113       </div>
114     </div>
115
116   </div>
117
118
119     <!-- if includes -->
120
121     <div id="section">
122
123
124
125
126
127     <div id="attribute-list">
128       <h3 class="section-bar">Attributes</h3>
129
130       <div class="name-list">
131         <table>
132         <tr class="top-aligned-row context-row">
133           <td class="context-item-name">discoverer</td>
134           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
135           <td class="context-item-desc"></td>
136         </tr>
137         <tr class="top-aligned-row context-row">
138           <td class="context-item-name">options</td>
139           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
140           <td class="context-item-desc"></td>
141         </tr>
142         <tr class="top-aligned-row context-row">
143           <td class="context-item-name">stats</td>
144           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
145           <td class="context-item-desc"></td>
146         </tr>
147         </table>
148       </div>
149     </div>
150       
151
152
153     <!-- if method_list -->
154     <div id="methods">
155       <h3 class="section-bar">Public Class methods</h3>
156
157       <div id="method-M000456" class="method-detail">
158         <a name="M000456"></a>
159
160         <div class="method-heading">
161           <a href="#M000456" class="method-signature">
162           <span class="method-name">new</span><span class="method-args">(configfile)</span>
163           </a>
164         </div>
165       
166         <div class="method-description">
167           <p><a class="source-toggle" href="#"
168             onclick="toggleCode('M000456-source');return false;">[Source]</a></p>
169           <div class="method-source-code" id="M000456-source">
170 <pre>
171     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 6</span>
172  6:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">configfile</span>)
173  7:       <span class="ruby-ivar">@config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
174  8:       <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">loadconfig</span>(<span class="ruby-identifier">configfile</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">configured</span>
175  9: 
176 10:       <span class="ruby-ivar">@connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;connector_plugin&quot;</span>]
177 11:       <span class="ruby-ivar">@security</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;security_plugin&quot;</span>]
178 12: 
179 13:       <span class="ruby-ivar">@security</span>.<span class="ruby-identifier">initiated_by</span> = <span class="ruby-identifier">:client</span>
180 14:       <span class="ruby-ivar">@options</span> = <span class="ruby-keyword kw">nil</span>
181 15:       <span class="ruby-ivar">@subscriptions</span> = {}
182 16: 
183 17:       <span class="ruby-ivar">@discoverer</span> = <span class="ruby-constant">Discovery</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>)
184 18:       <span class="ruby-ivar">@connection</span>.<span class="ruby-identifier">connect</span>
185 19:     <span class="ruby-keyword kw">end</span>
186 </pre>
187           </div>
188         </div>
189       </div>
190
191       <h3 class="section-bar">Public Instance methods</h3>
192
193       <div id="method-M000457" class="method-detail">
194         <a name="M000457"></a>
195
196         <div class="method-heading">
197           <a href="#M000457" class="method-signature">
198           <span class="method-name">collective</span><span class="method-args">()</span>
199           </a>
200         </div>
201       
202         <div class="method-description">
203           <p>
204 Returns the configured main <a href="Client.html#M000457">collective</a> if
205 no specific <a href="Client.html#M000457">collective</a> is specified as
206 options
207 </p>
208           <p><a class="source-toggle" href="#"
209             onclick="toggleCode('M000457-source');return false;">[Source]</a></p>
210           <div class="method-source-code" id="M000457-source">
211 <pre>
212     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 23</span>
213 23:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">collective</span>
214 24:       <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:collective</span>].<span class="ruby-identifier">nil?</span>
215 25:         <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">main_collective</span>
216 26:       <span class="ruby-keyword kw">else</span>
217 27:         <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:collective</span>]
218 28:       <span class="ruby-keyword kw">end</span>
219 29:     <span class="ruby-keyword kw">end</span>
220 </pre>
221           </div>
222         </div>
223       </div>
224
225       <div id="method-M000460" class="method-detail">
226         <a name="M000460"></a>
227
228         <div class="method-heading">
229           <a href="#M000460" class="method-signature">
230           <span class="method-name">createreq</span><span class="method-args">(msg, agent, filter ={})</span>
231           </a>
232         </div>
233       
234         <div class="method-description">
235           <p><a class="source-toggle" href="#"
236             onclick="toggleCode('M000460-source');return false;">[Source]</a></p>
237           <div class="method-source-code" id="M000460-source">
238 <pre>
239     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 48</span>
240 48:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">createreq</span>(<span class="ruby-identifier">msg</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">filter</span> ={})
241 49:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Message</span>)
242 50:         <span class="ruby-identifier">request</span> = <span class="ruby-identifier">msg</span>
243 51:         <span class="ruby-identifier">agent</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">agent</span>
244 52:       <span class="ruby-keyword kw">else</span>
245 53:         <span class="ruby-identifier">ttl</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:ttl</span>] <span class="ruby-operator">||</span> <span class="ruby-ivar">@config</span>.<span class="ruby-identifier">ttl</span>
246 54:         <span class="ruby-identifier">request</span> = <span class="ruby-constant">Message</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">msg</span>, <span class="ruby-keyword kw">nil</span>, {<span class="ruby-identifier">:agent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:request</span>, <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">collective</span>, <span class="ruby-identifier">:filter</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">filter</span>, <span class="ruby-identifier">:ttl</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ttl</span>})
247 55:         <span class="ruby-identifier">request</span>.<span class="ruby-identifier">reply_to</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:reply_to</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:reply_to</span>]
248 56:       <span class="ruby-keyword kw">end</span>
249 57: 
250 58:       <span class="ruby-identifier">request</span>.<span class="ruby-identifier">encode!</span>
251 59:       <span class="ruby-identifier">subscribe</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:reply</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">request</span>.<span class="ruby-identifier">reply_to</span>
252 60:       <span class="ruby-identifier">request</span>
253 61:     <span class="ruby-keyword kw">end</span>
254 </pre>
255           </div>
256         </div>
257       </div>
258
259       <div id="method-M000458" class="method-detail">
260         <a name="M000458"></a>
261
262         <div class="method-heading">
263           <a href="#M000458" class="method-signature">
264           <span class="method-name">disconnect</span><span class="method-args">()</span>
265           </a>
266         </div>
267       
268         <div class="method-description">
269           <p>
270 Disconnects cleanly from the middleware
271 </p>
272           <p><a class="source-toggle" href="#"
273             onclick="toggleCode('M000458-source');return false;">[Source]</a></p>
274           <div class="method-source-code" id="M000458-source">
275 <pre>
276     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 32</span>
277 32:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">disconnect</span>
278 33:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">&quot;Disconnecting from the middleware&quot;</span>)
279 34:       <span class="ruby-ivar">@connection</span>.<span class="ruby-identifier">disconnect</span>
280 35:     <span class="ruby-keyword kw">end</span>
281 </pre>
282           </div>
283         </div>
284       </div>
285
286       <div id="method-M000464" class="method-detail">
287         <a name="M000464"></a>
288
289         <div class="method-heading">
290           <a href="#M000464" class="method-signature">
291           <span class="method-name">discover</span><span class="method-args">(filter, timeout, limit=0)</span>
292           </a>
293         </div>
294       
295         <div class="method-description">
296           <p>
297 Performs a discovery of nodes matching the filter passed returns an array
298 of nodes
299 </p>
300 <p>
301 An integer limit can be supplied this will have the effect of the discovery
302 being cancelled soon as it reached the requested limit of hosts
303 </p>
304           <p><a class="source-toggle" href="#"
305             onclick="toggleCode('M000464-source');return false;">[Source]</a></p>
306           <div class="method-source-code" id="M000464-source">
307 <pre>
308      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 117</span>
309 117:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discover</span>(<span class="ruby-identifier">filter</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">limit</span>=<span class="ruby-value">0</span>)
310 118:       <span class="ruby-identifier">discovered</span> = <span class="ruby-ivar">@discoverer</span>.<span class="ruby-identifier">discover</span>(<span class="ruby-identifier">filter</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">limit</span>)
311 119:     <span class="ruby-keyword kw">end</span>
312 </pre>
313           </div>
314         </div>
315       </div>
316
317       <div id="method-M000471" class="method-detail">
318         <a name="M000471"></a>
319
320         <div class="method-heading">
321           <a href="#M000471" class="method-signature">
322           <span class="method-name">discovered_req</span><span class="method-args">(body, agent, options=false)</span>
323           </a>
324         </div>
325       
326         <div class="method-description">
327           <p><a class="source-toggle" href="#"
328             onclick="toggleCode('M000471-source');return false;">[Source]</a></p>
329           <div class="method-source-code" id="M000471-source">
330 <pre>
331      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 233</span>
332 233:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discovered_req</span>(<span class="ruby-identifier">body</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">options</span>=<span class="ruby-keyword kw">false</span>)
333 234:       <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Client#discovered_req has been removed, please port your agent and client to the SimpleRPC framework&quot;</span>
334 235:     <span class="ruby-keyword kw">end</span>
335 </pre>
336           </div>
337         </div>
338       </div>
339
340       <div id="method-M000472" class="method-detail">
341         <a name="M000472"></a>
342
343         <div class="method-heading">
344           <a href="#M000472" class="method-signature">
345           <span class="method-name">display_stats</span><span class="method-args">(stats, options=false, caption=&quot;stomp call summary&quot;)</span>
346           </a>
347         </div>
348       
349         <div class="method-description">
350           <p>
351 Prints out the stats returns from <a href="Client.html#M000465">req</a> and
352 <a href="Client.html#M000471">discovered_req</a> in a nice way
353 </p>
354           <p><a class="source-toggle" href="#"
355             onclick="toggleCode('M000472-source');return false;">[Source]</a></p>
356           <div class="method-source-code" id="M000472-source">
357 <pre>
358      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 238</span>
359 238:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">display_stats</span>(<span class="ruby-identifier">stats</span>, <span class="ruby-identifier">options</span>=<span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">caption</span>=<span class="ruby-value str">&quot;stomp call summary&quot;</span>)
360 239:       <span class="ruby-identifier">options</span> = <span class="ruby-ivar">@options</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">options</span>
361 240: 
362 241:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:verbose</span>]
363 242:         <span class="ruby-identifier">puts</span>(<span class="ruby-node">&quot;\n---- #{caption} ----&quot;</span>)
364 243: 
365 244:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:discovered</span>]
366 245:           <span class="ruby-identifier">puts</span>(<span class="ruby-node">&quot;           Nodes: #{stats[:discovered]} / #{stats[:responses]}&quot;</span>)
367 246:         <span class="ruby-keyword kw">else</span>
368 247:           <span class="ruby-identifier">puts</span>(<span class="ruby-node">&quot;           Nodes: #{stats[:responses]}&quot;</span>)
369 248:         <span class="ruby-keyword kw">end</span>
370 249: 
371 250:         <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;      Start Time: %s\n&quot;</span>, <span class="ruby-constant">Time</span>.<span class="ruby-identifier">at</span>(<span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:starttime</span>]))
372 251:         <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;  Discovery Time: %.2fms\n&quot;</span>, <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:discoverytime</span>] <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>)
373 252:         <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;      Agent Time: %.2fms\n&quot;</span>, <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:blocktime</span>] <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>)
374 253:         <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;      Total Time: %.2fms\n&quot;</span>, <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:totaltime</span>] <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>)
375 254: 
376 255:       <span class="ruby-keyword kw">else</span>
377 256:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:discovered</span>]
378 257:           <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;\nFinished processing %d / %d hosts in %.2f ms\n\n&quot;</span>, <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:responses</span>], <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:discovered</span>], <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:blocktime</span>] <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>)
379 258:         <span class="ruby-keyword kw">else</span>
380 259:           <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;\nFinished processing %d hosts in %.2f ms\n\n&quot;</span>, <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:responses</span>], <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:blocktime</span>] <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>)
381 260:         <span class="ruby-keyword kw">end</span>
382 261:       <span class="ruby-keyword kw">end</span>
383 262: 
384 263:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:noresponsefrom</span>].<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
385 264:         <span class="ruby-identifier">puts</span>(<span class="ruby-value str">&quot;\nNo response from:\n&quot;</span>)
386 265: 
387 266:         <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:noresponsefrom</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
388 267:           <span class="ruby-identifier">puts</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span> <span class="ruby-operator">%</span> <span class="ruby-value">4</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
389 268:           <span class="ruby-identifier">printf</span>(<span class="ruby-value str">&quot;%30s&quot;</span>, <span class="ruby-identifier">c</span>)
390 269:         <span class="ruby-keyword kw">end</span>
391 270: 
392 271:         <span class="ruby-identifier">puts</span>
393 272:       <span class="ruby-keyword kw">end</span>
394 273:     <span class="ruby-keyword kw">end</span>
395 </pre>
396           </div>
397         </div>
398       </div>
399
400       <div id="method-M000463" class="method-detail">
401         <a name="M000463"></a>
402
403         <div class="method-heading">
404           <a href="#M000463" class="method-signature">
405           <span class="method-name">receive</span><span class="method-args">(requestid = nil)</span>
406           </a>
407         </div>
408       
409         <div class="method-description">
410           <p>
411 Blocking call that waits for ever for a message to arrive.
412 </p>
413 <p>
414 If you give it a requestid this means you&#8216;ve previously send a
415 request with that ID and now you just want replies that matches that id, in
416 that case the current connection will just ignore all messages not directed
417 at it and keep waiting for more till it finds a matching message.
418 </p>
419           <p><a class="source-toggle" href="#"
420             onclick="toggleCode('M000463-source');return false;">[Source]</a></p>
421           <div class="method-source-code" id="M000463-source">
422 <pre>
423      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 88</span>
424  88:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">receive</span>(<span class="ruby-identifier">requestid</span> = <span class="ruby-keyword kw">nil</span>)
425  89:       <span class="ruby-identifier">reply</span> = <span class="ruby-keyword kw">nil</span>
426  90: 
427  91:       <span class="ruby-keyword kw">begin</span>
428  92:         <span class="ruby-identifier">reply</span> = <span class="ruby-ivar">@connection</span>.<span class="ruby-identifier">receive</span>
429  93:         <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">type</span> = <span class="ruby-identifier">:reply</span>
430  94:         <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">expected_msgid</span> = <span class="ruby-identifier">requestid</span>
431  95: 
432  96:         <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">decode!</span>
433  97:         <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">requestid</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">requestid</span>
434  98:           <span class="ruby-identifier">raise</span>(<span class="ruby-constant">MsgDoesNotMatchRequestID</span>, <span class="ruby-node">&quot;Message reqid #{reply.requestid} does not match our reqid #{requestid}&quot;</span>)
435  99:         <span class="ruby-keyword kw">end</span>
436 100:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">SecurityValidationFailed</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
437 101:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-value str">&quot;Ignoring a message that did not pass security validations&quot;</span>)
438 102:         <span class="ruby-keyword kw">retry</span>
439 103:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">MsgDoesNotMatchRequestID</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
440 104:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Ignoring a message for some other client : #{e.message}&quot;</span>)
441 105:         <span class="ruby-keyword kw">retry</span>
442 106:       <span class="ruby-keyword kw">end</span>
443 107: 
444 108:       <span class="ruby-identifier">reply</span>
445 109:     <span class="ruby-keyword kw">end</span>
446 </pre>
447           </div>
448         </div>
449       </div>
450
451       <div id="method-M000465" class="method-detail">
452         <a name="M000465"></a>
453
454         <div class="method-heading">
455           <a href="#M000465" class="method-signature">
456           <span class="method-name">req</span><span class="method-args">(body, agent=nil, options=false, waitfor=0, &amp;block)</span>
457           </a>
458         </div>
459       
460         <div class="method-description">
461           <p>
462 Send a request, performs the passed block for each response
463 </p>
464 <p>
465 times = <a href="Client.html#M000465">req</a>(&quot;status&quot;,
466 &quot;mcollectived&quot;, options, client) {|resp|
467 </p>
468 <pre>
469   pp resp
470 </pre>
471 <p>
472 }
473 </p>
474 <p>
475 It returns a hash of times and timeouts for discovery and total run is
476 taken from the options hash which in turn is generally built using <a
477 href="Optionparser.html">MCollective::Optionparser</a>
478 </p>
479           <p><a class="source-toggle" href="#"
480             onclick="toggleCode('M000465-source');return false;">[Source]</a></p>
481           <div class="method-source-code" id="M000465-source">
482 <pre>
483      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 129</span>
484 129:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">req</span>(<span class="ruby-identifier">body</span>, <span class="ruby-identifier">agent</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">options</span>=<span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">waitfor</span>=<span class="ruby-value">0</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
485 130:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">body</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Message</span>)
486 131:         <span class="ruby-identifier">agent</span> = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">agent</span>
487 132:         <span class="ruby-identifier">waitfor</span> = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">discovered_hosts</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">||</span> <span class="ruby-value">0</span>
488 133:         <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">body</span>.<span class="ruby-identifier">options</span>
489 134:       <span class="ruby-keyword kw">end</span>
490 135: 
491 136:       <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">options</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>
492 137:       <span class="ruby-identifier">threaded</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:threaded</span>]
493 138:       <span class="ruby-identifier">timeout</span> = <span class="ruby-ivar">@discoverer</span>.<span class="ruby-identifier">discovery_timeout</span>(<span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:timeout</span>], <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:filter</span>])
494 139:       <span class="ruby-identifier">request</span> = <span class="ruby-identifier">createreq</span>(<span class="ruby-identifier">body</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:filter</span>])
495 140:       <span class="ruby-identifier">publish_timeout</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:publish_timeout</span>]
496 141:       <span class="ruby-identifier">stat</span> = {<span class="ruby-identifier">:starttime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_f</span>, <span class="ruby-identifier">:discoverytime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>, <span class="ruby-identifier">:blocktime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>, <span class="ruby-identifier">:totaltime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>}
497 142:       <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">sync</span> = <span class="ruby-keyword kw">true</span>
498 143:       <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-value">0</span>
499 144: 
500 145: 
501 146:       <span class="ruby-keyword kw">begin</span>
502 147:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">threaded</span>
503 148:           <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-identifier">threaded_req</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
504 149:         <span class="ruby-keyword kw">else</span>
505 150:           <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-identifier">unthreaded_req</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
506 151:         <span class="ruby-keyword kw">end</span>
507 152:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Interrupt</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
508 153:       <span class="ruby-keyword kw">ensure</span>
509 154:         <span class="ruby-identifier">unsubscribe</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:reply</span>)
510 155:       <span class="ruby-keyword kw">end</span>
511 156: 
512 157:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">update_stat</span>(<span class="ruby-identifier">stat</span>, <span class="ruby-identifier">hosts_responded</span>, <span class="ruby-identifier">request</span>.<span class="ruby-identifier">requestid</span>)
513 158:     <span class="ruby-keyword kw">end</span>
514 </pre>
515           </div>
516         </div>
517       </div>
518
519       <div id="method-M000459" class="method-detail">
520         <a name="M000459"></a>
521
522         <div class="method-heading">
523           <a href="#M000459" class="method-signature">
524           <span class="method-name">sendreq</span><span class="method-args">(msg, agent, filter = {})</span>
525           </a>
526         </div>
527       
528         <div class="method-description">
529           <p>
530 Sends a request and returns the generated request id, doesn&#8216;t wait
531 for responses and doesn&#8216;t execute any passed in code blocks for
532 responses
533 </p>
534           <p><a class="source-toggle" href="#"
535             onclick="toggleCode('M000459-source');return false;">[Source]</a></p>
536           <div class="method-source-code" id="M000459-source">
537 <pre>
538     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 39</span>
539 39:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendreq</span>(<span class="ruby-identifier">msg</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">filter</span> = {})
540 40:       <span class="ruby-identifier">request</span> = <span class="ruby-identifier">createreq</span>(<span class="ruby-identifier">msg</span>, <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">filter</span>)
541 41: 
542 42:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending request #{request.requestid} to the #{request.agent} agent with ttl #{request.ttl} in collective #{request.collective}&quot;</span>)
543 43: 
544 44:       <span class="ruby-identifier">request</span>.<span class="ruby-identifier">publish</span>
545 45:       <span class="ruby-identifier">request</span>.<span class="ruby-identifier">requestid</span>
546 46:     <span class="ruby-keyword kw">end</span>
547 </pre>
548           </div>
549         </div>
550       </div>
551
552       <div id="method-M000468" class="method-detail">
553         <a name="M000468"></a>
554
555         <div class="method-heading">
556           <a href="#M000468" class="method-signature">
557           <span class="method-name">start_publisher</span><span class="method-args">(request, publish_timeout)</span>
558           </a>
559         </div>
560       
561         <div class="method-description">
562           <p>
563 Starts the request publishing routine
564 </p>
565           <p><a class="source-toggle" href="#"
566             onclick="toggleCode('M000468-source');return false;">[Source]</a></p>
567           <div class="method-source-code" id="M000468-source">
568 <pre>
569      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 191</span>
570 191:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start_publisher</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>)
571 192:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Starting publishing with publish timeout of #{publish_timeout}&quot;</span>)
572 193:       <span class="ruby-keyword kw">begin</span>
573 194:         <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">publish_timeout</span>) <span class="ruby-keyword kw">do</span>
574 195:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Sending request #{request.requestid} to the #{request.agent} agent with ttl #{request.ttl} in collective #{request.collective}&quot;</span>)
575 196:           <span class="ruby-identifier">request</span>.<span class="ruby-identifier">publish</span>
576 197:         <span class="ruby-keyword kw">end</span>
577 198:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
578 199:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-value str">&quot;Could not publish all messages. Publishing timed out.&quot;</span>)
579 200:       <span class="ruby-keyword kw">end</span>
580 201:     <span class="ruby-keyword kw">end</span>
581 </pre>
582           </div>
583         </div>
584       </div>
585
586       <div id="method-M000469" class="method-detail">
587         <a name="M000469"></a>
588
589         <div class="method-heading">
590           <a href="#M000469" class="method-signature">
591           <span class="method-name">start_receiver</span><span class="method-args">(requestid, waitfor, timeout) {|resp.payload| ...}</span>
592           </a>
593         </div>
594       
595         <div class="method-description">
596           <p>
597 Starts the response receiver routine Expected to return the amount of
598 received responses.
599 </p>
600           <p><a class="source-toggle" href="#"
601             onclick="toggleCode('M000469-source');return false;">[Source]</a></p>
602           <div class="method-source-code" id="M000469-source">
603 <pre>
604      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 205</span>
605 205:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">start_receiver</span>(<span class="ruby-identifier">requestid</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
606 206:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Starting response receiver with timeout of #{timeout}&quot;</span>)
607 207:       <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-value">0</span>
608 208:       <span class="ruby-keyword kw">begin</span>
609 209:         <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">timeout</span>) <span class="ruby-keyword kw">do</span>
610 210:           <span class="ruby-keyword kw">begin</span>
611 211:             <span class="ruby-identifier">resp</span> = <span class="ruby-identifier">receive</span>(<span class="ruby-identifier">requestid</span>)
612 212:             <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">resp</span>.<span class="ruby-identifier">payload</span>
613 213:             <span class="ruby-identifier">hosts_responded</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
614 214:           <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">waitfor</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">hosts_responded</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">waitfor</span>)
615 215:         <span class="ruby-keyword kw">end</span>
616 216:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
617 217:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-node">&quot;Could not receive all responses. Expected : #{waitfor}. Received : #{hosts_responded}&quot;</span>)
618 218:       <span class="ruby-keyword kw">end</span>
619 219: 
620 220:       <span class="ruby-identifier">hosts_responded</span>
621 221:     <span class="ruby-keyword kw">end</span>
622 </pre>
623           </div>
624         </div>
625       </div>
626
627       <div id="method-M000461" class="method-detail">
628         <a name="M000461"></a>
629
630         <div class="method-heading">
631           <a href="#M000461" class="method-signature">
632           <span class="method-name">subscribe</span><span class="method-args">(agent, type)</span>
633           </a>
634         </div>
635       
636         <div class="method-description">
637           <p><a class="source-toggle" href="#"
638             onclick="toggleCode('M000461-source');return false;">[Source]</a></p>
639           <div class="method-source-code" id="M000461-source">
640 <pre>
641     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 63</span>
642 63:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">subscribe</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">type</span>)
643 64:       <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@subscriptions</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agent</span>)
644 65:         <span class="ruby-identifier">subscription</span> = <span class="ruby-constant">Util</span>.<span class="ruby-identifier">make_subscriptions</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">type</span>, <span class="ruby-identifier">collective</span>)
645 66:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Subscribing to #{type} target for agent #{agent}&quot;</span>)
646 67: 
647 68:         <span class="ruby-constant">Util</span>.<span class="ruby-identifier">subscribe</span>(<span class="ruby-identifier">subscription</span>)
648 69:         <span class="ruby-ivar">@subscriptions</span>[<span class="ruby-identifier">agent</span>] = <span class="ruby-value">1</span>
649 70:       <span class="ruby-keyword kw">end</span>
650 71:     <span class="ruby-keyword kw">end</span>
651 </pre>
652           </div>
653         </div>
654       </div>
655
656       <div id="method-M000467" class="method-detail">
657         <a name="M000467"></a>
658
659         <div class="method-heading">
660           <a href="#M000467" class="method-signature">
661           <span class="method-name">threaded_req</span><span class="method-args">(request, publish_timeout, timeout, waitfor, &amp;block)</span>
662           </a>
663         </div>
664       
665         <div class="method-description">
666           <p>
667 Starts the client receiver and publisher in threads. This is activated when
668 the &#8216;threader_client&#8217; configuration option is set.
669 </p>
670           <p><a class="source-toggle" href="#"
671             onclick="toggleCode('M000467-source');return false;">[Source]</a></p>
672           <div class="method-source-code" id="M000467-source">
673 <pre>
674      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 170</span>
675 170:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">threaded_req</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
676 171:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-value str">&quot;Starting threaded client&quot;</span>)
677 172:       <span class="ruby-identifier">publisher</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
678 173:         <span class="ruby-identifier">start_publisher</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>)
679 174:       <span class="ruby-keyword kw">end</span>
680 175: 
681 176:       <span class="ruby-comment cmt"># When the client is threaded we add the publishing timeout to</span>
682 177:       <span class="ruby-comment cmt"># the agent timeout so that the receiver doesn't time out before</span>
683 178:       <span class="ruby-comment cmt"># publishing has finished in cases where publish_timeout &gt;= timeout.</span>
684 179:       <span class="ruby-identifier">total_timeout</span> = <span class="ruby-identifier">publish_timeout</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">timeout</span>
685 180:       <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-value">0</span>
686 181: 
687 182:       <span class="ruby-identifier">receiver</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
688 183:         <span class="ruby-identifier">hosts_responded</span> = <span class="ruby-identifier">start_receiver</span>(<span class="ruby-identifier">request</span>.<span class="ruby-identifier">requestid</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-identifier">total_timeout</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
689 184:       <span class="ruby-keyword kw">end</span>
690 185: 
691 186:       <span class="ruby-identifier">receiver</span>.<span class="ruby-identifier">join</span>
692 187:       <span class="ruby-identifier">hosts_responded</span>
693 188:     <span class="ruby-keyword kw">end</span>
694 </pre>
695           </div>
696         </div>
697       </div>
698
699       <div id="method-M000462" class="method-detail">
700         <a name="M000462"></a>
701
702         <div class="method-heading">
703           <a href="#M000462" class="method-signature">
704           <span class="method-name">unsubscribe</span><span class="method-args">(agent, type)</span>
705           </a>
706         </div>
707       
708         <div class="method-description">
709           <p><a class="source-toggle" href="#"
710             onclick="toggleCode('M000462-source');return false;">[Source]</a></p>
711           <div class="method-source-code" id="M000462-source">
712 <pre>
713     <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 73</span>
714 73:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unsubscribe</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">type</span>)
715 74:       <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@subscriptions</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agent</span>)
716 75:         <span class="ruby-identifier">subscription</span> = <span class="ruby-constant">Util</span>.<span class="ruby-identifier">make_subscriptions</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">type</span>, <span class="ruby-identifier">collective</span>)
717 76:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Unsubscribing #{type} target for #{agent}&quot;</span>)
718 77: 
719 78:         <span class="ruby-constant">Util</span>.<span class="ruby-identifier">unsubscribe</span>(<span class="ruby-identifier">subscription</span>)
720 79:         <span class="ruby-ivar">@subscriptions</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">agent</span>)
721 80:       <span class="ruby-keyword kw">end</span>
722 81:     <span class="ruby-keyword kw">end</span>
723 </pre>
724           </div>
725         </div>
726       </div>
727
728       <div id="method-M000466" class="method-detail">
729         <a name="M000466"></a>
730
731         <div class="method-heading">
732           <a href="#M000466" class="method-signature">
733           <span class="method-name">unthreaded_req</span><span class="method-args">(request, publish_timeout, timeout, waitfor, &amp;block)</span>
734           </a>
735         </div>
736       
737         <div class="method-description">
738           <p>
739 Starts the client receiver and publisher unthreaded. This is the default
740 client behaviour.
741 </p>
742           <p><a class="source-toggle" href="#"
743             onclick="toggleCode('M000466-source');return false;">[Source]</a></p>
744           <div class="method-source-code" id="M000466-source">
745 <pre>
746      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 162</span>
747 162:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unthreaded_req</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
748 163:       <span class="ruby-identifier">start_publisher</span>(<span class="ruby-identifier">request</span>, <span class="ruby-identifier">publish_timeout</span>)
749 164:       <span class="ruby-identifier">start_receiver</span>(<span class="ruby-identifier">request</span>.<span class="ruby-identifier">requestid</span>, <span class="ruby-identifier">waitfor</span>, <span class="ruby-identifier">timeout</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
750 165:     <span class="ruby-keyword kw">end</span>
751 </pre>
752           </div>
753         </div>
754       </div>
755
756       <div id="method-M000470" class="method-detail">
757         <a name="M000470"></a>
758
759         <div class="method-heading">
760           <a href="#M000470" class="method-signature">
761           <span class="method-name">update_stat</span><span class="method-args">(stat, hosts_responded, requestid)</span>
762           </a>
763         </div>
764       
765         <div class="method-description">
766           <p><a class="source-toggle" href="#"
767             onclick="toggleCode('M000470-source');return false;">[Source]</a></p>
768           <div class="method-source-code" id="M000470-source">
769 <pre>
770      <span class="ruby-comment cmt"># File lib/mcollective/client.rb, line 223</span>
771 223:     <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">update_stat</span>(<span class="ruby-identifier">stat</span>, <span class="ruby-identifier">hosts_responded</span>, <span class="ruby-identifier">requestid</span>)
772 224:       <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:totaltime</span>] = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:starttime</span>]
773 225:       <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:blocktime</span>] = <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:totaltime</span>] <span class="ruby-operator">-</span> <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:discoverytime</span>]
774 226:       <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:responses</span>] = <span class="ruby-identifier">hosts_responded</span>
775 227:       <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:noresponsefrom</span>] = []
776 228:       <span class="ruby-identifier">stat</span>[<span class="ruby-identifier">:requestid</span>] = <span class="ruby-identifier">requestid</span>
777 229: 
778 230:       <span class="ruby-ivar">@stats</span> = <span class="ruby-identifier">stat</span>
779 231:     <span class="ruby-keyword kw">end</span>
780 </pre>
781           </div>
782         </div>
783       </div>
784
785
786     </div>
787
788
789   </div>
790
791
792 <div id="validator-badges">
793   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
794 </div>
795
796 </body>
797 </html>