diff options
| author | Luke Kanies <luke@madstop.com> | 2008-06-17 10:54:23 -0500 |
|---|---|---|
| committer | Luke Kanies <luke@madstop.com> | 2008-06-17 10:54:23 -0500 |
| commit | d322df9a367fde290a3aa3d1b15082939c8fff19 (patch) | |
| tree | 7009700eb35b2de2414c8369c1c19693ffd93269 /lib/facter | |
| parent | 967631f91edd070ea6403bd528e8881c7daed8ba (diff) | |
| download | facter-d322df9a367fde290a3aa3d1b15082939c8fff19.tar.gz facter-d322df9a367fde290a3aa3d1b15082939c8fff19.tar.xz facter-d322df9a367fde290a3aa3d1b15082939c8fff19.zip | |
Refactored so each fact resolution can specify a separate timeout,
but the default is still 0.5.
Set the timeout on the AIX kernelrelease fact to 5 seconds.
Diffstat (limited to 'lib/facter')
| -rw-r--r-- | lib/facter/kernelrelease.rb | 2 | ||||
| -rw-r--r-- | lib/facter/util/collection.rb | 28 | ||||
| -rw-r--r-- | lib/facter/util/fact.rb | 14 | ||||
| -rw-r--r-- | lib/facter/util/resolution.rb | 21 |
4 files changed, 46 insertions, 19 deletions
diff --git a/lib/facter/kernelrelease.rb b/lib/facter/kernelrelease.rb index 8c6ac57..652fd6a 100644 --- a/lib/facter/kernelrelease.rb +++ b/lib/facter/kernelrelease.rb @@ -2,7 +2,7 @@ setcode 'uname -r' end - Facter.add(:kernelrelease) do + Facter.add(:kernelrelease, :timeout => 5) do confine :kernel => :aix setcode 'oslevel -s' end diff --git a/lib/facter/util/collection.rb b/lib/facter/util/collection.rb index edc65c7..3f8e0f8 100644 --- a/lib/facter/util/collection.rb +++ b/lib/facter/util/collection.rb @@ -17,11 +17,35 @@ class Facter::Util::Collection name = canonize(name) unless fact = @facts[name] - fact = Facter::Util::Fact.new(name, options) + fact = Facter::Util::Fact.new(name) + @facts[name] = fact end - fact.add(&block) if block + # Set any fact-appropriate options. + options.each do |opt, value| + method = opt.to_s + "=" + if fact.respond_to?(method) + fact.send(method, value) + options.delete(opt) + end + end + + if block + resolve = fact.add(&block) + # Set any resolve-appropriate options + options.each do |opt, value| + method = opt.to_s + "=" + if resolve.respond_to?(method) + resolve.send(method, value) + options.delete(opt) + end + end + end + + unless options.empty? + raise ArgumentError, "Invalid facter option(s) %s" % options.keys.collect { |k| k.to_s }.join(",") + end return fact end diff --git a/lib/facter/util/fact.rb b/lib/facter/util/fact.rb index 0b2d5b9..c96ca3b 100644 --- a/lib/facter/util/fact.rb +++ b/lib/facter/util/fact.rb @@ -1,9 +1,9 @@ require 'facter' require 'facter/util/resolution' -require 'timeout' - class Facter::Util::Fact + TIMEOUT = 5 + attr_accessor :name, :searching, :ldapname # Create a new fact, with no resolution mechanisms. @@ -82,15 +82,7 @@ class Facter::Util::Fact next unless resolve.suitable? foundsuits = true - tmp = nil - begin - Timeout.timeout(0.5) do - tmp = resolve.value - end - rescue Timeout::Error => detail - warn "Timed out seeking value for %s" % self.name - next - end + tmp = resolve.value break tmp unless tmp.nil? or tmp == "" } diff --git a/lib/facter/util/resolution.rb b/lib/facter/util/resolution.rb index b6aae77..1feda3f 100644 --- a/lib/facter/util/resolution.rb +++ b/lib/facter/util/resolution.rb @@ -5,8 +5,10 @@ # suitable. require 'facter/util/confine' +require 'timeout' + class Facter::Util::Resolution - attr_accessor :interpreter, :code, :name + attr_accessor :interpreter, :code, :name, :timeout def self.have_which if @have_which.nil? @@ -60,6 +62,7 @@ class Facter::Util::Resolution @name = name @confines = [] @value = nil + @timeout = 0.5 end # Return the number of confines. @@ -95,10 +98,18 @@ class Facter::Util::Resolution # How we get a value for our resolution mechanism. def value - if @code.is_a?(Proc) - result = @code.call() - else - result = Facter::Util::Resolution.exec(@code,@interpreter) + result = nil + begin + Timeout.timeout(timeout) do + if @code.is_a?(Proc) + result = @code.call() + else + result = Facter::Util::Resolution.exec(@code,@interpreter) + end + end + rescue Timeout::Error => detail + warn "Timed out seeking value for %s" % self.name + return nil end return nil if result == "" |
