Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Applications.html
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE html 
3      PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8   <title>Class: MCollective::Applications</title>
9   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10   <meta http-equiv="Content-Script-Type" content="text/javascript" />
11   <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12   <script type="text/javascript">
13   // <![CDATA[
14
15   function popupCode( url ) {
16     window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17   }
18
19   function toggleCode( id ) {
20     if ( document.getElementById )
21       elem = document.getElementById( id );
22     else if ( document.all )
23       elem = eval( "document.all." + id );
24     else
25       return false;
26
27     elemStyle = elem.style;
28     
29     if ( elemStyle.display != "block" ) {
30       elemStyle.display = "block"
31     } else {
32       elemStyle.display = "none"
33     }
34
35     return true;
36   }
37   
38   // Make codeblocks hidden by default
39   document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40   
41   // ]]>
42   </script>
43
44 </head>
45 <body>
46
47
48
49     <div id="classHeader">
50         <table class="header-table">
51         <tr class="top-aligned-row">
52           <td><strong>Class</strong></td>
53           <td class="class-name-in-header">MCollective::Applications</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../files/lib/mcollective/applications_rb.html">
59                 lib/mcollective/applications.rb
60                 </a>
61         <br />
62             </td>
63         </tr>
64
65         <tr class="top-aligned-row">
66             <td><strong>Parent:</strong></td>
67             <td>
68                 Object
69             </td>
70         </tr>
71         </table>
72     </div>
73   <!-- banner header -->
74
75   <div id="bodyContent">
76
77
78
79   <div id="contextContent">
80
81
82
83    </div>
84
85     <div id="method-list">
86       <h3 class="section-bar">Methods</h3>
87
88       <div class="name-list">
89       <a href="#M000425">[]</a>&nbsp;&nbsp;
90       <a href="#M000429">filter_extra_options</a>&nbsp;&nbsp;
91       <a href="#M000428">list</a>&nbsp;&nbsp;
92       <a href="#M000427">load_application</a>&nbsp;&nbsp;
93       <a href="#M000430">load_config</a>&nbsp;&nbsp;
94       <a href="#M000426">run</a>&nbsp;&nbsp;
95       </div>
96     </div>
97
98   </div>
99
100
101     <!-- if includes -->
102
103     <div id="section">
104
105
106
107
108
109       
110
111
112     <!-- if method_list -->
113     <div id="methods">
114       <h3 class="section-bar">Public Class methods</h3>
115
116       <div id="method-M000425" class="method-detail">
117         <a name="M000425"></a>
118
119         <div class="method-heading">
120           <a href="#M000425" class="method-signature">
121           <span class="method-name">[]</span><span class="method-args">(appname)</span>
122           </a>
123         </div>
124       
125         <div class="method-description">
126           <p><a class="source-toggle" href="#"
127             onclick="toggleCode('M000425-source');return false;">[Source]</a></p>
128           <div class="method-source-code" id="M000425-source">
129 <pre>
130    <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 3</span>
131 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>)
132 4:       <span class="ruby-identifier">load_application</span>(<span class="ruby-identifier">appname</span>)
133 5:       <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">&quot;#{appname}_application&quot;</span>]
134 6:     <span class="ruby-keyword kw">end</span>
135 </pre>
136           </div>
137         </div>
138       </div>
139
140       <div id="method-M000429" class="method-detail">
141         <a name="M000429"></a>
142
143         <div class="method-heading">
144           <a href="#M000429" class="method-signature">
145           <span class="method-name">filter_extra_options</span><span class="method-args">(opts)</span>
146           </a>
147         </div>
148       
149         <div class="method-description">
150           <p>
151 Filters a string of opts out using Shellwords keeping only things related
152 to &#8212;config and -c
153 </p>
154           <p><a class="source-toggle" href="#"
155             onclick="toggleCode('M000429-source');return false;">[Source]</a></p>
156           <div class="method-source-code" id="M000429-source">
157 <pre>
158     <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 49</span>
159 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>)
160 50:       <span class="ruby-identifier">res</span> = <span class="ruby-value str">&quot;&quot;</span>
161 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>)
162 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>
163 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>
164 54:           <span class="ruby-keyword kw">return</span> <span class="ruby-node">&quot;--config=#{words[idx + 1]}&quot;</span>
165 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>
166 56:           <span class="ruby-keyword kw">return</span> <span class="ruby-node">&quot;--config=#{words[idx + 1]}&quot;</span>
167 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>
168 58:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">word</span>
169 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>
170 60:           <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">word</span>
171 61:         <span class="ruby-keyword kw">end</span>
172 62:       <span class="ruby-keyword kw">end</span>
173 63: 
174 64:       <span class="ruby-keyword kw">return</span> <span class="ruby-value str">&quot;&quot;</span>
175 65:     <span class="ruby-keyword kw">end</span>
176 </pre>
177           </div>
178         </div>
179       </div>
180
181       <div id="method-M000428" class="method-detail">
182         <a name="M000428"></a>
183
184         <div class="method-heading">
185           <a href="#M000428" class="method-signature">
186           <span class="method-name">list</span><span class="method-args">()</span>
187           </a>
188         </div>
189       
190         <div class="method-description">
191           <p>
192 Returns an array of applications found in the lib dirs
193 </p>
194           <p><a class="source-toggle" href="#"
195             onclick="toggleCode('M000428-source');return false;">[Source]</a></p>
196           <div class="method-source-code" id="M000428-source">
197 <pre>
198     <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 36</span>
199 36:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">list</span>
200 37:       <span class="ruby-identifier">load_config</span>
201 38: 
202 39:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">find</span>(<span class="ruby-value str">&quot;application&quot;</span>)
203 40:     <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">SystemExit</span>
204 41:       <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
205 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>
206 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>
207 44:       <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
208 45:     <span class="ruby-keyword kw">end</span>
209 </pre>
210           </div>
211         </div>
212       </div>
213
214       <div id="method-M000427" class="method-detail">
215         <a name="M000427"></a>
216
217         <div class="method-heading">
218           <a href="#M000427" class="method-signature">
219           <span class="method-name">load_application</span><span class="method-args">(appname)</span>
220           </a>
221         </div>
222       
223         <div class="method-description">
224           <p><a class="source-toggle" href="#"
225             onclick="toggleCode('M000427-source');return false;">[Source]</a></p>
226           <div class="method-source-code" id="M000427-source">
227 <pre>
228     <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 26</span>
229 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>)
230 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>)
231 28: 
232 29:       <span class="ruby-identifier">load_config</span>
233 30: 
234 31:       <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span> <span class="ruby-node">&quot;MCollective::Application::#{appname.capitalize}&quot;</span>
235 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>}
236 33:     <span class="ruby-keyword kw">end</span>
237 </pre>
238           </div>
239         </div>
240       </div>
241
242       <div id="method-M000430" class="method-detail">
243         <a name="M000430"></a>
244
245         <div class="method-heading">
246           <a href="#M000430" class="method-signature">
247           <span class="method-name">load_config</span><span class="method-args">()</span>
248           </a>
249         </div>
250       
251         <div class="method-description">
252           <p>
253 We need to know the config file in order to know the libdir so that we can
254 find applications.
255 </p>
256 <p>
257 The problem is the CLI might be stuffed with options only the app in the
258 libdir might understand so we have a chicken and egg situation.
259 </p>
260 <p>
261 We&#8216;re parsing and filtering MCOLLECTIVE_EXTRA_OPTS removing all but
262 config related options and parsing the options looking just for the config
263 file.
264 </p>
265 <p>
266 We&#8216;re handling failures gracefully and finally restoring the ARG and
267 MCOLLECTIVE_EXTRA_OPTS to the state they were before we started parsing.
268 </p>
269 <p>
270 This is mostly a hack, when we&#8216;re redoing how config works this stuff
271 should be made less sucky
272 </p>
273           <p><a class="source-toggle" href="#"
274             onclick="toggleCode('M000430-source');return false;">[Source]</a></p>
275           <div class="method-source-code" id="M000430-source">
276 <pre>
277      <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 84</span>
278  84:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">load_config</span>
279  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>
280  86: 
281  87:       <span class="ruby-identifier">original_argv</span> = <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">clone</span>
282  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>
283  89:       <span class="ruby-identifier">configfile</span> = <span class="ruby-keyword kw">nil</span>
284  90: 
285  91:       <span class="ruby-identifier">parser</span> = <span class="ruby-constant">OptionParser</span>.<span class="ruby-identifier">new</span>
286  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>
287  93:         <span class="ruby-identifier">configfile</span> = <span class="ruby-identifier">f</span>
288  94:       <span class="ruby-keyword kw">end</span>
289  95: 
290  96:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">program_name</span> = <span class="ruby-identifier">$0</span>
291  97: 
292  98:       <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">&quot;--help&quot;</span>)
293  99: 
294 100:       <span class="ruby-comment cmt"># avoid option parsers own internal version handling that sux</span>
295 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>)
296 102: 
297 103:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">original_extra_opts</span>
298 104:         <span class="ruby-keyword kw">begin</span>
299 105:           <span class="ruby-comment cmt"># optparse will parse the whole ENV in one go and refuse</span>
300 106:           <span class="ruby-comment cmt"># to play along with the retry trick I do below so in</span>
301 107:           <span class="ruby-comment cmt"># order to handle unknown options properly I parse out</span>
302 108:           <span class="ruby-comment cmt"># only -c and --config deleting everything else and</span>
303 109:           <span class="ruby-comment cmt"># then restore the environment variable later when I</span>
304 110:           <span class="ruby-comment cmt"># am done with it</span>
305 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>)
306 112:           <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">environment</span>(<span class="ruby-value str">&quot;MCOLLECTIVE_EXTRA_OPTS&quot;</span>)
307 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>
308 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>)
309 115:         <span class="ruby-keyword kw">end</span>
310 116: 
311 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>
312 118:       <span class="ruby-keyword kw">end</span>
313 119: 
314 120:       <span class="ruby-keyword kw">begin</span>
315 121:         <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">parse!</span>
316 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>
317 123:         <span class="ruby-keyword kw">retry</span>
318 124:       <span class="ruby-keyword kw">end</span>
319 125: 
320 126:       <span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">clear</span>
321 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>}
322 128: 
323 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>
324 130: 
325 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>)
326 132:     <span class="ruby-keyword kw">end</span>
327 </pre>
328           </div>
329         </div>
330       </div>
331
332       <div id="method-M000426" class="method-detail">
333         <a name="M000426"></a>
334
335         <div class="method-heading">
336           <a href="#M000426" class="method-signature">
337           <span class="method-name">run</span><span class="method-args">(appname)</span>
338           </a>
339         </div>
340       
341         <div class="method-description">
342           <p><a class="source-toggle" href="#"
343             onclick="toggleCode('M000426-source');return false;">[Source]</a></p>
344           <div class="method-source-code" id="M000426-source">
345 <pre>
346     <span class="ruby-comment cmt"># File lib/mcollective/applications.rb, line 8</span>
347  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>)
348  9:       <span class="ruby-identifier">load_config</span>
349 10: 
350 11:       <span class="ruby-keyword kw">begin</span>
351 12:         <span class="ruby-identifier">load_application</span>(<span class="ruby-identifier">appname</span>)
352 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>
353 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>)
354 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>
355 16:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>
356 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>)
357 18:         <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>
358 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>)]
359 20:         <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
360 21:       <span class="ruby-keyword kw">end</span>
361 22: 
362 23:       <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">&quot;#{appname}_application&quot;</span>].<span class="ruby-identifier">run</span>
363 24:     <span class="ruby-keyword kw">end</span>
364 </pre>
365           </div>
366         </div>
367       </div>
368
369
370     </div>
371
372
373   </div>
374
375
376 <div id="validator-badges">
377   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
378 </div>
379
380 </body>
381 </html>