Update mcollective to 2.3.3 for MOS 6.1
[packages/trusty/mcollective.git] / doc / MCollective / PluginManager.html
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">
5 <head>
6         <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
7
8         <title>Module: MCollective::PluginManager</title>
9
10         <link rel="stylesheet" href="../rdoc.css" type="text/css" media="screen" />
11
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>
20
21 </head>
22 <body class="module">
23
24         <div id="metadata">
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">
29                                         <ul>
30                                         
31                                                 <li><a href="../lib/mcollective/pluginmanager_rb.html?TB_iframe=true&amp;height=550&amp;width=785"
32                                                         class="thickbox" title="lib/mcollective/pluginmanager.rb">lib/mcollective/pluginmanager.rb</a></li>
33                                         
34                                         </ul>
35                                 </div>
36                         </div>
37
38                         
39                 </div>
40
41                 <div id="class-metadata">
42
43                         <!-- Parent Class -->
44                         
45
46                         <!-- Namespace Contents -->
47                         
48
49                         <!-- Method Quickref -->
50                         
51                         <div id="method-list-section" class="section">
52                                 <h3 class="section-header">Methods</h3>
53                                 <ul class="link-list">
54                                         
55                                         <li><a href="#M000075">::<<</a></li>
56                                         
57                                         <li><a href="#M000080">::[]</a></li>
58                                         
59                                         <li><a href="#M000079">::clear</a></li>
60                                         
61                                         <li><a href="#M000081">::create_instance</a></li>
62                                         
63                                         <li><a href="#M000076">::delete</a></li>
64                                         
65                                         <li><a href="#M000082">::find</a></li>
66                                         
67                                         <li><a href="#M000083">::find_and_load</a></li>
68                                         
69                                         <li><a href="#M000085">::grep</a></li>
70                                         
71                                         <li><a href="#M000077">::include?</a></li>
72                                         
73                                         <li><a href="#M000084">::loadclass</a></li>
74                                         
75                                         <li><a href="#M000078">::pluginlist</a></li>
76                                         
77                                 </ul>
78                         </div>
79                         
80
81                         <!-- Included Modules -->
82                         
83                 </div>
84
85                 <div id="project-metadata">
86                         
87                         
88                         <div id="fileindex-section" class="section project-section">
89                                 <h3 class="section-header">Files</h3>
90                                 <ul>
91                                 
92                                         <li class="file"><a href="../COPYING.html">COPYING</a></li>
93                                 
94                                         <li class="file"><a href="../Gemfile.html">Gemfile</a></li>
95                                 
96                                         <li class="file"><a href="../README.html">README</a></li>
97                                 
98                                         <li class="file"><a href="../Rakefile.html">Rakefile</a></li>
99                                 
100                                         <li class="file"><a href="../etc/client_cfg_dist.html">client.cfg.dist</a></li>
101                                 
102                                         <li class="file"><a href="../etc/data-help_erb.html">data-help.erb</a></li>
103                                 
104                                         <li class="file"><a href="../etc/discovery-help_erb.html">discovery-help.erb</a></li>
105                                 
106                                         <li class="file"><a href="../etc/facts_yaml_dist.html">facts.yaml.dist</a></li>
107                                 
108                                         <li class="file"><a href="../etc/metadata-help_erb.html">metadata-help.erb</a></li>
109                                 
110                                         <li class="file"><a href="../etc/msg-help_erb.html">msg-help.erb</a></li>
111                                 
112                                         <li class="file"><a href="../etc/rpc-help_erb.html">rpc-help.erb</a></li>
113                                 
114                                         <li class="file"><a href="../etc/server_cfg_dist.html">server.cfg.dist</a></li>
115                                 
116                                         <li class="file"><a href="../etc/ssl/PLACEHOLDER.html">PLACEHOLDER</a></li>
117                                 
118                                         <li class="file"><a href="../etc/ssl/clients/PLACEHOLDER.html">PLACEHOLDER</a></li>
119                                 
120                                         <li class="file"><a href="../lib/mcollective/generators/templates/action_snippet_erb.html">action_snippet.erb</a></li>
121                                 
122                                         <li class="file"><a href="../lib/mcollective/generators/templates/data_input_snippet_erb.html">data_input_snippet.erb</a></li>
123                                 
124                                         <li class="file"><a href="../lib/mcollective/generators/templates/ddl_erb.html">ddl.erb</a></li>
125                                 
126                                         <li class="file"><a href="../lib/mcollective/generators/templates/plugin_erb.html">plugin.erb</a></li>
127                                 
128                                         <li class="file"><a href="../lib/mcollective/locales/en_yml.html">en.yml</a></li>
129                                 
130                                         <li class="file"><a href="../mcollective_init.html">mcollective.init</a></li>
131                                 
132                                 </ul>
133                         </div>
134                         
135
136                         <div id="classindex-section" class="section project-section">
137                                 <h3 class="section-header">Class Index
138                                         <span class="search-toggle"><img src="../images/find.png"
139                                                 height="16" width="16" alt="[+]"
140                                                 title="show/hide quicksearch" /></span></h3>
141                                 <form action="#" method="get" accept-charset="utf-8" class="initially-hidden">
142                                 <fieldset>
143                                         <legend>Quicksearch</legend>
144                                         <input type="text" name="quicksearch" value=""
145                                                 class="quicksearch-field" />
146                                 </fieldset>
147                                 </form>
148
149                                 <ul class="link-list">
150                                 
151                                         <li><a href="../MCollective.html">MCollective</a></li>
152                                 
153                                         <li><a href="../MCollective/Agent.html">MCollective::Agent</a></li>
154                                 
155                                         <li><a href="../MCollective/Agents.html">MCollective::Agents</a></li>
156                                 
157                                         <li><a href="../MCollective/Aggregate.html">MCollective::Aggregate</a></li>
158                                 
159                                         <li><a href="../MCollective/Aggregate/Base.html">MCollective::Aggregate::Base</a></li>
160                                 
161                                         <li><a href="../MCollective/Aggregate/Result.html">MCollective::Aggregate::Result</a></li>
162                                 
163                                         <li><a href="../MCollective/Aggregate/Result/Base.html">MCollective::Aggregate::Result::Base</a></li>
164                                 
165                                         <li><a href="../MCollective/Aggregate/Result/CollectionResult.html">MCollective::Aggregate::Result::CollectionResult</a></li>
166                                 
167                                         <li><a href="../MCollective/Aggregate/Result/NumericResult.html">MCollective::Aggregate::Result::NumericResult</a></li>
168                                 
169                                         <li><a href="../MCollective/Application.html">MCollective::Application</a></li>
170                                 
171                                         <li><a href="../MCollective/Applications.html">MCollective::Applications</a></li>
172                                 
173                                         <li><a href="../MCollective/Cache.html">MCollective::Cache</a></li>
174                                 
175                                         <li><a href="../MCollective/Client.html">MCollective::Client</a></li>
176                                 
177                                         <li><a href="../MCollective/CodedError.html">MCollective::CodedError</a></li>
178                                 
179                                         <li><a href="../MCollective/Config.html">MCollective::Config</a></li>
180                                 
181                                         <li><a href="../MCollective/Connector.html">MCollective::Connector</a></li>
182                                 
183                                         <li><a href="../MCollective/Connector/Base.html">MCollective::Connector::Base</a></li>
184                                 
185                                         <li><a href="../MCollective/DDL.html">MCollective::DDL</a></li>
186                                 
187                                         <li><a href="../MCollective/DDL/AgentDDL.html">MCollective::DDL::AgentDDL</a></li>
188                                 
189                                         <li><a href="../MCollective/DDL/Base.html">MCollective::DDL::Base</a></li>
190                                 
191                                         <li><a href="../MCollective/DDL/DataDDL.html">MCollective::DDL::DataDDL</a></li>
192                                 
193                                         <li><a href="../MCollective/DDL/DiscoveryDDL.html">MCollective::DDL::DiscoveryDDL</a></li>
194                                 
195                                         <li><a href="../MCollective/DDL/ValidatorDDL.html">MCollective::DDL::ValidatorDDL</a></li>
196                                 
197                                         <li><a href="../MCollective/DDLValidationError.html">MCollective::DDLValidationError</a></li>
198                                 
199                                         <li><a href="../MCollective/Data.html">MCollective::Data</a></li>
200                                 
201                                         <li><a href="../MCollective/Data/Base.html">MCollective::Data::Base</a></li>
202                                 
203                                         <li><a href="../MCollective/Data/Result.html">MCollective::Data::Result</a></li>
204                                 
205                                         <li><a href="../MCollective/Discovery.html">MCollective::Discovery</a></li>
206                                 
207                                         <li><a href="../MCollective/Facts.html">MCollective::Facts</a></li>
208                                 
209                                         <li><a href="../MCollective/Facts/Base.html">MCollective::Facts::Base</a></li>
210                                 
211                                         <li><a href="../MCollective/Generators.html">MCollective::Generators</a></li>
212                                 
213                                         <li><a href="../MCollective/Generators/AgentGenerator.html">MCollective::Generators::AgentGenerator</a></li>
214                                 
215                                         <li><a href="../MCollective/Generators/Base.html">MCollective::Generators::Base</a></li>
216                                 
217                                         <li><a href="../MCollective/Generators/DataGenerator.html">MCollective::Generators::DataGenerator</a></li>
218                                 
219                                         <li><a href="../MCollective/InvalidRPCData.html">MCollective::InvalidRPCData</a></li>
220                                 
221                                         <li><a href="../MCollective/Log.html">MCollective::Log</a></li>
222                                 
223                                         <li><a href="../MCollective/Logger.html">MCollective::Logger</a></li>
224                                 
225                                         <li><a href="../MCollective/Logger/Base.html">MCollective::Logger::Base</a></li>
226                                 
227                                         <li><a href="../MCollective/Logger/Console_logger.html">MCollective::Logger::Console_logger</a></li>
228                                 
229                                         <li><a href="../MCollective/Logger/File_logger.html">MCollective::Logger::File_logger</a></li>
230                                 
231                                         <li><a href="../MCollective/Logger/Syslog_logger.html">MCollective::Logger::Syslog_logger</a></li>
232                                 
233                                         <li><a href="../MCollective/Matcher.html">MCollective::Matcher</a></li>
234                                 
235                                         <li><a href="../MCollective/Matcher/Parser.html">MCollective::Matcher::Parser</a></li>
236                                 
237                                         <li><a href="../MCollective/Matcher/Scanner.html">MCollective::Matcher::Scanner</a></li>
238                                 
239                                         <li><a href="../MCollective/Message.html">MCollective::Message</a></li>
240                                 
241                                         <li><a href="../MCollective/MissingRPCData.html">MCollective::MissingRPCData</a></li>
242                                 
243                                         <li><a href="../MCollective/MsgDoesNotMatchRequestID.html">MCollective::MsgDoesNotMatchRequestID</a></li>
244                                 
245                                         <li><a href="../MCollective/MsgTTLExpired.html">MCollective::MsgTTLExpired</a></li>
246                                 
247                                         <li><a href="../MCollective/NotTargettedAtUs.html">MCollective::NotTargettedAtUs</a></li>
248                                 
249                                         <li><a href="../MCollective/Optionparser.html">MCollective::Optionparser</a></li>
250                                 
251                                         <li><a href="../MCollective/PluginManager.html">MCollective::PluginManager</a></li>
252                                 
253                                         <li><a href="../MCollective/PluginPackager.html">MCollective::PluginPackager</a></li>
254                                 
255                                         <li><a href="../MCollective/PluginPackager/AgentDefinition.html">MCollective::PluginPackager::AgentDefinition</a></li>
256                                 
257                                         <li><a href="../MCollective/PluginPackager/StandardDefinition.html">MCollective::PluginPackager::StandardDefinition</a></li>
258                                 
259                                         <li><a href="../MCollective/RPC.html">MCollective::RPC</a></li>
260                                 
261                                         <li><a href="../MCollective/RPC/ActionRunner.html">MCollective::RPC::ActionRunner</a></li>
262                                 
263                                         <li><a href="../MCollective/RPC/Agent.html">MCollective::RPC::Agent</a></li>
264                                 
265                                         <li><a href="../MCollective/RPC/Audit.html">MCollective::RPC::Audit</a></li>
266                                 
267                                         <li><a href="../MCollective/RPC/Client.html">MCollective::RPC::Client</a></li>
268                                 
269                                         <li><a href="../MCollective/RPC/Helpers.html">MCollective::RPC::Helpers</a></li>
270                                 
271                                         <li><a href="../MCollective/RPC/Progress.html">MCollective::RPC::Progress</a></li>
272                                 
273                                         <li><a href="../MCollective/RPC/Reply.html">MCollective::RPC::Reply</a></li>
274                                 
275                                         <li><a href="../MCollective/RPC/Request.html">MCollective::RPC::Request</a></li>
276                                 
277                                         <li><a href="../MCollective/RPC/Result.html">MCollective::RPC::Result</a></li>
278                                 
279                                         <li><a href="../MCollective/RPC/Stats.html">MCollective::RPC::Stats</a></li>
280                                 
281                                         <li><a href="../MCollective/RPCAborted.html">MCollective::RPCAborted</a></li>
282                                 
283                                         <li><a href="../MCollective/RPCError.html">MCollective::RPCError</a></li>
284                                 
285                                         <li><a href="../MCollective/Registration.html">MCollective::Registration</a></li>
286                                 
287                                         <li><a href="../MCollective/Registration/Base.html">MCollective::Registration::Base</a></li>
288                                 
289                                         <li><a href="../MCollective/Runner.html">MCollective::Runner</a></li>
290                                 
291                                         <li><a href="../MCollective/RunnerStats.html">MCollective::RunnerStats</a></li>
292                                 
293                                         <li><a href="../MCollective/SSL.html">MCollective::SSL</a></li>
294                                 
295                                         <li><a href="../MCollective/Security.html">MCollective::Security</a></li>
296                                 
297                                         <li><a href="../MCollective/Security/Base.html">MCollective::Security::Base</a></li>
298                                 
299                                         <li><a href="../MCollective/SecurityValidationFailed.html">MCollective::SecurityValidationFailed</a></li>
300                                 
301                                         <li><a href="../MCollective/Shell.html">MCollective::Shell</a></li>
302                                 
303                                         <li><a href="../MCollective/Translatable.html">MCollective::Translatable</a></li>
304                                 
305                                         <li><a href="../MCollective/UnixDaemon.html">MCollective::UnixDaemon</a></li>
306                                 
307                                         <li><a href="../MCollective/UnknownRPCAction.html">MCollective::UnknownRPCAction</a></li>
308                                 
309                                         <li><a href="../MCollective/UnknownRPCError.html">MCollective::UnknownRPCError</a></li>
310                                 
311                                         <li><a href="../MCollective/Util.html">MCollective::Util</a></li>
312                                 
313                                         <li><a href="../MCollective/Validator.html">MCollective::Validator</a></li>
314                                 
315                                         <li><a href="../MCollective/ValidatorError.html">MCollective::ValidatorError</a></li>
316                                 
317                                         <li><a href="../MCollective/WindowsDaemon.html">MCollective::WindowsDaemon</a></li>
318                                 
319                                         <li><a href="../Array.html">Array</a></li>
320                                 
321                                         <li><a href="../Dir.html">Dir</a></li>
322                                 
323                                         <li><a href="../Object.html">Object</a></li>
324                                 
325                                         <li><a href="../String.html">String</a></li>
326                                 
327                                         <li><a href="../Symbol.html">Symbol</a></li>
328                                 
329                                 </ul>
330                                 <div id="no-class-search-results" style="display: none;">No matching classes.</div>
331                         </div>
332
333                         
334                 </div>
335         </div>
336
337         <div id="documentation">
338                 <h1 class="module">MCollective::PluginManager</h1>
339
340                 <div id="description">
341                         <p>
342 A simple plugin manager, it stores one plugin each of a specific type the
343 idea is that we can only have one security provider, one connector etc.
344 </p>
345
346                 </div>
347
348                 <!-- Constants -->
349                 
350
351                 <!-- Attributes -->
352                 
353
354                 <!-- Methods -->
355                 
356                 <div id="public-class-method-details" class="method-section section">
357                         <h3 class="section-header">Public Class Methods</h3>
358
359                 
360                         <div id="--method" class="method-detail ">
361                                 <a name="M000075"></a>
362
363                                 <div class="method-heading">
364                                 
365                                         <span class="method-name">&lt;&lt;</span><span
366                                                 class="method-args">(plugin)</span>
367                                         <span class="method-click-advice">click to toggle source</span>
368                                 
369                                 </div>
370
371                                 <div class="method-description">
372                                         
373                                         <p>
374 Adds a plugin to the list of plugins, we expect a hash like:
375 </p>
376 <pre>
377    {:type =&gt; &quot;base&quot;,
378     :class =&gt; foo.new}
379 </pre>
380 <p>
381 or like:
382 </p>
383 <pre>
384    {:type =&gt; &quot;base&quot;,
385     :class =&gt; &quot;Foo::Bar&quot;}
386 </pre>
387 <p>
388 In the event that we already have a class with the given type an exception
389 will be raised.
390 </p>
391 <p>
392 If the :class passed is a <a href="../String.html">String</a> then we will
393 delay instantiation till the first time someone asks for the plugin, this
394 is because most likely the registration gets done by inherited() hooks, at
395 which point the plugin class is not final.
396 </p>
397 <p>
398 If we were to do a .new here the Class initialize method would get called
399 and not the plugins, we there for only initialize the classes when they get
400 requested via []
401 </p>
402 <p>
403 By default all plugin instances are cached and returned later so
404 there&#8217;s always a single instance. You can pass :single_instance =>
405 false when calling this to instruct it to always return a new instance when
406 a copy is requested. This only works with sending a <a
407 href="../String.html">String</a> for :class.
408 </p>
409                                         
410
411                                         
412                                         <div class="method-source-code"
413                                                 id="--source">
414 <pre>
415     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 30</span>
416 30:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-operator">&lt;&lt;</span>(<span class="ruby-identifier">plugin</span>)
417 31:       <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:single_instance</span>] = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">plugin</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:single_instance</span>)
418 32: 
419 33:       <span class="ruby-identifier">type</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:type</span>]
420 34:       <span class="ruby-identifier">klass</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:class</span>]
421 35:       <span class="ruby-identifier">single</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:single_instance</span>]
422 36: 
423 37:       <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Plugin #{type} already loaded&quot;</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">type</span>)
424 38: 
425 39: 
426 40:       <span class="ruby-comment cmt"># If we get a string then store 'nil' as the instance, signalling that we'll</span>
427 41:       <span class="ruby-comment cmt"># create the class later on demand.</span>
428 42:       <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
429 43:         <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">type</span>] = {<span class="ruby-identifier">:loadtime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">klass</span>, <span class="ruby-identifier">:instance</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">:single</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">single</span>}
430 44:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Registering plugin #{type} with class #{klass} single_instance: #{single}&quot;</span>)
431 45:       <span class="ruby-keyword kw">else</span>
432 46:         <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">type</span>] = {<span class="ruby-identifier">:loadtime</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">class</span>, <span class="ruby-identifier">:instance</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">klass</span>, <span class="ruby-identifier">:single</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">true</span>}
433 47:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Registering plugin #{type} with class #{klass.class} single_instance: true&quot;</span>)
434 48:       <span class="ruby-keyword kw">end</span>
435 49:     <span class="ruby-keyword kw">end</span></pre>
436                                         </div>
437                                         
438                                 </div>
439
440                                 
441                         </div>
442
443                 
444                         <div id="--method" class="method-detail ">
445                                 <a name="M000080"></a>
446
447                                 <div class="method-heading">
448                                 
449                                         <span class="method-name">[]</span><span
450                                                 class="method-args">(plugin)</span>
451                                         <span class="method-click-advice">click to toggle source</span>
452                                 
453                                 </div>
454
455                                 <div class="method-description">
456                                         
457                                         <p>
458 Gets a plugin by type
459 </p>
460                                         
461
462                                         
463                                         <div class="method-source-code"
464                                                 id="--source">
465 <pre>
466     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 72</span>
467 72:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-operator">[]</span>(<span class="ruby-identifier">plugin</span>)
468 73:       <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;No plugin #{plugin} defined&quot;</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
469 74: 
470 75:       <span class="ruby-identifier">klass</span> = <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:class</span>]
471 76: 
472 77:       <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:single</span>]
473 78:         <span class="ruby-comment cmt"># Create an instance of the class if one hasn't been done before</span>
474 79:         <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>] <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
475 80:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Returning new plugin #{plugin} with class #{klass}&quot;</span>)
476 81:           <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>] = <span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
477 82:         <span class="ruby-keyword kw">else</span>
478 83:           <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Returning cached plugin #{plugin} with class #{klass}&quot;</span>)
479 84:         <span class="ruby-keyword kw">end</span>
480 85: 
481 86:         <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>]
482 87:       <span class="ruby-keyword kw">else</span>
483 88:         <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Returning new plugin #{plugin} with class #{klass}&quot;</span>)
484 89:         <span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
485 90:       <span class="ruby-keyword kw">end</span>
486 91:     <span class="ruby-keyword kw">end</span></pre>
487                                         </div>
488                                         
489                                 </div>
490
491                                 
492                         </div>
493
494                 
495                         <div id="clear-method" class="method-detail ">
496                                 <a name="M000079"></a>
497
498                                 <div class="method-heading">
499                                 
500                                         <span class="method-name">clear</span><span
501                                                 class="method-args">()</span>
502                                         <span class="method-click-advice">click to toggle source</span>
503                                 
504                                 </div>
505
506                                 <div class="method-description">
507                                         
508                                         <p>
509 deletes all registered plugins
510 </p>
511                                         
512
513                                         
514                                         <div class="method-source-code"
515                                                 id="clear-source">
516 <pre>
517     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 67</span>
518 67:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">clear</span>
519 68:       <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">clear</span>
520 69:     <span class="ruby-keyword kw">end</span></pre>
521                                         </div>
522                                         
523                                 </div>
524
525                                 
526                         </div>
527
528                 
529                         <div id="create-instance-method" class="method-detail ">
530                                 <a name="M000081"></a>
531
532                                 <div class="method-heading">
533                                 
534                                         <span class="method-name">create_instance</span><span
535                                                 class="method-args">(klass)</span>
536                                         <span class="method-click-advice">click to toggle source</span>
537                                 
538                                 </div>
539
540                                 <div class="method-description">
541                                         
542                                         <p>
543 use eval to create an instance of a class
544 </p>
545                                         
546
547                                         
548                                         <div class="method-source-code"
549                                                 id="create-instance-source">
550 <pre>
551      <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 94</span>
552  94:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
553  95:       <span class="ruby-keyword kw">begin</span>
554  96:         <span class="ruby-identifier">eval</span>(<span class="ruby-node">&quot;#{klass}.new&quot;</span>)
555  97:       <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>
556  98:         <span class="ruby-identifier">raise</span>(<span class="ruby-node">&quot;Could not create instance of plugin #{klass}: #{e}&quot;</span>)
557  99:       <span class="ruby-keyword kw">end</span>
558 100:     <span class="ruby-keyword kw">end</span></pre>
559                                         </div>
560                                         
561                                 </div>
562
563                                 
564                         </div>
565
566                 
567                         <div id="delete-method" class="method-detail ">
568                                 <a name="M000076"></a>
569
570                                 <div class="method-heading">
571                                 
572                                         <span class="method-name">delete</span><span
573                                                 class="method-args">(plugin)</span>
574                                         <span class="method-click-advice">click to toggle source</span>
575                                 
576                                 </div>
577
578                                 <div class="method-description">
579                                         
580                                         <p>
581 Removes a plugim the list
582 </p>
583                                         
584
585                                         
586                                         <div class="method-source-code"
587                                                 id="delete-source">
588 <pre>
589     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 52</span>
590 52:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">plugin</span>)
591 53:       <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">plugin</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
592 54:     <span class="ruby-keyword kw">end</span></pre>
593                                         </div>
594                                         
595                                 </div>
596
597                                 
598                         </div>
599
600                 
601                         <div id="find-method" class="method-detail ">
602                                 <a name="M000082"></a>
603
604                                 <div class="method-heading">
605                                 
606                                         <span class="method-name">find</span><span
607                                                 class="method-args">(type, extension="rb")</span>
608                                         <span class="method-click-advice">click to toggle source</span>
609                                 
610                                 </div>
611
612                                 <div class="method-description">
613                                         
614                                         <p>
615 Finds plugins in all configured libdirs
616 </p>
617 <pre>
618   find(&quot;agent&quot;)
619 </pre>
620 <p>
621 will return an array of just agent names, for example:
622 </p>
623 <pre>
624   [&quot;puppetd&quot;, &quot;package&quot;]
625 </pre>
626 <p>
627 Can also be used to find files of other extensions:
628 </p>
629 <pre>
630   find(&quot;agent&quot;, &quot;ddl&quot;)
631 </pre>
632 <p>
633 Will return the same list but only of files with extension .ddl in the
634 agent subdirectory
635 </p>
636                                         
637
638                                         
639                                         <div class="method-source-code"
640                                                 id="find-source">
641 <pre>
642      <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 116</span>
643 116:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">find</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>=<span class="ruby-value str">&quot;rb&quot;</span>)
644 117:       <span class="ruby-identifier">extension</span> = <span class="ruby-node">&quot;.#{extension}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">extension</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp re">/^\./</span>)
645 118: 
646 119:       <span class="ruby-identifier">plugins</span> = []
647 120: 
648 121:       <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">libdir</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">libdir</span><span class="ruby-operator">|</span>
649 122:         <span class="ruby-identifier">plugdir</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>([<span class="ruby-identifier">libdir</span>, <span class="ruby-value str">&quot;mcollective&quot;</span>, <span class="ruby-identifier">type</span>.<span class="ruby-identifier">to_s</span>])
650 123:         <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">plugdir</span>)
651 124: 
652 125:         <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">plugdir</span>).<span class="ruby-identifier">grep</span>(<span class="ruby-node">/#{extension}$/</span>).<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">plugin</span><span class="ruby-operator">|</span>
653 126:           <span class="ruby-identifier">plugins</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">basename</span>(<span class="ruby-identifier">plugin</span>, <span class="ruby-identifier">extension</span>)
654 127:         <span class="ruby-keyword kw">end</span>
655 128:       <span class="ruby-keyword kw">end</span>
656 129: 
657 130:       <span class="ruby-identifier">plugins</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">uniq</span>
658 131:     <span class="ruby-keyword kw">end</span></pre>
659                                         </div>
660                                         
661                                 </div>
662
663                                 
664                         </div>
665
666                 
667                         <div id="find-and-load-method" class="method-detail ">
668                                 <a name="M000083"></a>
669
670                                 <div class="method-heading">
671                                 
672                                         <span class="method-name">find_and_load</span><span
673                                                 class="method-args">(type, extension="rb")</span>
674                                         <span class="method-click-advice">click to toggle source</span>
675                                 
676                                 </div>
677
678                                 <div class="method-description">
679                                         
680                                         <p>
681 Finds and loads from disk all plugins from all libdirs that match certain
682 criteria.
683 </p>
684 <pre>
685    find_and_load(&quot;pluginpackager&quot;)
686 </pre>
687 <p>
688 Will find all .rb files in the libdir/mcollective/pluginpackager/ directory
689 in all libdirs and load them from disk.
690 </p>
691 <p>
692 You can influence what plugins get loaded using a block notation:
693 </p>
694 <pre>
695    find_and_load(&quot;pluginpackager&quot;) do |plugin|
696       plugin.match(/puppet/)
697    end
698 </pre>
699 <p>
700 This will load only plugins matching /puppet/
701 </p>
702                                         
703
704                                         
705                                         <div class="method-source-code"
706                                                 id="find-and-load-source">
707 <pre>
708      <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 148</span>
709 148:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">find_and_load</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>=<span class="ruby-value str">&quot;rb&quot;</span>)
710 149:       <span class="ruby-identifier">extension</span> = <span class="ruby-node">&quot;.#{extension}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">extension</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp re">/^\./</span>)
711 150: 
712 151:       <span class="ruby-identifier">klasses</span> = <span class="ruby-identifier">find</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>).<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">plugin</span><span class="ruby-operator">|</span>
713 152:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
714 153:           <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">plugin</span>)
715 154:         <span class="ruby-keyword kw">end</span>
716 155: 
717 156:         <span class="ruby-value str">&quot;%s::%s::%s&quot;</span> <span class="ruby-operator">%</span> [ <span class="ruby-value str">&quot;MCollective&quot;</span>, <span class="ruby-identifier">type</span>.<span class="ruby-identifier">capitalize</span>, <span class="ruby-identifier">plugin</span>.<span class="ruby-identifier">capitalize</span> ]
718 157:       <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">compact</span>
719 158: 
720 159:       <span class="ruby-identifier">klasses</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">uniq</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">klass</span><span class="ruby-operator">|</span> <span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-keyword kw">true</span>)}
721 160:     <span class="ruby-keyword kw">end</span></pre>
722                                         </div>
723                                         
724                                 </div>
725
726                                 
727                         </div>
728
729                 
730                         <div id="grep-method" class="method-detail ">
731                                 <a name="M000085"></a>
732
733                                 <div class="method-heading">
734                                 
735                                         <span class="method-name">grep</span><span
736                                                 class="method-args">(regex)</span>
737                                         <span class="method-click-advice">click to toggle source</span>
738                                 
739                                 </div>
740
741                                 <div class="method-description">
742                                         
743                                         <p>
744 Grep&#8217;s over the plugin list and returns the list found
745 </p>
746                                         
747
748                                         
749                                         <div class="method-source-code"
750                                                 id="grep-source">
751 <pre>
752      <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 176</span>
753 176:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-identifier">regex</span>)
754 177:       <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-identifier">regex</span>)
755 178:     <span class="ruby-keyword kw">end</span></pre>
756                                         </div>
757                                         
758                                 </div>
759
760                                 
761                         </div>
762
763                 
764                         <div id="include--method" class="method-detail ">
765                                 <a name="M000077"></a>
766
767                                 <div class="method-heading">
768                                 
769                                         <span class="method-name">include?</span><span
770                                                 class="method-args">(plugin)</span>
771                                         <span class="method-click-advice">click to toggle source</span>
772                                 
773                                 </div>
774
775                                 <div class="method-description">
776                                         
777                                         <p>
778 Finds out if we have a plugin with the given name
779 </p>
780                                         
781
782                                         
783                                         <div class="method-source-code"
784                                                 id="include--source">
785 <pre>
786     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 57</span>
787 57:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
788 58:       <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
789 59:     <span class="ruby-keyword kw">end</span></pre>
790                                         </div>
791                                         
792                                 </div>
793
794                                 
795                         </div>
796
797                 
798                         <div id="loadclass-method" class="method-detail ">
799                                 <a name="M000084"></a>
800
801                                 <div class="method-heading">
802                                 
803                                         <span class="method-name">loadclass</span><span
804                                                 class="method-args">(klass, squash_failures=false)</span>
805                                         <span class="method-click-advice">click to toggle source</span>
806                                 
807                                 </div>
808
809                                 <div class="method-description">
810                                         
811                                         <p>
812 Loads a class from file by doing some simple search/replace on class names
813 and then doing a require.
814 </p>
815                                         
816
817                                         
818                                         <div class="method-source-code"
819                                                 id="loadclass-source">
820 <pre>
821      <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 164</span>
822 164:     <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>, <span class="ruby-identifier">squash_failures</span>=<span class="ruby-keyword kw">false</span>)
823 165:       <span class="ruby-identifier">fname</span> = <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">&quot;::&quot;</span>, <span class="ruby-value str">&quot;/&quot;</span>).<span class="ruby-identifier">downcase</span> <span class="ruby-operator">+</span> <span class="ruby-value str">&quot;.rb&quot;</span>
824 166: 
825 167:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Loading #{klass} from #{fname}&quot;</span>)
826 168: 
827 169:       <span class="ruby-identifier">load</span> <span class="ruby-identifier">fname</span>
828 170:     <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>
829 171:       <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Failed to load #{klass}: #{e}&quot;</span>)
830 172:       <span class="ruby-identifier">raise</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">squash_failures</span>
831 173:     <span class="ruby-keyword kw">end</span></pre>
832                                         </div>
833                                         
834                                 </div>
835
836                                 
837                         </div>
838
839                 
840                         <div id="pluginlist-method" class="method-detail ">
841                                 <a name="M000078"></a>
842
843                                 <div class="method-heading">
844                                 
845                                         <span class="method-name">pluginlist</span><span
846                                                 class="method-args">()</span>
847                                         <span class="method-click-advice">click to toggle source</span>
848                                 
849                                 </div>
850
851                                 <div class="method-description">
852                                         
853                                         <p>
854 Provides a list of plugins we know about
855 </p>
856                                         
857
858                                         
859                                         <div class="method-source-code"
860                                                 id="pluginlist-source">
861 <pre>
862     <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 62</span>
863 62:     <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">pluginlist</span>
864 63:       <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>
865 64:     <span class="ruby-keyword kw">end</span></pre>
866                                         </div>
867                                         
868                                 </div>
869
870                                 
871                         </div>
872
873                 
874                 </div>
875         
876
877         </div>
878
879
880         <div id="rdoc-debugging-section-dump" class="debugging-section">
881         
882                 <p>Disabled; run with --debug to generate this.</p>
883         
884         </div>
885
886         <div id="validator-badges">
887                 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
888                 <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish
889                         Rdoc Generator</a> 1.1.6</small>.</p>
890         </div>
891
892 </body>
893 </html>
894