facter 1.5 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (41) hide show
  1. data/CHANGELOG +51 -1
  2. data/Rakefile +10 -1
  3. data/conf/osx/PackageInfo.plist +36 -0
  4. data/conf/osx/createpackage.sh +167 -0
  5. data/conf/osx/preflight +11 -0
  6. data/conf/redhat/facter.spec +120 -0
  7. data/conf/solaris/pkginfo +7 -0
  8. data/documentation/custom.page +22 -0
  9. data/documentation/index.page +19 -0
  10. data/install.rb +227 -92
  11. data/lib/facter.rb +1 -1
  12. data/lib/facter/domain.rb +14 -0
  13. data/lib/facter/hardwaremodel.rb +8 -0
  14. data/lib/facter/ipaddress.rb +21 -2
  15. data/lib/facter/ipmess.rb +8 -37
  16. data/lib/facter/kernel.rb +7 -1
  17. data/lib/facter/kernelrelease.rb +16 -1
  18. data/lib/facter/kernelversion.rb +5 -0
  19. data/lib/facter/lsb.rb +1 -0
  20. data/lib/facter/macaddress.rb +15 -1
  21. data/lib/facter/operatingsystem.rb +6 -1
  22. data/lib/facter/operatingsystemrelease.rb +34 -7
  23. data/lib/facter/puppetversion.rb +1 -1
  24. data/lib/facter/util/ip.rb +37 -47
  25. data/lib/facter/util/manufacturer.rb +2 -2
  26. data/lib/facter/util/resolution.rb +13 -3
  27. data/lib/facter/virtual.rb +62 -0
  28. data/spec/Rakefile +18 -0
  29. data/spec/integration/facter.rb +27 -0
  30. data/spec/spec.opts +3 -0
  31. data/spec/spec_helper.rb +25 -0
  32. data/spec/unit/data/linux_ifconfig_all_with_single_interface +18 -0
  33. data/spec/unit/data/solaris_ifconfig_single_interface +3 -0
  34. data/spec/unit/facter.rb +134 -0
  35. data/spec/unit/util/collection.rb +255 -0
  36. data/spec/unit/util/confine.rb +75 -0
  37. data/spec/unit/util/fact.rb +129 -0
  38. data/spec/unit/util/ip.rb +40 -0
  39. data/spec/unit/util/loader.rb +219 -0
  40. data/spec/unit/util/resolution.rb +209 -0
  41. metadata +31 -2
data/lib/facter/domain.rb CHANGED
@@ -62,3 +62,17 @@ Facter.add(:domain) do
62
62
  end
63
63
  end
64
64
  end
65
+ Facter.add(:domain) do
66
+ confine :kernel => :windows
67
+ setcode do
68
+ require 'win32ole'
69
+ domain = ""
70
+ wmi = WIN32OLE.connect("winmgmts://")
71
+ query = "select DNSDomain from Win32_NetworkAdapterConfiguration where IPEnabled = True"
72
+ wmi.ExecQuery(query).each { |nic|
73
+ domain = nic.DNSDomain
74
+ break
75
+ }
76
+ domain
77
+ end
78
+ end
@@ -11,3 +11,11 @@ Facter.add(:hardwaremodel) do
11
11
  end
12
12
  end
13
13
  end
14
+
15
+ Facter.add(:hardwaremodel) do
16
+ confine :operatingsystem => :windows
17
+ setcode do
18
+ require 'rbconfig'
19
+ Config::CONFIG['host_cpu']
20
+ end
21
+ end
@@ -1,4 +1,4 @@
1
- Facter.add(:ipaddress, :ldapname => "iphostnumber") do
1
+ Facter.add(:ipaddress, :ldapname => "iphostnumber", :timeout => 2) do
2
2
  setcode do
3
3
  require 'resolv'
4
4
 
@@ -19,7 +19,7 @@ Facter.add(:ipaddress, :ldapname => "iphostnumber") do
19
19
  end
20
20
  end
21
21
 
22
- Facter.add(:ipaddress) do
22
+ Facter.add(:ipaddress, :timeout => 2) do
23
23
  setcode do
24
24
  if hostname = Facter.value(:hostname)
25
25
  # we need Hostname to exist for this to work
