1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
8 <title>Class: MCollective::Discovery</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Class</strong></td>
53 <td class="class-name-in-header">MCollective::Discovery</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/discovery_rb.html">
59 lib/mcollective/discovery.rb
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
73 <!-- banner header -->
75 <div id="bodyContent">
79 <div id="contextContent">
85 <div id="method-list">
86 <h3 class="section-bar">Methods</h3>
88 <div class="name-list">
89 <a href="#M000404">check_capabilities</a>
90 <a href="#M000403">ddl</a>
91 <a href="#M000408">discover</a>
92 <a href="#M000402">discovery_class</a>
93 <a href="#M000401">discovery_method</a>
94 <a href="#M000407">discovery_timeout</a>
95 <a href="#M000398">find_known_methods</a>
96 <a href="#M000400">force_direct_mode?</a>
97 <a href="#M000405">force_discovery_method_by_filter</a>
98 <a href="#M000399">has_method?</a>
99 <a href="#M000397">new</a>
100 <a href="#M000406">timeout_for_compound_filter</a>
118 <!-- if method_list -->
120 <h3 class="section-bar">Public Class methods</h3>
122 <div id="method-M000397" class="method-detail">
123 <a name="M000397"></a>
125 <div class="method-heading">
126 <a href="#M000397" class="method-signature">
127 <span class="method-name">new</span><span class="method-args">(client)</span>
131 <div class="method-description">
132 <p><a class="source-toggle" href="#"
133 onclick="toggleCode('M000397-source');return false;">[Source]</a></p>
134 <div class="method-source-code" id="M000397-source">
136 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 3</span>
137 3: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">client</span>)
138 4: <span class="ruby-ivar">@known_methods</span> = <span class="ruby-identifier">find_known_methods</span>
139 5: <span class="ruby-ivar">@default_method</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">default_discovery_method</span>
140 6: <span class="ruby-ivar">@client</span> = <span class="ruby-identifier">client</span>
141 7: <span class="ruby-keyword kw">end</span>
147 <h3 class="section-bar">Public Instance methods</h3>
149 <div id="method-M000404" class="method-detail">
150 <a name="M000404"></a>
152 <div class="method-heading">
153 <a href="#M000404" class="method-signature">
154 <span class="method-name">check_capabilities</span><span class="method-args">(filter)</span>
158 <div class="method-description">
160 <a href="Agent.html">Agent</a> filters are always present no matter what,
161 so we cant raise an error if the capabilities suggest the discovery method
162 cant do agents we just have to rely on the discovery plugin to not do
163 stupid things in the presense of a agent filter
165 <p><a class="source-toggle" href="#"
166 onclick="toggleCode('M000404-source');return false;">[Source]</a></p>
167 <div class="method-source-code" id="M000404-source">
169 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 62</span>
170 62: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">check_capabilities</span>(<span class="ruby-identifier">filter</span>)
171 63: <span class="ruby-identifier">capabilities</span> = <span class="ruby-identifier">ddl</span>.<span class="ruby-identifier">discovery_interface</span>[<span class="ruby-identifier">:capabilities</span>]
173 65: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">capabilities</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:classes</span>)
174 66: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Cannot use class filters while using the '%s' discovery method"</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">discovery_method</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"cf_class"</span>].<span class="ruby-identifier">empty?</span>
175 67: <span class="ruby-keyword kw">end</span>
177 69: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">capabilities</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:facts</span>)
178 70: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Cannot use fact filters while using the '%s' discovery method"</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">discovery_method</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"fact"</span>].<span class="ruby-identifier">empty?</span>
179 71: <span class="ruby-keyword kw">end</span>
181 73: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">capabilities</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:identity</span>)
182 74: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Cannot use identity filters while using the '%s' discovery method"</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">discovery_method</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"identity"</span>].<span class="ruby-identifier">empty?</span>
183 75: <span class="ruby-keyword kw">end</span>
185 77: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">capabilities</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:compound</span>)
186 78: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Cannot use compound filters while using the '%s' discovery method"</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">discovery_method</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"compound"</span>].<span class="ruby-identifier">empty?</span>
187 79: <span class="ruby-keyword kw">end</span>
188 80: <span class="ruby-keyword kw">end</span>
194 <div id="method-M000403" class="method-detail">
195 <a name="M000403"></a>
197 <div class="method-heading">
198 <a href="#M000403" class="method-signature">
199 <span class="method-name">ddl</span><span class="method-args">()</span>
203 <div class="method-description">
204 <p><a class="source-toggle" href="#"
205 onclick="toggleCode('M000403-source');return false;">[Source]</a></p>
206 <div class="method-source-code" id="M000403-source">
208 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 47</span>
209 47: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">ddl</span>
210 48: <span class="ruby-ivar">@ddl</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">discovery_method</span>, <span class="ruby-identifier">:discovery</span>)
212 50: <span class="ruby-comment cmt"># if the discovery method got changed we might have an old DDL cached</span>
213 51: <span class="ruby-comment cmt"># this will detect that and reread the correct DDL from disk</span>
214 52: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@ddl</span>.<span class="ruby-identifier">meta</span>[<span class="ruby-identifier">:name</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">discovery_method</span>
215 53: <span class="ruby-ivar">@ddl</span> = <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">discovery_method</span>, <span class="ruby-identifier">:discovery</span>)
216 54: <span class="ruby-keyword kw">end</span>
218 56: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@ddl</span>
219 57: <span class="ruby-keyword kw">end</span>
225 <div id="method-M000408" class="method-detail">
226 <a name="M000408"></a>
228 <div class="method-heading">
229 <a href="#M000408" class="method-signature">
230 <span class="method-name">discover</span><span class="method-args">(filter, timeout, limit)</span>
234 <div class="method-description">
235 <p><a class="source-toggle" href="#"
236 onclick="toggleCode('M000408-source');return false;">[Source]</a></p>
237 <div class="method-source-code" id="M000408-source">
239 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 127</span>
240 127: <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>)
241 128: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Limit has to be an integer"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Fixnum</span>)
243 130: <span class="ruby-identifier">force_discovery_method_by_filter</span>(<span class="ruby-identifier">filter</span>)
245 132: <span class="ruby-identifier">check_capabilities</span>(<span class="ruby-identifier">filter</span>)
247 134: <span class="ruby-identifier">discovered</span> = <span class="ruby-identifier">discovery_class</span>.<span class="ruby-identifier">discover</span>(<span class="ruby-identifier">filter</span>, <span class="ruby-identifier">discovery_timeout</span>(<span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">filter</span>), <span class="ruby-identifier">limit</span>, <span class="ruby-ivar">@client</span>)
249 136: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
250 137: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">discovered</span>[<span class="ruby-value">0</span>,<span class="ruby-identifier">limit</span>]
251 138: <span class="ruby-keyword kw">else</span>
252 139: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">discovered</span>
253 140: <span class="ruby-keyword kw">end</span>
254 141: <span class="ruby-keyword kw">end</span>
260 <div id="method-M000402" class="method-detail">
261 <a name="M000402"></a>
263 <div class="method-heading">
264 <a href="#M000402" class="method-signature">
265 <span class="method-name">discovery_class</span><span class="method-args">()</span>
269 <div class="method-description">
270 <p><a class="source-toggle" href="#"
271 onclick="toggleCode('M000402-source');return false;">[Source]</a></p>
272 <div class="method-source-code" id="M000402-source">
274 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 39</span>
275 39: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discovery_class</span>
276 40: <span class="ruby-identifier">method</span> = <span class="ruby-identifier">discovery_method</span>.<span class="ruby-identifier">capitalize</span>
278 42: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-node">"MCollective::Discovery::#{method}"</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">const_defined?</span>(<span class="ruby-identifier">method</span>)
280 44: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">method</span>)
281 45: <span class="ruby-keyword kw">end</span>
287 <div id="method-M000401" class="method-detail">
288 <a name="M000401"></a>
290 <div class="method-heading">
291 <a href="#M000401" class="method-signature">
292 <span class="method-name">discovery_method</span><span class="method-args">()</span>
296 <div class="method-description">
297 <p><a class="source-toggle" href="#"
298 onclick="toggleCode('M000401-source');return false;">[Source]</a></p>
299 <div class="method-source-code" id="M000401-source">
301 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 21</span>
302 21: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discovery_method</span>
303 22: <span class="ruby-identifier">method</span> = <span class="ruby-value str">"mc"</span>
305 24: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@client</span>.<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:discovery_method</span>]
306 25: <span class="ruby-identifier">method</span> = <span class="ruby-ivar">@client</span>.<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:discovery_method</span>]
307 26: <span class="ruby-keyword kw">else</span>
308 27: <span class="ruby-identifier">method</span> = <span class="ruby-ivar">@default_method</span>
309 28: <span class="ruby-keyword kw">end</span>
311 30: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Unknown discovery method %s"</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">method</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">has_method?</span>(<span class="ruby-identifier">method</span>)
313 32: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">method</span> <span class="ruby-operator">==</span> <span class="ruby-value str">"mc"</span>
314 33: <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Custom discovery methods require direct addressing mode"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">direct_addressing</span>
315 34: <span class="ruby-keyword kw">end</span>
317 36: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">method</span>
318 37: <span class="ruby-keyword kw">end</span>
324 <div id="method-M000407" class="method-detail">
325 <a name="M000407"></a>
327 <div class="method-heading">
328 <a href="#M000407" class="method-signature">
329 <span class="method-name">discovery_timeout</span><span class="method-args">(timeout, filter)</span>
333 <div class="method-description">
334 <p><a class="source-toggle" href="#"
335 onclick="toggleCode('M000407-source');return false;">[Source]</a></p>
336 <div class="method-source-code" id="M000407-source">
338 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 117</span>
339 117: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">discovery_timeout</span>(<span class="ruby-identifier">timeout</span>, <span class="ruby-identifier">filter</span>)
340 118: <span class="ruby-identifier">timeout</span> = <span class="ruby-identifier">ddl</span>.<span class="ruby-identifier">meta</span>[<span class="ruby-identifier">:timeout</span>] <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">timeout</span>
342 120: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">filter</span>[<span class="ruby-value str">"compound"</span>] <span class="ruby-operator">&&</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"compound"</span>].<span class="ruby-identifier">empty?</span>)
343 121: <span class="ruby-identifier">timeout</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">timeout_for_compound_filter</span>(<span class="ruby-identifier">filter</span>[<span class="ruby-value str">"compound"</span>])
344 122: <span class="ruby-keyword kw">else</span>
345 123: <span class="ruby-identifier">timeout</span>
346 124: <span class="ruby-keyword kw">end</span>
347 125: <span class="ruby-keyword kw">end</span>
353 <div id="method-M000398" class="method-detail">
354 <a name="M000398"></a>
356 <div class="method-heading">
357 <a href="#M000398" class="method-signature">
358 <span class="method-name">find_known_methods</span><span class="method-args">()</span>
362 <div class="method-description">
363 <p><a class="source-toggle" href="#"
364 onclick="toggleCode('M000398-source');return false;">[Source]</a></p>
365 <div class="method-source-code" id="M000398-source">
367 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 9</span>
368 9: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_known_methods</span>
369 10: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">find</span>(<span class="ruby-value str">"discovery"</span>)
370 11: <span class="ruby-keyword kw">end</span>
376 <div id="method-M000400" class="method-detail">
377 <a name="M000400"></a>
379 <div class="method-heading">
380 <a href="#M000400" class="method-signature">
381 <span class="method-name">force_direct_mode?</span><span class="method-args">()</span>
385 <div class="method-description">
386 <p><a class="source-toggle" href="#"
387 onclick="toggleCode('M000400-source');return false;">[Source]</a></p>
388 <div class="method-source-code" id="M000400-source">
390 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 17</span>
391 17: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">force_direct_mode?</span>
392 18: <span class="ruby-identifier">discovery_method</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">"mc"</span>
393 19: <span class="ruby-keyword kw">end</span>
399 <div id="method-M000405" class="method-detail">
400 <a name="M000405"></a>
402 <div class="method-heading">
403 <a href="#M000405" class="method-signature">
404 <span class="method-name">force_discovery_method_by_filter</span><span class="method-args">(filter)</span>
408 <div class="method-description">
410 checks if compound filters are used and then forces the ‘mc’
413 <p><a class="source-toggle" href="#"
414 onclick="toggleCode('M000405-source');return false;">[Source]</a></p>
415 <div class="method-source-code" id="M000405-source">
417 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 83</span>
418 83: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">force_discovery_method_by_filter</span>(<span class="ruby-identifier">filter</span>)
419 84: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">discovery_method</span> <span class="ruby-operator">==</span> <span class="ruby-value str">"mc"</span>
420 85: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">filter</span>[<span class="ruby-value str">"compound"</span>].<span class="ruby-identifier">empty?</span>
421 86: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">info</span> <span class="ruby-value str">"Switching to mc discovery method because compound filters are used"</span>
422 87: <span class="ruby-ivar">@client</span>.<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:discovery_method</span>] = <span class="ruby-value str">"mc"</span>
424 89: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
425 90: <span class="ruby-keyword kw">end</span>
426 91: <span class="ruby-keyword kw">end</span>
428 93: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
429 94: <span class="ruby-keyword kw">end</span>
435 <div id="method-M000399" class="method-detail">
436 <a name="M000399"></a>
438 <div class="method-heading">
439 <a href="#M000399" class="method-signature">
440 <span class="method-name">has_method?</span><span class="method-args">(method)</span>
444 <div class="method-description">
445 <p><a class="source-toggle" href="#"
446 onclick="toggleCode('M000399-source');return false;">[Source]</a></p>
447 <div class="method-source-code" id="M000399-source">
449 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 13</span>
450 13: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">has_method?</span>(<span class="ruby-identifier">method</span>)
451 14: <span class="ruby-ivar">@known_methods</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">method</span>)
452 15: <span class="ruby-keyword kw">end</span>
458 <div id="method-M000406" class="method-detail">
459 <a name="M000406"></a>
461 <div class="method-heading">
462 <a href="#M000406" class="method-signature">
463 <span class="method-name">timeout_for_compound_filter</span><span class="method-args">(compound_filter)</span>
467 <div class="method-description">
469 if a compound filter is specified and it has any function then we read the
470 <a href="DDL.html">DDL</a> for each of those plugins and sum up the timeout
471 declared in the <a href="DDL.html">DDL</a>
473 <p><a class="source-toggle" href="#"
474 onclick="toggleCode('M000406-source');return false;">[Source]</a></p>
475 <div class="method-source-code" id="M000406-source">
477 <span class="ruby-comment cmt"># File lib/mcollective/discovery.rb, line 99</span>
478 99: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">timeout_for_compound_filter</span>(<span class="ruby-identifier">compound_filter</span>)
479 100: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">compound_filter</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">compound_filter</span>.<span class="ruby-identifier">empty?</span>
481 102: <span class="ruby-identifier">timeout</span> = <span class="ruby-value">0</span>
483 104: <span class="ruby-identifier">compound_filter</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">filter</span><span class="ruby-operator">|</span>
484 105: <span class="ruby-identifier">filter</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">statement</span><span class="ruby-operator">|</span>
485 106: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>]
486 107: <span class="ruby-identifier">pluginname</span> = <span class="ruby-constant">Data</span>.<span class="ruby-identifier">pluginname</span>(<span class="ruby-identifier">statement</span>[<span class="ruby-value str">"fstatement"</span>][<span class="ruby-value str">"name"</span>])
487 108: <span class="ruby-identifier">ddl</span> = <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">pluginname</span>, <span class="ruby-identifier">:data</span>)
488 109: <span class="ruby-identifier">timeout</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">ddl</span>.<span class="ruby-identifier">meta</span>[<span class="ruby-identifier">:timeout</span>]
489 110: <span class="ruby-keyword kw">end</span>
490 111: <span class="ruby-keyword kw">end</span>
491 112: <span class="ruby-keyword kw">end</span>
493 114: <span class="ruby-identifier">timeout</span>
494 115: <span class="ruby-keyword kw">end</span>
507 <div id="validator-badges">
508 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>