1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
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">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
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>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/applications_rb.html">
59 lib/mcollective/applications.rb
65 <tr class="top-aligned-row">
66 <td><strong>Parent:</strong></td>
73 <!-- banner header -->
75 <div id="bodyContent">
79 <div id="contextContent">
85 <div id="method-list">
86 <h3 class="section-bar">Methods</h3>
88 <div class="name-list">
89 <a href="#M000425">[]</a>
90 <a href="#M000429">filter_extra_options</a>
91 <a href="#M000428">list</a>
92 <a href="#M000427">load_application</a>
93 <a href="#M000430">load_config</a>
94 <a href="#M000426">run</a>
112 <!-- if method_list -->
114 <h3 class="section-bar">Public Class methods</h3>
116 <div id="method-M000425" class="method-detail">
117 <a name="M000425"></a>
119 <div class="method-heading">
120 <a href="#M000425" class="method-signature">
121 <span class="method-name">[]</span><span class="method-args">(appname)</span>
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">
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">"#{appname}_application"</span>]
134 6: <span class="ruby-keyword kw">end</span>
140 <div id="method-M000429" class="method-detail">
141 <a name="M000429"></a>
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>
149 <div class="method-description">
151 Filters a string of opts out using Shellwords keeping only things related
152 to —config and -c
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">
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">""</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">"-c"</span>
164 54: <span class="ruby-keyword kw">return</span> <span class="ruby-node">"--config=#{words[idx + 1]}"</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">"--config"</span>
166 56: <span class="ruby-keyword kw">return</span> <span class="ruby-node">"--config=#{words[idx + 1]}"</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>
174 64: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">""</span>
175 65: <span class="ruby-keyword kw">end</span>
181 <div id="method-M000428" class="method-detail">
182 <a name="M000428"></a>
184 <div class="method-heading">
185 <a href="#M000428" class="method-signature">
186 <span class="method-name">list</span><span class="method-args">()</span>
190 <div class="method-description">
192 Returns an array of applications found in the lib dirs
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">
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>
202 39: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">find</span>(<span class="ruby-value str">"application"</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">></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">"Failed to generate application list: #{e.class}: #{e}"</span>
207 44: <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
208 45: <span class="ruby-keyword kw">end</span>
214 <div id="method-M000427" class="method-detail">
215 <a name="M000427"></a>
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>
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">
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">"#{appname}_application"</span>)
232 29: <span class="ruby-identifier">load_config</span>
234 31: <span class="ruby-constant">PluginManager</span>.<span class="ruby-identifier">loadclass</span> <span class="ruby-node">"MCollective::Application::#{appname.capitalize}"</span>
235 32: <span class="ruby-constant">PluginManager</span> <span class="ruby-operator"><<</span> {<span class="ruby-identifier">:type</span> =<span class="ruby-operator">></span> <span class="ruby-node">"#{appname}_application"</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">></span> <span class="ruby-node">"MCollective::Application::#{appname.capitalize}"</span>}
236 33: <span class="ruby-keyword kw">end</span>
242 <div id="method-M000430" class="method-detail">
243 <a name="M000430"></a>
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>
251 <div class="method-description">
253 We need to know the config file in order to know the libdir so that we can
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.
261 We‘re parsing and filtering MCOLLECTIVE_EXTRA_OPTS removing all but
262 config related options and parsing the options looking just for the config
266 We‘re handling failures gracefully and finally restoring the ARG and
267 MCOLLECTIVE_EXTRA_OPTS to the state they were before we started parsing.
270 This is mostly a hack, when we‘re redoing how config works this stuff
271 should be made less sucky
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">
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>
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">"MCOLLECTIVE_EXTRA_OPTS"</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>
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">"--config CONFIG"</span>, <span class="ruby-value str">"-c"</span>, <span class="ruby-value str">"Config file"</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>
290 96: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">program_name</span> = <span class="ruby-identifier">$0</span>
292 98: <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">on</span>(<span class="ruby-value str">"--help"</span>)
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">"-v"</span>, <span class="ruby-value str">"--verbose"</span>)
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">"MCOLLECTIVE_EXTRA_OPTS"</span>] = <span class="ruby-identifier">filter_extra_options</span>(<span class="ruby-constant">ENV</span>[<span class="ruby-value str">"MCOLLECTIVE_EXTRA_OPTS"</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">"MCOLLECTIVE_EXTRA_OPTS"</span>)
307 113: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></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">"Failed to parse MCOLLECTIVE_EXTRA_OPTS: #{e}"</span>)
309 115: <span class="ruby-keyword kw">end</span>
311 117: <span class="ruby-constant">ENV</span>[<span class="ruby-value str">"MCOLLECTIVE_EXTRA_OPTS"</span>] = <span class="ruby-identifier">original_extra_opts</span>.<span class="ruby-identifier">clone</span>
312 118: <span class="ruby-keyword kw">end</span>
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">></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>
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"><<</span> <span class="ruby-identifier">a</span>}
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>
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>
332 <div id="method-M000426" class="method-detail">
333 <a name="M000426"></a>
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>
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">
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>
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">></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"><<</span> <span class="ruby-constant">Util</span>.<span class="ruby-identifier">colorize</span>(<span class="ruby-identifier">:red</span>, <span class="ruby-value str">" <----"</span>)
354 15: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"Application '#{appname}' failed to load:"</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">" #{e} (#{e.class})"</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">" %s"</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">"\n "</span>)]
359 20: <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
360 21: <span class="ruby-keyword kw">end</span>
362 23: <span class="ruby-constant">PluginManager</span>[<span class="ruby-node">"#{appname}_application"</span>].<span class="ruby-identifier">run</span>
363 24: <span class="ruby-keyword kw">end</span>
376 <div id="validator-badges">
377 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>