--- /dev/null
+<?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>
+ <a href="#M000303">align_text</a>
+ <a href="#M000299">color</a>
+ <a href="#M000300">colorize</a>
+ <a href="#M000305">command_in_path?</a>
+ <a href="#M000290">config_file_for_user</a>
+ <a href="#M000291">default_options</a>
+ <a href="#M000288">empty_filter</a>
+ <a href="#M000287">empty_filter?</a>
+ <a href="#M000284">get_fact</a>
+ <a href="#M000281">has_agent?</a>
+ <a href="#M000283">has_cf_class?</a>
+ <a href="#M000285">has_fact?</a>
+ <a href="#M000286">has_identity?</a>
+ <a href="#M000295">loadclass</a>
+ <a href="#M000292">make_subscriptions</a>
+ <a href="#M000302">mcollective_version</a>
+ <a href="#M000296">parse_fact_string</a>
+ <a href="#M000301">ruby_version</a>
+ <a href="#M000282">setup_windows_sleeper</a>
+ <a href="#M000297">shellescape</a>
+ <a href="#M000308">str_to_bool</a>
+ <a href="#M000293">subscribe</a>
+ <a href="#M000309">t</a>
+ <a href="#M000310">templatepath</a>
+ <a href="#M000304">terminal_dimensions</a>
+ <a href="#M000294">unsubscribe</a>
+ <a href="#M000306">versioncmp</a>
+ <a href="#M000298">windows?</a>
+ <a href="#M000289">windows_prefix</a>
+ </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‘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"><=</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"><=</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">"\n"</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"><</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&&</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">""</span>
+341: <span class="ruby-identifier">line</span> = (<span class="ruby-value str">" "</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">>=</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">&&</span> <span class="ruby-identifier">line</span> <span class="ruby-operator">==</span> (<span class="ruby-value str">" "</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">""</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">"#{piece} "</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">></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">&&</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">"#{' ' * (whitespace)}#{piece}"</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">"\n"</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">></span> <span class="ruby-value str">"\e[31m"</span>,
+274: <span class="ruby-identifier">:green</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"\e[32m"</span>,
+275: <span class="ruby-identifier">:yellow</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"\e[33m"</span>,
+276: <span class="ruby-identifier">:cyan</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"\e[36m"</span>,
+277: <span class="ruby-identifier">:bold</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"\e[1m"</span>,
+278: <span class="ruby-identifier">:reset</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"\e[0m"</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">""</span>
+282: <span class="ruby-keyword kw">else</span>
+283: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">""</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">"%s%s%s"</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">"PATH"</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">"~/.mcollective"</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">&&</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">"etc"</span>, <span class="ruby-value str">"client.cfg"</span>)
+158: <span class="ruby-keyword kw">else</span>
+159: <span class="ruby-identifier">config</span> = <span class="ruby-value str">"/etc/mcollective/client.cfg"</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">></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">"etc"</span>, <span class="ruby-value str">"client.cfg"</span>)
+165: <span class="ruby-keyword kw">else</span>
+166: <span class="ruby-identifier">config</span> = <span class="ruby-value str">"/etc/mcollective/client.cfg"</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">></span> <span class="ruby-keyword kw">false</span>,
+176: <span class="ruby-identifier">:disctimeout</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
+177: <span class="ruby-identifier">:timeout</span> =<span class="ruby-operator">></span> <span class="ruby-value">5</span>,
+178: <span class="ruby-identifier">:config</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">config_file_for_user</span>,
+179: <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
+180: <span class="ruby-identifier">:discovery_method</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
+181: <span class="ruby-identifier">:discovery_options</span> =<span class="ruby-operator">></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">></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">"fact"</span> =<span class="ruby-operator">></span> [],
+134: <span class="ruby-value str">"cf_class"</span> =<span class="ruby-operator">></span> [],
+135: <span class="ruby-value str">"agent"</span> =<span class="ruby-operator">></span> [],
+136: <span class="ruby-value str">"identity"</span> =<span class="ruby-operator">></span> [],
+137: <span class="ruby-value str">"compound"</span> =<span class="ruby-operator">></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‘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">"\/"</span>, <span class="ruby-value str">""</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">"^/"</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">></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‘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">"\/"</span>, <span class="ruby-value str">""</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">"^/"</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">"Looking for configuration management classes in #{cfile}"</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">></span> <span class="ruby-identifier">e</span>
+55: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">warn</span>(<span class="ruby-node">"Parsing classes file '#{cfile}' failed: #{e.class}: #{e}"</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‘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">"Comparing #{fact} #{operator} #{value}"</span>)
+ 74: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"where :fact = '#{fact}', :operator = '#{operator}', :value = '#{value}'"</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">"=="</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">'<='</span>, <span class="ruby-value str">'>='</span>, <span class="ruby-value str">'<'</span>, <span class="ruby-value str">'>'</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">&&</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">&&</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">"fact #{operator} value"</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‘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">"\/"</span>, <span class="ruby-value str">""</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">"^/"</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">"Unknown target type #{type}"</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">></span> <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">type</span>, <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">></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">"Unknown collective '#{collective}' known collectives are '#{config.collectives.join ', '}'"</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">></span> <span class="ruby-identifier">agent</span>, <span class="ruby-identifier">:type</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">type</span>, <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">></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">/^([^ ]+?)[ ]*=>[ ]*(.+)/</span>
+231: <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'>='</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">/^([^ ]+?)[ ]*=<[ ]*(.+)/</span>
+233: <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">></span> <span class="ruby-value str">'<='</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">/^([^ ]+?)[ ]*(<=|>=|<|>|!=|==|=~)[ ]*(.+)/</span>
+235: <span class="ruby-keyword kw">return</span> {<span class="ruby-identifier">:fact</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$3</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">></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">></span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-node">"/#{$2}/"</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">></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">></span> <span class="ruby-identifier">$1</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">$2</span>, <span class="ruby-identifier">:operator</span> =<span class="ruby-operator">></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">"Could not parse fact #{fact} it does not appear to be in a valid format"</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‘<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‘s safe to use in system() or backticks
+</p>
+<p>
+Taken from Shellwords#shellescape since it‘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">"''"</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">"\\\\\\1"</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">"'\n'"</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">"Cannot convert string value '%{value}' into a boolean."</span>, <span class="ruby-identifier">:error</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">></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">"connector_plugin"</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">"%s.pattern"</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">"/etc/mcollective"</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‘<a href="Util.html#M000309">t</a> figure it
+out or if you‘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">"COLUMNS"</span>] <span class="ruby-operator">&&</span> <span class="ruby-identifier">environment</span>[<span class="ruby-value str">"LINES"</span>]
+402: <span class="ruby-keyword kw">return</span> [<span class="ruby-identifier">environment</span>[<span class="ruby-value str">"COLUMNS"</span>].<span class="ruby-identifier">to_i</span>, <span class="ruby-identifier">environment</span>[<span class="ruby-value str">"LINES"</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">"TERM"</span>] <span class="ruby-operator">&&</span> <span class="ruby-identifier">command_in_path?</span>(<span class="ruby-value str">"tput"</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">"connector_plugin"</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 < b returns 1 if a > 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">></span><span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">bx</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">></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">&&</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">&&</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">&&</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"><=></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"><=></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"><=></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"><=></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">"PuppetLabs"</span>, <span class="ruby-value str">"mcollective"</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