1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6 <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
8 <title>Module: MCollective::Util</title>
10 <link rel="stylesheet" href="../rdoc.css" type="text/css" media="screen" />
12 <script src="../js/jquery.js" type="text/javascript"
13 charset="utf-8"></script>
14 <script src="../js/thickbox-compressed.js" type="text/javascript"
15 charset="utf-8"></script>
16 <script src="../js/quicksearch.js" type="text/javascript"
17 charset="utf-8"></script>
18 <script src="../js/darkfish.js" type="text/javascript"
19 charset="utf-8"></script>
25 <div id="file-metadata">
26 <div id="file-list-section" class="section">
27 <h3 class="section-header">In Files</h3>
28 <div class="section-body">
31 <li><a href="../lib/mcollective/util_rb.html?TB_iframe=true&height=550&width=785"
32 class="thickbox" title="lib/mcollective/util.rb">lib/mcollective/util.rb</a></li>
41 <div id="class-metadata">
46 <!-- Namespace Contents -->
49 <!-- Method Quickref -->
51 <div id="method-list-section" class="section">
52 <h3 class="section-header">Methods</h3>
53 <ul class="link-list">
55 <li><a href="#M000328">::absolute_path?</a></li>
57 <li><a href="#M000317">::align_text</a></li>
59 <li><a href="#M000312">::color</a></li>
61 <li><a href="#M000314">::colorize</a></li>
63 <li><a href="#M000324">::command_in_path?</a></li>
65 <li><a href="#M000303">::config_file_for_user</a></li>
67 <li><a href="#M000304">::default_options</a></li>
69 <li><a href="#M000301">::empty_filter</a></li>
71 <li><a href="#M000300">::empty_filter?</a></li>
73 <li><a href="#M000297">::get_fact</a></li>
75 <li><a href="#M000293">::has_agent?</a></li>
77 <li><a href="#M000295">::has_cf_class?</a></li>
79 <li><a href="#M000298">::has_fact?</a></li>
81 <li><a href="#M000299">::has_identity?</a></li>
83 <li><a href="#M000308">::loadclass</a></li>
85 <li><a href="#M000305">::make_subscriptions</a></li>
87 <li><a href="#M000316">::mcollective_version</a></li>
89 <li><a href="#M000309">::parse_fact_string</a></li>
91 <li><a href="#M000315">::ruby_version</a></li>
93 <li><a href="#M000294">::setup_windows_sleeper</a></li>
95 <li><a href="#M000310">::shellescape</a></li>
97 <li><a href="#M000329">::str_to_bool</a></li>
99 <li><a href="#M000306">::subscribe</a></li>
101 <li><a href="#M000330">::t</a></li>
103 <li><a href="#M000331">::templatepath</a></li>
105 <li><a href="#M000322">::terminal_dimensions</a></li>
107 <li><a href="#M000307">::unsubscribe</a></li>
109 <li><a href="#M000325">::versioncmp</a></li>
111 <li><a href="#M000311">::windows?</a></li>
113 <li><a href="#M000302">::windows_prefix</a></li>
119 <!-- Included Modules -->
123 <div id="project-metadata">
126 <div id="fileindex-section" class="section project-section">
127 <h3 class="section-header">Files</h3>
130 <li class="file"><a href="../COPYING.html">COPYING</a></li>
132 <li class="file"><a href="../Gemfile.html">Gemfile</a></li>
134 <li class="file"><a href="../README.html">README</a></li>
136 <li class="file"><a href="../Rakefile.html">Rakefile</a></li>
138 <li class="file"><a href="../etc/client_cfg_dist.html">client.cfg.dist</a></li>
140 <li class="file"><a href="../etc/data-help_erb.html">data-help.erb</a></li>
142 <li class="file"><a href="../etc/discovery-help_erb.html">discovery-help.erb</a></li>
144 <li class="file"><a href="../etc/facts_yaml_dist.html">facts.yaml.dist</a></li>
146 <li class="file"><a href="../etc/metadata-help_erb.html">metadata-help.erb</a></li>
148 <li class="file"><a href="../etc/msg-help_erb.html">msg-help.erb</a></li>
150 <li class="file"><a href="../etc/rpc-help_erb.html">rpc-help.erb</a></li>
152 <li class="file"><a href="../etc/server_cfg_dist.html">server.cfg.dist</a></li>
154 <li class="file"><a href="../etc/ssl/PLACEHOLDER.html">PLACEHOLDER</a></li>
156 <li class="file"><a href="../etc/ssl/clients/PLACEHOLDER.html">PLACEHOLDER</a></li>
158 <li class="file"><a href="../lib/mcollective/generators/templates/action_snippet_erb.html">action_snippet.erb</a></li>
160 <li class="file"><a href="../lib/mcollective/generators/templates/data_input_snippet_erb.html">data_input_snippet.erb</a></li>
162 <li class="file"><a href="../lib/mcollective/generators/templates/ddl_erb.html">ddl.erb</a></li>
164 <li class="file"><a href="../lib/mcollective/generators/templates/plugin_erb.html">plugin.erb</a></li>
166 <li class="file"><a href="../lib/mcollective/locales/en_yml.html">en.yml</a></li>
168 <li class="file"><a href="../mcollective_init.html">mcollective.init</a></li>
174 <div id="classindex-section" class="section project-section">
175 <h3 class="section-header">Class Index
176 <span class="search-toggle"><img src="../images/find.png"
177 height="16" width="16" alt="[+]"
178 title="show/hide quicksearch" /></span></h3>
179 <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
181 <legend>Quicksearch</legend>
182 <input type="text" name="quicksearch" value=""
183 class="quicksearch-field" />
187 <ul class="link-list">
189 <li><a href="../MCollective.html">MCollective</a></li>
191 <li><a href="../MCollective/Agent.html">MCollective::Agent</a></li>
193 <li><a href="../MCollective/Agents.html">MCollective::Agents</a></li>
195 <li><a href="../MCollective/Aggregate.html">MCollective::Aggregate</a></li>
197 <li><a href="../MCollective/Aggregate/Base.html">MCollective::Aggregate::Base</a></li>
199 <li><a href="../MCollective/Aggregate/Result.html">MCollective::Aggregate::Result</a></li>
201 <li><a href="../MCollective/Aggregate/Result/Base.html">MCollective::Aggregate::Result::Base</a></li>
203 <li><a href="../MCollective/Aggregate/Result/CollectionResult.html">MCollective::Aggregate::Result::CollectionResult</a></li>
205 <li><a href="../MCollective/Aggregate/Result/NumericResult.html">MCollective::Aggregate::Result::NumericResult</a></li>
207 <li><a href="../MCollective/Application.html">MCollective::Application</a></li>
209 <li><a href="../MCollective/Applications.html">MCollective::Applications</a></li>
211 <li><a href="../MCollective/Cache.html">MCollective::Cache</a></li>
213 <li><a href="../MCollective/Client.html">MCollective::Client</a></li>
215 <li><a href="../MCollective/CodedError.html">MCollective::CodedError</a></li>
217 <li><a href="../MCollective/Config.html">MCollective::Config</a></li>
219 <li><a href="../MCollective/Connector.html">MCollective::Connector</a></li>
221 <li><a href="../MCollective/Connector/Base.html">MCollective::Connector::Base</a></li>
223 <li><a href="../MCollective/DDL.html">MCollective::DDL</a></li>
225 <li><a href="../MCollective/DDL/AgentDDL.html">MCollective::DDL::AgentDDL</a></li>
227 <li><a href="../MCollective/DDL/Base.html">MCollective::DDL::Base</a></li>
229 <li><a href="../MCollective/DDL/DataDDL.html">MCollective::DDL::DataDDL</a></li>
231 <li><a href="../MCollective/DDL/DiscoveryDDL.html">MCollective::DDL::DiscoveryDDL</a></li>
233 <li><a href="../MCollective/DDL/ValidatorDDL.html">MCollective::DDL::ValidatorDDL</a></li>
235 <li><a href="../MCollective/DDLValidationError.html">MCollective::DDLValidationError</a></li>
237 <li><a href="../MCollective/Data.html">MCollective::Data</a></li>
239 <li><a href="../MCollective/Data/Base.html">MCollective::Data::Base</a></li>
241 <li><a href="../MCollective/Data/Result.html">MCollective::Data::Result</a></li>
243 <li><a href="../MCollective/Discovery.html">MCollective::Discovery</a></li>
245 <li><a href="../MCollective/Facts.html">MCollective::Facts</a></li>
247 <li><a href="../MCollective/Facts/Base.html">MCollective::Facts::Base</a></li>
249 <li><a href="../MCollective/Generators.html">MCollective::Generators</a></li>
251 <li><a href="../MCollective/Generators/AgentGenerator.html">MCollective::Generators::AgentGenerator</a></li>
253 <li><a href="../MCollective/Generators/Base.html">MCollective::Generators::Base</a></li>
255 <li><a href="../MCollective/Generators/DataGenerator.html">MCollective::Generators::DataGenerator</a></li>
257 <li><a href="../MCollective/InvalidRPCData.html">MCollective::InvalidRPCData</a></li>
259 <li><a href="../MCollective/Log.html">MCollective::Log</a></li>
261 <li><a href="../MCollective/Logger.html">MCollective::Logger</a></li>
263 <li><a href="../MCollective/Logger/Base.html">MCollective::Logger::Base</a></li>
265 <li><a href="../MCollective/Logger/Console_logger.html">MCollective::Logger::Console_logger</a></li>
267 <li><a href="../MCollective/Logger/File_logger.html">MCollective::Logger::File_logger</a></li>
269 <li><a href="../MCollective/Logger/Syslog_logger.html">MCollective::Logger::Syslog_logger</a></li>
271 <li><a href="../MCollective/Matcher.html">MCollective::Matcher</a></li>
273 <li><a href="../MCollective/Matcher/Parser.html">MCollective::Matcher::Parser</a></li>
275 <li><a href="../MCollective/Matcher/Scanner.html">MCollective::Matcher::Scanner</a></li>
277 <li><a href="../MCollective/Message.html">MCollective::Message</a></li>
279 <li><a href="../MCollective/MissingRPCData.html">MCollective::MissingRPCData</a></li>
281 <li><a href="../MCollective/MsgDoesNotMatchRequestID.html">MCollective::MsgDoesNotMatchRequestID</a></li>
283 <li><a href="../MCollective/MsgTTLExpired.html">MCollective::MsgTTLExpired</a></li>
285 <li><a href="../MCollective/NotTargettedAtUs.html">MCollective::NotTargettedAtUs</a></li>
287 <li><a href="../MCollective/Optionparser.html">MCollective::Optionparser</a></li>
289 <li><a href="../MCollective/PluginManager.html">MCollective::PluginManager</a></li>
291 <li><a href="../MCollective/PluginPackager.html">MCollective::PluginPackager</a></li>
293 <li><a href="../MCollective/PluginPackager/AgentDefinition.html">MCollective::PluginPackager::AgentDefinition</a></li>
295 <li><a href="../MCollective/PluginPackager/StandardDefinition.html">MCollective::PluginPackager::StandardDefinition</a></li>
297 <li><a href="../MCollective/RPC.html">MCollective::RPC</a></li>
299 <li><a href="../MCollective/RPC/ActionRunner.html">MCollective::RPC::ActionRunner</a></li>
301 <li><a href="../MCollective/RPC/Agent.html">MCollective::RPC::Agent</a></li>
303 <li><a href="../MCollective/RPC/Audit.html">MCollective::RPC::Audit</a></li>
305 <li><a href="../MCollective/RPC/Client.html">MCollective::RPC::Client</a></li>
307 <li><a href="../MCollective/RPC/Helpers.html">MCollective::RPC::Helpers</a></li>
309 <li><a href="../MCollective/RPC/Progress.html">MCollective::RPC::Progress</a></li>
311 <li><a href="../MCollective/RPC/Reply.html">MCollective::RPC::Reply</a></li>
313 <li><a href="../MCollective/RPC/Request.html">MCollective::RPC::Request</a></li>
315 <li><a href="../MCollective/RPC/Result.html">MCollective::RPC::Result</a></li>
317 <li><a href="../MCollective/RPC/Stats.html">MCollective::RPC::Stats</a></li>
319 <li><a href="../MCollective/RPCAborted.html">MCollective::RPCAborted</a></li>
321 <li><a href="../MCollective/RPCError.html">MCollective::RPCError</a></li>
323 <li><a href="../MCollective/Registration.html">MCollective::Registration</a></li>
325 <li><a href="../MCollective/Registration/Base.html">MCollective::Registration::Base</a></li>
327 <li><a href="../MCollective/Runner.html">MCollective::Runner</a></li>
329 <li><a href="../MCollective/RunnerStats.html">MCollective::RunnerStats</a></li>
331 <li><a href="../MCollective/SSL.html">MCollective::SSL</a></li>
333 <li><a href="../MCollective/Security.html">MCollective::Security</a></li>
335 <li><a href="../MCollective/Security/Base.html">MCollective::Security::Base</a></li>
337 <li><a href="../MCollective/SecurityValidationFailed.html">MCollective::SecurityValidationFailed</a></li>
339 <li><a href="../MCollective/Shell.html">MCollective::Shell</a></li>
341 <li><a href="../MCollective/Translatable.html">MCollective::Translatable</a></li>
343 <li><a href="../MCollective/UnixDaemon.html">MCollective::UnixDaemon</a></li>
345 <li><a href="../MCollective/UnknownRPCAction.html">MCollective::UnknownRPCAction</a></li>
347 <li><a href="../MCollective/UnknownRPCError.html">MCollective::UnknownRPCError</a></li>
349 <li><a href="../MCollective/Util.html">MCollective::Util</a></li>
351 <li><a href="../MCollective/Validator.html">MCollective::Validator</a></li>
353 <li><a href="../MCollective/ValidatorError.html">MCollective::ValidatorError</a></li>
355 <li><a href="../MCollective/WindowsDaemon.html">MCollective::WindowsDaemon</a></li>
357 <li><a href="../Array.html">Array</a></li>
359 <li><a href="../Dir.html">Dir</a></li>
361 <li><a href="../Object.html">Object</a></li>
363 <li><a href="../String.html">String</a></li>
365 <li><a href="../Symbol.html">Symbol</a></li>
368 <div id="no-class-search-results" style="display: none;">No matching classes.</div>
375 <div id="documentation">
376 <h1 class="module">MCollective::Util</h1>
378 <div id="description">
380 Some basic utility helper methods useful to clients, agents, runner etc.
393 <div id="public-class-method-details" class="method-section section">
394 <h3 class="section-header">Public Class Methods</h3>
397 <div id="absolute-path--method" class="method-detail ">
398 <a name="M000328"></a>
400 <div class="method-heading">
402 <span class="method-name">absolute_path?</span><span
403 class="method-args">(path, separator=File::SEPARATOR, alt_separator=File::ALT_SEPARATOR)</span>
404 <span class="method-click-advice">click to toggle source</span>
408 <div class="method-description">
411 we should really use Pathname#absolute? but it’s not in all the ruby
412 versions we support and it comes down to roughly this
417 <div class="method-source-code"
418 id="absolute-path--source">
420 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 464</span>
421 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>)
422 465: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">alt_separator</span>
423 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>
424 467: <span class="ruby-keyword kw">else</span>
425 468: <span class="ruby-identifier">path_matcher</span> = <span class="ruby-node">/^#{Regexp.quote separator}/</span>
426 469: <span class="ruby-keyword kw">end</span>
428 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>)
429 472: <span class="ruby-keyword kw">end</span></pre>
438 <div id="align-text-method" class="method-detail ">
439 <a name="M000317"></a>
441 <div class="method-heading">
443 <span class="method-name">align_text</span><span
444 class="method-args">(text, console_cols = nil, preamble = 5)</span>
445 <span class="method-click-advice">click to toggle source</span>
449 <div class="method-description">
452 Returns an aligned_string of text relative to the size of the terminal
453 window. If a line in the string exceeds the width of the terminal window
454 the line will be chopped off at the whitespace chacter closest to the end
455 of the line and prepended to the next line, keeping all indentation.
458 The terminal size is detected by default, but custom line widths can
459 passed. All strings will also be left aligned with 5 whitespace characters
465 <div class="method-source-code"
466 id="align-text-source">
468 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 310</span>
469 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>)
470 311: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">console_cols</span>
471 312: <span class="ruby-identifier">console_cols</span> = <span class="ruby-identifier">terminal_dimensions</span>[<span class="ruby-value">0</span>]
473 314: <span class="ruby-comment cmt"># if unknown size we default to the typical unix default</span>
474 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>
475 316: <span class="ruby-keyword kw">end</span>
477 318: <span class="ruby-identifier">console_cols</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">preamble</span>
479 320: <span class="ruby-comment cmt"># Return unaligned text if console window is too small</span>
480 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>
482 323: <span class="ruby-comment cmt"># If console is 0 this implies unknown so we assume the common</span>
483 324: <span class="ruby-comment cmt"># minimal unix configuration of 80 characters</span>
484 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>
486 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>)
487 328: <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
488 329: <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
490 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>
491 332: <span class="ruby-identifier">whitespace</span> = <span class="ruby-value">0</span>
493 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>
494 335: <span class="ruby-identifier">whitespace</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
495 336: <span class="ruby-keyword kw">end</span>
497 338: <span class="ruby-comment cmt"># If the current line is empty, indent it so that a snippet</span>
498 339: <span class="ruby-comment cmt"># from the previous line is aligned correctly.</span>
499 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>
500 341: <span class="ruby-identifier">line</span> = (<span class="ruby-value str">" "</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">whitespace</span>)
501 342: <span class="ruby-keyword kw">end</span>
503 344: <span class="ruby-comment cmt"># If text was snipped from the previous line, prepend it to the</span>
504 345: <span class="ruby-comment cmt"># current line after any current indentation.</span>
505 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>
506 347: <span class="ruby-comment cmt"># Reset whitespaces to 0 if there are more whitespaces than there are</span>
507 348: <span class="ruby-comment cmt"># console columns</span>
508 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>
510 351: <span class="ruby-comment cmt"># If the current line is empty and being prepended to, create a new</span>
511 352: <span class="ruby-comment cmt"># empty line in the text so that formatting is preserved.</span>
512 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>)
513 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>)
514 355: <span class="ruby-keyword kw">end</span>
516 357: <span class="ruby-comment cmt"># Add the snipped text to the current line</span>
517 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>)
518 359: <span class="ruby-keyword kw">end</span>
520 361: <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
522 363: <span class="ruby-comment cmt"># Compare the line length to the allowed line length.</span>
523 364: <span class="ruby-comment cmt"># If it exceeds it, snip the offending text from the line</span>
524 365: <span class="ruby-comment cmt"># and store it so that it can be prepended to the next line.</span>
525 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>)
526 367: <span class="ruby-identifier">reverse</span> = <span class="ruby-identifier">console_cols</span>
528 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>
529 370: <span class="ruby-identifier">reverse</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
530 371: <span class="ruby-keyword kw">end</span>
532 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>
533 374: <span class="ruby-keyword kw">end</span>
535 376: <span class="ruby-comment cmt"># If a snippet exists when all the columns in the text have been</span>
536 377: <span class="ruby-comment cmt"># updated, create a new line and append the snippet to it, using</span>
537 378: <span class="ruby-comment cmt"># the same left alignment as the last line in the text.</span>
538 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>
539 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>
540 381: <span class="ruby-identifier">piece</span> = <span class="ruby-value str">''</span>
541 382: <span class="ruby-keyword kw">end</span>
543 384: <span class="ruby-comment cmt"># Add the preamble to the line and add it to the text</span>
544 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>)
545 386: <span class="ruby-identifier">text</span>[<span class="ruby-identifier">i</span>] = <span class="ruby-identifier">line</span>
546 387: <span class="ruby-keyword kw">end</span>
548 389: <span class="ruby-identifier">text</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">"\n"</span>)
549 390: <span class="ruby-keyword kw">end</span></pre>
558 <div id="color-method" class="method-detail ">
559 <a name="M000312"></a>
561 <div class="method-heading">
563 <span class="method-name">color</span><span
564 class="method-args">(code)</span>
565 <span class="method-click-advice">click to toggle source</span>
569 <div class="method-description">
572 Return color codes, if the config color= option is false just return a
578 <div class="method-source-code"
581 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 270</span>
582 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>)
583 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>
585 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>,
586 274: <span class="ruby-identifier">:green</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"
\e[32m"</span>,
587 275: <span class="ruby-identifier">:yellow</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"
\e[33m"</span>,
588 276: <span class="ruby-identifier">:cyan</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"
\e[36m"</span>,
589 277: <span class="ruby-identifier">:bold</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"
\e[1m"</span>,
590 278: <span class="ruby-identifier">:reset</span> =<span class="ruby-operator">></span> <span class="ruby-value str">"
\e[0m"</span>}
592 280: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">colorize</span>
593 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>
594 282: <span class="ruby-keyword kw">else</span>
595 283: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">""</span>
596 284: <span class="ruby-keyword kw">end</span>
597 285: <span class="ruby-keyword kw">end</span></pre>
606 <div id="colorize-method" class="method-detail ">
607 <a name="M000314"></a>
609 <div class="method-heading">
611 <span class="method-name">colorize</span><span
612 class="method-args">(code, msg)</span>
613 <span class="method-click-advice">click to toggle source</span>
617 <div class="method-description">
620 Helper to return a string in specific color
625 <div class="method-source-code"
626 id="colorize-source">
628 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 288</span>
629 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>)
630 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>) ]
631 290: <span class="ruby-keyword kw">end</span></pre>
640 <div id="command-in-path--method" class="method-detail ">
641 <a name="M000324"></a>
643 <div class="method-heading">
645 <span class="method-name">command_in_path?</span><span
646 class="method-args">(command)</span>
647 <span class="method-click-advice">click to toggle source</span>
651 <div class="method-description">
654 Checks in PATH returns true if the command is found
659 <div class="method-source-code"
660 id="command-in-path--source">
662 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 417</span>
663 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>)
664 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>
665 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>))
666 420: <span class="ruby-keyword kw">end</span>
668 422: <span class="ruby-identifier">found</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-keyword kw">true</span>)
669 423: <span class="ruby-keyword kw">end</span></pre>
678 <div id="config-file-for-user-method" class="method-detail ">
679 <a name="M000303"></a>
681 <div class="method-heading">
683 <span class="method-name">config_file_for_user</span><span
684 class="method-args">()</span>
685 <span class="method-click-advice">click to toggle source</span>
689 <div class="method-description">
692 Picks a config file defaults to ~/.mcollective else
693 /etc/mcollective/client.cfg
698 <div class="method-source-code"
699 id="config-file-for-user-source">
701 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 148</span>
702 148: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">config_file_for_user</span>
703 149: <span class="ruby-comment cmt"># expand_path is pretty lame, it relies on HOME environment</span>
704 150: <span class="ruby-comment cmt"># which isnt't always there so just handling all exceptions</span>
705 151: <span class="ruby-comment cmt"># here as cant find reverting to default</span>
706 152: <span class="ruby-keyword kw">begin</span>
707 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>)
709 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>)
710 156: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
711 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>)
712 158: <span class="ruby-keyword kw">else</span>
713 159: <span class="ruby-identifier">config</span> = <span class="ruby-value str">"/etc/mcollective/client.cfg"</span>
714 160: <span class="ruby-keyword kw">end</span>
715 161: <span class="ruby-keyword kw">end</span>
716 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>
717 163: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
718 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>)
719 165: <span class="ruby-keyword kw">else</span>
720 166: <span class="ruby-identifier">config</span> = <span class="ruby-value str">"/etc/mcollective/client.cfg"</span>
721 167: <span class="ruby-keyword kw">end</span>
722 168: <span class="ruby-keyword kw">end</span>
724 170: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">config</span>
725 171: <span class="ruby-keyword kw">end</span></pre>
734 <div id="default-options-method" class="method-detail ">
735 <a name="M000304"></a>
737 <div class="method-heading">
739 <span class="method-name">default_options</span><span
740 class="method-args">()</span>
741 <span class="method-click-advice">click to toggle source</span>
745 <div class="method-description">
748 Creates a standard options hash
753 <div class="method-source-code"
754 id="default-options-source">
756 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 174</span>
757 174: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">default_options</span>
758 175: {<span class="ruby-identifier">:verbose</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">false</span>,
759 176: <span class="ruby-identifier">:disctimeout</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
760 177: <span class="ruby-identifier">:timeout</span> =<span class="ruby-operator">></span> <span class="ruby-value">5</span>,
761 178: <span class="ruby-identifier">:config</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">config_file_for_user</span>,
762 179: <span class="ruby-identifier">:collective</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
763 180: <span class="ruby-identifier">:discovery_method</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>,
764 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>,
765 182: <span class="ruby-identifier">:filter</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">empty_filter</span>}
766 183: <span class="ruby-keyword kw">end</span></pre>
775 <div id="empty-filter-method" class="method-detail ">
776 <a name="M000301"></a>
778 <div class="method-heading">
780 <span class="method-name">empty_filter</span><span
781 class="method-args">()</span>
782 <span class="method-click-advice">click to toggle source</span>
786 <div class="method-description">
789 Creates an empty filter
794 <div class="method-source-code"
795 id="empty-filter-source">
797 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 132</span>
798 132: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">empty_filter</span>
799 133: {<span class="ruby-value str">"fact"</span> =<span class="ruby-operator">></span> [],
800 134: <span class="ruby-value str">"cf_class"</span> =<span class="ruby-operator">></span> [],
801 135: <span class="ruby-value str">"agent"</span> =<span class="ruby-operator">></span> [],
802 136: <span class="ruby-value str">"identity"</span> =<span class="ruby-operator">></span> [],
803 137: <span class="ruby-value str">"compound"</span> =<span class="ruby-operator">></span> []}
804 138: <span class="ruby-keyword kw">end</span></pre>
813 <div id="empty-filter--method" class="method-detail ">
814 <a name="M000300"></a>
816 <div class="method-heading">
818 <span class="method-name">empty_filter?</span><span
819 class="method-args">(filter)</span>
820 <span class="method-click-advice">click to toggle source</span>
824 <div class="method-description">
827 Checks if the passed in filter is an empty one
832 <div class="method-source-code"
833 id="empty-filter--source">
835 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 127</span>
836 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>)
837 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> {}
838 129: <span class="ruby-keyword kw">end</span></pre>
847 <div id="get-fact-method" class="method-detail ">
848 <a name="M000297"></a>
850 <div class="method-heading">
852 <span class="method-name">get_fact</span><span
853 class="method-args">(fact)</span>
854 <span class="method-click-advice">click to toggle source</span>
858 <div class="method-description">
861 Gets the value of a specific fact, mostly just a duplicate of <a
862 href="Facts.html#M000482">MCollective::Facts.get_fact</a> but it kind of
863 goes with the other classes here
868 <div class="method-source-code"
869 id="get-fact-source">
871 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 63</span>
872 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>)
873 64: <span class="ruby-constant">Facts</span>.<span class="ruby-identifier">get_fact</span>(<span class="ruby-identifier">fact</span>)
874 65: <span class="ruby-keyword kw">end</span></pre>
883 <div id="has-agent--method" class="method-detail ">
884 <a name="M000293"></a>
886 <div class="method-heading">
888 <span class="method-name">has_agent?</span><span
889 class="method-args">(agent)</span>
890 <span class="method-click-advice">click to toggle source</span>
894 <div class="method-description">
897 Finds out if this <a href="../MCollective.html">MCollective</a> has an
898 agent by the name passed
901 If the passed name starts with a / it’s assumed to be regex and will
907 <div class="method-source-code"
908 id="has-agent--source">
910 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 10</span>
911 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>)
912 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>)
914 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>)
915 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>
916 15: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
917 16: <span class="ruby-keyword kw">else</span>
918 17: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
919 18: <span class="ruby-keyword kw">end</span>
920 19: <span class="ruby-keyword kw">else</span>
921 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>)
922 21: <span class="ruby-keyword kw">end</span>
924 23: <span class="ruby-keyword kw">false</span>
925 24: <span class="ruby-keyword kw">end</span></pre>
934 <div id="has-cf-class--method" class="method-detail ">
935 <a name="M000295"></a>
937 <div class="method-heading">
939 <span class="method-name">has_cf_class?</span><span
940 class="method-args">(klass)</span>
941 <span class="method-click-advice">click to toggle source</span>
945 <div class="method-description">
948 Checks if this node has a configuration management class by parsing the a
949 text file with just a list of classes, recipes, roles etc. This is ala the
950 classes.txt from puppet.
953 If the passed name starts with a / it’s assumed to be regex and will
959 <div class="method-source-code"
960 id="has-cf-class--source">
962 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 40</span>
963 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>)
964 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>)
965 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>
967 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>)
969 46: <span class="ruby-keyword kw">begin</span>
970 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>
971 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>)
972 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>)
973 50: <span class="ruby-keyword kw">else</span>
974 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>
975 52: <span class="ruby-keyword kw">end</span>
976 53: <span class="ruby-keyword kw">end</span>
977 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>
978 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>)
979 56: <span class="ruby-keyword kw">end</span>
981 58: <span class="ruby-keyword kw">false</span>
982 59: <span class="ruby-keyword kw">end</span></pre>
991 <div id="has-fact--method" class="method-detail ">
992 <a name="M000298"></a>
994 <div class="method-heading">
996 <span class="method-name">has_fact?</span><span
997 class="method-args">(fact, value, operator)</span>
998 <span class="method-click-advice">click to toggle source</span>
1002 <div class="method-description">
1005 Compares fact == value,
1008 If the passed value starts with a / it’s assumed to be regex and will
1014 <div class="method-source-code"
1015 id="has-fact--source">
1017 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 71</span>
1018 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>)
1020 73: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Comparing #{fact} #{operator} #{value}"</span>)
1021 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>)
1023 76: <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Facts</span>[<span class="ruby-identifier">fact</span>]
1024 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>
1026 79: <span class="ruby-identifier">fact</span> = <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">clone</span>
1028 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>
1029 82: <span class="ruby-comment cmt"># to maintain backward compat we send the value</span>
1030 83: <span class="ruby-comment cmt"># as /.../ which is what 1.0.x needed. this strips</span>
1031 84: <span class="ruby-comment cmt"># off the /'s wich is what we need here</span>
1032 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>
1033 86: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">$1</span>
1034 87: <span class="ruby-keyword kw">end</span>
1036 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>))
1038 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>
1039 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>
1041 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>)
1042 95: <span class="ruby-comment cmt"># Yuk - need to type cast, but to_i and to_f are overzealous</span>
1043 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>
1044 97: <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">fact</span>)
1045 98: <span class="ruby-identifier">value</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">value</span>)
1046 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>
1047 100: <span class="ruby-identifier">fact</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">fact</span>)
1048 101: <span class="ruby-identifier">value</span> = <span class="ruby-constant">Float</span>(<span class="ruby-identifier">value</span>)
1049 102: <span class="ruby-keyword kw">end</span>
1051 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>)
1052 105: <span class="ruby-keyword kw">end</span>
1054 107: <span class="ruby-keyword kw">false</span>
1055 108: <span class="ruby-keyword kw">end</span></pre>
1064 <div id="has-identity--method" class="method-detail ">
1065 <a name="M000299"></a>
1067 <div class="method-heading">
1069 <span class="method-name">has_identity?</span><span
1070 class="method-args">(identity)</span>
1071 <span class="method-click-advice">click to toggle source</span>
1075 <div class="method-description">
1078 Checks if the configured identity matches the one supplied
1081 If the passed name starts with a / it’s assumed to be regex and will
1087 <div class="method-source-code"
1088 id="has-identity--source">
1090 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 114</span>
1091 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>)
1092 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>)
1094 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>)
1095 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>)
1096 119: <span class="ruby-keyword kw">else</span>
1097 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>
1098 121: <span class="ruby-keyword kw">end</span>
1100 123: <span class="ruby-keyword kw">false</span>
1101 124: <span class="ruby-keyword kw">end</span></pre>
1110 <div id="loadclass-method" class="method-detail ">
1111 <a name="M000308"></a>
1113 <div class="method-heading">
1115 <span class="method-name">loadclass</span><span
1116 class="method-args">(klass)</span>
1117 <span class="method-click-advice">click to toggle source</span>
1121 <div class="method-description">
1125 href="PluginManager.html#M000084">PluginManager.loadclass</a>
1130 <div class="method-source-code"
1131 id="loadclass-source">
1133 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 224</span>
1134 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>)
1135 225: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>)
1136 226: <span class="ruby-keyword kw">end</span></pre>
1145 <div id="make-subscriptions-method" class="method-detail ">
1146 <a name="M000305"></a>
1148 <div class="method-heading">
1150 <span class="method-name">make_subscriptions</span><span
1151 class="method-args">(agent, type, collective=nil)</span>
1152 <span class="method-click-advice">click to toggle source</span>
1156 <div class="method-description">
1158 <p class="missing-docs">(Not documented)</p>
1162 <div class="method-source-code"
1163 id="make-subscriptions-source">
1165 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 185</span>
1166 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>)
1167 186: <span class="ruby-identifier">config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
1169 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>)
1171 190: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">collective</span>.<span class="ruby-identifier">nil?</span>
1172 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>
1173 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>}
1174 193: <span class="ruby-keyword kw">end</span>
1175 194: <span class="ruby-keyword kw">else</span>
1176 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>)
1178 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>}]
1179 198: <span class="ruby-keyword kw">end</span>
1180 199: <span class="ruby-keyword kw">end</span></pre>
1189 <div id="mcollective-version-method" class="method-detail ">
1190 <a name="M000316"></a>
1192 <div class="method-heading">
1194 <span class="method-name">mcollective_version</span><span
1195 class="method-args">()</span>
1196 <span class="method-click-advice">click to toggle source</span>
1200 <div class="method-description">
1202 <p class="missing-docs">(Not documented)</p>
1206 <div class="method-source-code"
1207 id="mcollective-version-source">
1209 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 298</span>
1210 298: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">mcollective_version</span>
1211 299: <span class="ruby-constant">MCollective</span><span class="ruby-operator">::</span><span class="ruby-constant">VERSION</span>
1212 300: <span class="ruby-keyword kw">end</span></pre>
1221 <div id="parse-fact-string-method" class="method-detail ">
1222 <a name="M000309"></a>
1224 <div class="method-heading">
1226 <span class="method-name">parse_fact_string</span><span
1227 class="method-args">(fact)</span>
1228 <span class="method-click-advice">click to toggle source</span>
1232 <div class="method-description">
1235 Parse a fact filter string like foo=bar into the tuple hash thats needed
1240 <div class="method-source-code"
1241 id="parse-fact-string-source">
1243 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 229</span>
1244 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>)
1245 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>
1246 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> }
1247 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>
1248 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> }
1249 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>
1250 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> }
1251 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>
1252 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> }
1253 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>
1254 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> }
1255 240: <span class="ruby-keyword kw">else</span>
1256 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>
1257 242: <span class="ruby-keyword kw">end</span>
1258 243: <span class="ruby-keyword kw">end</span></pre>
1267 <div id="ruby-version-method" class="method-detail ">
1268 <a name="M000315"></a>
1270 <div class="method-heading">
1272 <span class="method-name">ruby_version</span><span
1273 class="method-args">()</span>
1274 <span class="method-click-advice">click to toggle source</span>
1278 <div class="method-description">
1281 Returns the current ruby version as per RUBY_VERSION, mostly doing this
1287 <div class="method-source-code"
1288 id="ruby-version-source">
1290 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 294</span>
1291 294: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">ruby_version</span>
1292 295: <span class="ruby-constant">RUBY_VERSION</span>
1293 296: <span class="ruby-keyword kw">end</span></pre>
1302 <div id="setup-windows-sleeper-method" class="method-detail ">
1303 <a name="M000294"></a>
1305 <div class="method-heading">
1307 <span class="method-name">setup_windows_sleeper</span><span
1308 class="method-args">()</span>
1309 <span class="method-click-advice">click to toggle source</span>
1313 <div class="method-description">
1316 On windows ^c can’t interrupt the VM if its blocking on IO, so this
1317 sets up a dummy thread that sleeps and this will have the end result of
1318 being interruptable at least once a second. This is a common pattern found
1324 <div class="method-source-code"
1325 id="setup-windows-sleeper-source">
1327 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 30</span>
1328 30: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">setup_windows_sleeper</span>
1329 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>
1330 32: <span class="ruby-keyword kw">end</span></pre>
1339 <div id="shellescape-method" class="method-detail ">
1340 <a name="M000310"></a>
1342 <div class="method-heading">
1344 <span class="method-name">shellescape</span><span
1345 class="method-args">(str)</span>
1346 <span class="method-click-advice">click to toggle source</span>
1350 <div class="method-description">
1353 Escapes a string so it’s safe to use in system() or backticks
1356 Taken from Shellwords#shellescape since it’s only in a few ruby
1362 <div class="method-source-code"
1363 id="shellescape-source">
1365 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 248</span>
1366 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>)
1367 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>
1369 251: <span class="ruby-identifier">str</span> = <span class="ruby-identifier">str</span>.<span class="ruby-identifier">dup</span>
1371 253: <span class="ruby-comment cmt"># Process as a single byte sequence because not all shell</span>
1372 254: <span class="ruby-comment cmt"># implementations are multibyte aware.</span>
1373 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>)
1375 257: <span class="ruby-comment cmt"># A LF cannot be escaped with a backslash because a backslash + LF</span>
1376 258: <span class="ruby-comment cmt"># combo is regarded as line continuation and simply ignored.</span>
1377 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>)
1379 261: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">str</span>
1380 262: <span class="ruby-keyword kw">end</span></pre>
1389 <div id="str-to-bool-method" class="method-detail ">
1390 <a name="M000329"></a>
1392 <div class="method-heading">
1394 <span class="method-name">str_to_bool</span><span
1395 class="method-args">(val)</span>
1396 <span class="method-click-advice">click to toggle source</span>
1400 <div class="method-description">
1403 Converts a string into a boolean value Strings matching 1,y,yes,true or t
1404 will return TrueClass Any other value will return FalseClass
1409 <div class="method-source-code"
1410 id="str-to-bool-source">
1412 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 477</span>
1413 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>)
1414 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>
1415 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>
1416 480: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
1417 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>
1418 482: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
1419 483: <span class="ruby-keyword kw">else</span>
1420 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>)
1421 485: <span class="ruby-keyword kw">end</span>
1422 486: <span class="ruby-keyword kw">end</span></pre>
1431 <div id="subscribe-method" class="method-detail ">
1432 <a name="M000306"></a>
1434 <div class="method-heading">
1436 <span class="method-name">subscribe</span><span
1437 class="method-args">(targets)</span>
1438 <span class="method-click-advice">click to toggle source</span>
1442 <div class="method-description">
1445 Helper to subscribe to a topic on multiple collectives or just one
1450 <div class="method-source-code"
1451 id="subscribe-source">
1453 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 202</span>
1454 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>)
1455 203: <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"connector_plugin"</span>]
1457 205: <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
1459 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>
1460 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>])
1461 209: <span class="ruby-keyword kw">end</span>
1462 210: <span class="ruby-keyword kw">end</span></pre>
1471 <div id="t-method" class="method-detail ">
1472 <a name="M000330"></a>
1474 <div class="method-heading">
1476 <span class="method-name">t</span><span
1477 class="method-args">(msgid, args={})</span>
1478 <span class="method-click-advice">click to toggle source</span>
1482 <div class="method-description">
1485 Looks up and interprolate the hash values into a i18n string
1490 <div class="method-source-code"
1493 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 489</span>
1494 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>={})
1495 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>)
1496 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>)
1497 492: <span class="ruby-keyword kw">else</span>
1498 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>)
1499 494: <span class="ruby-keyword kw">end</span>
1500 495: <span class="ruby-keyword kw">end</span></pre>
1509 <div id="templatepath-method" class="method-detail ">
1510 <a name="M000331"></a>
1512 <div class="method-heading">
1514 <span class="method-name">templatepath</span><span
1515 class="method-args">(template_file)</span>
1516 <span class="method-click-advice">click to toggle source</span>
1520 <div class="method-description">
1523 Looks up the template directory and returns its full path
1528 <div class="method-source-code"
1529 id="templatepath-source">
1531 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 498</span>
1532 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>)
1533 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>)
1534 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>)
1535 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>)
1537 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>)
1538 504: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">template_path</span>
1539 505: <span class="ruby-keyword kw">end</span></pre>
1548 <div id="terminal-dimensions-method" class="method-detail ">
1549 <a name="M000322"></a>
1551 <div class="method-heading">
1553 <span class="method-name">terminal_dimensions</span><span
1554 class="method-args">(stdout = STDOUT, environment = ENV)</span>
1555 <span class="method-click-advice">click to toggle source</span>
1559 <div class="method-description">
1562 Figures out the columns and lines of the current tty
1565 Returns [0, 0] if it can’t figure it out or if you’re not
1571 <div class="method-source-code"
1572 id="terminal-dimensions-source">
1574 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 396</span>
1575 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>)
1576 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>
1578 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>
1580 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>]
1581 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>]
1583 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>)
1584 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>]
1586 407: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">command_in_path?</span>(<span class="ruby-value str">'stty'</span>)
1587 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> }
1588 409: <span class="ruby-keyword kw">else</span>
1589 410: <span class="ruby-keyword kw">return</span> [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
1590 411: <span class="ruby-keyword kw">end</span>
1591 412: <span class="ruby-keyword kw">rescue</span>
1592 413: [<span class="ruby-value">0</span>, <span class="ruby-value">0</span>]
1593 414: <span class="ruby-keyword kw">end</span></pre>
1602 <div id="unsubscribe-method" class="method-detail ">
1603 <a name="M000307"></a>
1605 <div class="method-heading">
1607 <span class="method-name">unsubscribe</span><span
1608 class="method-args">(targets)</span>
1609 <span class="method-click-advice">click to toggle source</span>
1613 <div class="method-description">
1616 Helper to unsubscribe to a topic on multiple collectives or just one
1621 <div class="method-source-code"
1622 id="unsubscribe-source">
1624 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 213</span>
1625 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>)
1626 214: <span class="ruby-identifier">connection</span> = <span class="ruby-constant">PluginManager</span>[<span class="ruby-value str">"connector_plugin"</span>]
1628 216: <span class="ruby-identifier">targets</span> = [<span class="ruby-identifier">targets</span>].<span class="ruby-identifier">flatten</span>
1630 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>
1631 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>])
1632 220: <span class="ruby-keyword kw">end</span>
1633 221: <span class="ruby-keyword kw">end</span></pre>
1642 <div id="versioncmp-method" class="method-detail ">
1643 <a name="M000325"></a>
1645 <div class="method-heading">
1647 <span class="method-name">versioncmp</span><span
1648 class="method-args">(version_a, version_b)</span>
1649 <span class="method-click-advice">click to toggle source</span>
1653 <div class="method-description">
1656 compare two software versions as commonly found in package versions.
1659 returns 0 if a == b returns -1 if a < b returns 1 if a > b
1662 Code originally from Puppet
1667 <div class="method-source-code"
1668 id="versioncmp-source">
1670 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 433</span>
1671 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>)
1672 434: <span class="ruby-identifier">vre</span> = <span class="ruby-regexp re">/[-.]|\d+|[^-.\d]+/</span>
1673 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>)
1674 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>)
1676 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>)
1677 439: <span class="ruby-identifier">a</span> = <span class="ruby-identifier">ax</span>.<span class="ruby-identifier">shift</span>
1678 440: <span class="ruby-identifier">b</span> = <span class="ruby-identifier">bx</span>.<span class="ruby-identifier">shift</span>
1680 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>
1681 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>
1682 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>
1683 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>
1684 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>
1685 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>
1686 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>
1687 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>
1688 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>
1689 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>
1690 452: <span class="ruby-keyword kw">end</span>
1691 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>
1692 454: <span class="ruby-keyword kw">else</span>
1693 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>
1694 456: <span class="ruby-keyword kw">end</span>
1695 457: <span class="ruby-keyword kw">end</span>
1697 459: <span class="ruby-identifier">version_a</span> <span class="ruby-operator"><=></span> <span class="ruby-identifier">version_b</span>;
1698 460: <span class="ruby-keyword kw">end</span></pre>
1707 <div id="windows--method" class="method-detail ">
1708 <a name="M000311"></a>
1710 <div class="method-heading">
1712 <span class="method-name">windows?</span><span
1713 class="method-args">()</span>
1714 <span class="method-click-advice">click to toggle source</span>
1718 <div class="method-description">
1720 <p class="missing-docs">(Not documented)</p>
1724 <div class="method-source-code"
1725 id="windows--source">
1727 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 264</span>
1728 264: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows?</span>
1729 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>)
1730 266: <span class="ruby-keyword kw">end</span></pre>
1739 <div id="windows-prefix-method" class="method-detail ">
1740 <a name="M000302"></a>
1742 <div class="method-heading">
1744 <span class="method-name">windows_prefix</span><span
1745 class="method-args">()</span>
1746 <span class="method-click-advice">click to toggle source</span>
1750 <div class="method-description">
1753 Returns the PuppetLabs mcollective path for windows
1758 <div class="method-source-code"
1759 id="windows-prefix-source">
1761 <span class="ruby-comment cmt"># File lib/mcollective/util.rb, line 141</span>
1762 141: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">windows_prefix</span>
1763 142: <span class="ruby-identifier">require</span> <span class="ruby-value str">'win32/dir'</span>
1764 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>)
1765 144: <span class="ruby-keyword kw">end</span></pre>
1780 <div id="rdoc-debugging-section-dump" class="debugging-section">
1782 <p>Disabled; run with --debug to generate this.</p>
1786 <div id="validator-badges">
1787 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
1788 <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
1789 Rdoc Generator</a> 1.1.6</small>.</p>