Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Util.html
diff --git a/doc/classes/MCollective/Util.html b/doc/classes/MCollective/Util.html
new file mode 100644 (file)
index 0000000..a7a7018
--- /dev/null
@@ -0,0 +1,1289 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html 
+     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <title>Module: MCollective::Util</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+  <meta http-equiv="Content-Script-Type" content="text/javascript" />
+  <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
+  <script type="text/javascript">
+  // <![CDATA[
+
+  function popupCode( url ) {
+    window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
+  }
+
+  function toggleCode( id ) {
+    if ( document.getElementById )
+      elem = document.getElementById( id );
+    else if ( document.all )
+      elem = eval( "document.all." + id );
+    else
+      return false;
+
+    elemStyle = elem.style;
+    
+    if ( elemStyle.display != "block" ) {
+      elemStyle.display = "block"
+    } else {
+      elemStyle.display = "none"
+    }
+
+    return true;
+  }
+  
+  // Make codeblocks hidden by default
+  document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
+  
+  // ]]>
+  </script>
+
+</head>
+<body>
+
+
+
+    <div id="classHeader">
+        <table class="header-table">
+        <tr class="top-aligned-row">
+          <td><strong>Module</strong></td>
+          <td class="class-name-in-header">MCollective::Util</td>
+        </tr>
+        <tr class="top-aligned-row">
+            <td><strong>In:</strong></td>
+            <td>
+                <a href="../../files/lib/mcollective/util_rb.html">
+                lib/mcollective/util.rb
+                </a>
+        <br />
+            </td>
+        </tr>
+
+        </table>
+    </div>
+  <!-- banner header -->
+
+  <div id="bodyContent">
+
+
+
+  <div id="contextContent">
+
+    <div id="description">
+      <p>
+Some basic utility helper methods useful to clients, agents, runner etc.
+</p>
+
+    </div>
+
+
+   </div>
+
+    <div id="method-list">
+      <h3 class="section-bar">Methods</h3>
+
+      <div class="name-list">
+      <a href="#M000307">absolute_path?</a>&nbsp;&nbsp;
+      <a href="#M000303">align_text</a>&nbsp;&nbsp;
+      <a href="#M000299">color</a>&nbsp;&nbsp;
+      <a href="#M000300">colorize</a>&nbsp;&nbsp;
+      <a href="#M000305">command_in_path?</a>&nbsp;&nbsp;
+      <a href="#M000290">config_file_for_user</a>&nbsp;&nbsp;
+      <a href="#M000291">default_options</a>&nbsp;&nbsp;
+      <a href="#M000288">empty_filter</a>&nbsp;&nbsp;
+      <a href="#M000287">empty_filter?</a>&nbsp;&nbsp;
+      <a href="#M000284">get_fact</a>&nbsp;&nbsp;
+      <a href="#M000281">has_agent?</a>&nbsp;&nbsp;
+      <a href="#M000283">has_cf_class?</a>&nbsp;&nbsp;
+      <a href="#M000285">has_fact?</a>&nbsp;&nbsp;
+      <a href="#M000286">has_identity?</a>&nbsp;&nbsp;
+      <a href="#M000295">loadclass</a>&nbsp;&nbsp;
+      <a href="#M000292">make_subscriptions</a>&nbsp;&nbsp;
+      <a href="#M000302">mcollective_version</a>&nbsp;&nbsp;
+      <a href="#M000296">parse_fact_string</a>&nbsp;&nbsp;
+      <a href="#M000301">ruby_version</a>&nbsp;&nbsp;
+      <a href="#M000282">setup_windows_sleeper</a>&nbsp;&nbsp;
+      <a href="#M000297">shellescape</a>&nbsp;&nbsp;
+      <a href="#M000308">str_to_bool</a>&nbsp;&nbsp;
+      <a href="#M000293">subscribe</a>&nbsp;&nbsp;
+      <a href="#M000309">t</a>&nbsp;&nbsp;
+      <a href="#M000310">templatepath</a>&nbsp;&nbsp;
+      <a href="#M000304">terminal_dimensions</a>&nbsp;&nbsp;
+      <a href="#M000294">unsubscribe</a>&nbsp;&nbsp;
+      <a href="#M000306">versioncmp</a>&nbsp;&nbsp;
+      <a href="#M000298">windows?</a>&nbsp;&nbsp;
+      <a href="#M000289">windows_prefix</a>&nbsp;&nbsp;
+      </div>
+    </div>
+
+  </div>
+
+
+    <!-- if includes -->
+
+    <div id="section">
+
+
+
+
+
+      
+
+
+    <!-- if method_list -->
+    <div id="methods">
+      <h3 class="section-bar">Public Class methods</h3>
+
+      <div id="method-M000307" class="method-detail">
+        <a name="M000307"></a>
+
+        <div class="method-heading">
+          <a href="#M000307" class="method-signature">
+          <span class="method-name">absolute_path?</span><span class="method-args">(path, separator=File::SEPARATOR, alt_separator=File::ALT_SEPARATOR)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+we should really use Pathname#absolute? but it&#8216;s not in all the ruby
+versions we support and it comes down to roughly this
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000307-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000307-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 464</span>
+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>)
+465:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">alt_separator</span>
+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>
+467:       <span class="ruby-keyword kw">else</span>
+468:         <span class="ruby-identifier">path_matcher</span> = <span class="ruby-node">/^#{Regexp.quote separator}/</span>
+469:       <span class="ruby-keyword kw">end</span>
+470: 
+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>)
+472:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000303" class="method-detail">
+        <a name="M000303"></a>
+
+        <div class="method-heading">
+          <a href="#M000303" class="method-signature">
+          <span class="method-name">align_text</span><span class="method-args">(text, console_cols = nil, preamble = 5)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Returns an aligned_string of text relative to the size of the terminal
+window. If a line in the string exceeds the width of the terminal window
+the line will be chopped off at the whitespace chacter closest to the end
+of the line and prepended to the next line, keeping all indentation.
+</p>
+<p>
+The terminal size is detected by default, but custom line widths can
+passed. All strings will also be left aligned with 5 whitespace characters
+by default.
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000303-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000303-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 310</span>
+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>)
+311:       <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">console_cols</span>
+312:         <span class="ruby-identifier">console_cols</span> = <span class="ruby-identifier">terminal_dimensions</span>[<span class="ruby-value">0</span>]
+313: 
+314:         <span class="ruby-comment cmt"># if unknown size we default to the typical unix default</span>
+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>
+316:       <span class="ruby-keyword kw">end</span>
+317: 
+318:       <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">preamble</span>
+319: 
+320:       <span class="ruby-comment cmt"># Return unaligned text if console window is too small</span>
+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>
+322: 
+323:       <span class="ruby-comment cmt"># If console is 0 this implies unknown so we assume the common</span>
+324:       <span class="ruby-comment cmt"># minimal unix configuration of 80 characters</span>
+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>
+326: 
+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>)
+328:       <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
+329:       <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
+330: 
+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>
+332:         <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
+333: 
+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>
+335:           <span class="ruby-identifier">whitespace</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
+336:         <span class="ruby-keyword kw">end</span>
+337: 
+338:         <span class="ruby-comment cmt"># If the current line is empty, indent it so that a snippet</span>
+339:         <span class="ruby-comment cmt"># from the previous line is aligned correctly.</span>
+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>
+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>)
+342:         <span class="ruby-keyword kw">end</span>
+343: 
+344:         <span class="ruby-comment cmt"># If text was snipped from the previous line, prepend it to the</span>
+345:         <span class="ruby-comment cmt"># current line after any current indentation.</span>
+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>
+347:           <span class="ruby-comment cmt"># Reset whitespaces to 0 if there are more whitespaces than there are</span>
+348:           <span class="ruby-comment cmt"># console columns</span>
+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>
+350: 
+351:           <span class="ruby-comment cmt"># If the current line is empty and being prepended to, create a new</span>
+352:           <span class="ruby-comment cmt"># empty line in the text so that formatting is preserved.</span>
+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>)
+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>)
+355:           <span class="ruby-keyword kw">end</span>
+356: 
+357:           <span class="ruby-comment cmt"># Add the snipped text to the current line</span>
+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>)
+359:         <span class="ruby-keyword kw">end</span>
+360: 
+361:         <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
+362: 
+363:         <span class="ruby-comment cmt"># Compare the line length to the allowed line length.</span>
+364:         <span class="ruby-comment cmt"># If it exceeds it, snip the offending text from the line</span>
+365:         <span class="ruby-comment cmt"># and store it so that it can be prepended to the next line.</span>
+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>)
+367:           <span class="ruby-identifier">reverse</span> = <span class="ruby-identifier">console_cols</span>
+368: 
+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>
+370:             <span class="ruby-identifier">reverse</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
+371:           <span class="ruby-keyword kw">end</span>
+372: 
+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>
+374:         <span class="ruby-keyword kw">end</span>
+375: 
+376:         <span class="ruby-comment cmt"># If a snippet exists when all the columns in the text have been</span>
+377:         <span class="ruby-comment cmt"># updated, create a new line and append the snippet to it, using</span>
+378:         <span class="ruby-comment cmt"># the same left alignment as the last line in the text.</span>
+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>
+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>
+381:           <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
+382:         <span class="ruby-keyword kw">end</span>
+383: 
+384:         <span class="ruby-comment cmt"># Add the preamble to the line and add it to the text</span>
+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>)
+386:         <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span>] = <span class="ruby-identifier">line</span>
+387:       <span class="ruby-keyword kw">end</span>
+388: 
+389:       <span class="ruby-identifier">text</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
+390:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000299" class="method-detail">
+        <a name="M000299"></a>
+
+        <div class="method-heading">
+          <a href="#M000299" class="method-signature">
+          <span class="method-name">color</span><span class="method-args">(code)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Return <a href="Util.html#M000299">color</a> codes, if the config color=
+option is false just return a empty string
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000299-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000299-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 270</span>
+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>)
+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>
+272: 
+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>,
+274:                 <span class="ruby-identifier">:green</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[32m&quot;</span>,
+275:                 <span class="ruby-identifier">:yellow</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[33m&quot;</span>,
+276:                 <span class="ruby-identifier">:cyan</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[36m&quot;</span>,
+277:                 <span class="ruby-identifier">:bold</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[1m&quot;</span>,
+278:                 <span class="ruby-identifier">:reset</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">&quot;\e[0m&quot;</span>}
+279: 
+280:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">colorize</span>
+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>
+282:       <span class="ruby-keyword kw">else</span>
+283:         <span class="ruby-keyword kw">return</span> <span class="ruby-value str">&quot;&quot;</span>
+284:       <span class="ruby-keyword kw">end</span>
+285:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000300" class="method-detail">
+        <a name="M000300"></a>
+
+        <div class="method-heading">
+          <a href="#M000300" class="method-signature">
+          <span class="method-name">colorize</span><span class="method-args">(code, msg)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Helper to return a string in specific <a href="Util.html#M000299">color</a>
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000300-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000300-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 288</span>
+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>)
+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>) ]
+290:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000305" class="method-detail">
+        <a name="M000305"></a>
+
+        <div class="method-heading">
+          <a href="#M000305" class="method-signature">
+          <span class="method-name">command_in_path?</span><span class="method-args">(command)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Checks in PATH returns true if the command is found
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000305-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000305-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 417</span>
+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>)
+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>
+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>))
+420:       <span class="ruby-keyword kw">end</span>
+421: 
+422:       <span class="ruby-identifier">found</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-keyword kw">true</span>)
+423:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000290" class="method-detail">
+        <a name="M000290"></a>
+
+        <div class="method-heading">
+          <a href="#M000290" class="method-signature">
+          <span class="method-name">config_file_for_user</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Picks a config file defaults to ~/.mcollective else
+/etc/mcollective/client.cfg
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000290-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000290-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 148</span>
+148:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">config_file_for_user</span>
+149:       <span class="ruby-comment cmt"># expand_path is pretty lame, it relies on HOME environment</span>
+150:       <span class="ruby-comment cmt"># which isnt't always there so just handling all exceptions</span>
+151:       <span class="ruby-comment cmt"># here as cant find reverting to default</span>
+152:       <span class="ruby-keyword kw">begin</span>
+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>)
+154: 
+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>)
+156:           <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
+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>)
+158:           <span class="ruby-keyword kw">else</span>
+159:             <span class="ruby-identifier">config</span> = <span class="ruby-value str">&quot;/etc/mcollective/client.cfg&quot;</span>
+160:           <span class="ruby-keyword kw">end</span>
+161:         <span class="ruby-keyword kw">end</span>
+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>
+163:         <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
+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>)
+165:         <span class="ruby-keyword kw">else</span>
+166:           <span class="ruby-identifier">config</span> = <span class="ruby-value str">&quot;/etc/mcollective/client.cfg&quot;</span>
+167:         <span class="ruby-keyword kw">end</span>
+168:       <span class="ruby-keyword kw">end</span>
+169: 
+170:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">config</span>
+171:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000291" class="method-detail">
+        <a name="M000291"></a>
+
+        <div class="method-heading">
+          <a href="#M000291" class="method-signature">
+          <span class="method-name">default_options</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Creates a standard options hash
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000291-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000291-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 174</span>
+174:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">default_options</span>
+175:       {<span class="ruby-identifier">:verbose</span>           =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>,
+176:        <span class="ruby-identifier">:disctimeout</span>       =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
+177:        <span class="ruby-identifier">:timeout</span>           =<span class="ruby-operator">&gt;</span> <span class="ruby-value">5</span>,
+178:        <span class="ruby-identifier">:config</span>            =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">config_file_for_user</span>,
+179:        <span class="ruby-identifier">:collective</span>        =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
+180:        <span class="ruby-identifier">:discovery_method</span>  =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>,
+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>,
+182:        <span class="ruby-identifier">:filter</span>            =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">empty_filter</span>}
+183:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000288" class="method-detail">
+        <a name="M000288"></a>
+
+        <div class="method-heading">
+          <a href="#M000288" class="method-signature">
+          <span class="method-name">empty_filter</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Creates an empty filter
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000288-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000288-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 132</span>
+132:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">empty_filter</span>
+133:       {<span class="ruby-value str">&quot;fact&quot;</span>     =<span class="ruby-operator">&gt;</span> [],
+134:        <span class="ruby-value str">&quot;cf_class&quot;</span> =<span class="ruby-operator">&gt;</span> [],
+135:        <span class="ruby-value str">&quot;agent&quot;</span>    =<span class="ruby-operator">&gt;</span> [],
+136:        <span class="ruby-value str">&quot;identity&quot;</span> =<span class="ruby-operator">&gt;</span> [],
+137:        <span class="ruby-value str">&quot;compound&quot;</span> =<span class="ruby-operator">&gt;</span> []}
+138:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000287" class="method-detail">
+        <a name="M000287"></a>
+
+        <div class="method-heading">
+          <a href="#M000287" class="method-signature">
+          <span class="method-name">empty_filter?</span><span class="method-args">(filter)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Checks if the passed in filter is an empty one
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000287-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000287-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 127</span>
+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>)
+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> {}
+129:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000284" class="method-detail">
+        <a name="M000284"></a>
+
+        <div class="method-heading">
+          <a href="#M000284" class="method-signature">
+          <span class="method-name">get_fact</span><span class="method-args">(fact)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Gets the value of a specific fact, mostly just a duplicate of <a
+href="Facts.html#M000017">MCollective::Facts.get_fact</a> but it kind of
+goes with the other classes here
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000284-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000284-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 63</span>
+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>)
+64:       <span class="ruby-constant">Facts</span>.<span class="ruby-identifier">get_fact</span>(<span class="ruby-identifier">fact</span>)
+65:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000281" class="method-detail">
+        <a name="M000281"></a>
+
+        <div class="method-heading">
+          <a href="#M000281" class="method-signature">
+          <span class="method-name">has_agent?</span><span class="method-args">(agent)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Finds out if this <a href="../MCollective.html">MCollective</a> has an
+agent by the name passed
+</p>
+<p>
+If the passed name starts with a / it&#8216;s assumed to be regex and will
+use regex to match
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000281-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000281-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 10</span>
+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>)
+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>)
+12: 
+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>)
+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>
+15:           <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
+16:         <span class="ruby-keyword kw">else</span>
+17:           <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+18:         <span class="ruby-keyword kw">end</span>
+19:       <span class="ruby-keyword kw">else</span>
+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>)
+21:       <span class="ruby-keyword kw">end</span>
+22: 
+23:       <span class="ruby-keyword kw">false</span>
+24:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000283" class="method-detail">
+        <a name="M000283"></a>
+
+        <div class="method-heading">
+          <a href="#M000283" class="method-signature">
+          <span class="method-name">has_cf_class?</span><span class="method-args">(klass)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Checks if this node has a configuration management class by parsing the a
+text file with just a list of classes, recipes, roles etc. This is ala the
+classes.txt from puppet.
+</p>
+<p>
+If the passed name starts with a / it&#8216;s assumed to be regex and will
+use regex to match
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000283-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000283-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 40</span>
+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>)
+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>)
+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>
+43: 
+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>)
+45: 
+46:       <span class="ruby-keyword kw">begin</span>
+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>
+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>)
+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>)
+50:           <span class="ruby-keyword kw">else</span>
+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>
+52:           <span class="ruby-keyword kw">end</span>
+53:         <span class="ruby-keyword kw">end</span>
+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>
+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>)
+56:       <span class="ruby-keyword kw">end</span>
+57: 
+58:       <span class="ruby-keyword kw">false</span>
+59:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000285" class="method-detail">
+        <a name="M000285"></a>
+
+        <div class="method-heading">
+          <a href="#M000285" class="method-signature">
+          <span class="method-name">has_fact?</span><span class="method-args">(fact, value, operator)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Compares fact == value,
+</p>
+<p>
+If the passed value starts with a / it&#8216;s assumed to be regex and will
+use regex to match
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000285-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000285-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 71</span>
+ 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>)
+ 72: 
+ 73:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Comparing #{fact} #{operator} #{value}&quot;</span>)
+ 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>)
+ 75: 
+ 76:       <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Facts</span>[<span class="ruby-identifier">fact</span>]
+ 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>
+ 78: 
+ 79:       <span class="ruby-identifier">fact</span> = <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">clone</span>
+ 80: 
+ 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>
+ 82:         <span class="ruby-comment cmt"># to maintain backward compat we send the value</span>
+ 83:         <span class="ruby-comment cmt"># as /.../ which is what 1.0.x needed.  this strips</span>
+ 84:         <span class="ruby-comment cmt"># off the /'s wich is what we need here</span>
+ 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>
+ 86:           <span class="ruby-identifier">value</span> = <span class="ruby-identifier">$1</span>
+ 87:         <span class="ruby-keyword kw">end</span>
+ 88: 
+ 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>))
+ 90: 
+ 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>
+ 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>
+ 93: 
+ 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>)
+ 95:         <span class="ruby-comment cmt"># Yuk - need to type cast, but to_i and to_f are overzealous</span>
+ 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>
+ 97:           <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">fact</span>)
+ 98:           <span class="ruby-identifier">value</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">value</span>)
+ 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>
+100:           <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">fact</span>)
+101:           <span class="ruby-identifier">value</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">value</span>)
+102:         <span class="ruby-keyword kw">end</span>
+103: 
+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>)
+105:       <span class="ruby-keyword kw">end</span>
+106: 
+107:       <span class="ruby-keyword kw">false</span>
+108:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000286" class="method-detail">
+        <a name="M000286"></a>
+
+        <div class="method-heading">
+          <a href="#M000286" class="method-signature">
+          <span class="method-name">has_identity?</span><span class="method-args">(identity)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Checks if the configured identity matches the one supplied
+</p>
+<p>
+If the passed name starts with a / it&#8216;s assumed to be regex and will
+use regex to match
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000286-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000286-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 114</span>
+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>)
+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>)
+116: 
+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>)
+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>)
+119:       <span class="ruby-keyword kw">else</span>
+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>
+121:       <span class="ruby-keyword kw">end</span>
+122: 
+123:       <span class="ruby-keyword kw">false</span>
+124:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000295" class="method-detail">
+        <a name="M000295"></a>
+
+        <div class="method-heading">
+          <a href="#M000295" class="method-signature">
+          <span class="method-name">loadclass</span><span class="method-args">(klass)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Wrapper around <a
+href="PluginManager.html#M000034">PluginManager.loadclass</a>
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000295-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000295-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 224</span>
+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>)
+225:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>)
+226:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000292" class="method-detail">
+        <a name="M000292"></a>
+
+        <div class="method-heading">
+          <a href="#M000292" class="method-signature">
+          <span class="method-name">make_subscriptions</span><span class="method-args">(agent, type, collective=nil)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000292-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000292-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 185</span>
+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>)
+186:       <span class="ruby-identifier">config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
+187: 
+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>)
+189: 
+190:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">collective</span>.<span class="ruby-identifier">nil?</span>
+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>
+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>}
+193:         <span class="ruby-keyword kw">end</span>
+194:       <span class="ruby-keyword kw">else</span>
+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>)
+196: 
+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>}]
+198:       <span class="ruby-keyword kw">end</span>
+199:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000302" class="method-detail">
+        <a name="M000302"></a>
+
+        <div class="method-heading">
+          <a href="#M000302" class="method-signature">
+          <span class="method-name">mcollective_version</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000302-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000302-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 298</span>
+298:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">mcollective_version</span>
+299:       <span class="ruby-constant">MCollective</span><span class="ruby-operator">::</span><span class="ruby-constant">VERSION</span>
+300:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000296" class="method-detail">
+        <a name="M000296"></a>
+
+        <div class="method-heading">
+          <a href="#M000296" class="method-signature">
+          <span class="method-name">parse_fact_string</span><span class="method-args">(fact)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Parse a fact filter string like foo=bar into the tuple hash thats needed
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000296-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000296-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 229</span>
+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>)
+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>
+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> }
+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>
+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> }
+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>
+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> }
+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>
+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> }
+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>
+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> }
+240:       <span class="ruby-keyword kw">else</span>
+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>
+242:       <span class="ruby-keyword kw">end</span>
+243:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000301" class="method-detail">
+        <a name="M000301"></a>
+
+        <div class="method-heading">
+          <a href="#M000301" class="method-signature">
+          <span class="method-name">ruby_version</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Returns the current ruby version as per RUBY_VERSION, mostly doing this
+here to aid testing
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000301-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000301-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 294</span>
+294:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">ruby_version</span>
+295:       <span class="ruby-constant">RUBY_VERSION</span>
+296:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000282" class="method-detail">
+        <a name="M000282"></a>
+
+        <div class="method-heading">
+          <a href="#M000282" class="method-signature">
+          <span class="method-name">setup_windows_sleeper</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+On windows ^c can&#8216;<a href="Util.html#M000309">t</a> interrupt the VM
+if its blocking on IO, so this sets up a dummy thread that sleeps and this
+will have the end result of being interruptable at least once a second.
+This is a common pattern found in Rails etc
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000282-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000282-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 30</span>
+30:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">setup_windows_sleeper</span>
+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>
+32:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000297" class="method-detail">
+        <a name="M000297"></a>
+
+        <div class="method-heading">
+          <a href="#M000297" class="method-signature">
+          <span class="method-name">shellescape</span><span class="method-args">(str)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Escapes a string so it&#8216;s safe to use in system() or backticks
+</p>
+<p>
+Taken from Shellwords#shellescape since it&#8216;s only in a few ruby
+versions
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000297-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000297-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 248</span>
+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>)
+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>
+250: 
+251:       <span class="ruby-identifier">str</span> = <span class="ruby-identifier">str</span>.<span class="ruby-identifier">dup</span>
+252: 
+253:       <span class="ruby-comment cmt"># Process as a single byte sequence because not all shell</span>
+254:       <span class="ruby-comment cmt"># implementations are multibyte aware.</span>
+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>)
+256: 
+257:       <span class="ruby-comment cmt"># A LF cannot be escaped with a backslash because a backslash + LF</span>
+258:       <span class="ruby-comment cmt"># combo is regarded as line continuation and simply ignored.</span>
+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>)
+260: 
+261:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">str</span>
+262:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000308" class="method-detail">
+        <a name="M000308"></a>
+
+        <div class="method-heading">
+          <a href="#M000308" class="method-signature">
+          <span class="method-name">str_to_bool</span><span class="method-args">(val)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Converts a string into a boolean value Strings matching 1,y,yes,true or <a
+href="Util.html#M000309">t</a> will return TrueClass Any other value will
+return FalseClass
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000308-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000308-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 477</span>
+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>)
+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>
+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>
+480:         <span class="ruby-keyword kw">return</span>  <span class="ruby-keyword kw">true</span>
+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>
+482:         <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+483:       <span class="ruby-keyword kw">else</span>
+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>)
+485:       <span class="ruby-keyword kw">end</span>
+486:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000293" class="method-detail">
+        <a name="M000293"></a>
+
+        <div class="method-heading">
+          <a href="#M000293" class="method-signature">
+          <span class="method-name">subscribe</span><span class="method-args">(targets)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Helper to <a href="Util.html#M000293">subscribe</a> to a topic on multiple
+collectives or just one
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000293-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000293-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 202</span>
+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>)
+203:       <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;connector_plugin&quot;</span>]
+204: 
+205:       <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
+206: 
+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>
+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>])
+209:       <span class="ruby-keyword kw">end</span>
+210:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000309" class="method-detail">
+        <a name="M000309"></a>
+
+        <div class="method-heading">
+          <a href="#M000309" class="method-signature">
+          <span class="method-name">t</span><span class="method-args">(msgid, args={})</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Looks up and interprolate the hash values into a i18n string
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000309-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000309-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 489</span>
+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>={})
+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>)
+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>)
+492:       <span class="ruby-keyword kw">else</span>
+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>)
+494:       <span class="ruby-keyword kw">end</span>
+495:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000310" class="method-detail">
+        <a name="M000310"></a>
+
+        <div class="method-heading">
+          <a href="#M000310" class="method-signature">
+          <span class="method-name">templatepath</span><span class="method-args">(template_file)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Looks up the template directory and returns its full path
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000310-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000310-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 498</span>
+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>)
+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>)
+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>)
+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>)
+502: 
+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>)
+504:       <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">template_path</span>
+505:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000304" class="method-detail">
+        <a name="M000304"></a>
+
+        <div class="method-heading">
+          <a href="#M000304" class="method-signature">
+          <span class="method-name">terminal_dimensions</span><span class="method-args">(stdout = STDOUT, environment = ENV)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Figures out the columns and lines of the current tty
+</p>
+<p>
+Returns [0, 0] if it can&#8216;<a href="Util.html#M000309">t</a> figure it
+out or if you&#8216;re not running on a tty
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000304-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000304-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 396</span>
+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>)
+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>
+398: 
+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>
+400: 
+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>]
+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>]
+403: 
+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>)
+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>]
+406: 
+407:       <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">command_in_path?</span>(<span class="ruby-value str">'stty'</span>)
+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> }
+409:       <span class="ruby-keyword kw">else</span>
+410:         <span class="ruby-keyword kw">return</span> [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
+411:       <span class="ruby-keyword kw">end</span>
+412:     <span class="ruby-keyword kw">rescue</span>
+413:       [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
+414:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000294" class="method-detail">
+        <a name="M000294"></a>
+
+        <div class="method-heading">
+          <a href="#M000294" class="method-signature">
+          <span class="method-name">unsubscribe</span><span class="method-args">(targets)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Helper to <a href="Util.html#M000294">unsubscribe</a> to a topic on
+multiple collectives or just one
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000294-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000294-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 213</span>
+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>)
+214:       <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">&quot;connector_plugin&quot;</span>]
+215: 
+216:       <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
+217: 
+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>
+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>])
+220:       <span class="ruby-keyword kw">end</span>
+221:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000306" class="method-detail">
+        <a name="M000306"></a>
+
+        <div class="method-heading">
+          <a href="#M000306" class="method-signature">
+          <span class="method-name">versioncmp</span><span class="method-args">(version_a, version_b)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+compare two software versions as commonly found in package versions.
+</p>
+<p>
+returns 0 if a == b returns -1 if a &lt; b returns 1 if a &gt; b
+</p>
+<p>
+Code originally from Puppet
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000306-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000306-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 433</span>
+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>)
+434:       <span class="ruby-identifier">vre</span> = <span class="ruby-regexp re">/[-.]|\d+|[^-.\d]+/</span>
+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>)
+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>)
+437: 
+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>)
+439:         <span class="ruby-identifier">a</span> = <span class="ruby-identifier">ax</span>.<span class="ruby-identifier">shift</span>
+440:         <span class="ruby-identifier">b</span> = <span class="ruby-identifier">bx</span>.<span class="ruby-identifier">shift</span>
+441: 
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+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>
+452:           <span class="ruby-keyword kw">end</span>
+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>
+454:         <span class="ruby-keyword kw">else</span>
+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>
+456:         <span class="ruby-keyword kw">end</span>
+457:       <span class="ruby-keyword kw">end</span>
+458: 
+459:       <span class="ruby-identifier">version_a</span> <span class="ruby-operator">&lt;=&gt;</span> <span class="ruby-identifier">version_b</span>;
+460:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000298" class="method-detail">
+        <a name="M000298"></a>
+
+        <div class="method-heading">
+          <a href="#M000298" class="method-signature">
+          <span class="method-name">windows?</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000298-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000298-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 264</span>
+264:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
+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>)
+266:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000289" class="method-detail">
+        <a name="M000289"></a>
+
+        <div class="method-heading">
+          <a href="#M000289" class="method-signature">
+          <span class="method-name">windows_prefix</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Returns the PuppetLabs mcollective path for windows
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000289-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000289-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 141</span>
+141:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows_prefix</span>
+142:       <span class="ruby-identifier">require</span> <span class="ruby-value str">'win32/dir'</span>
+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>)
+144:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+
+    </div>
+
+
+  </div>
+
+
+<div id="validator-badges">
+  <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
+</div>
+
+</body>
+</html>
\ No newline at end of file