@@ -149,3 +149,22 @@ Facter.add(:ipaddress) do
149
149
  ip
150
150
  end
151
151
  end
152
+
153
+ Facter.add(:ipaddress) do
154
+ confine :kernel => %w{windows}
155
+ setcode do
156
+ ip = nil
157
+ output = %x{ipconfig}
158
+
159
+ output.split(/^\S/).each { |str|
160
+ if str =~ /IP Address.*: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
161
+ tmp = $1
162
+ unless tmp =~ /127\./
163
+ ip = tmp
164
+ break
165
+ end
166
+ end
167
+ }
168
+ ip
169
+ end
170
+ end
data/lib/facter/ipmess.rb CHANGED
@@ -15,61 +15,32 @@ Facter.add(:interfaces) do
15
15
  end
16
16
 
17
17
  case Facter.value(:kernel)
18
- when 'SunOS', 'Linux'
18
+ when 'SunOS', 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD'
19
19
  Facter::IPAddress.get_interfaces.each do |interface|
20
- mi = interface.gsub(':', '_')
20
+ mi = interface.gsub('/:|\./', '_')
21
21
 
22
22
  Facter.add("ipaddress_" + mi) do
23
- confine :kernel => [ :sunos, :linux ]
23
+ confine :kernel => [ :sunos, :freebsd, :openbsd, :netbsd, :linux ]
24
24
  setcode do
25
25
  label = 'ipaddress'
26
- Facter::IPAddress.get_interface_value_nonbsd(interface, label)
26
+ Facter::IPAddress.get_interface_value(interface, label)
27
27
  end
28
28
  end
29
29
 
30
30
  Facter.add("macaddress_" + mi) do
31
- confine :kernel => [ :sunos, :linux ]
31
+ confine :kernel => [ :sunos, :freebsd, :openbsd, :netbsd, :linux ]
32
32
  setcode do
33
33
  label = 'macaddress'
34
- Facter::IPAddress.get_interface_value_nonbsd(interface, label)
34
+ Facter::IPAddress.get_interface_value(interface, label)
35
35
  end
36
36
  end
37
37
 
38
38
  Facter.add("netmask_" + mi) do
39
- confine :kernel => [ :sunos, :linux ]
39
+ confine :kernel => [ :sunos, :freebsd, :openbsd, :netbsd, :linux ]
40
40
  setcode do
41
41
  label = 'netmask'
42
- Facter::IPAddress.get_interface_value_nonbsd(interface, label)
42
+ Facter::IPAddress.get_interface_value(interface, label)
43
43
  end
44
44
  end
45
45
  end
46
-
47
- when 'OpenBSD', 'NetBSD', 'FreeBSD'
48
- Facter::IPAddress.get_interfaces.each do |interface|
49
- mi = interface.gsub(':', '_')
50
-
51
- Facter.add("ipaddress_" + mi) do
52
- confine :kernel => [ :openbsd, :freebsd, :netbsd ]
53
- setcode do
54
- label = 'ipaddress'
55
- Facter::IPAddress.get_interface_value_bsd(interface, label)
56
- end
57
- end
58
-
59
- Facter.add("netmask_" + mi) do
60
- confine :kernel => [ :openbsd, :freebsd, :netbsd ]
61
- setcode do
62
- label = 'netmask'
63
- Facter::IPAddress.get_interface_value_bsd(interface, label)
64
- end
65
- end
66
-
67
- Facter.add("macaddress_" + mi) do
68
- confine :kernel => [ :openbsd, :freebsd, :netbsd ]
69
- setcode do
70
- label = 'macaddress'
71
- Facter::IPAddress.get_interface_value_bsd(interface, label)
72
- end
73
- end
74
- end
75
46
  end
data/lib/facter/kernel.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  Facter.add(:kernel) do
2
- setcode 'uname -s'
2
+ setcode do
3
+ require 'rbconfig'
4
+ case Config::CONFIG['host_os']
5
+ when /mswin/i then 'windows'
6
+ else Facter::Util::Resolution.exec("uname -s")
7
+ end
8
+ end
3
9
  end
@@ -2,7 +2,22 @@ Facter.add(:kernelrelease) do
2
2
  setcode 'uname -r'
3
3
  end
4
4
 
