Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Applications.html
diff --git a/doc/classes/MCollective/Applications.html b/doc/classes/MCollective/Applications.html
new file mode 100644 (file)
index 0000000..09f0299
--- /dev/null
@@ -0,0 +1,381 @@
+<?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>Class: MCollective::Applications</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>Class</strong></td>
+          <td class="class-name-in-header">MCollective::Applications</td>
+        </tr>
+        <tr class="top-aligned-row">
+            <td><strong>In:</strong></td>
+            <td>
+                <a href="../../files/lib/mcollective/applications_rb.html">
+                lib/mcollective/applications.rb
+                </a>
+        <br />
+            </td>
+        </tr>
+
+        <tr class="top-aligned-row">
+            <td><strong>Parent:</strong></td>
+            <td>
+                Object
+            </td>
+        </tr>
+        </table>
+    </div>
+  <!-- banner header -->
+
+  <div id="bodyContent">
+
+
+
+  <div id="contextContent">
+
+
+
+   </div>
+
+    <div id="method-list">
+      <h3 class="section-bar">Methods</h3>
+
+      <div class="name-list">
+      <a href="#M000425">[]</a>&nbsp;&nbsp;
+      <a href="#M000429">filter_extra_options</a>&nbsp;&nbsp;
+      <a href="#M000428">list</a>&nbsp;&nbsp;
+      <a href="#M000427">load_application</a>&nbsp;&nbsp;
+      <a href="#M000430">load_config</a>&nbsp;&nbsp;
+      <a href="#M000426">run</a>&nbsp;&nbsp;
+      </div>
+    </div>
+
+  </div>
+
+
+    <!-- if includes -->
+
+    <div id="section">
+
+
+
+
+
+      
+
+
+    <!-- if method_list -->
+    <div id="methods">
+      <h3 class="section-bar">Public Class methods</h3>
+
+      <div id="method-M000425" class="method-detail">
+        <a name="M000425"></a>
+
+        <div class="method-heading">
+          <a href="#M000425" class="method-signature">
+          <span class="method-name">[]</span><span class="method-args">(appname)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000425-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000425-source">
+<pre>
+   <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 3</span>
+3:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-operator">[]</span>(<span class="ruby-identifier">appname</span>)
+4:       <span class="ruby-identifier">load_application</span>(<span class="ruby-identifier">appname</span>)
+5:       <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">&quot;#{appname}_application&quot;</span>]
+6:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000429" class="method-detail">
+        <a name="M000429"></a>
+
+        <div class="method-heading">
+          <a href="#M000429" class="method-signature">
+          <span class="method-name">filter_extra_options</span><span class="method-args">(opts)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Filters a string of opts out using Shellwords keeping only things related
+to &#8212;config and -c
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000429-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000429-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 49</span>
+49:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">filter_extra_options</span>(<span class="ruby-identifier">opts</span>)
+50:       <span class="ruby-identifier">res</span> = <span class="ruby-value str">&quot;&quot;</span>
+51:       <span class="ruby-identifier">words</span> = <span class="ruby-constant">Shellwords</span>.<span class="ruby-identifier">shellwords</span>(<span class="ruby-identifier">opts</span>)
+52:       <span class="ruby-identifier">words</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">word</span>,<span class="ruby-identifier">idx</span><span class="ruby-operator">|</span>
+53:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">word</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;-c&quot;</span>
+54:           <span class="ruby-keyword kw">return</span> <span class="ruby-node">&quot;--config=#{words[idx + 1]}&quot;</span>
+55:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">word</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;--config&quot;</span>
+56:           <span class="ruby-keyword kw">return</span> <span class="ruby-node">&quot;--config=#{words[idx + 1]}&quot;</span>
+57:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">word</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/\-c=/</span>
+58:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">word</span>
+59:         <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">word</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/\-\-config=/</span>
+60:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">word</span>
+61:         <span class="ruby-keyword kw">end</span>
+62:       <span class="ruby-keyword kw">end</span>
+63: 
+64:       <span class="ruby-keyword kw">return</span> <span class="ruby-value str">&quot;&quot;</span>
+65:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000428" class="method-detail">
+        <a name="M000428"></a>
+
+        <div class="method-heading">
+          <a href="#M000428" class="method-signature">
+          <span class="method-name">list</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+Returns an array of applications found in the lib dirs
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000428-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000428-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 36</span>
+36:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">list</span>
+37:       <span class="ruby-identifier">load_config</span>
+38: 
+39:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">find</span>(<span class="ruby-value str">&quot;application&quot;</span>)
+40:     <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">SystemExit</span>
+41:       <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
+42:     <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
+43:       <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Failed to generate application list: #{e.class}: #{e}&quot;</span>
+44:       <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
+45:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000427" class="method-detail">
+        <a name="M000427"></a>
+
+        <div class="method-heading">
+          <a href="#M000427" class="method-signature">
+          <span class="method-name">load_application</span><span class="method-args">(appname)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000427-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000427-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 26</span>
+26:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">load_application</span>(<span class="ruby-identifier">appname</span>)
+27:       <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-node">&quot;#{appname}_application&quot;</span>)
+28: 
+29:       <span class="ruby-identifier">load_config</span>
+30: 
+31:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span> <span class="ruby-node">&quot;MCollective::Application::#{appname.capitalize}&quot;</span>
+32:       <span class="ruby-constant">PluginManager</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;#{appname}_application&quot;</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;MCollective::Application::#{appname.capitalize}&quot;</span>}
+33:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000430" class="method-detail">
+        <a name="M000430"></a>
+
+        <div class="method-heading">
+          <a href="#M000430" class="method-signature">
+          <span class="method-name">load_config</span><span class="method-args">()</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p>
+We need to know the config file in order to know the libdir so that we can
+find applications.
+</p>
+<p>
+The problem is the CLI might be stuffed with options only the app in the
+libdir might understand so we have a chicken and egg situation.
+</p>
+<p>
+We&#8216;re parsing and filtering MCOLLECTIVE_EXTRA_OPTS removing all but
+config related options and parsing the options looking just for the config
+file.
+</p>
+<p>
+We&#8216;re handling failures gracefully and finally restoring the ARG and
+MCOLLECTIVE_EXTRA_OPTS to the state they were before we started parsing.
+</p>
+<p>
+This is mostly a hack, when we&#8216;re redoing how config works this stuff
+should be made less sucky
+</p>
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000430-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000430-source">
+<pre>
+     <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 84</span>
+ 84:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">load_config</span>
+ 85:       <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">configured</span>
+ 86: 
+ 87:       <span class="ruby-identifier">original_argv</span> = <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">clone</span>
+ 88:       <span class="ruby-identifier">original_extra_opts</span> = <span class="ruby-constant">ENV</span>[<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>].<span class="ruby-identifier">clone</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
+ 89:       <span class="ruby-identifier">configfile</span> = <span class="ruby-keyword kw">nil</span>
+ 90: 
+ 91:       <span class="ruby-identifier">parser</span> = <span class="ruby-constant">OptionParser</span>.<span class="ruby-identifier">new</span>
+ 92:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">&quot;--config CONFIG&quot;</span>, <span class="ruby-value str">&quot;-c&quot;</span>, <span class="ruby-value str">&quot;Config file&quot;</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span>
+ 93:         <span class="ruby-identifier">configfile</span> = <span class="ruby-identifier">f</span>
+ 94:       <span class="ruby-keyword kw">end</span>
+ 95: 
+ 96:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">program_name</span> = <span class="ruby-identifier">$0</span>
+ 97: 
+ 98:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">&quot;--help&quot;</span>)
+ 99: 
+100:       <span class="ruby-comment cmt"># avoid option parsers own internal version handling that sux</span>
+101:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">&quot;-v&quot;</span>, <span class="ruby-value str">&quot;--verbose&quot;</span>)
+102: 
+103:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">original_extra_opts</span>
+104:         <span class="ruby-keyword kw">begin</span>
+105:           <span class="ruby-comment cmt"># optparse will parse the whole ENV in one go and refuse</span>
+106:           <span class="ruby-comment cmt"># to play along with the retry trick I do below so in</span>
+107:           <span class="ruby-comment cmt"># order to handle unknown options properly I parse out</span>
+108:           <span class="ruby-comment cmt"># only -c and --config deleting everything else and</span>
+109:           <span class="ruby-comment cmt"># then restore the environment variable later when I</span>
+110:           <span class="ruby-comment cmt"># am done with it</span>
+111:           <span class="ruby-constant">ENV</span>[<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>] = <span class="ruby-identifier">filter_extra_options</span>(<span class="ruby-constant">ENV</span>[<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>].<span class="ruby-identifier">clone</span>)
+112:           <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">environment</span>(<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>)
+113:         <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
+114:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Failed to parse MCOLLECTIVE_EXTRA_OPTS: #{e}&quot;</span>)
+115:         <span class="ruby-keyword kw">end</span>
+116: 
+117:         <span class="ruby-constant">ENV</span>[<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>] = <span class="ruby-identifier">original_extra_opts</span>.<span class="ruby-identifier">clone</span>
+118:       <span class="ruby-keyword kw">end</span>
+119: 
+120:       <span class="ruby-keyword kw">begin</span>
+121:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">parse!</span>
+122:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">OptionParser</span><span class="ruby-operator">::</span><span class="ruby-constant">InvalidOption</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
+123:         <span class="ruby-keyword kw">retry</span>
+124:       <span class="ruby-keyword kw">end</span>
+125: 
+126:       <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">clear</span>
+127:       <span class="ruby-identifier">original_argv</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-constant">ARGV</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">a</span>}
+128: 
+129:       <span class="ruby-identifier">configfile</span> = <span class="ruby-constant">Util</span>.<span class="ruby-identifier">config_file_for_user</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">configfile</span>
+130: 
+131:       <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">loadconfig</span>(<span class="ruby-identifier">configfile</span>)
+132:     <span class="ruby-keyword kw">end</span>
+</pre>
+          </div>
+        </div>
+      </div>
+
+      <div id="method-M000426" class="method-detail">
+        <a name="M000426"></a>
+
+        <div class="method-heading">
+          <a href="#M000426" class="method-signature">
+          <span class="method-name">run</span><span class="method-args">(appname)</span>
+          </a>
+        </div>
+      
+        <div class="method-description">
+          <p><a class="source-toggle" href="#"
+            onclick="toggleCode('M000426-source');return false;">[Source]</a></p>
+          <div class="method-source-code" id="M000426-source">
+<pre>
+    <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 8</span>
+ 8:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">run</span>(<span class="ruby-identifier">appname</span>)
+ 9:       <span class="ruby-identifier">load_config</span>
+10: 
+11:       <span class="ruby-keyword kw">begin</span>
+12:         <span class="ruby-identifier">load_application</span>(<span class="ruby-identifier">appname</span>)
+13:       <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
+14:         <span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">first</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-value str">&quot;  &lt;----&quot;</span>)
+15:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Application '#{appname}' failed to load:&quot;</span>
+16:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>
+17:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-node">&quot;   #{e} (#{e.class})&quot;</span>)
+18:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>
+19:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">&quot;       %s&quot;</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n       &quot;</span>)]
+20:         <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
+21:       <span class="ruby-keyword kw">end</span>
+22: 
+23:       <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">&quot;#{appname}_application&quot;</span>].<span class="ruby-identifier">run</span>
+24:     <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