facter 1.3.8 → 1.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of facter might be problematic. Click here for more details.

Files changed (46) hide show
  1. data/CHANGELOG +68 -0
  2. data/README +1 -1
  3. data/Rakefile +2 -1
  4. data/bin/facter +16 -11
  5. data/lib/facter.rb +55 -1001
  6. data/lib/facter/Cfkey.rb +42 -0
  7. data/lib/facter/architecture.rb +14 -0
  8. data/lib/facter/domain.rb +64 -0
  9. data/lib/facter/facterversion.rb +3 -0
  10. data/lib/facter/fqdn.rb +10 -0
  11. data/lib/facter/hardwareisa.rb +4 -0
  12. data/lib/facter/hardwaremodel.rb +13 -0
  13. data/lib/facter/hostname.rb +25 -0
  14. data/lib/facter/id.rb +4 -0
  15. data/lib/facter/ipaddress.rb +151 -0
  16. data/lib/facter/iphostnumber.rb +18 -0
  17. data/lib/facter/ipmess.rb +64 -74
  18. data/lib/facter/kernel.rb +3 -0
  19. data/lib/facter/kernelrelease.rb +8 -0
  20. data/lib/facter/lsb.rb +37 -0
  21. data/lib/facter/lsbmajdistrelease.rb +15 -0
  22. data/lib/facter/macaddress.rb +65 -0
  23. data/lib/facter/macosx.rb +25 -55
  24. data/lib/facter/manufacturer.rb +7 -45
  25. data/lib/facter/memory.rb +26 -49
  26. data/lib/facter/netmask.rb +17 -0
  27. data/lib/facter/operatingsystem.rb +37 -0
  28. data/lib/facter/operatingsystemrelease.rb +63 -0
  29. data/lib/facter/processor.rb +36 -14
  30. data/lib/facter/ps.rb +8 -0
  31. data/lib/facter/puppetversion.rb +10 -0
  32. data/lib/facter/rubysitedir.rb +8 -0
  33. data/lib/facter/rubyversion.rb +3 -0
  34. data/lib/facter/ssh.rb +33 -0
  35. data/lib/facter/uniqueid.rb +4 -0
  36. data/lib/facter/util/collection.rb +126 -0
  37. data/lib/facter/util/confine.rb +41 -0
  38. data/lib/facter/util/fact.rb +122 -0
  39. data/lib/facter/util/ip.rb +98 -0
  40. data/lib/facter/util/loader.rb +96 -0
  41. data/lib/facter/util/macosx.rb +50 -0
  42. data/lib/facter/util/manufacturer.rb +39 -0
  43. data/lib/facter/util/memory.rb +54 -0
  44. data/lib/facter/util/netmask.rb +36 -0
  45. data/lib/facter/util/resolution.rb +125 -0
  46. metadata +76 -34
