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>Module: MCollective::RPC</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>Module</strong></td>
53 <td class="class-name-in-header">MCollective::RPC</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/rpc_rb.html">
59 lib/mcollective/rpc.rb
62 <a href="../../files/lib/mcollective/rpc/actionrunner_rb.html">
63 lib/mcollective/rpc/actionrunner.rb
66 <a href="../../files/lib/mcollective/rpc/reply_rb.html">
67 lib/mcollective/rpc/reply.rb
70 <a href="../../files/lib/mcollective/rpc/progress_rb.html">
71 lib/mcollective/rpc/progress.rb
74 <a href="../../files/lib/mcollective/rpc/agent_rb.html">
75 lib/mcollective/rpc/agent.rb
78 <a href="../../files/lib/mcollective/rpc/request_rb.html">
79 lib/mcollective/rpc/request.rb
82 <a href="../../files/lib/mcollective/rpc/audit_rb.html">
83 lib/mcollective/rpc/audit.rb
86 <a href="../../files/lib/mcollective/rpc/stats_rb.html">
87 lib/mcollective/rpc/stats.rb
90 <a href="../../files/lib/mcollective/rpc/result_rb.html">
91 lib/mcollective/rpc/result.rb
94 <a href="../../files/lib/mcollective/rpc/client_rb.html">
95 lib/mcollective/rpc/client.rb
98 <a href="../../files/lib/mcollective/rpc/helpers_rb.html">
99 lib/mcollective/rpc/helpers.rb
107 <!-- banner header -->
109 <div id="bodyContent">
113 <div id="contextContent">
115 <div id="description">
117 Toolset to create a standard interface of client and agent using an <a
118 href="RPC.html">RPC</a> metaphor, standard compliant agents will make it
119 easier to create generic clients like web interfaces etc
127 <div id="method-list">
128 <h3 class="section-bar">Methods</h3>
130 <div class="name-list">
131 <a href="#M000043">const_missing</a>
132 <a href="#M000039">discovered</a>
133 <a href="#M000042">empty_filter?</a>
134 <a href="#M000041">printrpc</a>
135 <a href="#M000040">printrpcstats</a>
136 <a href="#M000037">rpcclient</a>
137 <a href="#M000036">rpcoptions</a>
138 <a href="#M000038">stats</a>
149 <div id="class-list">
150 <h3 class="section-bar">Classes and Modules</h3>
152 Class <a href="RPC/ActionRunner.html" class="link">MCollective::RPC::ActionRunner</a><br />
153 Class <a href="RPC/Agent.html" class="link">MCollective::RPC::Agent</a><br />
154 Class <a href="RPC/Audit.html" class="link">MCollective::RPC::Audit</a><br />
155 Class <a href="RPC/Client.html" class="link">MCollective::RPC::Client</a><br />
156 Class <a href="RPC/Helpers.html" class="link">MCollective::RPC::Helpers</a><br />
157 Class <a href="RPC/Progress.html" class="link">MCollective::RPC::Progress</a><br />
158 Class <a href="RPC/Reply.html" class="link">MCollective::RPC::Reply</a><br />
159 Class <a href="RPC/Request.html" class="link">MCollective::RPC::Request</a><br />
160 Class <a href="RPC/Result.html" class="link">MCollective::RPC::Result</a><br />
161 Class <a href="RPC/Stats.html" class="link">MCollective::RPC::Stats</a><br />
171 <!-- if method_list -->
173 <h3 class="section-bar">Public Class methods</h3>
175 <div id="method-M000043" class="method-detail">
176 <a name="M000043"></a>
178 <div class="method-heading">
179 <a href="#M000043" class="method-signature">
180 <span class="method-name">const_missing</span><span class="method-args">(const_name)</span>
184 <div class="method-description">
185 <p><a class="source-toggle" href="#"
186 onclick="toggleCode('M000043-source');return false;">[Source]</a></p>
187 <div class="method-source-code" id="M000043-source">
189 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 175</span>
190 175: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">const_missing</span>(<span class="ruby-identifier">const_name</span>)
191 176: <span class="ruby-keyword kw">super</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">const_name</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:DDL</span>
193 178: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-value str">"MCollective::RPC::DDL is deprecatd, please use MCollective::DDL instead"</span>)
194 179: <span class="ruby-constant">MCollective</span><span class="ruby-operator">::</span><span class="ruby-constant">DDL</span>
195 180: <span class="ruby-keyword kw">end</span>
201 <div id="method-M000039" class="method-detail">
202 <a name="M000039"></a>
204 <div class="method-heading">
205 <a href="#M000039" class="method-signature">
206 <span class="method-name">discovered</span><span class="method-args">(discovered)</span>
210 <div class="method-description">
212 means for other classes to drop <a href="RPC.html#M000039">discovered</a>
213 hosts into this module its a bit hacky but needed so that the mixin methods
214 like <a href="RPC.html#M000040">printrpcstats</a> can easily get access to
215 it without users having to pass it around in params.
217 <p><a class="source-toggle" href="#"
218 onclick="toggleCode('M000039-source');return false;">[Source]</a></p>
219 <div class="method-source-code" id="M000039-source">
221 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 107</span>
222 107: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">discovered</span>(<span class="ruby-identifier">discovered</span>)
223 108: <span class="ruby-ivar">@@discovered</span> = <span class="ruby-identifier">discovered</span>
224 109: <span class="ruby-keyword kw">end</span>
230 <div id="method-M000038" class="method-detail">
231 <a name="M000038"></a>
233 <div class="method-heading">
234 <a href="#M000038" class="method-signature">
235 <span class="method-name">stats</span><span class="method-args">(stats)</span>
239 <div class="method-description">
241 means for other classes to drop <a href="RPC.html#M000038">stats</a> into
242 this module its a bit hacky but needed so that the mixin methods like <a
243 href="RPC.html#M000040">printrpcstats</a> can easily get access to it
244 without users having to pass it around in params.
246 <p><a class="source-toggle" href="#"
247 onclick="toggleCode('M000038-source');return false;">[Source]</a></p>
248 <div class="method-source-code" id="M000038-source">
250 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 99</span>
251 99: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">stats</span>(<span class="ruby-identifier">stats</span>)
252 100: <span class="ruby-ivar">@@stats</span> = <span class="ruby-identifier">stats</span>
253 101: <span class="ruby-keyword kw">end</span>
259 <h3 class="section-bar">Public Instance methods</h3>
261 <div id="method-M000042" class="method-detail">
262 <a name="M000042"></a>
264 <div class="method-heading">
265 <a href="#M000042" class="method-signature">
266 <span class="method-name">empty_filter?</span><span class="method-args">(options)</span>
270 <div class="method-description">
272 Wrapper for <a href="Util.html#M000288">MCollective::Util.empty_filter</a>?
273 to make clients less fugly to write - ticket 18
275 <p><a class="source-toggle" href="#"
276 onclick="toggleCode('M000042-source');return false;">[Source]</a></p>
277 <div class="method-source-code" id="M000042-source">
279 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 167</span>
280 167: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">empty_filter?</span>(<span class="ruby-identifier">options</span>)
281 168: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:filter</span>)
282 169: <span class="ruby-constant">Util</span>.<span class="ruby-identifier">empty_filter?</span>(<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:filter</span>])
283 170: <span class="ruby-keyword kw">else</span>
284 171: <span class="ruby-constant">Util</span>.<span class="ruby-identifier">empty_filter?</span>(<span class="ruby-identifier">options</span>)
285 172: <span class="ruby-keyword kw">end</span>
286 173: <span class="ruby-keyword kw">end</span>
292 <div id="method-M000041" class="method-detail">
293 <a name="M000041"></a>
295 <div class="method-heading">
296 <a href="#M000041" class="method-signature">
297 <span class="method-name">printrpc</span><span class="method-args">(result, flags = {})</span>
301 <div class="method-description">
303 Prints the result of an <a href="RPC.html">RPC</a> call.
306 In the default quiet mode - no flattening or verbose - only results that
307 produce an error will be printed
310 To get details of each result run with the -v command line option.
312 <p><a class="source-toggle" href="#"
313 onclick="toggleCode('M000041-source');return false;">[Source]</a></p>
314 <div class="method-source-code" id="M000041-source">
316 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 146</span>
317 146: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">printrpc</span>(<span class="ruby-identifier">result</span>, <span class="ruby-identifier">flags</span> = {})
318 147: <span class="ruby-identifier">verbose</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:verbose</span>] <span class="ruby-keyword kw">rescue</span> <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword kw">false</span>
319 148: <span class="ruby-identifier">verbose</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:verbose</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">verbose</span>
320 149: <span class="ruby-identifier">flatten</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:flatten</span>] <span class="ruby-operator">||</span> <span class="ruby-keyword kw">false</span>
321 150: <span class="ruby-identifier">format</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:output_format</span>]
322 151: <span class="ruby-identifier">forced_mode</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:force_display_mode</span>] <span class="ruby-operator">||</span> <span class="ruby-keyword kw">false</span>
324 153: <span class="ruby-identifier">result_text</span> = <span class="ruby-constant">Helpers</span>.<span class="ruby-identifier">rpcresults</span>(<span class="ruby-identifier">result</span>, {<span class="ruby-identifier">:verbose</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">verbose</span>, <span class="ruby-identifier">:flatten</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">flatten</span>, <span class="ruby-identifier">:format</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">format</span>, <span class="ruby-identifier">:force_display_mode</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">forced_mode</span>})
326 155: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">format</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:console</span>
327 156: <span class="ruby-identifier">puts</span> <span class="ruby-value str">"\n%s\n"</span> <span class="ruby-operator">%</span> [ <span class="ruby-identifier">result_text</span> ]
328 157: <span class="ruby-keyword kw">else</span>
329 158: <span class="ruby-comment cmt"># when we get just one result to print dont pad them all with</span>
330 159: <span class="ruby-comment cmt"># blank spaces etc, just print the individual result with no</span>
331 160: <span class="ruby-comment cmt"># padding</span>
332 161: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">result_text</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">result_text</span> <span class="ruby-operator">==</span> <span class="ruby-value str">""</span>
333 162: <span class="ruby-keyword kw">end</span>
334 163: <span class="ruby-keyword kw">end</span>
340 <div id="method-M000040" class="method-detail">
341 <a name="M000040"></a>
343 <div class="method-heading">
344 <a href="#M000040" class="method-signature">
345 <span class="method-name">printrpcstats</span><span class="method-args">(flags={})</span>
349 <div class="method-description">
351 Prints <a href="RPC.html#M000038">stats</a>, requires <a
352 href="RPC.html#M000038">stats</a> to be saved from elsewhere using the <a
353 href="RPC.html#M000038">MCollective::RPC.stats</a> method.
356 If you‘ve passed -v on the command line a detailed stat block will be
357 printed, else just a one liner.
360 You can pass flags into it:
363 printrpcstats :caption => "Foo", :summarize => true
366 This will use "Foo" as the caption to the <a
367 href="RPC.html#M000038">stats</a> in verbose mode and print out any
368 aggregate summary information if present
370 <p><a class="source-toggle" href="#"
371 onclick="toggleCode('M000040-source');return false;">[Source]</a></p>
372 <div class="method-source-code" id="M000040-source">
374 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 123</span>
375 123: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">printrpcstats</span>(<span class="ruby-identifier">flags</span>={})
376 124: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:output_format</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">:console</span>
378 126: <span class="ruby-identifier">flags</span> = {<span class="ruby-identifier">:summarize</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">:caption</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"rpc stats"</span>}.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">flags</span>)
380 128: <span class="ruby-identifier">verbose</span> = <span class="ruby-ivar">@options</span>[<span class="ruby-identifier">:verbose</span>] <span class="ruby-keyword kw">rescue</span> <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword kw">false</span>
382 130: <span class="ruby-keyword kw">begin</span>
383 131: <span class="ruby-identifier">stats</span> = <span class="ruby-ivar">@@stats</span>
384 132: <span class="ruby-keyword kw">rescue</span>
385 133: <span class="ruby-identifier">puts</span>(<span class="ruby-value str">"no stats to display"</span>)
386 134: <span class="ruby-keyword kw">return</span>
387 135: <span class="ruby-keyword kw">end</span>
389 137: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">stats</span>.<span class="ruby-identifier">report</span>(<span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:caption</span>], <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:summarize</span>], <span class="ruby-identifier">verbose</span>)
390 138: <span class="ruby-keyword kw">end</span>
396 <div id="method-M000037" class="method-detail">
397 <a name="M000037"></a>
399 <div class="method-heading">
400 <a href="#M000037" class="method-signature">
401 <span class="method-name">rpcclient</span><span class="method-args">(agent, flags = {}) {|rpc| ...}</span>
405 <div class="method-description">
407 Wrapper to create clients, supposed to be used as a mixin:
410 include <a href="RPC.html">MCollective::RPC</a>
413 exim = <a href="RPC.html#M000037">rpcclient</a>("exim") <a
414 href="RPC.html#M000041">printrpc</a> exim.mailq
420 <a href="RPC.html#M000037">rpcclient</a>("exim") do |exim|
429 It will take a few flags:
432 :configfile => "etc/client.cfg"
433 :options => options
434 :exit_on_failure => true
437 Options would be a build up options hash from the <a
438 href="Optionparser.html">Optionparser</a> you can use the <a
439 href="RPC.html#M000036">rpcoptions</a> helper to create this
442 :exit_on_failure is true by default, and causes the application to exit if
443 there is a failure constructing the <a href="RPC.html">RPC</a> client. Set
444 this flag to false to cause an Exception to be raised instead.
446 <p><a class="source-toggle" href="#"
447 onclick="toggleCode('M000037-source');return false;">[Source]</a></p>
448 <div class="method-source-code" id="M000037-source">
450 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 60</span>
451 60: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">rpcclient</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">flags</span> = {})
452 61: <span class="ruby-identifier">configfile</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:configfile</span>] <span class="ruby-operator">||</span> <span class="ruby-value str">"/etc/mcollective/client.cfg"</span>
453 62: <span class="ruby-identifier">options</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:options</span>] <span class="ruby-operator">||</span> <span class="ruby-keyword kw">nil</span>
455 64: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>.<span class="ruby-identifier">key?</span>(<span class="ruby-identifier">:exit_on_failure</span>)
456 65: <span class="ruby-identifier">exit_on_failure</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:exit_on_failure</span>]
457 66: <span class="ruby-keyword kw">else</span>
458 67: <span class="ruby-comment cmt"># We exit on failure by default for CLI-friendliness</span>
459 68: <span class="ruby-identifier">exit_on_failure</span> = <span class="ruby-keyword kw">true</span>
460 69: <span class="ruby-keyword kw">end</span>
462 71: <span class="ruby-keyword kw">begin</span>
463 72: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>
464 73: <span class="ruby-identifier">rpc</span> = <span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:configfile</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:config</span>], <span class="ruby-identifier">:options</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">options</span>)
465 74: <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">rpc</span>.<span class="ruby-identifier">options</span>
466 75: <span class="ruby-keyword kw">else</span>
467 76: <span class="ruby-identifier">rpc</span> = <span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:configfile</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">configfile</span>)
468 77: <span class="ruby-ivar">@options</span> = <span class="ruby-identifier">rpc</span>.<span class="ruby-identifier">options</span>
469 78: <span class="ruby-keyword kw">end</span>
470 79: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
471 80: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">exit_on_failure</span>
472 81: <span class="ruby-identifier">puts</span>(<span class="ruby-node">"Could not create RPC client: #{e}"</span>)
473 82: <span class="ruby-identifier">exit!</span>
474 83: <span class="ruby-keyword kw">else</span>
475 84: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
476 85: <span class="ruby-keyword kw">end</span>
477 86: <span class="ruby-keyword kw">end</span>
479 88: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
480 89: <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">rpc</span>)
481 90: <span class="ruby-keyword kw">else</span>
482 91: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">rpc</span>
483 92: <span class="ruby-keyword kw">end</span>
484 93: <span class="ruby-keyword kw">end</span>
490 <div id="method-M000036" class="method-detail">
491 <a name="M000036"></a>
493 <div class="method-heading">
494 <a href="#M000036" class="method-signature">
495 <span class="method-name">rpcoptions</span><span class="method-args">() {|parser, options| ...}</span>
499 <div class="method-description">
501 Creates a standard options hash, pass in a block to add extra headings etc
502 see <a href="Optionparser.html">Optionparser</a>
504 <p><a class="source-toggle" href="#"
505 onclick="toggleCode('M000036-source');return false;">[Source]</a></p>
506 <div class="method-source-code" id="M000036-source">
508 <span class="ruby-comment cmt"># File lib/mcollective/rpc.rb, line 21</span>
509 21: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">rpcoptions</span>
510 22: <span class="ruby-identifier">oparser</span> = <span class="ruby-constant">MCollective</span><span class="ruby-operator">::</span><span class="ruby-constant">Optionparser</span>.<span class="ruby-identifier">new</span>({<span class="ruby-identifier">:verbose</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">:progress_bar</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">true</span>}, <span class="ruby-value str">"filter"</span>)
512 24: <span class="ruby-identifier">options</span> = <span class="ruby-identifier">oparser</span>.<span class="ruby-identifier">parse</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parser</span>, <span class="ruby-identifier">options</span><span class="ruby-operator">|</span>
513 25: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
514 26: <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">parser</span>, <span class="ruby-identifier">options</span>)
515 27: <span class="ruby-keyword kw">end</span>
517 29: <span class="ruby-constant">Helpers</span>.<span class="ruby-identifier">add_simplerpc_options</span>(<span class="ruby-identifier">parser</span>, <span class="ruby-identifier">options</span>)
518 30: <span class="ruby-keyword kw">end</span>
520 32: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">options</span>
521 33: <span class="ruby-keyword kw">end</span>
534 <div id="validator-badges">
535 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>