Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / RPC / Helpers.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::Helpers</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::Helpers</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../../files/lib/mcollective/rpc/helpers_rb.html">
59                 lib/mcollective/rpc/helpers.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 Various utilities for the <a href="../RPC.html">RPC</a> system
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="#M000050">add_simplerpc_options</a>&nbsp;&nbsp;
96       <a href="#M000045">extract_hosts_from_array</a>&nbsp;&nbsp;
97       <a href="#M000044">extract_hosts_from_json</a>&nbsp;&nbsp;
98       <a href="#M000049">old_rpcresults</a>&nbsp;&nbsp;
99       <a href="#M000046">rpcresults</a>&nbsp;&nbsp;
100       <a href="#M000048">text_for_flattened_result</a>&nbsp;&nbsp;
101       <a href="#M000047">text_for_result</a>&nbsp;&nbsp;
102       </div>
103     </div>
104
105   </div>
106
107
108     <!-- if includes -->
109
110     <div id="section">
111
112
113
114
115
116       
117
118
119     <!-- if method_list -->
120     <div id="methods">
121       <h3 class="section-bar">Public Class methods</h3>
122
123       <div id="method-M000050" class="method-detail">
124         <a name="M000050"></a>
125
126         <div class="method-heading">
127           <a href="#M000050" class="method-signature">
128           <span class="method-name">add_simplerpc_options</span><span class="method-args">(parser, options)</span>
129           </a>
130         </div>
131       
132         <div class="method-description">
133           <p>
134 Add SimpleRPC common options
135 </p>
136           <p><a class="source-toggle" href="#"
137             onclick="toggleCode('M000050-source');return false;">[Source]</a></p>
138           <div class="method-source-code" id="M000050-source">
139 <pre>
140      <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 254</span>
141 254:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">add_simplerpc_options</span>(<span class="ruby-identifier">parser</span>, <span class="ruby-identifier">options</span>)
142 255:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">separator</span> <span class="ruby-value str">&quot;&quot;</span>
143 256:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">separator</span> <span class="ruby-value str">&quot;RPC Options&quot;</span>
144 257: 
145 258:         <span class="ruby-comment cmt"># add SimpleRPC specific options to all clients that use our library</span>
146 259:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--np'</span>, <span class="ruby-value str">'--no-progress'</span>, <span class="ruby-value str">'Do not show the progress bar'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
147 260:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:progress_bar</span>] = <span class="ruby-keyword kw">false</span>
148 261:         <span class="ruby-keyword kw">end</span>
149 262: 
150 263:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--one'</span>, <span class="ruby-value str">'-1'</span>, <span class="ruby-value str">'Send request to only one discovered nodes'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
151 264:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:mcollective_limit_targets</span>] = <span class="ruby-value">1</span>
152 265:         <span class="ruby-keyword kw">end</span>
153 266: 
154 267:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--batch SIZE'</span>, <span class="ruby-constant">Integer</span>, <span class="ruby-value str">'Do requests in batches'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
155 268:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:batch_size</span>] = <span class="ruby-identifier">v</span>
156 269:         <span class="ruby-keyword kw">end</span>
157 270: 
158 271:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--batch-sleep SECONDS'</span>, <span class="ruby-constant">Float</span>, <span class="ruby-value str">'Sleep time between batches'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
159 272:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:batch_sleep_time</span>] = <span class="ruby-identifier">v</span>
160 273:         <span class="ruby-keyword kw">end</span>
161 274: 
162 275:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--limit-seed NUMBER'</span>, <span class="ruby-constant">Integer</span>, <span class="ruby-value str">'Seed value for deterministic random batching'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
163 276:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:limit_seed</span>] = <span class="ruby-identifier">v</span>
164 277:         <span class="ruby-keyword kw">end</span>
165 278: 
166 279:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--limit-nodes COUNT'</span>, <span class="ruby-value str">'--ln'</span>, <span class="ruby-value str">'--limit'</span>, <span class="ruby-value str">'Send request to only a subset of nodes, can be a percentage'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
167 280:           <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Invalid limit specified: #{v} valid limits are /^\d+%*$/&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^\d+%*$/</span>
168 281: 
169 282:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^\d+$/</span>
170 283:             <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:mcollective_limit_targets</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">to_i</span>
171 284:           <span class="ruby-keyword kw">else</span>
172 285:             <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:mcollective_limit_targets</span>] = <span class="ruby-identifier">v</span>
173 286:           <span class="ruby-keyword kw">end</span>
174 287:         <span class="ruby-keyword kw">end</span>
175 288: 
176 289:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--json'</span>, <span class="ruby-value str">'-j'</span>, <span class="ruby-value str">'Produce JSON output'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
177 290:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:progress_bar</span>] = <span class="ruby-keyword kw">false</span>
178 291:           <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:output_format</span>] = <span class="ruby-identifier">:json</span>
179 292:         <span class="ruby-keyword kw">end</span>
180 293: 
181 294:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">'--display MODE'</span>, <span class="ruby-value str">'Influence how results are displayed. One of ok, all or failed'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
182 295:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">v</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;all&quot;</span>
183 296:             <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:force_display_mode</span>] = <span class="ruby-identifier">:always</span>
184 297:           <span class="ruby-keyword kw">else</span>
185 298:             <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:force_display_mode</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">intern</span>
186 299:           <span class="ruby-keyword kw">end</span>
187 300: 
188 301:           <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;--display has to be one of 'ok', 'all' or 'failed'&quot;</span> <span class="ruby-keyword kw">unless</span> [<span class="ruby-identifier">:ok</span>, <span class="ruby-identifier">:failed</span>, <span class="ruby-identifier">:always</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:force_display_mode</span>])
189 302:         <span class="ruby-keyword kw">end</span>
190 303:       <span class="ruby-keyword kw">end</span>
191 </pre>
192           </div>
193         </div>
194       </div>
195
196       <div id="method-M000045" class="method-detail">
197         <a name="M000045"></a>
198
199         <div class="method-heading">
200           <a href="#M000045" class="method-signature">
201           <span class="method-name">extract_hosts_from_array</span><span class="method-args">(hosts)</span>
202           </a>
203         </div>
204       
205         <div class="method-description">
206           <p>
207 Given an array of something, make sure each is a string chomp off any new
208 lines and return just the array of hosts
209 </p>
210           <p><a class="source-toggle" href="#"
211             onclick="toggleCode('M000045-source');return false;">[Source]</a></p>
212           <div class="method-source-code" id="M000045-source">
213 <pre>
214     <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 29</span>
215 29:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">extract_hosts_from_array</span>(<span class="ruby-identifier">hosts</span>)
216 30:         [<span class="ruby-identifier">hosts</span>].<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">host</span><span class="ruby-operator">|</span>
217 31:           <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;#{host} should be a string&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">host</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
218 32:           <span class="ruby-identifier">host</span>.<span class="ruby-identifier">chomp</span>
219 33:         <span class="ruby-keyword kw">end</span>
220 34:       <span class="ruby-keyword kw">end</span>
221 </pre>
222           </div>
223         </div>
224       </div>
225
226       <div id="method-M000044" class="method-detail">
227         <a name="M000044"></a>
228
229         <div class="method-heading">
230           <a href="#M000044" class="method-signature">
231           <span class="method-name">extract_hosts_from_json</span><span class="method-args">(json)</span>
232           </a>
233         </div>
234       
235         <div class="method-description">
236           <p>
237 Parse JSON output as produced by printrpc and extract the
238 &quot;sender&quot; of each rpc response
239 </p>
240 <p>
241 The simplist valid JSON based data would be:
242 </p>
243 <p>
244 [
245 </p>
246 <pre>
247  {&quot;sender&quot; =&gt; &quot;example.com&quot;},
248  {&quot;sender&quot; =&gt; &quot;another.com&quot;}
249 </pre>
250 <p>
251 ]
252 </p>
253           <p><a class="source-toggle" href="#"
254             onclick="toggleCode('M000044-source');return false;">[Source]</a></p>
255           <div class="method-source-code" id="M000044-source">
256 <pre>
257     <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 14</span>
258 14:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">extract_hosts_from_json</span>(<span class="ruby-identifier">json</span>)
259 15:         <span class="ruby-identifier">hosts</span> = <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">json</span>)
260 16: 
261 17:         <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;JSON hosts list is not an array&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">hosts</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>)
262 18: 
263 19:         <span class="ruby-identifier">hosts</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">host</span><span class="ruby-operator">|</span>
264 20:           <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;JSON host list is not an array of Hashes&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">host</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Hash</span>)
265 21:           <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;JSON host list does not have senders in it&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">host</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-value str">&quot;sender&quot;</span>)
266 22: 
267 23:           <span class="ruby-identifier">host</span>[<span class="ruby-value str">&quot;sender&quot;</span>]
268 24:         <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">uniq</span>
269 25:       <span class="ruby-keyword kw">end</span>
270 </pre>
271           </div>
272         </div>
273       </div>
274
275       <div id="method-M000049" class="method-detail">
276         <a name="M000049"></a>
277
278         <div class="method-heading">
279           <a href="#M000049" class="method-signature">
280           <span class="method-name">old_rpcresults</span><span class="method-args">(result, flags = {})</span>
281           </a>
282         </div>
283       
284         <div class="method-description">
285           <p>
286 Backward compatible display block for results without a <a
287 href="../DDL.html">DDL</a>
288 </p>
289           <p><a class="source-toggle" href="#"
290             onclick="toggleCode('M000049-source');return false;">[Source]</a></p>
291           <div class="method-source-code" id="M000049-source">
292 <pre>
293      <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 202</span>
294 202:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">old_rpcresults</span>(<span class="ruby-identifier">result</span>, <span class="ruby-identifier">flags</span> = {})
295 203:         <span class="ruby-identifier">result_text</span> = <span class="ruby-value str">&quot;&quot;</span>
296 204: 
297 205:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:flatten</span>]
298 206:           <span class="ruby-identifier">result</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
299 207:             <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">&lt;=</span> <span class="ruby-value">1</span>
300 208:               <span class="ruby-identifier">data</span> = <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:data</span>]
301 209: 
302 210:               <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
303 211:                 <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">pretty_inspect</span>
304 212:               <span class="ruby-keyword kw">else</span>
305 213:                 <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">data</span>
306 214:               <span class="ruby-keyword kw">end</span>
307 215:             <span class="ruby-keyword kw">else</span>
308 216:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">pretty_inspect</span>
309 217:             <span class="ruby-keyword kw">end</span>
310 218:           <span class="ruby-keyword kw">end</span>
311 219: 
312 220:           <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span>
313 221:         <span class="ruby-keyword kw">else</span>
314 222:           [<span class="ruby-identifier">result</span>].<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
315 223: 
316 224:             <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:verbose</span>]
317 225:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;%-40s: %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">r</span>[<span class="ruby-identifier">:sender</span>], <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statusmsg</span>]]
318 226: 
319 227:               <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">&lt;=</span> <span class="ruby-value">1</span>
320 228:                 <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:data</span>].<span class="ruby-identifier">pretty_inspect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>).<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">m</span><span class="ruby-operator">|</span> <span class="ruby-identifier">result_text</span> <span class="ruby-operator">+=</span> <span class="ruby-node">&quot;    #{m}&quot;</span>}
321 229:                 <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;\n\n&quot;</span>
322 230:               <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">==</span> <span class="ruby-value">2</span>
323 231:                 <span class="ruby-comment cmt"># dont print anything, no useful data to display</span>
324 232:                 <span class="ruby-comment cmt"># past what was already shown</span>
325 233:               <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">==</span> <span class="ruby-value">3</span>
326 234:                 <span class="ruby-comment cmt"># dont print anything, no useful data to display</span>
327 235:                 <span class="ruby-comment cmt"># past what was already shown</span>
328 236:               <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">==</span> <span class="ruby-value">4</span>
329 237:                 <span class="ruby-comment cmt"># dont print anything, no useful data to display</span>
330 238:                 <span class="ruby-comment cmt"># past what was already shown</span>
331 239:               <span class="ruby-keyword kw">else</span>
332 240:                 <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;    #{r[:statusmsg]}&quot;</span>
333 241:               <span class="ruby-keyword kw">end</span>
334 242:             <span class="ruby-keyword kw">else</span>
335 243:               <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>] <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
336 244:                 <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;%-40s %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">r</span>[<span class="ruby-identifier">:sender</span>], <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statusmsg</span>])]
337 245:               <span class="ruby-keyword kw">end</span>
338 246:             <span class="ruby-keyword kw">end</span>
339 247:           <span class="ruby-keyword kw">end</span>
340 248:         <span class="ruby-keyword kw">end</span>
341 249: 
342 250:         <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span>
343 251:       <span class="ruby-keyword kw">end</span>
344 </pre>
345           </div>
346         </div>
347       </div>
348
349       <div id="method-M000046" class="method-detail">
350         <a name="M000046"></a>
351
352         <div class="method-heading">
353           <a href="#M000046" class="method-signature">
354           <span class="method-name">rpcresults</span><span class="method-args">(result, flags = {})</span>
355           </a>
356         </div>
357       
358         <div class="method-description">
359           <p>
360 Returns a blob of text representing the results in a standard way
361 </p>
362 <p>
363 It tries hard to do sane things so you often should not need to write your
364 own display functions
365 </p>
366 <p>
367 If the agent you are getting results for has a <a
368 href="../DDL.html">DDL</a> it will use the hints in there to do the right
369 thing specifically it will look at the values of display in the <a
370 href="../DDL.html">DDL</a> to choose when to show results
371 </p>
372 <p>
373 If you do not have a <a href="../DDL.html">DDL</a> you can pass these
374 flags:
375 </p>
376 <pre>
377    printrpc exim.mailq, :flatten =&gt; true
378    printrpc exim.mailq, :verbose =&gt; true
379 </pre>
380 <p>
381 If you&#8216;ve asked it to flatten the result it will not print sender
382 hostnames, it will just print the result as if it&#8216;s one huge result,
383 handy for things like showing a combined mailq.
384 </p>
385           <p><a class="source-toggle" href="#"
386             onclick="toggleCode('M000046-source');return false;">[Source]</a></p>
387           <div class="method-source-code" id="M000046-source">
388 <pre>
389      <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 54</span>
390  54:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">rpcresults</span>(<span class="ruby-identifier">result</span>, <span class="ruby-identifier">flags</span> = {})
391  55:         <span class="ruby-identifier">flags</span> = {<span class="ruby-identifier">:verbose</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">:flatten</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">:format</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:console</span>, <span class="ruby-identifier">:force_display_mode</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>}.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">flags</span>)
392  56: 
393  57:         <span class="ruby-identifier">result_text</span> = <span class="ruby-value str">&quot;&quot;</span>
394  58:         <span class="ruby-identifier">ddl</span> = <span class="ruby-keyword kw">nil</span>
395  59: 
396  60:         <span class="ruby-comment cmt"># if running in verbose mode, just use the old style print</span>
397  61:         <span class="ruby-comment cmt"># no need for all the DDL helpers obfuscating the result</span>
398  62:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:format</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">:json</span>
399  63:           <span class="ruby-keyword kw">if</span> <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">tty?</span>
400  64:             <span class="ruby-identifier">result_text</span> = <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">pretty_generate</span>(<span class="ruby-identifier">result</span>)
401  65:           <span class="ruby-keyword kw">else</span>
402  66:             <span class="ruby-identifier">result_text</span> = <span class="ruby-identifier">result</span>.<span class="ruby-identifier">to_json</span>
403  67:           <span class="ruby-keyword kw">end</span>
404  68:         <span class="ruby-keyword kw">else</span>
405  69:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:verbose</span>]
406  70:             <span class="ruby-identifier">result_text</span> = <span class="ruby-identifier">old_rpcresults</span>(<span class="ruby-identifier">result</span>, <span class="ruby-identifier">flags</span>)
407  71:           <span class="ruby-keyword kw">else</span>
408  72:             [<span class="ruby-identifier">result</span>].<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
409  73:               <span class="ruby-keyword kw">begin</span>
410  74:                 <span class="ruby-identifier">ddl</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">DDL</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">r</span>.<span class="ruby-identifier">agent</span>).<span class="ruby-identifier">action_interface</span>(<span class="ruby-identifier">r</span>.<span class="ruby-identifier">action</span>.<span class="ruby-identifier">to_s</span>)
411  75: 
412  76:                 <span class="ruby-identifier">sender</span> = <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:sender</span>]
413  77:                 <span class="ruby-identifier">status</span> = <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statuscode</span>]
414  78:                 <span class="ruby-identifier">message</span> = <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:statusmsg</span>]
415  79:                 <span class="ruby-identifier">result</span> = <span class="ruby-identifier">r</span>[<span class="ruby-identifier">:data</span>]
416  80: 
417  81:                 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:force_display_mode</span>]
418  82:                   <span class="ruby-identifier">display</span> = <span class="ruby-identifier">flags</span>[<span class="ruby-identifier">:force_display_mode</span>]
419  83:                 <span class="ruby-keyword kw">else</span>
420  84:                   <span class="ruby-identifier">display</span> = <span class="ruby-identifier">ddl</span>[<span class="ruby-identifier">:display</span>]
421  85:                 <span class="ruby-keyword kw">end</span>
422  86: 
423  87:                 <span class="ruby-comment cmt"># appand the results only according to what the DDL says</span>
424  88:                 <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">display</span>
425  89:                   <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:ok</span>
426  90:                     <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
427  91:                       <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_result</span>(<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">message</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">ddl</span>)
428  92:                     <span class="ruby-keyword kw">end</span>
429  93: 
430  94:                   <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:failed</span>
431  95:                     <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
432  96:                       <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_result</span>(<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">message</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">ddl</span>)
433  97:                     <span class="ruby-keyword kw">end</span>
434  98: 
435  99:                   <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:always</span>
436 100:                     <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_result</span>(<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">message</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">ddl</span>)
437 101: 
438 102:                   <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:flatten</span>
439 103:                     <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">text_for_flattened_result</span>(<span class="ruby-identifier">status</span>, <span class="ruby-identifier">result</span>)
440 104: 
441 105:                 <span class="ruby-keyword kw">end</span>
442 106:               <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
443 107:                 <span class="ruby-comment cmt"># no DDL so just do the old style print unchanged for</span>
444 108:                 <span class="ruby-comment cmt"># backward compat</span>
445 109:                 <span class="ruby-identifier">result_text</span> = <span class="ruby-identifier">old_rpcresults</span>(<span class="ruby-identifier">result</span>, <span class="ruby-identifier">flags</span>)
446 110:               <span class="ruby-keyword kw">end</span>
447 111:             <span class="ruby-keyword kw">end</span>
448 112:           <span class="ruby-keyword kw">end</span>
449 113:         <span class="ruby-keyword kw">end</span>
450 114: 
451 115:         <span class="ruby-identifier">result_text</span>
452 116:       <span class="ruby-keyword kw">end</span>
453 </pre>
454           </div>
455         </div>
456       </div>
457
458       <div id="method-M000048" class="method-detail">
459         <a name="M000048"></a>
460
461         <div class="method-heading">
462           <a href="#M000048" class="method-signature">
463           <span class="method-name">text_for_flattened_result</span><span class="method-args">(status, result)</span>
464           </a>
465         </div>
466       
467         <div class="method-description">
468           <p>
469 Returns text representing a flattened result of only good data
470 </p>
471           <p><a class="source-toggle" href="#"
472             onclick="toggleCode('M000048-source');return false;">[Source]</a></p>
473           <div class="method-source-code" id="M000048-source">
474 <pre>
475      <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 189</span>
476 189:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">text_for_flattened_result</span>(<span class="ruby-identifier">status</span>, <span class="ruby-identifier">result</span>)
477 190:         <span class="ruby-identifier">result_text</span> = <span class="ruby-value str">&quot;&quot;</span>
478 191: 
479 192:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">1</span>
480 193:           <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
481 194:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">pretty_inspect</span>
482 195:           <span class="ruby-keyword kw">else</span>
483 196:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">result</span>
484 197:           <span class="ruby-keyword kw">end</span>
485 198:         <span class="ruby-keyword kw">end</span>
486 199:       <span class="ruby-keyword kw">end</span>
487 </pre>
488           </div>
489         </div>
490       </div>
491
492       <div id="method-M000047" class="method-detail">
493         <a name="M000047"></a>
494
495         <div class="method-heading">
496           <a href="#M000047" class="method-signature">
497           <span class="method-name">text_for_result</span><span class="method-args">(sender, status, msg, result, ddl)</span>
498           </a>
499         </div>
500       
501         <div class="method-description">
502           <p>
503 Return text representing a result
504 </p>
505           <p><a class="source-toggle" href="#"
506             onclick="toggleCode('M000047-source');return false;">[Source]</a></p>
507           <div class="method-source-code" id="M000047-source">
508 <pre>
509      <span class="ruby-comment cmt"># File lib/mcollective/rpc/helpers.rb, line 119</span>
510 119:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">text_for_result</span>(<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">status</span>, <span class="ruby-identifier">msg</span>, <span class="ruby-identifier">result</span>, <span class="ruby-identifier">ddl</span>)
511 120:         <span class="ruby-identifier">statusses</span> = [<span class="ruby-value str">&quot;&quot;</span>,
512 121:                      <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-value str">&quot;Request Aborted&quot;</span>),
513 122:                      <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-value str">&quot;Unknown Action&quot;</span>),
514 123:                      <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-value str">&quot;Missing Request Data&quot;</span>),
515 124:                      <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-value str">&quot;Invalid Request Data&quot;</span>),
516 125:                      <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-value str">&quot;Unknown Request Status&quot;</span>)]
517 126: 
518 127:         <span class="ruby-identifier">result_text</span> = <span class="ruby-value str">&quot;%-40s %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">sender</span>, <span class="ruby-identifier">statusses</span>[<span class="ruby-identifier">status</span>]]
519 128:         <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;   %s\n&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:yellow</span>, <span class="ruby-identifier">msg</span>)] <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">msg</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;OK&quot;</span>
520 129: 
521 130:         <span class="ruby-comment cmt"># only print good data, ignore data that results from failure</span>
522 131:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
523 132:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Hash</span>)
524 133:             <span class="ruby-comment cmt"># figure out the lengths of the display as strings, we'll use</span>
525 134:             <span class="ruby-comment cmt"># it later to correctly justify the output</span>
526 135:             <span class="ruby-identifier">lengths</span> = <span class="ruby-identifier">result</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span>
527 136:               <span class="ruby-keyword kw">begin</span>
528 137:                 <span class="ruby-identifier">ddl</span>[<span class="ruby-identifier">:output</span>][<span class="ruby-identifier">k</span>][<span class="ruby-identifier">:display_as</span>].<span class="ruby-identifier">size</span>
529 138:               <span class="ruby-keyword kw">rescue</span>
530 139:                 <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">size</span>
531 140:               <span class="ruby-keyword kw">end</span>
532 141:             <span class="ruby-keyword kw">end</span>
533 142: 
534 143:             <span class="ruby-identifier">result</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort_by</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>}.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span>
535 144:               <span class="ruby-comment cmt"># get all the output fields nicely lined up with a</span>
536 145:               <span class="ruby-comment cmt"># 3 space front padding</span>
537 146:               <span class="ruby-keyword kw">begin</span>
538 147:                 <span class="ruby-identifier">display_as</span> = <span class="ruby-identifier">ddl</span>[<span class="ruby-identifier">:output</span>][<span class="ruby-identifier">k</span>][<span class="ruby-identifier">:display_as</span>]
539 148:               <span class="ruby-keyword kw">rescue</span>
540 149:                 <span class="ruby-identifier">display_as</span> = <span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_s</span>
541 150:               <span class="ruby-keyword kw">end</span>
542 151: 
543 152:               <span class="ruby-identifier">display_length</span> = <span class="ruby-identifier">display_as</span>.<span class="ruby-identifier">size</span>
544 153:               <span class="ruby-identifier">padding</span> = <span class="ruby-identifier">lengths</span>.<span class="ruby-identifier">max</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">display_length</span> <span class="ruby-operator">+</span> <span class="ruby-value">3</span>
545 154:               <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">*</span> <span class="ruby-identifier">padding</span>
546 155: 
547 156:               <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{display_as}:&quot;</span>
548 157: 
549 158:               <span class="ruby-keyword kw">if</span> [<span class="ruby-constant">String</span>, <span class="ruby-constant">Numeric</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">result</span>[<span class="ruby-identifier">k</span>].<span class="ruby-identifier">class</span>)
550 159:                 <span class="ruby-identifier">lines</span> = <span class="ruby-identifier">result</span>[<span class="ruby-identifier">k</span>].<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
551 160: 
552 161:                 <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">lines</span>.<span class="ruby-identifier">empty?</span>
553 162:                   <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;\n&quot;</span>
554 163:                 <span class="ruby-keyword kw">else</span>
555 164:                   <span class="ruby-identifier">lines</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
556 165:                     <span class="ruby-identifier">i</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">padtxt</span> = <span class="ruby-value str">&quot; &quot;</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">padtxt</span> = <span class="ruby-value str">&quot; &quot;</span> <span class="ruby-operator">*</span> (<span class="ruby-identifier">padding</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">display_length</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>)
557 166: 
558 167:                     <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{padtxt}#{line}\n&quot;</span>
559 168:                   <span class="ruby-keyword kw">end</span>
560 169:                 <span class="ruby-keyword kw">end</span>
561 170:               <span class="ruby-keyword kw">else</span>
562 171:                 <span class="ruby-identifier">padding</span> = <span class="ruby-value str">&quot; &quot;</span> <span class="ruby-operator">*</span> (<span class="ruby-identifier">lengths</span>.<span class="ruby-identifier">max</span> <span class="ruby-operator">+</span> <span class="ruby-value">5</span>)
563 172:                 <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">result</span>[<span class="ruby-identifier">k</span>].<span class="ruby-identifier">pretty_inspect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>).<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">padding</span>) <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;\n&quot;</span>
564 173:               <span class="ruby-keyword kw">end</span>
565 174:             <span class="ruby-keyword kw">end</span>
566 175:           <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
567 176:             <span class="ruby-comment cmt"># for status 1 we dont want to show half baked</span>
568 177:             <span class="ruby-comment cmt"># data by default since the DDL will supply all the defaults</span>
569 178:             <span class="ruby-comment cmt"># it just doesnt look right</span>
570 179:           <span class="ruby-keyword kw">else</span>
571 180:             <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;\n\t&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">pretty_inspect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>).<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n\t&quot;</span>)
572 181:           <span class="ruby-keyword kw">end</span>
573 182:         <span class="ruby-keyword kw">end</span>
574 183: 
575 184:         <span class="ruby-identifier">result_text</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;\n&quot;</span>
576 185:         <span class="ruby-identifier">result_text</span>
577 186:       <span class="ruby-keyword kw">end</span>
578 </pre>
579           </div>
580         </div>
581       </div>
582
583
584     </div>
585
586
587   </div>
588
589
590 <div id="validator-badges">
591   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
592 </div>
593
594 </body>
595 </html>