5
- Facter.add(:kernelrelease, :timeout => 5) do
5
+ Facter.add(:kernelrelease) do
6
6
  confine :kernel => :aix
7
7
  setcode 'oslevel -s'
8
8
  end
9
+
10
+ Facter.add(:kernelrelease) do
11
+ confine :kernel => %{windows}
12
+ setcode do
13
+ require 'win32ole'
14
+ version = ""
15
+ connection_string = "winmgmts://./root/cimv2"
16
+ wmi = WIN32OLE.connect(connection_string)
17
+ wmi.ExecQuery("SELECT Version from Win32_OperatingSystem").each { |ole|
18
+ version = "#{ole.Version}"
19
+ break
20
+ }
21
+ version
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ Facter.add("kernelversion") do
2
+ setcode do
3
+ Facter['kernelrelease'].value.split('-')[0]
4
+ end
5
+ end
data/lib/facter/lsb.rb CHANGED
@@ -20,6 +20,7 @@
20
20
  "LSBDistCodeName" => %r{^Codename:\t(.*)$}
21
21
  }.each do |fact, pattern|
22
22
  Facter.add(fact) do
23
+ confine :kernel => :linux
23
24
  setcode do
24
25
  unless defined?(@@lsbdata) and defined?(@@lsbtime) and (Time.now.to_i - @@lsbtime.to_i < 5)
25
26
  type = nil
@@ -1,5 +1,5 @@
1
1
  Facter.add(:macaddress) do
2
- confine :operatingsystem => %w{Solaris Linux Fedora RedHat CentOS SuSE Debian Gentoo}
2
+ confine :operatingsystem => %w{Solaris Linux Fedora RedHat CentOS SuSE Debian Gentoo Ubuntu}
3
3
  setcode do
4
4
  ether = []
5
5
  output = %x{/sbin/ifconfig -a}
@@ -63,3 +63,17 @@ Facter.add(:macaddress) do
63
63
  ether[0]
64
64
  end
65
65
  end
66
+
67
+ Facter.add(:macaddress) do
68
+ confine :kernel => %w(windows)
69
+ setcode do
70
+ ether = []
71
+ output = %x{ipconfig /all}
72
+ output.split(/\r\n/).each do |str|
73
+ if str =~ /.*Physical Address.*: (\w{1,2}-\w{1,2}-\w{1,2}-\w{1,2}-\w{1,2}-\w{1,2})/
74
+ ether.push($1.gsub(/-/, ":"))
75
+ end
76
+ end
77
+ ether[0]
78
+ end
79
+ end
@@ -26,7 +26,12 @@ Facter.add(:operatingsystem) do
26
26
  "RedHat"
27
27
  end
28
28
  elsif FileTest.exists?("/etc/SuSE-release")
29
- "SuSE"
29
+ txt = File.read("/etc/SuSE-release")
30
+ if txt =~ /^SUSE LINUX Enterprise Server/i
31
+ "SLES"
32
+ else
33
+ "SuSE"
34
+ end
30
35
  end
31
36
  end
32
37
  end
@@ -29,11 +29,11 @@ end
29
29
  Facter.add(:operatingsystemrelease) do
30
30
  confine :operatingsystem => %w{CentOS}
31
31
  setcode do
32
- centosrelease = Facter::Util::Resolution.exec('cat /etc/redhat-release | sed -e \'s/CentOS release//g\' -e \'s/(Final)//g\'')
33
- if centosrelease =~ /^5^/
32
+ centos_release = Facter::Util::Resolution.exec("sed -r -e 's/CentOS release //' -e 's/ \((Branch|Final)\)//' /etc/redhat-release")
33
+ if centos_release =~ /5/
34
34
  release = Facter::Util::Resolution.exec('rpm -q --qf \'%{VERSION}.%{RELEASE}\' centos-release | cut -d. -f1,2')
35
35
  else
36
- release = Facter::Util::Resolution.exec('cat /etc/redhat-release | sed -e \'s/CentOS release//g\' -e \'s/(Final)//g\'')
36
+ release = centos_release
37
37
  end
38
38
  end
39
39
  end
@@ -41,10 +41,7 @@ end
41
41
  Facter.add(:operatingsystemrelease) do
