Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / RPC / Stats.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::RPC::Stats</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::RPC::Stats</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../../files/lib/mcollective/rpc/stats_rb.html">
59                 lib/mcollective/rpc/stats.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 Class to wrap all the stats and to keep track of some timings
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="#M000123">[]</a>&nbsp;&nbsp;
96       <a href="#M000126">client_stats=</a>&nbsp;&nbsp;
97       <a href="#M000129">discovered_agents</a>&nbsp;&nbsp;
98       <a href="#M000125">fail</a>&nbsp;&nbsp;
99       <a href="#M000130">finish_request</a>&nbsp;&nbsp;
100       <a href="#M000120">new</a>&nbsp;&nbsp;
101       <a href="#M000134">no_response_report</a>&nbsp;&nbsp;
102       <a href="#M000131">node_responded</a>&nbsp;&nbsp;
103       <a href="#M000124">ok</a>&nbsp;&nbsp;
104       <a href="#M000133">report</a>&nbsp;&nbsp;
105       <a href="#M000121">reset</a>&nbsp;&nbsp;
106       <a href="#M000132">text_for_aggregates</a>&nbsp;&nbsp;
107       <a href="#M000128">time_block_execution</a>&nbsp;&nbsp;
108       <a href="#M000127">time_discovery</a>&nbsp;&nbsp;
109       <a href="#M000122">to_hash</a>&nbsp;&nbsp;
110       </div>
111     </div>
112
113   </div>
114
115
116     <!-- if includes -->
117
118     <div id="section">
119
120
121
122
123
124     <div id="attribute-list">
125       <h3 class="section-bar">Attributes</h3>
126
127       <div class="name-list">
128         <table>
129         <tr class="top-aligned-row context-row">
130           <td class="context-item-name">aggregate_failures</td>
131           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
132           <td class="context-item-desc"></td>
133         </tr>
134         <tr class="top-aligned-row context-row">
135           <td class="context-item-name">aggregate_summary</td>
136           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
137           <td class="context-item-desc"></td>
138         </tr>
139         <tr class="top-aligned-row context-row">
140           <td class="context-item-name">blocktime</td>
141           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
142           <td class="context-item-desc"></td>
143         </tr>
144         <tr class="top-aligned-row context-row">
145           <td class="context-item-name">ddl</td>
146           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
147           <td class="context-item-desc"></td>
148         </tr>
149         <tr class="top-aligned-row context-row">
150           <td class="context-item-name">discovered</td>
151           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
152           <td class="context-item-desc"></td>
153         </tr>
154         <tr class="top-aligned-row context-row">
155           <td class="context-item-name">discovered_nodes</td>
156           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
157           <td class="context-item-desc"></td>
158         </tr>
159         <tr class="top-aligned-row context-row">
160           <td class="context-item-name">discoverytime</td>
161           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
162           <td class="context-item-desc"></td>
163         </tr>
164         <tr class="top-aligned-row context-row">
165           <td class="context-item-name">failcount</td>
166           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
167           <td class="context-item-desc"></td>
168         </tr>
169         <tr class="top-aligned-row context-row">
170           <td class="context-item-name">noresponsefrom</td>
171           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
172           <td class="context-item-desc"></td>
173         </tr>
174         <tr class="top-aligned-row context-row">
175           <td class="context-item-name">noresponsefrom</td>
176           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
177           <td class="context-item-desc"></td>
178         </tr>
179         <tr class="top-aligned-row context-row">
180           <td class="context-item-name">okcount</td>
181           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
182           <td class="context-item-desc"></td>
183         </tr>
184         <tr class="top-aligned-row context-row">
185           <td class="context-item-name">requestid</td>
186           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
187           <td class="context-item-desc"></td>
188         </tr>
189         <tr class="top-aligned-row context-row">
190           <td class="context-item-name">responses</td>
191           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
192           <td class="context-item-desc"></td>
193         </tr>
194         <tr class="top-aligned-row context-row">
195           <td class="context-item-name">responsesfrom</td>
196           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
197           <td class="context-item-desc"></td>
198         </tr>
199         <tr class="top-aligned-row context-row">
200           <td class="context-item-name">starttime</td>
201           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
202           <td class="context-item-desc"></td>
203         </tr>
204         <tr class="top-aligned-row context-row">
205           <td class="context-item-name">totaltime</td>
206           <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
207           <td class="context-item-desc"></td>
208         </tr>
209         </table>
210       </div>
211     </div>
212       
213
214
215     <!-- if method_list -->
216     <div id="methods">
217       <h3 class="section-bar">Public Class methods</h3>
218
219       <div id="method-M000120" class="method-detail">
220         <a name="M000120"></a>
221
222         <div class="method-heading">
223           <a href="#M000120" class="method-signature">
224           <span class="method-name">new</span><span class="method-args">()</span>
225           </a>
226         </div>
227       
228         <div class="method-description">
229           <p><a class="source-toggle" href="#"
230             onclick="toggleCode('M000120-source');return false;">[Source]</a></p>
231           <div class="method-source-code" id="M000120-source">
232 <pre>
233     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 9</span>
234  9:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
235 10:         <span class="ruby-identifier">reset</span>
236 11:       <span class="ruby-keyword kw">end</span>
237 </pre>
238           </div>
239         </div>
240       </div>
241
242       <h3 class="section-bar">Public Instance methods</h3>
243
244       <div id="method-M000123" class="method-detail">
245         <a name="M000123"></a>
246
247         <div class="method-heading">
248           <a href="#M000123" class="method-signature">
249           <span class="method-name">[]</span><span class="method-args">(key)</span>
250           </a>
251         </div>
252       
253         <div class="method-description">
254           <p>
255 Fake hash access to keep things backward compatible
256 </p>
257           <p><a class="source-toggle" href="#"
258             onclick="toggleCode('M000123-source');return false;">[Source]</a></p>
259           <div class="method-source-code" id="M000123-source">
260 <pre>
261     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 51</span>
262 51:       <span class="ruby-keyword kw">def</span> <span class="ruby-operator">[]</span>(<span class="ruby-identifier">key</span>)
263 52:         <span class="ruby-identifier">to_hash</span>[<span class="ruby-identifier">key</span>]
264 53:       <span class="ruby-keyword kw">rescue</span>
265 54:         <span class="ruby-keyword kw">nil</span>
266 55:       <span class="ruby-keyword kw">end</span>
267 </pre>
268           </div>
269         </div>
270       </div>
271
272       <div id="method-M000126" class="method-detail">
273         <a name="M000126"></a>
274
275         <div class="method-heading">
276           <a href="#M000126" class="method-signature">
277           <span class="method-name">client_stats=</span><span class="method-args">(stats)</span>
278           </a>
279         </div>
280       
281         <div class="method-description">
282           <p>
283 Re-initializes the object with stats from the basic client
284 </p>
285           <p><a class="source-toggle" href="#"
286             onclick="toggleCode('M000126-source');return false;">[Source]</a></p>
287           <div class="method-source-code" id="M000126-source">
288 <pre>
289     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 72</span>
290 72:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">client_stats=</span>(<span class="ruby-identifier">stats</span>)
291 73:         <span class="ruby-ivar">@noresponsefrom</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:noresponsefrom</span>]
292 74:         <span class="ruby-ivar">@responses</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:responses</span>]
293 75:         <span class="ruby-ivar">@starttime</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:starttime</span>]
294 76:         <span class="ruby-ivar">@blocktime</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:blocktime</span>]
295 77:         <span class="ruby-ivar">@totaltime</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:totaltime</span>]
296 78:         <span class="ruby-ivar">@requestid</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:requestid</span>]
297 79:         <span class="ruby-ivar">@discoverytime</span> = <span class="ruby-identifier">stats</span>[<span class="ruby-identifier">:discoverytime</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@discoverytime</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
298 80:       <span class="ruby-keyword kw">end</span>
299 </pre>
300           </div>
301         </div>
302       </div>
303
304       <div id="method-M000129" class="method-detail">
305         <a name="M000129"></a>
306
307         <div class="method-heading">
308           <a href="#M000129" class="method-signature">
309           <span class="method-name">discovered_agents</span><span class="method-args">(agents)</span>
310           </a>
311         </div>
312       
313         <div class="method-description">
314           <p>
315 Update discovered and discovered_nodes based on discovery results
316 </p>
317           <p><a class="source-toggle" href="#"
318             onclick="toggleCode('M000129-source');return false;">[Source]</a></p>
319           <div class="method-source-code" id="M000129-source">
320 <pre>
321      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 110</span>
322 110:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discovered_agents</span>(<span class="ruby-identifier">agents</span>)
323 111:         <span class="ruby-ivar">@discovered_nodes</span> = <span class="ruby-identifier">agents</span>
324 112:         <span class="ruby-ivar">@discovered</span> = <span class="ruby-identifier">agents</span>.<span class="ruby-identifier">size</span>
325 113:       <span class="ruby-keyword kw">end</span>
326 </pre>
327           </div>
328         </div>
329       </div>
330
331       <div id="method-M000125" class="method-detail">
332         <a name="M000125"></a>
333
334         <div class="method-heading">
335           <a href="#M000125" class="method-signature">
336           <span class="method-name">fail</span><span class="method-args">()</span>
337           </a>
338         </div>
339       
340         <div class="method-description">
341           <p>
342 increment the count of failed hosts
343 </p>
344           <p><a class="source-toggle" href="#"
345             onclick="toggleCode('M000125-source');return false;">[Source]</a></p>
346           <div class="method-source-code" id="M000125-source">
347 <pre>
348     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 65</span>
349 65:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">fail</span>
350 66:         <span class="ruby-ivar">@failcount</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
351 67:       <span class="ruby-keyword kw">rescue</span>
352 68:         <span class="ruby-ivar">@failcount</span> = <span class="ruby-value">1</span>
353 69:       <span class="ruby-keyword kw">end</span>
354 </pre>
355           </div>
356         </div>
357       </div>
358
359       <div id="method-M000130" class="method-detail">
360         <a name="M000130"></a>
361
362         <div class="method-heading">
363           <a href="#M000130" class="method-signature">
364           <span class="method-name">finish_request</span><span class="method-args">()</span>
365           </a>
366         </div>
367       
368         <div class="method-description">
369           <p>
370 Helper to calculate total time etc
371 </p>
372           <p><a class="source-toggle" href="#"
373             onclick="toggleCode('M000130-source');return false;">[Source]</a></p>
374           <div class="method-source-code" id="M000130-source">
375 <pre>
376      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 116</span>
377 116:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">finish_request</span>
378 117:         <span class="ruby-ivar">@totaltime</span> = <span class="ruby-ivar">@blocktime</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@discoverytime</span>
379 118: 
380 119:         <span class="ruby-comment cmt"># figures out who we had no responses from</span>
381 120:         <span class="ruby-identifier">dhosts</span> = <span class="ruby-ivar">@discovered_nodes</span>.<span class="ruby-identifier">clone</span>
382 121:         <span class="ruby-ivar">@responsesfrom</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">dhosts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">r</span>)}
383 122:         <span class="ruby-ivar">@noresponsefrom</span> = <span class="ruby-identifier">dhosts</span>
384 123:       <span class="ruby-keyword kw">rescue</span>
385 124:         <span class="ruby-ivar">@totaltime</span> = <span class="ruby-value">0</span>
386 125:         <span class="ruby-ivar">@noresponsefrom</span> = []
387 126:       <span class="ruby-keyword kw">end</span>
388 </pre>
389           </div>
390         </div>
391       </div>
392
393       <div id="method-M000134" class="method-detail">
394         <a name="M000134"></a>
395
396         <div class="method-heading">
397           <a href="#M000134" class="method-signature">
398           <span class="method-name">no_response_report</span><span class="method-args">()</span>
399           </a>
400         </div>
401       
402         <div class="method-description">
403           <p>
404 Returns a blob of text indicating what nodes did not respond
405 </p>
406           <p><a class="source-toggle" href="#"
407             onclick="toggleCode('M000134-source');return false;">[Source]</a></p>
408           <div class="method-source-code" id="M000134-source">
409 <pre>
410      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 237</span>
411 237:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">no_response_report</span>
412 238:         <span class="ruby-identifier">result_text</span> = <span class="ruby-constant">StringIO</span>.<span class="ruby-identifier">new</span>
413 239: 
414 240:         <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@noresponsefrom</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
415 241:           <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">puts</span>
416 242:           <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-value str">&quot;No response from:&quot;</span>)
417 243:           <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">puts</span>
418 244: 
419 245:           <span class="ruby-ivar">@noresponsefrom</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">in_groups_of</span>(<span class="ruby-value">3</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
420 246:             <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;   %-30s%-30s%-30s&quot;</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">c</span>
421 247:           <span class="ruby-keyword kw">end</span>
422 248: 
423 249:           <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">puts</span>
424 250:         <span class="ruby-keyword kw">end</span>
425 251: 
426 252:         <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">string</span>
427 253:       <span class="ruby-keyword kw">end</span>
428 </pre>
429           </div>
430         </div>
431       </div>
432
433       <div id="method-M000131" class="method-detail">
434         <a name="M000131"></a>
435
436         <div class="method-heading">
437           <a href="#M000131" class="method-signature">
438           <span class="method-name">node_responded</span><span class="method-args">(node)</span>
439           </a>
440         </div>
441       
442         <div class="method-description">
443           <p>
444 Helper to keep track of who we received responses from
445 </p>
446           <p><a class="source-toggle" href="#"
447             onclick="toggleCode('M000131-source');return false;">[Source]</a></p>
448           <div class="method-source-code" id="M000131-source">
449 <pre>
450      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 129</span>
451 129:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">node_responded</span>(<span class="ruby-identifier">node</span>)
452 130:         <span class="ruby-ivar">@responsesfrom</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>
453 131:       <span class="ruby-keyword kw">rescue</span>
454 132:         <span class="ruby-ivar">@responsesfrom</span> = [<span class="ruby-identifier">node</span>]
455 133:       <span class="ruby-keyword kw">end</span>
456 </pre>
457           </div>
458         </div>
459       </div>
460
461       <div id="method-M000124" class="method-detail">
462         <a name="M000124"></a>
463
464         <div class="method-heading">
465           <a href="#M000124" class="method-signature">
466           <span class="method-name">ok</span><span class="method-args">()</span>
467           </a>
468         </div>
469       
470         <div class="method-description">
471           <p>
472 increment the count of <a href="Stats.html#M000124">ok</a> hosts
473 </p>
474           <p><a class="source-toggle" href="#"
475             onclick="toggleCode('M000124-source');return false;">[Source]</a></p>
476           <div class="method-source-code" id="M000124-source">
477 <pre>
478     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 58</span>
479 58:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ok</span>
480 59:         <span class="ruby-ivar">@okcount</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
481 60:       <span class="ruby-keyword kw">rescue</span>
482 61:         <span class="ruby-ivar">@okcount</span> = <span class="ruby-value">1</span>
483 62:       <span class="ruby-keyword kw">end</span>
484 </pre>
485           </div>
486         </div>
487       </div>
488
489       <div id="method-M000133" class="method-detail">
490         <a name="M000133"></a>
491
492         <div class="method-heading">
493           <a href="#M000133" class="method-signature">
494           <span class="method-name">report</span><span class="method-args">(caption = &quot;rpc stats&quot;, summarize = true, verbose = false)</span>
495           </a>
496         </div>
497       
498         <div class="method-description">
499           <p>
500 Returns a blob of text representing the request status based on the stats
501 contained in this class
502 </p>
503           <p><a class="source-toggle" href="#"
504             onclick="toggleCode('M000133-source');return false;">[Source]</a></p>
505           <div class="method-source-code" id="M000133-source">
506 <pre>
507      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 187</span>
508 187:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">report</span>(<span class="ruby-identifier">caption</span> = <span class="ruby-value str">&quot;rpc stats&quot;</span>, <span class="ruby-identifier">summarize</span> = <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword kw">false</span>)
509 188:         <span class="ruby-identifier">result_text</span> = []
510 189: 
511 190:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">verbose</span>
512 191:             <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@aggregate_summary</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">summarize</span>
513 192:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_aggregates</span>
514 193:             <span class="ruby-keyword kw">else</span>
515 194:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span>
516 195:             <span class="ruby-keyword kw">end</span>
517 196: 
518 197:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-node">&quot;---- #{caption} ----&quot;</span>)
519 198: 
520 199:           <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@discovered</span>
521 200:             <span class="ruby-ivar">@responses</span> <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@discovered</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:red</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:reset</span>
522 201:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;           Nodes: %s / %s&quot;</span> <span class="ruby-operator">%</span> [ <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@discovered</span>), <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@responses</span>) ]
523 202:           <span class="ruby-keyword kw">else</span>
524 203:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;           Nodes: #{@responses}&quot;</span>
525 204:           <span class="ruby-keyword kw">end</span>
526 205: 
527 206:           <span class="ruby-ivar">@failcount</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:red</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:reset</span>
528 207: 
529 208:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;     Pass / Fail: %s / %s&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@okcount</span>), <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@failcount</span>) ]
530 209:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;      Start Time: %s&quot;</span>      <span class="ruby-operator">%</span> [<span class="ruby-constant">Time</span>.<span class="ruby-identifier">at</span>(<span class="ruby-ivar">@starttime</span>)]
531 210:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;  Discovery Time: %.2fms&quot;</span>  <span class="ruby-operator">%</span> [<span class="ruby-ivar">@discoverytime</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>]
532 211:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;      Agent Time: %.2fms&quot;</span>  <span class="ruby-operator">%</span> [<span class="ruby-ivar">@blocktime</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>]
533 212:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;      Total Time: %.2fms&quot;</span>  <span class="ruby-operator">%</span> [<span class="ruby-ivar">@totaltime</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>]
534 213:         <span class="ruby-keyword kw">else</span>
535 214:           <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@discovered</span>
536 215:             <span class="ruby-ivar">@responses</span> <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@discovered</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:red</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">color</span> = <span class="ruby-identifier">:green</span>
537 216: 
538 217:             <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@aggregate_summary</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@aggregate_failures</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">summarize</span>
539 218:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_aggregates</span>
540 219:             <span class="ruby-keyword kw">else</span>
541 220:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span>
542 221:             <span class="ruby-keyword kw">end</span>
543 222: 
544 223:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;Finished processing %s / %s hosts in %.2f ms&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@responses</span>), <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">color</span>, <span class="ruby-ivar">@discovered</span>), <span class="ruby-ivar">@blocktime</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>]
545 224:           <span class="ruby-keyword kw">else</span>
546 225:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;Finished processing %s hosts in %.2f ms&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:bold</span>, <span class="ruby-ivar">@responses</span>), <span class="ruby-ivar">@blocktime</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>]
547 226:           <span class="ruby-keyword kw">end</span>
548 227:         <span class="ruby-keyword kw">end</span>
549 228: 
550 229:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">no_response_report</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">&quot;&quot;</span>
551 230:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">no_response_report</span>
552 231:         <span class="ruby-keyword kw">end</span>
553 232: 
554 233:         <span class="ruby-identifier">result_text</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
555 234:       <span class="ruby-keyword kw">end</span>
556 </pre>
557           </div>
558         </div>
559       </div>
560
561       <div id="method-M000121" class="method-detail">
562         <a name="M000121"></a>
563
564         <div class="method-heading">
565           <a href="#M000121" class="method-signature">
566           <span class="method-name">reset</span><span class="method-args">()</span>
567           </a>
568         </div>
569       
570         <div class="method-description">
571           <p>
572 Resets stats, if discovery time is set we keep it as it was
573 </p>
574           <p><a class="source-toggle" href="#"
575             onclick="toggleCode('M000121-source');return false;">[Source]</a></p>
576           <div class="method-source-code" id="M000121-source">
577 <pre>
578     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 14</span>
579 14:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reset</span>
580 15:         <span class="ruby-ivar">@noresponsefrom</span> = []
581 16:         <span class="ruby-ivar">@responsesfrom</span> = []
582 17:         <span class="ruby-ivar">@responses</span> = <span class="ruby-value">0</span>
583 18:         <span class="ruby-ivar">@starttime</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_f</span>
584 19:         <span class="ruby-ivar">@discoverytime</span> = <span class="ruby-value">0</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@discoverytime</span>
585 20:         <span class="ruby-ivar">@blocktime</span> = <span class="ruby-value">0</span>
586 21:         <span class="ruby-ivar">@totaltime</span> = <span class="ruby-value">0</span>
587 22:         <span class="ruby-ivar">@discovered</span> = <span class="ruby-value">0</span>
588 23:         <span class="ruby-ivar">@discovered_nodes</span> = []
589 24:         <span class="ruby-ivar">@okcount</span> = <span class="ruby-value">0</span>
590 25:         <span class="ruby-ivar">@failcount</span> = <span class="ruby-value">0</span>
591 26:         <span class="ruby-ivar">@noresponsefrom</span> = []
592 27:         <span class="ruby-ivar">@requestid</span> = <span class="ruby-keyword kw">nil</span>
593 28:         <span class="ruby-ivar">@aggregate_summary</span> = []
594 29:         <span class="ruby-ivar">@aggregate_failures</span> = []
595 30:       <span class="ruby-keyword kw">end</span>
596 </pre>
597           </div>
598         </div>
599       </div>
600
601       <div id="method-M000132" class="method-detail">
602         <a name="M000132"></a>
603
604         <div class="method-heading">
605           <a href="#M000132" class="method-signature">
606           <span class="method-name">text_for_aggregates</span><span class="method-args">()</span>
607           </a>
608         </div>
609       
610         <div class="method-description">
611           <p><a class="source-toggle" href="#"
612             onclick="toggleCode('M000132-source');return false;">[Source]</a></p>
613           <div class="method-source-code" id="M000132-source">
614 <pre>
615      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 135</span>
616 135:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">text_for_aggregates</span>
617 136:         <span class="ruby-identifier">result</span> = <span class="ruby-constant">StringIO</span>.<span class="ruby-identifier">new</span>
618 137: 
619 138:         <span class="ruby-ivar">@aggregate_summary</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">aggregate</span><span class="ruby-operator">|</span>
620 139:           <span class="ruby-identifier">output_item</span> = <span class="ruby-identifier">aggregate</span>.<span class="ruby-identifier">result</span>[<span class="ruby-identifier">:output</span>]
621 140: 
622 141:           <span class="ruby-keyword kw">begin</span>
623 142:             <span class="ruby-identifier">action_interface</span> = <span class="ruby-ivar">@ddl</span>.<span class="ruby-identifier">action_interface</span>(<span class="ruby-identifier">aggregate</span>.<span class="ruby-identifier">action</span>)
624 143:             <span class="ruby-identifier">display_as</span> = <span class="ruby-identifier">action_interface</span>[<span class="ruby-identifier">:output</span>][<span class="ruby-identifier">output_item</span>][<span class="ruby-identifier">:display_as</span>]
625 144:           <span class="ruby-keyword kw">rescue</span>
626 145:             <span class="ruby-identifier">display_as</span> = <span class="ruby-identifier">output_item</span>
627 146:           <span class="ruby-keyword kw">end</span>
628 147: 
629 148:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">aggregate</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Aggregate</span><span class="ruby-operator">::</span><span class="ruby-constant">Result</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>)
630 149:             <span class="ruby-identifier">aggregate_report</span> = <span class="ruby-identifier">aggregate</span>.<span class="ruby-identifier">to_s</span>
631 150:           <span class="ruby-keyword kw">else</span>
632 151:             <span class="ruby-keyword kw">next</span>
633 152:           <span class="ruby-keyword kw">end</span>
634 153: 
635 154:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:bold</span>, <span class="ruby-value str">&quot;Summary of %s:&quot;</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">display_as</span>)
636 155:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span>
637 156:           <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">aggregate_report</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;&quot;</span>
638 157:             <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">aggregate</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>).<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-value str">&quot;   &quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">x</span>}.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
639 158:           <span class="ruby-keyword kw">else</span>
640 159:             <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-value str">&quot;     No aggregate summary could be computed&quot;</span>)
641 160:           <span class="ruby-keyword kw">end</span>
642 161:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span>
643 162:         <span class="ruby-keyword kw">end</span>
644 163: 
645 164:         <span class="ruby-ivar">@aggregate_failures</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">failed</span><span class="ruby-operator">|</span>
646 165:           <span class="ruby-keyword kw">case</span>(<span class="ruby-identifier">failed</span>[<span class="ruby-identifier">:type</span>])
647 166:           <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:startup</span>
648 167:             <span class="ruby-identifier">message</span> = <span class="ruby-value str">&quot;exception raised while processing startup hook&quot;</span>
649 168:           <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:create</span>
650 169:             <span class="ruby-identifier">message</span> = <span class="ruby-node">&quot;unspecified output '#{failed[:name]}' for the action&quot;</span>
651 170:           <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:process_result</span>
652 171:             <span class="ruby-identifier">message</span> = <span class="ruby-value str">&quot;exception raised while processing result data&quot;</span>
653 172:           <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:summarize</span>
654 173:             <span class="ruby-identifier">message</span> = <span class="ruby-value str">&quot;exception raised while summarizing&quot;</span>
655 174:           <span class="ruby-keyword kw">end</span>
656 175: 
657 176:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:bold</span>, <span class="ruby-value str">&quot;Summary of %s:&quot;</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">failed</span>[<span class="ruby-identifier">:name</span>])
658 177:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span>
659 178:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-value str">&quot;     Could not compute summary - %s&quot;</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">message</span>)
660 179:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">puts</span>
661 180:         <span class="ruby-keyword kw">end</span>
662 181: 
663 182:         <span class="ruby-identifier">result</span>.<span class="ruby-identifier">string</span>
664 183:       <span class="ruby-keyword kw">end</span>
665 </pre>
666           </div>
667         </div>
668       </div>
669
670       <div id="method-M000128" class="method-detail">
671         <a name="M000128"></a>
672
673         <div class="method-heading">
674           <a href="#M000128" class="method-signature">
675           <span class="method-name">time_block_execution</span><span class="method-args">(action)</span>
676           </a>
677         </div>
678       
679         <div class="method-description">
680           <p>
681 helper to time block execution time
682 </p>
683           <p><a class="source-toggle" href="#"
684             onclick="toggleCode('M000128-source');return false;">[Source]</a></p>
685           <div class="method-source-code" id="M000128-source">
686 <pre>
687      <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 96</span>
688  96:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">time_block_execution</span>(<span class="ruby-identifier">action</span>)
689  97:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">action</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:start</span>
690  98:           <span class="ruby-ivar">@block_start</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_f</span>
691  99:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">action</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:end</span>
692 100:           <span class="ruby-ivar">@blocktime</span> <span class="ruby-operator">+=</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-ivar">@block_start</span>
693 101:         <span class="ruby-keyword kw">else</span>
694 102:           <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Uknown block action #{action}&quot;</span>)
695 103:         <span class="ruby-keyword kw">end</span>
696 104:       <span class="ruby-keyword kw">rescue</span>
697 105:         <span class="ruby-ivar">@blocktime</span> = <span class="ruby-value">0</span>
698 106:       <span class="ruby-keyword kw">end</span>
699 </pre>
700           </div>
701         </div>
702       </div>
703
704       <div id="method-M000127" class="method-detail">
705         <a name="M000127"></a>
706
707         <div class="method-heading">
708           <a href="#M000127" class="method-signature">
709           <span class="method-name">time_discovery</span><span class="method-args">(action)</span>
710           </a>
711         </div>
712       
713         <div class="method-description">
714           <p>
715 Utility to time discovery from :start to :end
716 </p>
717           <p><a class="source-toggle" href="#"
718             onclick="toggleCode('M000127-source');return false;">[Source]</a></p>
719           <div class="method-source-code" id="M000127-source">
720 <pre>
721     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 83</span>
722 83:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">time_discovery</span>(<span class="ruby-identifier">action</span>)
723 84:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">action</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:start</span>
724 85:           <span class="ruby-ivar">@discovery_start</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_f</span>
725 86:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">action</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:end</span>
726 87:           <span class="ruby-ivar">@discoverytime</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-ivar">@discovery_start</span>
727 88:         <span class="ruby-keyword kw">else</span>
728 89:           <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Uknown discovery action #{action}&quot;</span>)
729 90:         <span class="ruby-keyword kw">end</span>
730 91:       <span class="ruby-keyword kw">rescue</span>
731 92:         <span class="ruby-ivar">@discoverytime</span> = <span class="ruby-value">0</span>
732 93:       <span class="ruby-keyword kw">end</span>
733 </pre>
734           </div>
735         </div>
736       </div>
737
738       <div id="method-M000122" class="method-detail">
739         <a name="M000122"></a>
740
741         <div class="method-heading">
742           <a href="#M000122" class="method-signature">
743           <span class="method-name">to_hash</span><span class="method-args">()</span>
744           </a>
745         </div>
746       
747         <div class="method-description">
748           <p>
749 returns a hash of our stats
750 </p>
751           <p><a class="source-toggle" href="#"
752             onclick="toggleCode('M000122-source');return false;">[Source]</a></p>
753           <div class="method-source-code" id="M000122-source">
754 <pre>
755     <span class="ruby-comment cmt"># File lib/mcollective/rpc/stats.rb, line 33</span>
756 33:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_hash</span>
757 34:         {<span class="ruby-identifier">:noresponsefrom</span>    =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@noresponsefrom</span>,
758 35:          <span class="ruby-identifier">:starttime</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@starttime</span>,
759 36:          <span class="ruby-identifier">:discoverytime</span>     =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@discoverytime</span>,
760 37:          <span class="ruby-identifier">:blocktime</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@blocktime</span>,
761 38:          <span class="ruby-identifier">:responses</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@responses</span>,
762 39:          <span class="ruby-identifier">:totaltime</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@totaltime</span>,
763 40:          <span class="ruby-identifier">:discovered</span>        =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@discovered</span>,
764 41:          <span class="ruby-identifier">:discovered_nodes</span>  =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@discovered_nodes</span>,
765 42:          <span class="ruby-identifier">:noresponsefrom</span>    =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@noresponsefrom</span>,
766 43:          <span class="ruby-identifier">:okcount</span>           =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@okcount</span>,
767 44:          <span class="ruby-identifier">:requestid</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@requestid</span>,
768 45:          <span class="ruby-identifier">:failcount</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@failcount</span>,
769 46:          <span class="ruby-identifier">:aggregate_summary</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@aggregate_summary</span>,
770 47:          <span class="ruby-identifier">:aggregate_failures</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@aggregate_failures</span>}
771 48:       <span class="ruby-keyword kw">end</span>
772 </pre>
773           </div>
774         </div>
775       </div>
776
777
778     </div>
779
780
781   </div>
782
783
784 <div id="validator-badges">
785   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
786 </div>
787
788 </body>
789 </html>