@@ -0,0 +1,96 @@
1
+ require 'facter'
2
+
3
+ # Load facts on demand.
4
+ class Facter::Util::Loader
5
+ # Load all resolutions for a single fact.
6
+ def load(fact)
7
+ # Now load from the search path
8
+ shortname = fact.to_s.downcase
9
+ load_env(shortname)
10
+
11
+ filename = shortname + ".rb"
12
+ search_path.each do |dir|
13
+ # Load individual files
14
+ file = File.join(dir, filename)
15
+
16
+ load_file(file) if FileTest.exist?(file)
17
+
18
+ # And load any directories matching the name
19
+ factdir = File.join(dir, shortname)
20
+ load_dir(factdir) if FileTest.directory?(factdir)
21
+ end
22
+ end
23
+
24
+ # Load all facts from all directories.
25
+ def load_all
26
+ return if defined?(@loaded_all)
27
+
28
+ load_env
29
+
30
+ search_path.each do |dir|
31
+ next unless FileTest.directory?(dir)
32
+
33
+ Dir.entries(dir).each do |file|
34
+ path = File.join(dir, file)
35
+ if File.directory?(path)
36
+ load_dir(path)
37
+ elsif file =~ /\.rb$/
38
+ load_file(File.join(dir, file))
39
+ end
40
+ end
41
+ end
42
+
43
+ @loaded_all = true
44
+ end
45
+
46
+ # The list of directories we're going to search through for facts.
47
+ def search_path
48
+ result = []
49
+ result += $LOAD_PATH.collect { |d| File.join(d, "facter") }
50
+ if ENV.include?("FACTERLIB")
51
+ result += ENV["FACTERLIB"].split(":")
52
+ end
53
+
54
+ # This allows others to register additional paths we should search.
55
+ result += Facter.search_path
56
+
57
+ result
58
+ end
59
+
60
+ private
61
+
62
+ def load_dir(dir)
63
+ return if dir =~ /\/\.+$/ or dir =~ /\/util$/ or dir =~ /\/lib$/
64
+
65
+ Dir.entries(dir).find_all { |f| f =~ /\.rb$/ }.each do |file|
66
+ load_file(File.join(dir, file))
67
+ end
68
+ end
69
+
70
+ def load_file(file)
71
+ # We have to specify Kernel.load, because we have a load method.
72
+ Kernel.load(file)
73
+ end
74
+
75
+ # Load facts from the environment. If no name is provided,
76
+ # all will be loaded.
77
+ def load_env(fact = nil)
78
+ # Load from the environment, if possible
79
+ ENV.each do |name, value|
80
+ # Skip anything that doesn't match our regex.
81
+ next unless name =~ /^facter_?(\w+)$/i
82
+ env_name = $1
83
+
84
+ # If a fact name was specified, skip anything that doesn't
85
+ # match it.
86
+ next if fact and env_name != fact
87
+
88
+ Facter.add($1) do
89
+ setcode { value }
90
+ end
91
+
92
+ # Short-cut, if we are only looking for one value.
93
+ break if fact
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,50 @@
1
+ ## macosx.rb
2
+ ## Support methods for Apple OSX facts
3
+ ##
4
+ ## Copyright (C) 2007 Jeff McCune
5
+ ## Author: Jeff McCune <jeff.mccune@northstarlabs.net>
6
+ ##
7
+ ## This program is free software; you can redistribute it and/or
8
+ ## modify it under the terms of the GNU General Public License
9
+ ## as published by the Free Software Foundation (version 2 of the License)
10
+ ## This program is distributed in the hope that it will be useful,
11
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ ## GNU General Public License for more details.
14
+ ## You should have received a copy of the GNU General Public License
15
+ ## along with this program; if not, write to the Free Software
16
+ ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA
17
+ ##
18
+
19
+ module Facter::Macosx
20
+ require 'thread'
21
+ require 'facter/util/plist'
22
+
23
+ # JJM I'd really like to dynamically generate these methods
24
+ # by looking at the _name key of the _items dict for each _dataType
25
+
26
+ def self.hardware_overview
27
+ # JJM Perhaps we should cache the XML data in a "class" level object.
28
+ top_level_plist = Plist::parse_xml %x{/usr/sbin/system_profiler -xml SPHardwareDataType}
29
+ system_hardware = top_level_plist[0]['_items'][0]
30
+ system_hardware.delete '_name'
31
+ system_hardware
32
+ end
33
+
34
+ # SPSoftwareDataType
35
+ def self.os_overview
36
+ top_level_plist = Plist::parse_xml %x{/usr/sbin/system_profiler -xml SPSoftwareDataType}
37
+ os_stuff = top_level_plist[0]['_items'][0]
38
+ os_stuff.delete '_name'
39
+ os_stuff
40
+ end
41
+
42
+ def self.sw_vers
43
+ ver = Hash.new
44
+ [ "productName", "productVersion", "buildVersion" ].each do |option|
45
+ ver["macosx_#{option}"] = %x{sw_vers -#{option}}.strip
46
+ end
47
+ ver
48
+ end
49
+ end
50
+
@@ -0,0 +1,39 @@
1
+ # mamufacturer.rb
2
+ # Support methods for manufacturer specific facts
3
+
4
+ module Facter::Manufacturer
5
+ def self.dmi_find_system_info(name)
6
+ case Facter.value(:kernel)
7
+ when 'Linux'
8
+ return nil unless FileTest.exists?("/usr/sbin/dmidecode")
9
+
10
+ output=%x{/usr/sbin/dmidecode 2>/dev/null}
11
+ when 'OpenBSD', 'FreeBSD'
12
+ return nil unless FileTest.exists?("/usr/local/sbin/dmidecode")
13
+
14
+ output=%x{/usr/local/sbin/dmidecode 2>/dev/null}
15
+ when 'NetBSD'
16
+ return nil unless FileTest.exists?("/usr/pkg/sbin/dmidecode")
17
+
18
+ output=%x{/usr/pkg/sbin/dmidecode 2>/dev/null}
19
+ else
20
+ return
21
+ end
22
+ name.each_pair do |key,v|
23
+ v.each do |value|
24
+ output.split("Handle").each do |line|
25
+ if line =~ /#{key}/ and line =~ /#{value} (\w.*)\n*./
26
+ result = $1
27
+ Facter.add(value.chomp(':').gsub(' ','')) do
28
+ confine :kernel => [ :linux, :freebsd, :netbsd, :openbsd ]
29
+ setcode do
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,54 @@
1
+ ## memory.rb
2
+ ## Support module for memory related facts
3
+ ##
4
+ ## This program is free software; you can redistribute it and/or
5
+ ## modify it under the terms of the GNU General Public License
6
+ ## as published by the Free Software Foundation (version 2 of the License)
7
+ ## This program is distributed in the hope that it will be useful,
8
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ ## GNU General Public License for more details.
11
+ ## You should have received a copy of the GNU General Public License
12
+ ## along with this program; if not, write to the Free Software
13
+ ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston MA 02110-1301 USA
14
+ ##
15
+
16
+ module Facter::Memory
17
+ require 'thread'
18
+
19
+ def self.meminfo_number(tag)
20
+ memsize = ""
21
+ Thread::exclusive do
22
+ size, scale = [0, ""]
23
+ File.readlines("/proc/meminfo").each do |l|
24
+ size, scale = [$1.to_f, $2] if l =~ /^#{tag}:\s+(\d+)\s+(\S+)/
25
+ # MemoryFree == memfree + cached + buffers
26
+ # (assume scales are all the same as memfree)
27
+ if tag == "MemFree" &&
28
+ l =~ /^(?:Buffers|Cached):\s+(\d+)\s+(?:\S+)/
29
+ size += $1.to_f
30
+ end
31
+ end
32
+ memsize = scale_number(size, scale)
33
+ end
34
+
35
+ memsize
36
+ end
37
+
38
+ def self.scale_number(size, multiplier)
39
+ suffixes = ['', 'kB', 'MB', 'GB', 'TB']
40
+
41
+ s = suffixes.shift
42
+ while s != multiplier
43
+ s = suffixes.shift
44
+ end
45
+
46
+ while size > 1024.0
47
+ size /= 1024.0
48
+ s = suffixes.shift
49
+ end
50
+
51
+ return "%.2f %s" % [size, s]
52
+ end
53
+ end
54
+
@@ -0,0 +1,36 @@
1
+ module Facter::NetMask
2
+
3
+ def self.get_netmask
4
+ netmask = nil;
5
+ ipregex = %r{(\d{1,3}\.){3}\d{1,3}}
6
+
7
+ ops = nil
8
+ case Facter.value(:kernel)
9
+ when 'Linux'
10
+ ops = {
11
+ :ifconfig => '/sbin/ifconfig',
12
+ :regex => %r{\s+ inet\saddr: #{Facter.ipaddress} .*? Mask: (#{ipregex})}x,
13
+ :munge => nil,
14
+ }
15
+ when 'SunOS'
16
+ ops = {
17
+ :ifconfig => '/usr/sbin/ifconfig -a',
18
+ :regex => %r{\s+ inet\s+? #{Facter.ipaddress} \+? mask (\w{8})}x,
19
+ :munge => Proc.new { |mask| mask.scan(/../).collect do |byte| byte.to_i(16) end.join('.') }
20
+ }
21
+ end
22
+
23
+ %x{#{ops[:ifconfig]}}.split(/\n/).collect do |line|
24
+ matches = line.match(ops[:regex])
25
+ if !matches.nil?
26
+ if ops[:munge].nil?
27
+ netmask = matches[1]
28
+ else
29
+ netmask = ops[:munge].call(matches[1])
30
+ end
31
+ end
32
+ end
33
+ netmask
34
+ end
35
+
36
+ end
@@ -0,0 +1,125 @@
1
+ # An actual fact resolution mechanism. These are largely just chunks of
2
+ # code, with optional confinements restricting the mechanisms to only working on
3
+ # specific systems. Note that the confinements are always ANDed, so any
4
+ # confinements specified must all be true for the resolution to be
5
+ # suitable.
6
+ require 'facter/util/confine'
7
+
8
+ require 'timeout'
9
+
10
+ class Facter::Util::Resolution
11
+ attr_accessor :interpreter, :code, :name, :timeout
12
+
13
+ def self.have_which
14
+ if ! defined?(@have_which) or @have_which.nil?
15
+ %x{which which 2>/dev/null}
16
+ @have_which = ($? == 0)
17
+ end
18
+ @have_which
19
+ end
20
+
21
+ # Execute a chunk of code.
22
+ def self.exec(code, interpreter = "/bin/sh")
23
+ raise ArgumentError, "non-sh interpreters are not currently supported" unless interpreter == "/bin/sh"
24
+ binary = code.split(/\s+/).shift
25
+
26
+ if have_which
27
+ path = nil
28
+ if binary !~ /^\//
29
+ path = %x{which #{binary} 2>/dev/null}.chomp
30
+ # we don't have the binary necessary
31
+ return nil if path == ""
32
+ else
33
+ path = binary
34
+ end
35
+
36
+ return nil unless FileTest.exists?(path)
37
+ end
38
+
39
+ out = nil
40
+ begin
41
+ out = %x{#{code}}.chomp
42
+ rescue => detail
43
+ $stderr.puts detail
44
+ return nil
45
+ end
46
+ if out == ""
47
+ return nil
48
+ else
49
+ return out
50
+ end
51
+ end
52
+
53
+ # Add a new confine to the resolution mechanism.
54
+ def confine(confines)
55
+ confines.each do |fact, values|
56
+ @confines.push Facter::Util::Confine.new(fact, *values)
57
+ end
58
+ end
59
+
60
+ # Create a new resolution mechanism.
61
+ def initialize(name)
62
+ @name = name
63
+ @confines = []
64
+ @value = nil
65
+ @timeout = 0.5
66
+ end
67
+
68
+ # Return the number of confines.
69
+ def length
70
+ @confines.length
71
+ end
72
+
73
+ # We need this as a getter for 'timeout', because some versions
74
+ # of ruby seem to already have a 'timeout' method and we can't
75
+ # seem to override the instance methods, somehow.
76
+ def limit
77
+ @timeout
78
+ end
79
+
80
+ # Set our code for returning a value.
81
+ def setcode(string = nil, interp = nil, &block)
82
+ if string
83
+ @code = string
84
+ @interpreter = interp || "/bin/sh"
85
+ else
86
+ unless block_given?
87
+ raise ArgumentError, "You must pass either code or a block"
88
+ end
89
+ @code = block
90
+ end
91
+ end
92
+
93
+ # Is this resolution mechanism suitable on the system in question?
94
+ def suitable?
95
+ unless defined? @suitable
96
+ @suitable = ! @confines.detect { |confine| ! confine.true? }
97
+ end
98
+
99
+ return @suitable
100
+ end
101
+
102
+ def to_s
103
+ return self.value()
104
+ end
105
+
106
+ # How we get a value for our resolution mechanism.
107
+ def value
108
+ result = nil
109
+ begin
110
+ Timeout.timeout(limit) do
111
+ if @code.is_a?(Proc)
112
+ result = @code.call()
113
+ else
114
+ result = Facter::Util::Resolution.exec(@code,@interpreter)
115
+ end
116
+ end
117
+ rescue Timeout::Error => detail
118
+ warn "Timed out seeking value for %s" % self.name
119
+ return nil
120
+ end
121
+
122
+ return nil if result == ""
123
+ return result
124
+ end
125
+ end
metadata CHANGED
@@ -1,33 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: facter
5
3
  version: !ruby/object:Gem::Version
6
- version: 1.3.8
7
- date: 2007-09-24 00:00:00 +02:00
8
- summary: Facter collects Operating system facts.
9
- require_paths:
10
- - lib
11
- email: dev@reductivelabs.com
12
- homepage: http://reductivelabs.com/projects/facter
13
- rubyforge_project: facter
14
- description: Facter is a module for collecting simple facts about a host Operating system.
15
- autorequire:
16
- default_executable: facter
17
- bindir: bin
18
- has_rdoc: false
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: "1.5"
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
- -
7
+ - Luke Kanies
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-07-08 00:00:00 +02:00
13
+ default_executable: facter
14
+ dependencies: []
15
+
16
+ description: Facter is a module for collecting simple facts about a host Operating system.
17
+ email: dev@reductivelabs.com
18
+ executables:
19
+ - facter
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
31
24
  files:
32
25
  - install.rb
33
26
  - COPYING
@@ -39,26 +32,75 @@ files:
39
32
  - CHANGELOG
40
33
  - bin/facter
41
34
  - lib/facter.rb
35
+ - lib/facter/lsb.rb
42
36
  - lib/facter/processor.rb
37
+ - lib/facter/id.rb
38
+ - lib/facter/operatingsystem.rb
39
+ - lib/facter/architecture.rb
40
+ - lib/facter/operatingsystemrelease.rb
41
+ - lib/facter/domain.rb
42
+ - lib/facter/uniqueid.rb
43
43
  - lib/facter/memory.rb
44
+ - lib/facter/hardwareisa.rb
45
+ - lib/facter/facterversion.rb
46
+ - lib/facter/ps.rb
47
+ - lib/facter/rubysitedir.rb
48
+ - lib/facter/hostname.rb
49
+ - lib/facter/iphostnumber.rb
50
+ - lib/facter/rubyversion.rb
51
+ - lib/facter/Cfkey.rb
52
+ - lib/facter/lsbmajdistrelease.rb
53
+ - lib/facter/hardwaremodel.rb
54
+ - lib/facter/macaddress.rb
55
+ - lib/facter/util/resolution.rb
56
+ - lib/facter/util/collection.rb
57
+ - lib/facter/util/confine.rb
58
+ - lib/facter/util/loader.rb
59
+ - lib/facter/util/memory.rb
60
+ - lib/facter/util/fact.rb
44
61
  - lib/facter/util/plist.rb
62
+ - lib/facter/util/macosx.rb
63
+ - lib/facter/util/ip.rb
45
64
  - lib/facter/util/plist/parser.rb
46
65
  - lib/facter/util/plist/generator.rb
66
+ - lib/facter/util/manufacturer.rb
67
+ - lib/facter/util/netmask.rb
68
+ - lib/facter/fqdn.rb
69
+ - lib/facter/ssh.rb
70
+ - lib/facter/ipaddress.rb
71
+ - lib/facter/puppetversion.rb
47
72
  - lib/facter/macosx.rb
73
+ - lib/facter/kernelrelease.rb
48
74
  - lib/facter/manufacturer.rb
75
+ - lib/facter/kernel.rb
49
76
  - lib/facter/ipmess.rb
77
+ - lib/facter/netmask.rb
50
78
  - etc/facter.conf
51
- test_files: []
52
-
79
+ has_rdoc: false
80
+ homepage: http://reductivelabs.com/projects/facter
81
+ post_install_message:
53
82
  rdoc_options: []
54
83
 
55
- extra_rdoc_files: []
56
-
57
- executables:
58
- - facter
59
- extensions: []
60
-
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: "0"
97
+ version:
61
98
  requirements: []
62
99
 
63
- dependencies: []
100
+ rubyforge_project: facter
101
+ rubygems_version: 1.0.1
102
+ signing_key:
103
+ specification_version: 2
104
+ summary: Facter collects Operating system facts.
105
+ test_files: []
64
106