42
42
  confine :operatingsystem => %w{Debian}
43
43
  setcode do
44
- release = Facter::Util::Resolution.exec('cat /proc/version')
45
- if release =~ /\(Debian (\d+.\d+).\d+-\d+\)/
46
- $1
47
- end
44
+ release = Facter::Util::Resolution.exec('cat /etc/debian_version')
48
45
  end
49
46
  end
50
47
 
@@ -58,6 +55,36 @@ Facter.add(:operatingsystemrelease) do
58
55
  end
59
56
  end
60
57
 
58
+ Facter.add(:operatingsystemrelease) do
59
+ confine :operatingsystem => %w{SLES}
60
+ setcode do
61
+ releasefile = Facter::Util::Resolution.exec('cat /etc/SuSE-release')
62
+ if releasefile =~ /^VERSION\s*=\s*(\d+)/
63
+ releasemajor = $1
64
+ if releasefile =~ /^PATCHLEVEL\s*=\s*(\d+)/
65
+ releaseminor = $1
66
+ else
67
+ releaseminor = 0
68
+ end
69
+ releasemajor + "." + releaseminor
70
+ else
71
+ "unknown"
72
+ end
73
+ end
74
+ end
75
+
76
+ Facter.add(:operatingsystemrelease) do
77
+ confine :operatingsystem => %w{Solaris}
78
+ setcode do
79
+ full_release = File.readlines("/etc/release").to_s.match(/Solaris \w+ [\w\/]+ ([^_]+_[^_]+)/).to_a.last.chomp("wos")
80
+ if full_release =~ /^s(\d+)\w(_\w\d)+/
81
+ $1 + $2
82
+ else
83
+ full_release
84
+ end
85
+ end
86
+ end
87
+
61
88
  Facter.add(:operatingsystemrelease) do
62
89
  setcode do Facter[:kernelrelease].value end
63
90
  end
