summaryrefslogtreecommitdiffstats
path: root/lib/facter
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2008-06-17 10:54:23 -0500
committerLuke Kanies <luke@madstop.com>2008-06-17 10:54:23 -0500
commitd322df9a367fde290a3aa3d1b15082939c8fff19 (patch)
tree7009700eb35b2de2414c8369c1c19693ffd93269 /lib/facter
parent967631f91edd070ea6403bd528e8881c7daed8ba (diff)
downloadfacter-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.rb2
-rw-r--r--lib/facter/util/collection.rb28
-rw-r--r--lib/facter/util/fact.rb14
-rw-r--r--lib/facter/util/resolution.rb21
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 == ""