Update version according to OSCI-856
[packages/precise/mcollective.git] / doc / classes / MCollective / Facts / Base.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::Facts::Base</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::Facts::Base</td>
54         </tr>
55         <tr class="top-aligned-row">
56             <td><strong>In:</strong></td>
57             <td>
58                 <a href="../../../files/lib/mcollective/facts/base_rb.html">
59                 lib/mcollective/facts/base.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     <div id="description">
82       <p>
83 A base class for fact providers, to make a <a
84 href="Base.html#M000019">new</a> fully functional fact provider inherit
85 from this and simply provide a self.get_facts method that returns a hash
86 like:
87 </p>
88 <pre>
89  {&quot;foo&quot; =&gt; &quot;bar&quot;,
90   &quot;bar&quot; =&gt; &quot;baz&quot;}
91 </pre>
92
93     </div>
94
95
96    </div>
97
98     <div id="method-list">
99       <h3 class="section-bar">Methods</h3>
100
101       <div class="name-list">
102       <a href="#M000024">force_reload?</a>&nbsp;&nbsp;
103       <a href="#M000021">get_fact</a>&nbsp;&nbsp;
104       <a href="#M000022">get_facts</a>&nbsp;&nbsp;
105       <a href="#M000023">has_fact?</a>&nbsp;&nbsp;
106       <a href="#M000020">inherited</a>&nbsp;&nbsp;
107       <a href="#M000019">new</a>&nbsp;&nbsp;
108       </div>
109     </div>
110
111   </div>
112
113
114     <!-- if includes -->
115
116     <div id="section">
117
118
119
120
121
122       
123
124
125     <!-- if method_list -->
126     <div id="methods">
127       <h3 class="section-bar">Public Class methods</h3>
128
129       <div id="method-M000020" class="method-detail">
130         <a name="M000020"></a>
131
132         <div class="method-heading">
133           <a href="#M000020" class="method-signature">
134           <span class="method-name">inherited</span><span class="method-args">(klass)</span>
135           </a>
136         </div>
137       
138         <div class="method-description">
139           <p>
140 Registers <a href="Base.html#M000019">new</a> fact sources into the plugin
141 manager
142 </p>
143           <p><a class="source-toggle" href="#"
144             onclick="toggleCode('M000020-source');return false;">[Source]</a></p>
145           <div class="method-source-code" id="M000020-source">
146 <pre>
147     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 17</span>
148 17:       <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">inherited</span>(<span class="ruby-identifier">klass</span>)
149 18:         <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-value str">&quot;facts_plugin&quot;</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">to_s</span>}
150 19:       <span class="ruby-keyword kw">end</span>
151 </pre>
152           </div>
153         </div>
154       </div>
155
156       <div id="method-M000019" class="method-detail">
157         <a name="M000019"></a>
158
159         <div class="method-heading">
160           <a href="#M000019" class="method-signature">
161           <span class="method-name">new</span><span class="method-args">()</span>
162           </a>
163         </div>
164       
165         <div class="method-description">
166           <p><a class="source-toggle" href="#"
167             onclick="toggleCode('M000019-source');return false;">[Source]</a></p>
168           <div class="method-source-code" id="M000019-source">
169 <pre>
170     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 10</span>
171 10:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
172 11:         <span class="ruby-ivar">@facts</span> = {}
173 12:         <span class="ruby-ivar">@last_good_facts</span> = {}
174 13:         <span class="ruby-ivar">@last_facts_load</span> = <span class="ruby-value">0</span>
175 14:       <span class="ruby-keyword kw">end</span>
176 </pre>
177           </div>
178         </div>
179       </div>
180
181       <h3 class="section-bar">Public Instance methods</h3>
182
183       <div id="method-M000024" class="method-detail">
184         <a name="M000024"></a>
185
186         <div class="method-heading">
187           <a href="#M000024" class="method-signature">
188           <span class="method-name">force_reload?</span><span class="method-args">()</span>
189           </a>
190         </div>
191       
192         <div class="method-description">
193           <p>
194 Plugins can override this to provide forced fact invalidation
195 </p>
196           <p><a class="source-toggle" href="#"
197             onclick="toggleCode('M000024-source');return false;">[Source]</a></p>
198           <div class="method-source-code" id="M000024-source">
199 <pre>
200     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 81</span>
201 81:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">force_reload?</span>
202 82:         <span class="ruby-keyword kw">false</span>
203 83:       <span class="ruby-keyword kw">end</span>
204 </pre>
205           </div>
206         </div>
207       </div>
208
209       <div id="method-M000021" class="method-detail">
210         <a name="M000021"></a>
211
212         <div class="method-heading">
213           <a href="#M000021" class="method-signature">
214           <span class="method-name">get_fact</span><span class="method-args">(fact=nil)</span>
215           </a>
216         </div>
217       
218         <div class="method-description">
219           <p>
220 Returns the value of a single fact
221 </p>
222           <p><a class="source-toggle" href="#"
223             onclick="toggleCode('M000021-source');return false;">[Source]</a></p>
224           <div class="method-source-code" id="M000021-source">
225 <pre>
226     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 22</span>
227 22:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get_fact</span>(<span class="ruby-identifier">fact</span>=<span class="ruby-keyword kw">nil</span>)
228 23:         <span class="ruby-identifier">config</span> = <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>
229 24: 
230 25:         <span class="ruby-identifier">cache_time</span> = <span class="ruby-identifier">config</span>.<span class="ruby-identifier">fact_cache_time</span> <span class="ruby-operator">||</span> <span class="ruby-value">300</span>
231 26: 
232 27:         <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">exclusive</span> <span class="ruby-keyword kw">do</span>
233 28:           <span class="ruby-keyword kw">begin</span>
234 29:             <span class="ruby-keyword kw">if</span> (<span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@last_facts_load</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">cache_time</span>.<span class="ruby-identifier">to_i</span> ) <span class="ruby-operator">||</span> <span class="ruby-identifier">force_reload?</span>
235 30:               <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Resetting facter cache, now: #{Time.now.to_i} last-known-good: #{@last_facts_load}&quot;</span>)
236 31: 
237 32:               <span class="ruby-identifier">tfacts</span> = <span class="ruby-identifier">load_facts_from_source</span>
238 33: 
239 34:               <span class="ruby-comment cmt"># Force reset to last known good state on empty facts</span>
240 35:               <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Got empty facts&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">tfacts</span>.<span class="ruby-identifier">empty?</span>
241 36: 
242 37:               <span class="ruby-ivar">@facts</span>.<span class="ruby-identifier">clear</span>
243 38: 
244 39:               <span class="ruby-identifier">tfacts</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>,<span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
245 40:                 <span class="ruby-ivar">@facts</span>[<span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>] = <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>
246 41:               <span class="ruby-keyword kw">end</span>
247 42: 
248 43:               <span class="ruby-ivar">@last_good_facts</span> = <span class="ruby-ivar">@facts</span>.<span class="ruby-identifier">clone</span>
249 44:               <span class="ruby-ivar">@last_facts_load</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_i</span>
250 45:             <span class="ruby-keyword kw">else</span>
251 46:               <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">&quot;Using cached facts now: #{Time.now.to_i} last-known-good: #{@last_facts_load}&quot;</span>)
252 47:             <span class="ruby-keyword kw">end</span>
253 48:           <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>
254 49:             <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Failed to load facts: #{e.class}: #{e}&quot;</span>)
255 50: 
256 51:             <span class="ruby-comment cmt"># Avoid loops where failing fact loads cause huge CPU</span>
257 52:             <span class="ruby-comment cmt"># loops, this way it only retries once every cache_time</span>
258 53:             <span class="ruby-comment cmt"># seconds</span>
259 54:             <span class="ruby-ivar">@last_facts_load</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_i</span>
260 55: 
261 56:             <span class="ruby-comment cmt"># Revert to last known good state</span>
262 57:             <span class="ruby-ivar">@facts</span> = <span class="ruby-ivar">@last_good_facts</span>.<span class="ruby-identifier">clone</span>
263 58:           <span class="ruby-keyword kw">end</span>
264 59:         <span class="ruby-keyword kw">end</span>
265 60: 
266 61: 
267 62:         <span class="ruby-comment cmt"># If you do not supply a specific fact all facts will be returned</span>
268 63:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fact</span>.<span class="ruby-identifier">nil?</span>
269 64:           <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@facts</span>
270 65:         <span class="ruby-keyword kw">else</span>
271 66:           <span class="ruby-ivar">@facts</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">fact</span>) <span class="ruby-operator">?</span> <span class="ruby-ivar">@facts</span>[<span class="ruby-identifier">fact</span>] <span class="ruby-operator">:</span> <span class="ruby-keyword kw">nil</span>
272 67:         <span class="ruby-keyword kw">end</span>
273 68:       <span class="ruby-keyword kw">end</span>
274 </pre>
275           </div>
276         </div>
277       </div>
278
279       <div id="method-M000022" class="method-detail">
280         <a name="M000022"></a>
281
282         <div class="method-heading">
283           <a href="#M000022" class="method-signature">
284           <span class="method-name">get_facts</span><span class="method-args">()</span>
285           </a>
286         </div>
287       
288         <div class="method-description">
289           <p>
290 Returns all facts
291 </p>
292           <p><a class="source-toggle" href="#"
293             onclick="toggleCode('M000022-source');return false;">[Source]</a></p>
294           <div class="method-source-code" id="M000022-source">
295 <pre>
296     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 71</span>
297 71:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">get_facts</span>
298 72:         <span class="ruby-identifier">get_fact</span>(<span class="ruby-keyword kw">nil</span>)
299 73:       <span class="ruby-keyword kw">end</span>
300 </pre>
301           </div>
302         </div>
303       </div>
304
305       <div id="method-M000023" class="method-detail">
306         <a name="M000023"></a>
307
308         <div class="method-heading">
309           <a href="#M000023" class="method-signature">
310           <span class="method-name">has_fact?</span><span class="method-args">(fact)</span>
311           </a>
312         </div>
313       
314         <div class="method-description">
315           <p>
316 Returns true if we know about a specific fact, false otherwise
317 </p>
318           <p><a class="source-toggle" href="#"
319             onclick="toggleCode('M000023-source');return false;">[Source]</a></p>
320           <div class="method-source-code" id="M000023-source">
321 <pre>
322     <span class="ruby-comment cmt"># File lib/mcollective/facts/base.rb, line 76</span>
323 76:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">has_fact?</span>(<span class="ruby-identifier">fact</span>)
324 77:         <span class="ruby-identifier">get_fact</span>(<span class="ruby-keyword kw">nil</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">fact</span>)
325 78:       <span class="ruby-keyword kw">end</span>
326 </pre>
327           </div>
328         </div>
329       </div>
330
331
332     </div>
333
334
335   </div>
336
337
338 <div id="validator-badges">
339   <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
340 </div>
341
342 </body>
343 </html>