@@ -1,4 +1,4 @@
1
- Facter.add(:puppetversion, :timeout => 1.5) do
1
+ Facter.add(:puppetversion) do
2
2
  setcode {
3
3
  begin
4
4
  require 'puppet'
@@ -4,13 +4,8 @@ module Facter::IPAddress
4
4
 
5
5
  int = nil
6
6
 
7
- case Facter.value(:kernel)
8
- when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD'
9
- output = %x{/sbin/ifconfig -a}
10
- when 'SunOS'
11
- output = %x{/usr/sbin/ifconfig -a}
12
- end
13
-
7
+ output = Facter::IPAddress.get_all_interface_output()
8
+
14
9
  # We get lots of warnings on platforms that don't get an output
15
10
  # made.
16
11
  if output
@@ -20,24 +15,43 @@ module Facter::IPAddress
20
15
  end
21
16
 
22
17
  end
18
+
19
+ def self.get_all_interface_output
20
+ case Facter.value(:kernel)
21
+ when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD'
22
+ output = %x{/sbin/ifconfig -a}
23
+ when 'SunOS'
24
+ output = %x{/usr/sbin/ifconfig -a}
25
+ end
26
+ output
27
+ end
28
+
29
+ def self.get_single_interface_output(interface)
30
+ output = ""
31
+ case Facter.value(:kernel)
32
+ when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD'
33
+ output = %x{/sbin/ifconfig #{interface}}
34
+ when 'SunOS'
35
+ output = %x{/usr/sbin/ifconfig #{interface}}
36
+ end
37
+ output
38
+ end
39
+
40
+
41
+ def self.get_interface_value(interface, label)
23
42
 
24
- def self.get_interface_value_nonbsd(interface, label)
25
-
26
- tmp1 = nil
43
+ tmp1 = []
27
44
 
28
45
  case Facter.value(:kernel)
29
46
  when 'Linux'
30
- output_int = %x{/sbin/ifconfig #{interface}}
31
47
  addr = /inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
32
48
  mac = /(?:ether|HWaddr)\s+(\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2})/
33
49
  mask = /Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
34
50
  when 'OpenBSD', 'NetBSD', 'FreeBSD'
35
- output_int = %x{/sbin/ifconfig #{interface}}
36
51
  addr = /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
37
52
  mac = /(?:ether|lladdr)\s+(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)/
38
53
  mask = /netmask\s+(\w{10})/
39
54
  when 'SunOS'
40
- output_int = %x{/usr/sbin/ifconfig #{interface}}
41
55
  addr = /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
42
56
  mac = /(?:ether|lladdr)\s+(\w?\w:\w?\w:\w?\w:\w?\w:\w?\w:\w?\w)/
43
57
  mask = /netmask\s+(\w{8})/
@@ -51,48 +65,24 @@ module Facter::IPAddress
51
65
  when 'netmask'
52
66
  regex = mask
53
67
  end
68
+
69
+ output_int = get_single_interface_output(interface)
54
70
 
55
71
  if interface != "lo" && interface != "lo0"
56
72
  output_int.each { |s|
57
- tmp1 = $1 if s =~ regex
73
+ if s =~ regex
74
+ value = $1
75
+ if label == 'netmask' && Facter.value(:kernel) == "SunOS"
76
+ value = value.scan(/../).collect do |byte| byte.to_i(16) end.join('.')
77
+ end
78
+ tmp1.push(value)
79
+ end
58
80
  }
59
81
  end
60
82
 
61
83
  if tmp1
62
- value = tmp1
84
+ value = tmp1.shift
63
85
  end
64
86
 
65
87
  end
66
-
67
- def self.get_interface_value_bsd(interface, label)
68
-
69
- tmp1 = []
70
-
71
- int_hash = {}
72
- output_int = %x{/sbin/ifconfig #{interface}}
73
- addr = /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/
74
- mac = /(?:ether|lladdr)\s+(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)/
75
- mask = /netmask\s+(\w{10})/
76
-
77
- case label
78
- when 'ipaddress'
79
- regex = addr
80
- when 'macaddress'
81
- regex = mac
82
- when 'netmask'
83
- regex = mask
84
- end
85
-
86
- if interface != "lo" && interface != "lo0"
87
- output_int.each { |s|
88
- tmp1.push($1) if s =~ regex
89
- }
90
- end
91
-
92
- if tmp1
93
- value = tmp1.shift
94
- end
95
-
96
- end
97
88
  end
98
-
@@ -22,8 +22,8 @@ module Facter::Manufacturer
22
22
  name.each_pair do |key,v|
23
23
  v.each do |value|
24
24
  output.split("Handle").each do |line|
25
- if line =~ /#{key}/ and line =~ /#{value} (\w.*)\n*./
26
- result = $1
25
+ if line =~ /#{key}/ and line =~ /#{value} ([-\w].*)\n*./
26
+ result = $1
27
27
  Facter.add(value.chomp(':').gsub(' ','')) do
28
28
  confine :kernel => [ :linux, :freebsd, :netbsd, :openbsd ]
29
29
  setcode do
@@ -6,14 +6,19 @@
6
6
  require 'facter/util/confine'
7
7
 
8
8
  require 'timeout'
9
+ require 'rbconfig'
9
10
 
10
11
  class Facter::Util::Resolution
11
12
  attr_accessor :interpreter, :code, :name, :timeout
12
13
 
13
14
  def self.have_which
14
15
  if ! defined?(@have_which) or @have_which.nil?
15
- %x{which which 2>/dev/null}
16
- @have_which = ($? == 0)
16
+ if Config::CONFIG['host_os'] =~ /mswin/
17
+ @have_which = false
18
+ else
19
+ %x{which which 2>/dev/null}
20
+ @have_which = ($? == 0)
21
+ end
17
22
  end
18
23
  @have_which
19
24
  end
@@ -62,7 +67,7 @@ class Facter::Util::Resolution
62
67
  @name = name
63
68
  @confines = []
64
69
  @value = nil
65
- @timeout = 0.5
70
+ @timeout = 0
66
71
  end
67
72
 
68
73
  # Return the number of confines.
@@ -116,6 +121,11 @@ class Facter::Util::Resolution
116
121
  end
117
122
  rescue Timeout::Error => detail
118
123
  warn "Timed out seeking value for %s" % self.name
124
+
125
+ # This call avoids zombies -- basically, create a thread that will
126
+ # dezombify all of the child processes that we're ignoring because
127
+ # of the timeout.
128
+ Thread.new { Process.waitall }
119
129
  return nil
120
130
  end
121
131