Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Util.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>Module: MCollective::Util</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>Module</strong></td>
53           <td class="class-name-in-header">MCollective::Util</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../files/lib/mcollective/util_rb.html">
59                 lib/mcollective/util.rb
60                 </a>
61         <br />
62             </td>
63         </tr>
64
65         </table>
66     </div>
67   <!-- banner header -->
68
69   <div id="bodyContent">
70
71
72
73   <div id="contextContent">
74
75     <div id="description">
76       <p>
77 Some basic utility helper methods useful to clients, agents, runner etc.
78 </p>
79
80     </div>
81
82
83    </div>
84
85     <div id="method-list">
86       <h3 class="section-bar">Methods</h3>
87
88       <div class="name-list">
89       <a href="#M000307">absolute_path?</a>&nbsp;&nbsp;
90       <a href="#M000303">align_text</a>&nbsp;&nbsp;
91       <a href="#M000299">color</a>&nbsp;&nbsp;
92       <a href="#M000300">colorize</a>&nbsp;&nbsp;
93       <a href="#M000305">command_in_path?</a>&nbsp;&nbsp;
94       <a href="#M000290">config_file_for_user</a>&nbsp;&nbsp;
95       <a href="#M000291">default_options</a>&nbsp;&nbsp;
96       <a href="#M000288">empty_filter</a>&nbsp;&nbsp;
97       <a href="#M000287">empty_filter?</a>&nbsp;&nbsp;
98       <a href="#M000284">get_fact</a>&nbsp;&nbsp;
99       <a href="#M000281">has_agent?</a>&nbsp;&nbsp;
100       <a href="#M000283">has_cf_class?</a>&nbsp;&nbsp;
101       <a href="#M000285">has_fact?</a>&nbsp;&nbsp;
102       <a href="#M000286">has_identity?</a>&nbsp;&nbsp;
103       <a href="#M000295">loadclass</a>&nbsp;&nbsp;
104       <a href="#M000292">make_subscriptions</a>&nbsp;&nbsp;
105       <a href="#M000302">mcollective_version</a>&nbsp;&nbsp;
106       <a href="#M000296">parse_fact_string</a>&nbsp;&nbsp;
107       <a href="#M000301">ruby_version</a>&nbsp;&nbsp;
108       <a href="#M000282">setup_windows_sleeper</a>&nbsp;&nbsp;
109       <a href="#M000297">shellescape</a>&nbsp;&nbsp;
110       <a href="#M000308">str_to_bool</a>&nbsp;&nbsp;
111       <a href="#M000293">subscribe</a>&nbsp;&nbsp;
112       <a href="#M000309">t</a>&nbsp;&nbsp;
113       <a href="#M000310">templatepath</a>&nbsp;&nbsp;
114       <a href="#M000304">terminal_dimensions</a>&nbsp;&nbsp;
115       <a href="#M000294">unsubscribe</a>&nbsp;&nbsp;
116       <a href="#M000306">versioncmp</a>&nbsp;&nbsp;
117       <a href="#M000298">windows?</a>&nbsp;&nbsp;
118       <a href="#M000289">windows_prefix</a>&nbsp;&nbsp;
119       </div>
120     </div>
121
122   </div>
123
124
125     <!-- if includes -->
126
127     <div id="section">
128
129
130
131
132
133       
134
135
136     <!-- if method_list -->
137     <div id="methods">
138       <h3 class="section-bar">Public Class methods</h3>
139
140       <div id="method-M000307" class="method-detail">
141         <a name="M000307"></a>
142
143         <div class="method-heading">
144           <a href="#M000307" class="method-signature">
145           <span class="method-name">absolute_path?</span><span class="method-args">(path, separator=File::SEPARATOR, alt_separator=File::ALT_SEPARATOR)</span>
146           </a>
147         </div>
148       
149         <div class="method-description">
150           <p>
151 we should really use Pathname#absolute? but it&#8216;s not in all the ruby
152 versions we support and it comes down to roughly this
153 </p>
154           <p><a class="source-toggle" href="#"
155             onclick="toggleCode('M000307-source');return false;">[Source]</a></p>
156           <div class="method-source-code" id="M000307-source">
157 <pre>
158      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 464</span>
159 464:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">absolute_path?</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">separator</span>=<span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-constant">SEPARATOR</span>, <span class="ruby-identifier">alt_separator</span>=<span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-constant">ALT_SEPARATOR</span>)
160 465:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">alt_separator</span>
161 466:         <span class="ruby-identifier">path_matcher</span> = <span class="ruby-node">/^([a-zA-Z]:){0,1}[#{Regexp.quote alt_separator}#{Regexp.quote separator}]/</span>
162 467:       <span class="ruby-keyword kw">else</span>
163 468:         <span class="ruby-identifier">path_matcher</span> = <span class="ruby-node">/^#{Regexp.quote separator}/</span>
164 469:       <span class="ruby-keyword kw">end</span>
165 470: 
166 471:       <span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">path</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">path_matcher</span>)
167 472:     <span class="ruby-keyword kw">end</span>
168 </pre>
169           </div>
170         </div>
171       </div>
172
173       <div id="method-M000303" class="method-detail">
174         <a name="M000303"></a>
175
176         <div class="method-heading">
177           <a href="#M000303" class="method-signature">
178           <span class="method-name">align_text</span><span class="method-args">(text, console_cols = nil, preamble = 5)</span>
179           </a>
180         </div>
181       
182         <div class="method-description">
183           <p>
184 Returns an aligned_string of text relative to the size of the terminal
185 window. If a line in the string exceeds the width of the terminal window
186 the line will be chopped off at the whitespace chacter closest to the end
187 of the line and prepended to the next line, keeping all indentation.
188 </p>
189 <p>
190 The terminal size is detected by default, but custom line widths can
191 passed. All strings will also be left aligned with 5 whitespace characters
192 by default.
193 </p>
194           <p><a class="source-toggle" href="#"
195             onclick="toggleCode('M000303-source');return false;">[Source]</a></p>
196           <div class="method-source-code" id="M000303-source">
197 <pre>
198      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 310</span>
199 310:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">align_text</span>(<span class="ruby-identifier">text</span>, <span class="ruby-identifier">console_cols</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">preamble</span> = <span class="ruby-value">5</span>)
200 311:       <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">console_cols</span>
201 312:         <span class="ruby-identifier">console_cols</span> = <span class="ruby-identifier">terminal_dimensions</span>[<span class="ruby-value">0</span>]
202 313: 
203 314:         <span class="ruby-comment cmt"># if unknown size we default to the typical unix default</span>
204 315:         <span class="ruby-identifier">console_cols</span> = <span class="ruby-value">80</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
205 316:       <span class="ruby-keyword kw">end</span>
206 317: 
207 318:       <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">preamble</span>
208 319: 
209 320:       <span class="ruby-comment cmt"># Return unaligned text if console window is too small</span>
210 321:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">text</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0</span>
211 322: 
212 323:       <span class="ruby-comment cmt"># If console is 0 this implies unknown so we assume the common</span>
213 324:       <span class="ruby-comment cmt"># minimal unix configuration of 80 characters</span>
214 325:       <span class="ruby-identifier">console_cols</span> = <span class="ruby-value">80</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0</span>
215 326: 
216 327:       <span class="ruby-identifier">text</span> = <span class="ruby-identifier">text</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
217 328:       <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
218 329:       <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
219 330: 
220 331:       <span class="ruby-identifier">text</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>
221 332:         <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
222 333: 
223 334:         <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">whitespace</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">line</span>[<span class="ruby-identifier">whitespace</span>].<span class="ruby-identifier">chr</span> <span class="ruby-operator">==</span> <span class="ruby-value str">' '</span>
224 335:           <span class="ruby-identifier">whitespace</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
225 336:         <span class="ruby-keyword kw">end</span>
226 337: 
227 338:         <span class="ruby-comment cmt"># If the current line is empty, indent it so that a snippet</span>
228 339:         <span class="ruby-comment cmt"># from the previous line is aligned correctly.</span>
229 340:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;&quot;</span>
230 341:           <span class="ruby-identifier">line</span> = (<span class="ruby-value str">&quot; &quot;</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">whitespace</span>)
231 342:         <span class="ruby-keyword kw">end</span>
232 343: 
233 344:         <span class="ruby-comment cmt"># If text was snipped from the previous line, prepend it to the</span>
234 345:         <span class="ruby-comment cmt"># current line after any current indentation.</span>
235 346:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">piece</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">''</span>
236 347:           <span class="ruby-comment cmt"># Reset whitespaces to 0 if there are more whitespaces than there are</span>
237 348:           <span class="ruby-comment cmt"># console columns</span>
238 349:           <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">whitespace</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">console_cols</span>
239 350: 
240 351:           <span class="ruby-comment cmt"># If the current line is empty and being prepended to, create a new</span>
241 352:           <span class="ruby-comment cmt"># empty line in the text so that formatting is preserved.</span>
242 353:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>] <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">line</span> <span class="ruby-operator">==</span> (<span class="ruby-value str">&quot; &quot;</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">whitespace</span>)
243 354:             <span class="ruby-identifier">text</span>.<span class="ruby-identifier">insert</span>(<span class="ruby-identifier">i</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>, <span class="ruby-value str">&quot;&quot;</span>)
244 355:           <span class="ruby-keyword kw">end</span>
245 356: 
246 357:           <span class="ruby-comment cmt"># Add the snipped text to the current line</span>
247 358:           <span class="ruby-identifier">line</span>.<span class="ruby-identifier">insert</span>(<span class="ruby-identifier">whitespace</span>, <span class="ruby-node">&quot;#{piece} &quot;</span>)
248 359:         <span class="ruby-keyword kw">end</span>
249 360: 
250 361:         <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
251 362: 
252 363:         <span class="ruby-comment cmt"># Compare the line length to the allowed line length.</span>
253 364:         <span class="ruby-comment cmt"># If it exceeds it, snip the offending text from the line</span>
254 365:         <span class="ruby-comment cmt"># and store it so that it can be prepended to the next line.</span>
255 366:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> (<span class="ruby-identifier">console_cols</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">preamble</span>)
256 367:           <span class="ruby-identifier">reverse</span> = <span class="ruby-identifier">console_cols</span>
257 368: 
258 369:           <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">line</span>[<span class="ruby-identifier">reverse</span>].<span class="ruby-identifier">chr</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">' '</span>
259 370:             <span class="ruby-identifier">reverse</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
260 371:           <span class="ruby-keyword kw">end</span>
261 372: 
262 373:           <span class="ruby-identifier">piece</span> = <span class="ruby-identifier">line</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-identifier">reverse</span>, (<span class="ruby-identifier">line</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)).<span class="ruby-identifier">lstrip</span>
263 374:         <span class="ruby-keyword kw">end</span>
264 375: 
265 376:         <span class="ruby-comment cmt"># If a snippet exists when all the columns in the text have been</span>
266 377:         <span class="ruby-comment cmt"># updated, create a new line and append the snippet to it, using</span>
267 378:         <span class="ruby-comment cmt"># the same left alignment as the last line in the text.</span>
268 379:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">piece</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">''</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>].<span class="ruby-identifier">nil?</span>
269 380:           <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>] = <span class="ruby-node">&quot;#{' ' * (whitespace)}#{piece}&quot;</span>
270 381:           <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
271 382:         <span class="ruby-keyword kw">end</span>
272 383: 
273 384:         <span class="ruby-comment cmt"># Add the preamble to the line and add it to the text</span>
274 385:         <span class="ruby-identifier">line</span> = ((<span class="ruby-value str">' '</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">preamble</span>) <span class="ruby-operator">+</span> <span class="ruby-identifier">line</span>)
275 386:         <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span>] = <span class="ruby-identifier">line</span>
276 387:       <span class="ruby-keyword kw">end</span>
277 388: 
278 389:       <span class="ruby-identifier">text</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
279 390:     <span class="ruby-keyword kw">end</span>
280 </pre>
281           </div>
282         </div>
283       </div>
284
285       <div id="method-M000299" class="method-detail">
286         <a name="M000299"></a>
287
288         <div class="method-heading">
289           <a href="#M000299" class="method-signature">
290           <span class="method-name">color</span><span class="method-args">(code)</span>
291           </a>
292         </div>
293       
294         <div class="method-description">
295           <p>
296 Return <a href="Util.html#M000299">color</a> codes, if the config color=
297 option is false just return a empty string
298 </p>
299           <p><a class="source-toggle" href="#"
300             onclick="toggleCode('M000299-source');return false;">[Source]</a></p>
301           <div class="method-source-code" id="M000299-source">
302 <pre>
303      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 270</span>
304 270:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">color</span>(<span class="ruby-identifier">code</span>)
305 271:       <span class="ruby-identifier">colorize</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">color</span>
306 272: 
307 273:       <span class="ruby-identifier">colors</span> = {<span class="ruby-identifier">:red</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[31m&quot;</span>,
308 274:                 <span class="ruby-identifier">:green</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[32m&quot;</span>,
309 275:                 <span class="ruby-identifier">:yellow</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[33m&quot;</span>,
310 276:                 <span class="ruby-identifier">:cyan</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[36m&quot;</span>,
311 277:                 <span class="ruby-identifier">:bold</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[1m&quot;</span>,
312 278:                 <span class="ruby-identifier">:reset</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[0m&quot;</span>}
313 279: 
314 280:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">colorize</span>
315 281:         <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">colors</span>[<span class="ruby-identifier">code</span>] <span class="ruby-operator">||</span> <span class="ruby-value str">&quot;&quot;</span>
316 282:       <span class="ruby-keyword kw">else</span>
317 283:         <span class="ruby-keyword kw">return</span> <span class="ruby-value str">&quot;&quot;</span>
318 284:       <span class="ruby-keyword kw">end</span>
319 285:     <span class="ruby-keyword kw">end</span>
320 </pre>
321           </div>
322         </div>
323       </div>
324
325       <div id="method-M000300" class="method-detail">
326         <a name="M000300"></a>
327
328         <div class="method-heading">
329           <a href="#M000300" class="method-signature">
330           <span class="method-name">colorize</span><span class="method-args">(code, msg)</span>
331           </a>
332         </div>
333       
334         <div class="method-description">
335           <p>
336 Helper to return a string in specific <a href="Util.html#M000299">color</a>
337 </p>
338           <p><a class="source-toggle" href="#"
339             onclick="toggleCode('M000300-source');return false;">[Source]</a></p>
340           <div class="method-source-code" id="M000300-source">
341 <pre>
342      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 288</span>
343 288:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">code</span>, <span class="ruby-identifier">msg</span>)
344 289:       <span class="ruby-value str">&quot;%s%s%s&quot;</span> <span class="ruby-operator">%</span> [ <span class="ruby-identifier">color</span>(<span class="ruby-identifier">code</span>), <span class="ruby-identifier">msg</span>, <span class="ruby-identifier">color</span>(<span class="ruby-identifier">:reset</span>) ]
345 290:     <span class="ruby-keyword kw">end</span>
346 </pre>
347           </div>
348         </div>
349       </div>
350
351       <div id="method-M000305" class="method-detail">
352         <a name="M000305"></a>
353
354         <div class="method-heading">
355           <a href="#M000305" class="method-signature">
356           <span class="method-name">command_in_path?</span><span class="method-args">(command)</span>
357           </a>
358         </div>
359       
360         <div class="method-description">
361           <p>
362 Checks in PATH returns true if the command is found
363 </p>
364           <p><a class="source-toggle" href="#"
365             onclick="toggleCode('M000305-source');return false;">[Source]</a></p>
366           <div class="method-source-code" id="M000305-source">
367 <pre>
368      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 417</span>
369 417:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">command_in_path?</span>(<span class="ruby-identifier">command</span>)
370 418:       <span class="ruby-identifier">found</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-value str">&quot;PATH&quot;</span>].<span class="ruby-identifier">split</span>(<span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-constant">PATH_SEPARATOR</span>).<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span>
371 419:         <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">p</span>, <span class="ruby-identifier">command</span>))
372 420:       <span class="ruby-keyword kw">end</span>
373 421: 
374 422:       <span class="ruby-identifier">found</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-keyword kw">true</span>)
375 423:     <span class="ruby-keyword kw">end</span>
376 </pre>
377           </div>
378         </div>
379       </div>
380
381       <div id="method-M000290" class="method-detail">
382         <a name="M000290"></a>
383
384         <div class="method-heading">
385           <a href="#M000290" class="method-signature">
386           <span class="method-name">config_file_for_user</span><span class="method-args">()</span>
387           </a>
388         </div>
389       
390         <div class="method-description">
391           <p>
392 Picks a config file defaults to ~/.mcollective else
393 /etc/mcollective/client.cfg
394 </p>
395           <p><a class="source-toggle" href="#"
396             onclick="toggleCode('M000290-source');return false;">[Source]</a></p>
397           <div class="method-source-code" id="M000290-source">
398 <pre>
399      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 148</span>
400 148:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">config_file_for_user</span>
401 149:       <span class="ruby-comment cmt"># expand_path is pretty lame, it relies on HOME environment</span>
402 150:       <span class="ruby-comment cmt"># which isnt't always there so just handling all exceptions</span>
403 151:       <span class="ruby-comment cmt"># here as cant find reverting to default</span>
404 152:       <span class="ruby-keyword kw">begin</span>
405 153:         <span class="ruby-identifier">config</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-value str">&quot;~/.mcollective&quot;</span>)
406 154: 
407 155:         <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">readable?</span>(<span class="ruby-identifier">config</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">file?</span>(<span class="ruby-identifier">config</span>)
408 156:           <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
409 157:             <span class="ruby-identifier">config</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows_prefix</span>, <span class="ruby-value str">&quot;etc&quot;</span>, <span class="ruby-value str">&quot;client.cfg&quot;</span>)
410 158:           <span class="ruby-keyword kw">else</span>
411 159:             <span class="ruby-identifier">config</span> = <span class="ruby-value str">&quot;/etc/mcollective/client.cfg&quot;</span>
412 160:           <span class="ruby-keyword kw">end</span>
413 161:         <span class="ruby-keyword kw">end</span>
414 162:       <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>
415 163:         <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
416 164:           <span class="ruby-identifier">config</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows_prefix</span>, <span class="ruby-value str">&quot;etc&quot;</span>, <span class="ruby-value str">&quot;client.cfg&quot;</span>)
417 165:         <span class="ruby-keyword kw">else</span>
418 166:           <span class="ruby-identifier">config</span> = <span class="ruby-value str">&quot;/etc/mcollective/client.cfg&quot;</span>
419 167:         <span class="ruby-keyword kw">end</span>
420 168:       <span class="ruby-keyword kw">end</span>
421 169: 
422 170:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">config</span>
423 171:     <span class="ruby-keyword kw">end</span>
424 </pre>
425           </div>
426         </div>
427       </div>
428
429       <div id="method-M000291" class="method-detail">
430         <a name="M000291"></a>
431
432         <div class="method-heading">
433           <a href="#M000291" class="method-signature">
434           <span class="method-name">default_options</span><span class="method-args">()</span>
435           </a>
436         </div>
437       
438         <div class="method-description">
439           <p>
440 Creates a standard options hash
441 </p>
442           <p><a class="source-toggle" href="#"
443             onclick="toggleCode('M000291-source');return false;">[Source]</a></p>
444           <div class="method-source-code" id="M000291-source">
445 <pre>
446      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 174</span>
447 174:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">default_options</span>
448 175:       {<span class="ruby-identifier">:verbose</span>           =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>,
449 176:        <span class="ruby-identifier">:disctimeout</span>       =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
450 177:        <span class="ruby-identifier">:timeout</span>           =<span class="ruby-operator">&gt;</span> <span class="ruby-value">5</span>,
451 178:        <span class="ruby-identifier">:config</span>            =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">config_file_for_user</span>,
452 179:        <span class="ruby-identifier">:collective</span>        =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
453 180:        <span class="ruby-identifier">:discovery_method</span>  =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
454 181:        <span class="ruby-identifier">:discovery_options</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">default_discovery_options</span>,
455 182:        <span class="ruby-identifier">:filter</span>            =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">empty_filter</span>}
456 183:     <span class="ruby-keyword kw">end</span>
457 </pre>
458           </div>
459         </div>
460       </div>
461
462       <div id="method-M000288" class="method-detail">
463         <a name="M000288"></a>
464
465         <div class="method-heading">
466           <a href="#M000288" class="method-signature">
467           <span class="method-name">empty_filter</span><span class="method-args">()</span>
468           </a>
469         </div>
470       
471         <div class="method-description">
472           <p>
473 Creates an empty filter
474 </p>
475           <p><a class="source-toggle" href="#"
476             onclick="toggleCode('M000288-source');return false;">[Source]</a></p>
477           <div class="method-source-code" id="M000288-source">
478 <pre>
479      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 132</span>
480 132:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">empty_filter</span>
481 133:       {<span class="ruby-value str">&quot;fact&quot;</span>     =<span class="ruby-operator">&gt;</span> [],
482 134:        <span class="ruby-value str">&quot;cf_class&quot;</span> =<span class="ruby-operator">&gt;</span> [],
483 135:        <span class="ruby-value str">&quot;agent&quot;</span>    =<span class="ruby-operator">&gt;</span> [],
484 136:        <span class="ruby-value str">&quot;identity&quot;</span> =<span class="ruby-operator">&gt;</span> [],
485 137:        <span class="ruby-value str">&quot;compound&quot;</span> =<span class="ruby-operator">&gt;</span> []}
486 138:     <span class="ruby-keyword kw">end</span>
487 </pre>
488           </div>
489         </div>
490       </div>
491
492       <div id="method-M000287" class="method-detail">
493         <a name="M000287"></a>
494
495         <div class="method-heading">
496           <a href="#M000287" class="method-signature">
497           <span class="method-name">empty_filter?</span><span class="method-args">(filter)</span>
498           </a>
499         </div>
500       
501         <div class="method-description">
502           <p>
503 Checks if the passed in filter is an empty one
504 </p>
505           <p><a class="source-toggle" href="#"
506             onclick="toggleCode('M000287-source');return false;">[Source]</a></p>
507           <div class="method-source-code" id="M000287-source">
508 <pre>
509      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 127</span>
510 127:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">empty_filter?</span>(<span class="ruby-identifier">filter</span>)
511 128:       <span class="ruby-identifier">filter</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">empty_filter</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">filter</span> <span class="ruby-operator">==</span> {}
512 129:     <span class="ruby-keyword kw">end</span>
513 </pre>
514           </div>
515         </div>
516       </div>
517
518       <div id="method-M000284" class="method-detail">
519         <a name="M000284"></a>
520
521         <div class="method-heading">
522           <a href="#M000284" class="method-signature">
523           <span class="method-name">get_fact</span><span class="method-args">(fact)</span>
524           </a>
525         </div>
526       
527         <div class="method-description">
528           <p>
529 Gets the value of a specific fact, mostly just a duplicate of <a
530 href="Facts.html#M000017">MCollective::Facts.get_fact</a> but it kind of
531 goes with the other classes here
532 </p>
533           <p><a class="source-toggle" href="#"
534             onclick="toggleCode('M000284-source');return false;">[Source]</a></p>
535           <div class="method-source-code" id="M000284-source">
536 <pre>
537     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 63</span>
538 63:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">get_fact</span>(<span class="ruby-identifier">fact</span>)
539 64:       <span class="ruby-constant">Facts</span>.<span class="ruby-identifier">get_fact</span>(<span class="ruby-identifier">fact</span>)
540 65:     <span class="ruby-keyword kw">end</span>
541 </pre>
542           </div>
543         </div>
544       </div>
545
546       <div id="method-M000281" class="method-detail">
547         <a name="M000281"></a>
548
549         <div class="method-heading">
550           <a href="#M000281" class="method-signature">
551           <span class="method-name">has_agent?</span><span class="method-args">(agent)</span>
552           </a>
553         </div>
554       
555         <div class="method-description">
556           <p>
557 Finds out if this <a href="../MCollective.html">MCollective</a> has an
558 agent by the name passed
559 </p>
560 <p>
561 If the passed name starts with a / it&#8216;s assumed to be regex and will
562 use regex to match
563 </p>
564           <p><a class="source-toggle" href="#"
565             onclick="toggleCode('M000281-source');return false;">[Source]</a></p>
566           <div class="method-source-code" id="M000281-source">
567 <pre>
568     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 10</span>
569 10:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_agent?</span>(<span class="ruby-identifier">agent</span>)
570 11:       <span class="ruby-identifier">agent</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">agent</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">&quot;\/&quot;</span>, <span class="ruby-value str">&quot;&quot;</span>)) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">agent</span>.<span class="ruby-identifier">match</span>(<span class="ruby-value str">&quot;^/&quot;</span>)
571 12: 
572 13:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">agent</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Regexp</span>)
573 14:         <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Agents</span>.<span class="ruby-identifier">agentlist</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-identifier">agent</span>).<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
574 15:           <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
575 16:         <span class="ruby-keyword kw">else</span>
576 17:           <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
577 18:         <span class="ruby-keyword kw">end</span>
578 19:       <span class="ruby-keyword kw">else</span>
579 20:         <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Agents</span>.<span class="ruby-identifier">agentlist</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">agent</span>)
580 21:       <span class="ruby-keyword kw">end</span>
581 22: 
582 23:       <span class="ruby-keyword kw">false</span>
583 24:     <span class="ruby-keyword kw">end</span>
584 </pre>
585           </div>
586         </div>
587       </div>
588
589       <div id="method-M000283" class="method-detail">
590         <a name="M000283"></a>
591
592         <div class="method-heading">
593           <a href="#M000283" class="method-signature">
594           <span class="method-name">has_cf_class?</span><span class="method-args">(klass)</span>
595           </a>
596         </div>
597       
598         <div class="method-description">
599           <p>
600 Checks if this node has a configuration management class by parsing the a
601 text file with just a list of classes, recipes, roles etc. This is ala the
602 classes.txt from puppet.
603 </p>
604 <p>
605 If the passed name starts with a / it&#8216;s assumed to be regex and will
606 use regex to match
607 </p>
608           <p><a class="source-toggle" href="#"
609             onclick="toggleCode('M000283-source');return false;">[Source]</a></p>
610           <div class="method-source-code" id="M000283-source">
611 <pre>
612     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 40</span>
613 40:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_cf_class?</span>(<span class="ruby-identifier">klass</span>)
614 41:       <span class="ruby-identifier">klass</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">klass</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">&quot;\/&quot;</span>, <span class="ruby-value str">&quot;&quot;</span>)) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">match</span>(<span class="ruby-value str">&quot;^/&quot;</span>)
615 42:       <span class="ruby-identifier">cfile</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">classesfile</span>
616 43: 
617 44:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Looking for configuration management classes in #{cfile}&quot;</span>)
618 45: 
619 46:       <span class="ruby-keyword kw">begin</span>
620 47:         <span class="ruby-constant">File</span>.<span class="ruby-identifier">readlines</span>(<span class="ruby-identifier">cfile</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>
621 48:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Regexp</span>)
622 49:             <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">chomp</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">klass</span>)
623 50:           <span class="ruby-keyword kw">else</span>
624 51:             <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">chomp</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">klass</span>
625 52:           <span class="ruby-keyword kw">end</span>
626 53:         <span class="ruby-keyword kw">end</span>
627 54:       <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>
628 55:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-node">&quot;Parsing classes file '#{cfile}' failed: #{e.class}: #{e}&quot;</span>)
629 56:       <span class="ruby-keyword kw">end</span>
630 57: 
631 58:       <span class="ruby-keyword kw">false</span>
632 59:     <span class="ruby-keyword kw">end</span>
633 </pre>
634           </div>
635         </div>
636       </div>
637
638       <div id="method-M000285" class="method-detail">
639         <a name="M000285"></a>
640
641         <div class="method-heading">
642           <a href="#M000285" class="method-signature">
643           <span class="method-name">has_fact?</span><span class="method-args">(fact, value, operator)</span>
644           </a>
645         </div>
646       
647         <div class="method-description">
648           <p>
649 Compares fact == value,
650 </p>
651 <p>
652 If the passed value starts with a / it&#8216;s assumed to be regex and will
653 use regex to match
654 </p>
655           <p><a class="source-toggle" href="#"
656             onclick="toggleCode('M000285-source');return false;">[Source]</a></p>
657           <div class="method-source-code" id="M000285-source">
658 <pre>
659      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 71</span>
660  71:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_fact?</span>(<span class="ruby-identifier">fact</span>, <span class="ruby-identifier">value</span>, <span class="ruby-identifier">operator</span>)
661  72: 
662  73:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Comparing #{fact} #{operator} #{value}&quot;</span>)
663  74:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;where :fact = '#{fact}', :operator = '#{operator}', :value = '#{value}'&quot;</span>)
664  75: 
665  76:       <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Facts</span>[<span class="ruby-identifier">fact</span>]
666  77:       <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">nil?</span>
667  78: 
668  79:       <span class="ruby-identifier">fact</span> = <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">clone</span>
669  80: 
670  81:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">operator</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'=~'</span>
671  82:         <span class="ruby-comment cmt"># to maintain backward compat we send the value</span>
672  83:         <span class="ruby-comment cmt"># as /.../ which is what 1.0.x needed.  this strips</span>
673  84:         <span class="ruby-comment cmt"># off the /'s wich is what we need here</span>
674  85:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^\/(.+)\/$/</span>
675  86:           <span class="ruby-identifier">value</span> = <span class="ruby-identifier">$1</span>
676  87:         <span class="ruby-keyword kw">end</span>
677  88: 
678  89:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">value</span>))
679  90: 
680  91:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">operator</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;==&quot;</span>
681  92:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">value</span>
682  93: 
683  94:       <span class="ruby-keyword kw">elsif</span> [<span class="ruby-value str">'&lt;='</span>, <span class="ruby-value str">'&gt;='</span>, <span class="ruby-value str">'&lt;'</span>, <span class="ruby-value str">'&gt;'</span>, <span class="ruby-value str">'!='</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">operator</span>)
684  95:         <span class="ruby-comment cmt"># Yuk - need to type cast, but to_i and to_f are overzealous</span>
685  96:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^[0-9]+$/</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^[0-9]+$/</span>
686  97:           <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">fact</span>)
687  98:           <span class="ruby-identifier">value</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">value</span>)
688  99:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^[0-9]+.[0-9]+$/</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^[0-9]+.[0-9]+$/</span>
689 100:           <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">fact</span>)
690 101:           <span class="ruby-identifier">value</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">value</span>)
691 102:         <span class="ruby-keyword kw">end</span>
692 103: 
693 104:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">eval</span>(<span class="ruby-node">&quot;fact #{operator} value&quot;</span>)
694 105:       <span class="ruby-keyword kw">end</span>
695 106: 
696 107:       <span class="ruby-keyword kw">false</span>
697 108:     <span class="ruby-keyword kw">end</span>
698 </pre>
699           </div>
700         </div>
701       </div>
702
703       <div id="method-M000286" class="method-detail">
704         <a name="M000286"></a>
705
706         <div class="method-heading">
707           <a href="#M000286" class="method-signature">
708           <span class="method-name">has_identity?</span><span class="method-args">(identity)</span>
709           </a>
710         </div>
711       
712         <div class="method-description">
713           <p>
714 Checks if the configured identity matches the one supplied
715 </p>
716 <p>
717 If the passed name starts with a / it&#8216;s assumed to be regex and will
718 use regex to match
719 </p>
720           <p><a class="source-toggle" href="#"
721             onclick="toggleCode('M000286-source');return false;">[Source]</a></p>
722           <div class="method-source-code" id="M000286-source">
723 <pre>
724      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 114</span>
725 114:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_identity?</span>(<span class="ruby-identifier">identity</span>)
726 115:       <span class="ruby-identifier">identity</span> = <span class="ruby-constant">Regexp</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">identity</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">&quot;\/&quot;</span>, <span class="ruby-value str">&quot;&quot;</span>)) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">identity</span>.<span class="ruby-identifier">match</span>(<span class="ruby-value str">&quot;^/&quot;</span>)
727 116: 
728 117:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">identity</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Regexp</span>)
729 118:         <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">identity</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">identity</span>)
730 119:       <span class="ruby-keyword kw">else</span>
731 120:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">identity</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">identity</span>
732 121:       <span class="ruby-keyword kw">end</span>
733 122: 
734 123:       <span class="ruby-keyword kw">false</span>
735 124:     <span class="ruby-keyword kw">end</span>
736 </pre>
737           </div>
738         </div>
739       </div>
740
741       <div id="method-M000295" class="method-detail">
742         <a name="M000295"></a>
743
744         <div class="method-heading">
745           <a href="#M000295" class="method-signature">
746           <span class="method-name">loadclass</span><span class="method-args">(klass)</span>
747           </a>
748         </div>
749       
750         <div class="method-description">
751           <p>
752 Wrapper around <a
753 href="PluginManager.html#M000034">PluginManager.loadclass</a>
754 </p>
755           <p><a class="source-toggle" href="#"
756             onclick="toggleCode('M000295-source');return false;">[Source]</a></p>
757           <div class="method-source-code" id="M000295-source">
758 <pre>
759      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 224</span>
760 224:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>)
761 225:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>)
762 226:     <span class="ruby-keyword kw">end</span>
763 </pre>
764           </div>
765         </div>
766       </div>
767
768       <div id="method-M000292" class="method-detail">
769         <a name="M000292"></a>
770
771         <div class="method-heading">
772           <a href="#M000292" class="method-signature">
773           <span class="method-name">make_subscriptions</span><span class="method-args">(agent, type, collective=nil)</span>
774           </a>
775         </div>
776       
777         <div class="method-description">
778           <p><a class="source-toggle" href="#"
779             onclick="toggleCode('M000292-source');return false;">[Source]</a></p>
780           <div class="method-source-code" id="M000292-source">
781 <pre>
782      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 185</span>
783 185:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">make_subscriptions</span>(<span class="ruby-identifier">agent</span>, <span class="ruby-identifier">type</span>, <span class="ruby-identifier">collective</span>=<span class="ruby-keyword kw">nil</span>)
784 186:       <span class="ruby-identifier">config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
785 187: 
786 188:       <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Unknown target type #{type}&quot;</span>) <span class="ruby-keyword kw">unless</span> [<span class="ruby-identifier">:broadcast</span>, <span class="ruby-identifier">:directed</span>, <span class="ruby-identifier">:reply</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">type</span>)
787 189: 
788 190:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">collective</span>.<span class="ruby-identifier">nil?</span>
789 191:         <span class="ruby-identifier">config</span>.<span class="ruby-identifier">collectives</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
790 192:           {<span class="ruby-identifier">:agent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">type</span>, <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">c</span>}
791 193:         <span class="ruby-keyword kw">end</span>
792 194:       <span class="ruby-keyword kw">else</span>
793 195:         <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Unknown collective '#{collective}' known collectives are '#{config.collectives.join ', '}'&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">config</span>.<span class="ruby-identifier">collectives</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">collective</span>)
794 196: 
795 197:         [{<span class="ruby-identifier">:agent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">type</span>, <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">collective</span>}]
796 198:       <span class="ruby-keyword kw">end</span>
797 199:     <span class="ruby-keyword kw">end</span>
798 </pre>
799           </div>
800         </div>
801       </div>
802
803       <div id="method-M000302" class="method-detail">
804         <a name="M000302"></a>
805
806         <div class="method-heading">
807           <a href="#M000302" class="method-signature">
808           <span class="method-name">mcollective_version</span><span class="method-args">()</span>
809           </a>
810         </div>
811       
812         <div class="method-description">
813           <p><a class="source-toggle" href="#"
814             onclick="toggleCode('M000302-source');return false;">[Source]</a></p>
815           <div class="method-source-code" id="M000302-source">
816 <pre>
817      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 298</span>
818 298:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">mcollective_version</span>
819 299:       <span class="ruby-constant">MCollective</span><span class="ruby-operator">::</span><span class="ruby-constant">VERSION</span>
820 300:     <span class="ruby-keyword kw">end</span>
821 </pre>
822           </div>
823         </div>
824       </div>
825
826       <div id="method-M000296" class="method-detail">
827         <a name="M000296"></a>
828
829         <div class="method-heading">
830           <a href="#M000296" class="method-signature">
831           <span class="method-name">parse_fact_string</span><span class="method-args">(fact)</span>
832           </a>
833         </div>
834       
835         <div class="method-description">
836           <p>
837 Parse a fact filter string like foo=bar into the tuple hash thats needed
838 </p>
839           <p><a class="source-toggle" href="#"
840             onclick="toggleCode('M000296-source');return false;">[Source]</a></p>
841           <div class="method-source-code" id="M000296-source">
842 <pre>
843      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 229</span>
844 229:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parse_fact_string</span>(<span class="ruby-identifier">fact</span>)
845 230:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^([^ ]+?)[ ]*=&gt;[ ]*(.+)/</span>
846 231:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'&gt;='</span> }
847 232:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^([^ ]+?)[ ]*=&lt;[ ]*(.+)/</span>
848 233:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'&lt;='</span> }
849 234:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^([^ ]+?)[ ]*(&lt;=|&gt;=|&lt;|&gt;|!=|==|=~)[ ]*(.+)/</span>
850 235:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$3</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$2</span> }
851 236:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(.+?)[ ]*=[ ]*\/(.+)\/$/</span>
852 237:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;/#{$2}/&quot;</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'=~'</span> }
853 238:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">fact</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^([^= ]+?)[ ]*=[ ]*(.+)/</span>
854 239:         <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'=='</span> }
855 240:       <span class="ruby-keyword kw">else</span>
856 241:         <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Could not parse fact #{fact} it does not appear to be in a valid format&quot;</span>
857 242:       <span class="ruby-keyword kw">end</span>
858 243:     <span class="ruby-keyword kw">end</span>
859 </pre>
860           </div>
861         </div>
862       </div>
863
864       <div id="method-M000301" class="method-detail">
865         <a name="M000301"></a>
866
867         <div class="method-heading">
868           <a href="#M000301" class="method-signature">
869           <span class="method-name">ruby_version</span><span class="method-args">()</span>
870           </a>
871         </div>
872       
873         <div class="method-description">
874           <p>
875 Returns the current ruby version as per RUBY_VERSION, mostly doing this
876 here to aid testing
877 </p>
878           <p><a class="source-toggle" href="#"
879             onclick="toggleCode('M000301-source');return false;">[Source]</a></p>
880           <div class="method-source-code" id="M000301-source">
881 <pre>
882      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 294</span>
883 294:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">ruby_version</span>
884 295:       <span class="ruby-constant">RUBY_VERSION</span>
885 296:     <span class="ruby-keyword kw">end</span>
886 </pre>
887           </div>
888         </div>
889       </div>
890
891       <div id="method-M000282" class="method-detail">
892         <a name="M000282"></a>
893
894         <div class="method-heading">
895           <a href="#M000282" class="method-signature">
896           <span class="method-name">setup_windows_sleeper</span><span class="method-args">()</span>
897           </a>
898         </div>
899       
900         <div class="method-description">
901           <p>
902 On windows ^c can&#8216;<a href="Util.html#M000309">t</a> interrupt the VM
903 if its blocking on IO, so this sets up a dummy thread that sleeps and this
904 will have the end result of being interruptable at least once a second.
905 This is a common pattern found in Rails etc
906 </p>
907           <p><a class="source-toggle" href="#"
908             onclick="toggleCode('M000282-source');return false;">[Source]</a></p>
909           <div class="method-source-code" id="M000282-source">
910 <pre>
911     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 30</span>
912 30:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">setup_windows_sleeper</span>
913 31:       <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> { <span class="ruby-identifier">loop</span> { <span class="ruby-identifier">sleep</span> <span class="ruby-value">1</span> } } <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">windows?</span>
914 32:     <span class="ruby-keyword kw">end</span>
915 </pre>
916           </div>
917         </div>
918       </div>
919
920       <div id="method-M000297" class="method-detail">
921         <a name="M000297"></a>
922
923         <div class="method-heading">
924           <a href="#M000297" class="method-signature">
925           <span class="method-name">shellescape</span><span class="method-args">(str)</span>
926           </a>
927         </div>
928       
929         <div class="method-description">
930           <p>
931 Escapes a string so it&#8216;s safe to use in system() or backticks
932 </p>
933 <p>
934 Taken from Shellwords#shellescape since it&#8216;s only in a few ruby
935 versions
936 </p>
937           <p><a class="source-toggle" href="#"
938             onclick="toggleCode('M000297-source');return false;">[Source]</a></p>
939           <div class="method-source-code" id="M000297-source">
940 <pre>
941      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 248</span>
942 248:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">shellescape</span>(<span class="ruby-identifier">str</span>)
943 249:       <span class="ruby-keyword kw">return</span> <span class="ruby-value str">&quot;''&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">str</span>.<span class="ruby-identifier">empty?</span>
944 250: 
945 251:       <span class="ruby-identifier">str</span> = <span class="ruby-identifier">str</span>.<span class="ruby-identifier">dup</span>
946 252: 
947 253:       <span class="ruby-comment cmt"># Process as a single byte sequence because not all shell</span>
948 254:       <span class="ruby-comment cmt"># implementations are multibyte aware.</span>
949 255:       <span class="ruby-identifier">str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/([^A-Za-z0-9_\-.,:\/@\n])/n</span>, <span class="ruby-value str">&quot;\\\\\\1&quot;</span>)
950 256: 
951 257:       <span class="ruby-comment cmt"># A LF cannot be escaped with a backslash because a backslash + LF</span>
952 258:       <span class="ruby-comment cmt"># combo is regarded as line continuation and simply ignored.</span>
953 259:       <span class="ruby-identifier">str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/\n/</span>, <span class="ruby-value str">&quot;'\n'&quot;</span>)
954 260: 
955 261:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">str</span>
956 262:     <span class="ruby-keyword kw">end</span>
957 </pre>
958           </div>
959         </div>
960       </div>
961
962       <div id="method-M000308" class="method-detail">
963         <a name="M000308"></a>
964
965         <div class="method-heading">
966           <a href="#M000308" class="method-signature">
967           <span class="method-name">str_to_bool</span><span class="method-args">(val)</span>
968           </a>
969         </div>
970       
971         <div class="method-description">
972           <p>
973 Converts a string into a boolean value Strings matching 1,y,yes,true or <a
974 href="Util.html#M000309">t</a> will return TrueClass Any other value will
975 return FalseClass
976 </p>
977           <p><a class="source-toggle" href="#"
978             onclick="toggleCode('M000308-source');return false;">[Source]</a></p>
979           <div class="method-source-code" id="M000308-source">
980 <pre>
981      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 477</span>
982 477:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">str_to_bool</span>(<span class="ruby-identifier">val</span>)
983 478:       <span class="ruby-identifier">clean_val</span> = <span class="ruby-identifier">val</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">strip</span>
984 479:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">clean_val</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(1|yes|true|y|t)$/i</span>
985 480:         <span class="ruby-keyword kw">return</span>  <span class="ruby-keyword kw">true</span>
986 481:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">clean_val</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(0|no|false|n|f)$/i</span>
987 482:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
988 483:       <span class="ruby-keyword kw">else</span>
989 484:         <span class="ruby-identifier">raise_code</span>(<span class="ruby-identifier">:PLMC42</span>, <span class="ruby-value str">&quot;Cannot convert string value '%{value}' into a boolean.&quot;</span>, <span class="ruby-identifier">:error</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">clean_val</span>)
990 485:       <span class="ruby-keyword kw">end</span>
991 486:     <span class="ruby-keyword kw">end</span>
992 </pre>
993           </div>
994         </div>
995       </div>
996
997       <div id="method-M000293" class="method-detail">
998         <a name="M000293"></a>
999
1000         <div class="method-heading">
1001           <a href="#M000293" class="method-signature">
1002           <span class="method-name">subscribe</span><span class="method-args">(targets)</span>
1003           </a>
1004         </div>
1005       
1006         <div class="method-description">
1007           <p>
1008 Helper to <a href="Util.html#M000293">subscribe</a> to a topic on multiple
1009 collectives or just one
1010 </p>
1011           <p><a class="source-toggle" href="#"
1012             onclick="toggleCode('M000293-source');return false;">[Source]</a></p>
1013           <div class="method-source-code" id="M000293-source">
1014 <pre>
1015      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 202</span>
1016 202:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">subscribe</span>(<span class="ruby-identifier">targets</span>)
1017 203:       <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;connector_plugin&quot;</span>]
1018 204: 
1019 205:       <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
1020 206: 
1021 207:       <span class="ruby-identifier">targets</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">target</span><span class="ruby-operator">|</span>
1022 208:         <span class="ruby-identifier">connection</span>.<span class="ruby-identifier">subscribe</span>(<span class="ruby-identifier">target</span>[<span class="ruby-identifier">:agent</span>], <span class="ruby-identifier">target</span>[<span class="ruby-identifier">:type</span>], <span class="ruby-identifier">target</span>[<span class="ruby-identifier">:collective</span>])
1023 209:       <span class="ruby-keyword kw">end</span>
1024 210:     <span class="ruby-keyword kw">end</span>
1025 </pre>
1026           </div>
1027         </div>
1028       </div>
1029
1030       <div id="method-M000309" class="method-detail">
1031         <a name="M000309"></a>
1032
1033         <div class="method-heading">
1034           <a href="#M000309" class="method-signature">
1035           <span class="method-name">t</span><span class="method-args">(msgid, args={})</span>
1036           </a>
1037         </div>
1038       
1039         <div class="method-description">
1040           <p>
1041 Looks up and interprolate the hash values into a i18n string
1042 </p>
1043           <p><a class="source-toggle" href="#"
1044             onclick="toggleCode('M000309-source');return false;">[Source]</a></p>
1045           <div class="method-source-code" id="M000309-source">
1046 <pre>
1047      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 489</span>
1048 489:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">t</span>(<span class="ruby-identifier">msgid</span>, <span class="ruby-identifier">args</span>={})
1049 490:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">msgid</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Symbol</span>)
1050 491:         <span class="ruby-constant">I18n</span>.<span class="ruby-identifier">t</span>(<span class="ruby-value str">&quot;%s.pattern&quot;</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">msgid</span>, <span class="ruby-identifier">args</span>)
1051 492:       <span class="ruby-keyword kw">else</span>
1052 493:         <span class="ruby-constant">I18n</span>.<span class="ruby-identifier">t</span>(<span class="ruby-identifier">msgid</span>, <span class="ruby-identifier">args</span>)
1053 494:       <span class="ruby-keyword kw">end</span>
1054 495:     <span class="ruby-keyword kw">end</span>
1055 </pre>
1056           </div>
1057         </div>
1058       </div>
1059
1060       <div id="method-M000310" class="method-detail">
1061         <a name="M000310"></a>
1062
1063         <div class="method-heading">
1064           <a href="#M000310" class="method-signature">
1065           <span class="method-name">templatepath</span><span class="method-args">(template_file)</span>
1066           </a>
1067         </div>
1068       
1069         <div class="method-description">
1070           <p>
1071 Looks up the template directory and returns its full path
1072 </p>
1073           <p><a class="source-toggle" href="#"
1074             onclick="toggleCode('M000310-source');return false;">[Source]</a></p>
1075           <div class="method-source-code" id="M000310-source">
1076 <pre>
1077      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 498</span>
1078 498:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">templatepath</span>(<span class="ruby-identifier">template_file</span>)
1079 499:       <span class="ruby-identifier">config_dir</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">dirname</span>(<span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">configfile</span>)
1080 500:       <span class="ruby-identifier">template_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">config_dir</span>, <span class="ruby-identifier">template_file</span>)
1081 501:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">template_path</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">template_path</span>)
1082 502: 
1083 503:       <span class="ruby-identifier">template_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;/etc/mcollective&quot;</span>, <span class="ruby-identifier">template_file</span>)
1084 504:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">template_path</span>
1085 505:     <span class="ruby-keyword kw">end</span>
1086 </pre>
1087           </div>
1088         </div>
1089       </div>
1090
1091       <div id="method-M000304" class="method-detail">
1092         <a name="M000304"></a>
1093
1094         <div class="method-heading">
1095           <a href="#M000304" class="method-signature">
1096           <span class="method-name">terminal_dimensions</span><span class="method-args">(stdout = STDOUT, environment = ENV)</span>
1097           </a>
1098         </div>
1099       
1100         <div class="method-description">
1101           <p>
1102 Figures out the columns and lines of the current tty
1103 </p>
1104 <p>
1105 Returns [0, 0] if it can&#8216;<a href="Util.html#M000309">t</a> figure it
1106 out or if you&#8216;re not running on a tty
1107 </p>
1108           <p><a class="source-toggle" href="#"
1109             onclick="toggleCode('M000304-source');return false;">[Source]</a></p>
1110           <div class="method-source-code" id="M000304-source">
1111 <pre>
1112      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 396</span>
1113 396:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">terminal_dimensions</span>(<span class="ruby-identifier">stdout</span> = <span class="ruby-constant">STDOUT</span>, <span class="ruby-identifier">environment</span> = <span class="ruby-constant">ENV</span>)
1114 397:       <span class="ruby-keyword kw">return</span> [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>] <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">tty?</span>
1115 398: 
1116 399:       <span class="ruby-keyword kw">return</span> [<span class="ruby-value">80</span>, <span class="ruby-value">40</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">windows?</span>
1117 400: 
1118 401:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">environment</span>[<span class="ruby-value str">&quot;COLUMNS&quot;</span>] <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">environment</span>[<span class="ruby-value str">&quot;LINES&quot;</span>]
1119 402:         <span class="ruby-keyword kw">return</span> [<span class="ruby-identifier">environment</span>[<span class="ruby-value str">&quot;COLUMNS&quot;</span>].<span class="ruby-identifier">to_i</span>, <span class="ruby-identifier">environment</span>[<span class="ruby-value str">&quot;LINES&quot;</span>].<span class="ruby-identifier">to_i</span>]
1120 403: 
1121 404:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">environment</span>[<span class="ruby-value str">&quot;TERM&quot;</span>] <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">command_in_path?</span>(<span class="ruby-value str">&quot;tput&quot;</span>)
1122 405:         <span class="ruby-keyword kw">return</span> [<span class="ruby-value">`tput cols`</span>.<span class="ruby-identifier">to_i</span>, <span class="ruby-value">`tput lines`</span>.<span class="ruby-identifier">to_i</span>]
1123 406: 
1124 407:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">command_in_path?</span>(<span class="ruby-value str">'stty'</span>)
1125 408:         <span class="ruby-keyword kw">return</span> <span class="ruby-value">`stty size`</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp re">/\d+/</span>).<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">to_i</span> }
1126 409:       <span class="ruby-keyword kw">else</span>
1127 410:         <span class="ruby-keyword kw">return</span> [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
1128 411:       <span class="ruby-keyword kw">end</span>
1129 412:     <span class="ruby-keyword kw">rescue</span>
1130 413:       [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
1131 414:     <span class="ruby-keyword kw">end</span>
1132 </pre>
1133           </div>
1134         </div>
1135       </div>
1136
1137       <div id="method-M000294" class="method-detail">
1138         <a name="M000294"></a>
1139
1140         <div class="method-heading">
1141           <a href="#M000294" class="method-signature">
1142           <span class="method-name">unsubscribe</span><span class="method-args">(targets)</span>
1143           </a>
1144         </div>
1145       
1146         <div class="method-description">
1147           <p>
1148 Helper to <a href="Util.html#M000294">unsubscribe</a> to a topic on
1149 multiple collectives or just one
1150 </p>
1151           <p><a class="source-toggle" href="#"
1152             onclick="toggleCode('M000294-source');return false;">[Source]</a></p>
1153           <div class="method-source-code" id="M000294-source">
1154 <pre>
1155      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 213</span>
1156 213:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">unsubscribe</span>(<span class="ruby-identifier">targets</span>)
1157 214:       <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;connector_plugin&quot;</span>]
1158 215: 
1159 216:       <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
1160 217: 
1161 218:       <span class="ruby-identifier">targets</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">target</span><span class="ruby-operator">|</span>
1162 219:         <span class="ruby-identifier">connection</span>.<span class="ruby-identifier">unsubscribe</span>(<span class="ruby-identifier">target</span>[<span class="ruby-identifier">:agent</span>], <span class="ruby-identifier">target</span>[<span class="ruby-identifier">:type</span>], <span class="ruby-identifier">target</span>[<span class="ruby-identifier">:collective</span>])
1163 220:       <span class="ruby-keyword kw">end</span>
1164 221:     <span class="ruby-keyword kw">end</span>
1165 </pre>
1166           </div>
1167         </div>
1168       </div>
1169
1170       <div id="method-M000306" class="method-detail">
1171         <a name="M000306"></a>
1172
1173         <div class="method-heading">
1174           <a href="#M000306" class="method-signature">
1175           <span class="method-name">versioncmp</span><span class="method-args">(version_a, version_b)</span>
1176           </a>
1177         </div>
1178       
1179         <div class="method-description">
1180           <p>
1181 compare two software versions as commonly found in package versions.
1182 </p>
1183 <p>
1184 returns 0 if a == b returns -1 if a &lt; b returns 1 if a &gt; b
1185 </p>
1186 <p>
1187 Code originally from Puppet
1188 </p>
1189           <p><a class="source-toggle" href="#"
1190             onclick="toggleCode('M000306-source');return false;">[Source]</a></p>
1191           <div class="method-source-code" id="M000306-source">
1192 <pre>
1193      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 433</span>
1194 433:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">versioncmp</span>(<span class="ruby-identifier">version_a</span>, <span class="ruby-identifier">version_b</span>)
1195 434:       <span class="ruby-identifier">vre</span> = <span class="ruby-regexp re">/[-.]|\d+|[^-.\d]+/</span>
1196 435:       <span class="ruby-identifier">ax</span> = <span class="ruby-identifier">version_a</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-identifier">vre</span>)
1197 436:       <span class="ruby-identifier">bx</span> = <span class="ruby-identifier">version_b</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-identifier">vre</span>)
1198 437: 
1199 438:       <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">ax</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">bx</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span>)
1200 439:         <span class="ruby-identifier">a</span> = <span class="ruby-identifier">ax</span>.<span class="ruby-identifier">shift</span>
1201 440:         <span class="ruby-identifier">b</span> = <span class="ruby-identifier">bx</span>.<span class="ruby-identifier">shift</span>
1202 441: 
1203 442:         <span class="ruby-keyword kw">if</span>( <span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">b</span> )                 <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">next</span>
1204 443:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'-'</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'-'</span>) <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">next</span>
1205 444:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'-'</span>)             <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">return</span> <span class="ruby-value">-1</span>
1206 445:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'-'</span>)             <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">return</span> <span class="ruby-value">1</span>
1207 446:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'.'</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'.'</span>) <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">next</span>
1208 447:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'.'</span> )            <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">return</span> <span class="ruby-value">-1</span>
1209 448:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'.'</span> )            <span class="ruby-keyword kw">then</span> <span class="ruby-keyword kw">return</span> <span class="ruby-value">1</span>
1210 449:         <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">a</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^\d+$/</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^\d+$/</span>) <span class="ruby-keyword kw">then</span>
1211 450:           <span class="ruby-keyword kw">if</span>( <span class="ruby-identifier">a</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^0/</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^0/</span> ) <span class="ruby-keyword kw">then</span>
1212 451:             <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">upcase</span> <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">upcase</span>
1213 452:           <span class="ruby-keyword kw">end</span>
1214 453:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">to_i</span>
1215 454:         <span class="ruby-keyword kw">else</span>
1216 455:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">upcase</span> <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">upcase</span>
1217 456:         <span class="ruby-keyword kw">end</span>
1218 457:       <span class="ruby-keyword kw">end</span>
1219 458: 
1220 459:       <span class="ruby-identifier">version_a</span> <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">version_b</span>;
1221 460:     <span class="ruby-keyword kw">end</span>
1222 </pre>
1223           </div>
1224         </div>
1225       </div>
1226
1227       <div id="method-M000298" class="method-detail">
1228         <a name="M000298"></a>
1229
1230         <div class="method-heading">
1231           <a href="#M000298" class="method-signature">
1232           <span class="method-name">windows?</span><span class="method-args">()</span>
1233           </a>
1234         </div>
1235       
1236         <div class="method-description">
1237           <p><a class="source-toggle" href="#"
1238             onclick="toggleCode('M000298-source');return false;">[Source]</a></p>
1239           <div class="method-source-code" id="M000298-source">
1240 <pre>
1241      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 264</span>
1242 264:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
1243 265:       <span class="ruby-operator">!</span><span class="ruby-operator">!</span>(<span class="ruby-constant">RbConfig</span><span class="ruby-operator">::</span><span class="ruby-constant">CONFIG</span>[<span class="ruby-value str">'host_os'</span>] <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/mswin|win32|dos|mingw|cygwin/i</span>)
1244 266:     <span class="ruby-keyword kw">end</span>
1245 </pre>
1246           </div>
1247         </div>
1248       </div>
1249
1250       <div id="method-M000289" class="method-detail">
1251         <a name="M000289"></a>
1252
1253         <div class="method-heading">
1254           <a href="#M000289" class="method-signature">
1255           <span class="method-name">windows_prefix</span><span class="method-args">()</span>
1256           </a>
1257         </div>
1258       
1259         <div class="method-description">
1260           <p>
1261 Returns the PuppetLabs mcollective path for windows
1262 </p>
1263           <p><a class="source-toggle" href="#"
1264             onclick="toggleCode('M000289-source');return false;">[Source]</a></p>
1265           <div class="method-source-code" id="M000289-source">
1266 <pre>
1267      <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 141</span>
1268 141:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows_prefix</span>
1269 142:       <span class="ruby-identifier">require</span> <span class="ruby-value str">'win32/dir'</span>
1270 143:       <span class="ruby-identifier">prefix</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">Dir</span><span class="ruby-operator">::</span><span class="ruby-constant">COMMON_APPDATA</span>, <span class="ruby-value str">&quot;PuppetLabs&quot;</span>, <span class="ruby-value str">&quot;mcollective&quot;</span>)
1271 144:     <span class="ruby-keyword kw">end</span>
1272 </pre>
1273           </div>
1274         </div>
1275       </div>
1276
1277
1278     </div>
1279
1280
1281   </div>
1282
1283
1284 <div id="validator-badges">
1285   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
1286 </div>
1287
1288 </body>
1289 </html>