facter 4.1.1 → 4.2.3

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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +202 -0
  3. data/lib/facter.rb +11 -17
  4. data/lib/facter/config.rb +2 -0
  5. data/lib/facter/custom_facts/core/execution/posix.rb +2 -2
  6. data/lib/facter/custom_facts/core/execution/windows.rb +1 -1
  7. data/lib/facter/custom_facts/core/file_loader.rb +0 -1
  8. data/lib/facter/custom_facts/core/legacy_facter.rb +0 -2
  9. data/lib/facter/custom_facts/core/resolvable.rb +1 -1
  10. data/lib/facter/custom_facts/util/collection.rb +6 -4
  11. data/lib/facter/custom_facts/util/confine.rb +9 -3
  12. data/lib/facter/custom_facts/util/directory_loader.rb +19 -7
  13. data/lib/facter/custom_facts/util/fact.rb +12 -10
  14. data/lib/facter/custom_facts/util/loader.rb +5 -1
  15. data/lib/facter/custom_facts/util/parser.rb +8 -2
  16. data/lib/facter/custom_facts/util/resolution.rb +5 -1
  17. data/lib/facter/custom_facts/util/windows_root.rb +2 -1
  18. data/lib/facter/facts/freebsd/is_virtual.rb +1 -5
  19. data/lib/facter/facts/freebsd/virtual.rb +1 -2
  20. data/lib/facter/facts/linux/az_metadata.rb +1 -5
  21. data/lib/facter/facts/linux/cloud/provider.rb +1 -5
  22. data/lib/facter/facts/linux/ec2_metadata.rb +1 -5
  23. data/lib/facter/facts/linux/ec2_userdata.rb +1 -5
  24. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -2
  25. data/lib/facter/facts/linux/is_virtual.rb +1 -5
  26. data/lib/facter/facts/linux/virtual.rb +1 -2
  27. data/lib/facter/facts/macosx/os/macosx/version.rb +6 -3
  28. data/lib/facter/facts/windows/az_metadata.rb +1 -1
  29. data/lib/facter/facts/windows/cloud/provider.rb +1 -1
  30. data/lib/facter/facts/windows/ec2_metadata.rb +1 -1
  31. data/lib/facter/facts/windows/ec2_userdata.rb +1 -1
  32. data/lib/facter/facts/windows/gce.rb +1 -1
  33. data/lib/facter/facts/windows/hypervisors/hyperv.rb +1 -1
  34. data/lib/facter/facts/windows/hypervisors/kvm.rb +2 -1
  35. data/lib/facter/facts/windows/hypervisors/virtualbox.rb +2 -2
  36. data/lib/facter/facts/windows/hypervisors/vmware.rb +1 -1
  37. data/lib/facter/facts/windows/hypervisors/xen.rb +3 -1
  38. data/lib/facter/facts/windows/is_virtual.rb +15 -0
  39. data/lib/facter/facts/windows/virtual.rb +15 -0
  40. data/lib/facter/framework/cli/cli.rb +13 -15
  41. data/lib/facter/framework/core/cache_manager.rb +2 -2
  42. data/lib/facter/framework/core/fact/external/external_fact_manager.rb +0 -1
  43. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +39 -39
  44. data/lib/facter/framework/core/fact_filter.rb +4 -14
  45. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +0 -1
  46. data/lib/facter/framework/core/fact_manager.rb +11 -0
  47. data/lib/facter/framework/core/file_loader.rb +1 -1
  48. data/lib/facter/framework/logging/logger.rb +61 -0
  49. data/lib/facter/framework/parsers/query_parser.rb +6 -16
  50. data/lib/facter/models/fact_collection.rb +20 -3
  51. data/lib/facter/models/resolved_fact.rb +2 -3
  52. data/lib/facter/models/searched_fact.rb +2 -3
  53. data/lib/facter/resolvers/ec2.rb +8 -1
  54. data/lib/facter/resolvers/linux/networking.rb +18 -1
  55. data/lib/facter/resolvers/lsb_release.rb +1 -2
  56. data/lib/facter/resolvers/mountpoints.rb +16 -8
  57. data/lib/facter/resolvers/networking.rb +3 -1
  58. data/lib/facter/resolvers/os_release.rb +7 -4
  59. data/lib/facter/resolvers/partitions.rb +1 -3
  60. data/lib/facter/resolvers/ruby.rb +1 -1
  61. data/lib/facter/resolvers/windows/ffi/identity_ffi.rb +5 -0
  62. data/lib/facter/resolvers/windows/ffi/kernel_ffi.rb +1 -1
  63. data/lib/facter/resolvers/windows/identity.rb +1 -6
  64. data/lib/facter/resolvers/windows/virtualization.rb +46 -44
  65. data/lib/facter/resolvers/xen.rb +6 -1
  66. data/lib/facter/util/facts/posix/virtual_detector.rb +74 -0
  67. data/lib/facter/util/linux/dhcp.rb +4 -1
  68. data/lib/facter/util/linux/if_inet6.rb +73 -0
  69. data/lib/facter/util/linux/socket_parser.rb +17 -2
  70. data/lib/facter/version.rb +1 -1
  71. metadata +48 -11
  72. data/lib/facter/custom_facts/core/logging.rb +0 -203
  73. data/lib/facter/facts/windows/virtualization/is_virtual.rb +0 -17
  74. data/lib/facter/facts/windows/virtualization/virtual.rb +0 -17
  75. data/lib/facter/framework/core/fact_augmenter.rb +0 -54
  76. data/lib/facter/util/facts/virtual_detector.rb +0 -83
@@ -47,8 +47,6 @@ module Facter
47
47
  @used_resolution_weight = 0
48
48
 
49
49
  @value = nil
50
-
51
- @log = Facter::Log.new(self)
52
50
  end
53
51
 
54
52
  # Adds a new {Facter::Util::Resolution resolution}. This requires a
@@ -87,8 +85,8 @@ module Facter
87
85
 
88
86
  resolve
89
87
  rescue StandardError => e
90
- LegacyFacter
91
- .log_exception(e, "Unable to add resolve #{resolution_name.inspect} for fact #{@name}: #{e.message}")
88
+ log.log_exception("Unable to add resolve #{resolution_name.inspect} for fact #{@name}: #{e.message}")
89
+ nil
92
90
  end
93
91
 
94
92
  # Retrieve an existing resolution by name
@@ -122,7 +120,7 @@ module Facter
122
120
  return @value if @value
123
121
 
124
122
  if @resolves.empty?
125
- LegacyFacter.debug format('No resolves for %<name>s', name: @name)
123
+ log.debug format('No resolves for %<name>s', name: @name)
126
124
  return nil
127
125
  end
128
126
 
@@ -147,12 +145,16 @@ module Facter
147
145
  def extract_ldapname_option!(options)
148
146
  return unless options[:ldapname]
149
147
 
150
- LegacyFacter.warnonce('ldapname is deprecated and will be removed in a future version')
148
+ log.warnonce('ldapname is deprecated and will be removed in a future version')
151
149
  self.ldapname = options.delete(:ldapname)
152
150
  end
153
151
 
154
152
  private
155
153
 
154
+ def log
155
+ @log ||= Facter::Log.new(self)
156
+ end
157
+
156
158
  def resolve_value
157
159
  return Facter.core_value(name) if @value.nil?
158
160
 
@@ -222,18 +224,18 @@ module Facter
222
224
 
223
225
  def log_fact_path(resolve)
224
226
  fact = resolve.fact
225
- @log.debug("#{resolve.fact_type} fact #{fact.name} got resolved from: #{fact.location}")
227
+ log.debug("#{resolve.fact_type} fact #{fact.name} got resolved from: #{fact.location}")
226
228
  end
227
229
 
228
230
  def announce_when_no_suitable_resolution(resolutions)
229
231
  return unless resolutions.empty?
230
232
 
231
- LegacyFacter.debug format('Found no suitable resolves of %<resolver_length> for %<name>s',
232
- resolver_length: @resolves.length, name: @name)
233
+ log.debug format('Found no suitable resolves of %<resolver_length> for %<name>s',
234
+ resolver_length: @resolves.length, name: @name)
233
235
  end
234
236
 
235
237
  def announce_when_no_value_found(value)
236
- LegacyFacter.debug(format('value for %<name>s is still nil', name: @name)) if value.nil?
238
+ log.debug(format('value for %<name>s is still nil', name: @name)) if value.nil?
237
239
  end
238
240
 
239
241
  def create_or_return_resolution(resolution_name, resolution_type)
@@ -78,7 +78,7 @@ module LegacyFacter
78
78
  if valid_search_path?(path)
79
79
  search_paths << path
80
80
  else
81
- LegacyFacter.warn "Excluding #{path} from search path. Fact file paths must be an absolute directory"
81
+ log.debug "Excluding #{path} from search path. Fact file paths must be an absolute directory"
82
82
  end
83
83
  end
84
84
 
@@ -89,6 +89,10 @@ module LegacyFacter
89
89
 
90
90
  private
91
91
 
92
+ def log
93
+ @log ||= Facter::Log.new(self)
94
+ end
95
+
92
96
  # Validate that the given path is valid, ie it is an absolute path.
93
97
  #
94
98
  # @api private
@@ -137,11 +137,17 @@ module LegacyFacter
137
137
  if LegacyFacter.json?
138
138
  JSON.parse(content)
139
139
  else
140
- LegacyFacter.warnonce "Cannot parse JSON data file #{filename} without the json library."
141
- LegacyFacter.warnonce 'Suggested next step is `gem install json` to install the json library.'
140
+ log.warnonce "Cannot parse JSON data file #{filename} without the json library."
141
+ log.warnonce 'Suggested next step is `gem install json` to install the json library.'
142
142
  nil
143
143
  end
144
144
  end
145
+
146
+ private
147
+
148
+ def log
149
+ @log ||= Facter::Log.new(self)
150
+ end
145
151
  end
146
152
 
147
153
  register(JsonParser) do |filename|
@@ -91,7 +91,7 @@ module Facter
91
91
  msg = "Already evaluated #{@name}"
92
92
  msg << " at #{@last_evaluated}" if msg.is_a? String
93
93
  msg << ', reevaluating anyways'
94
- LegacyFacter.warn msg
94
+ log.warn msg
95
95
  end
96
96
 
97
97
  instance_eval(&block)
@@ -171,6 +171,10 @@ module Facter
171
171
 
172
172
  private
173
173
 
174
+ def log
175
+ @log ||= Facter::Log.new(self)
176
+ end
177
+
174
178
  # If the weights are equal, we consider external facts greater tan custom facts
175
179
  def compare_equal_weights(other)
176
180
  # Other is considered greater because self is custom fact and other is external
@@ -4,7 +4,8 @@ module LegacyFacter
4
4
  module Util
5
5
  module Root
6
6
  def self.root?
7
- Facter::Resolvers::Identity.resolve(:privileged)
7
+ require 'facter/resolvers/windows/ffi/identity_ffi'
8
+ IdentityFFI.privileged?
8
9
  end
9
10
  end
10
11
  end
@@ -5,12 +5,8 @@ module Facts
5
5
  class IsVirtual
6
6
  FACT_NAME = 'is_virtual'
7
7
 
8
- def initialize
9
- @virtual = Facter::Util::Facts::VirtualDetector.new
10
- end
11
-
12
8
  def call_the_resolver
13
- fact_value = @virtual.platform
9
+ fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform
14
10
 
15
11
  Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value))
16
12
  end
@@ -7,12 +7,11 @@ module Facts
7
7
 
8
8
  def initialize
9
9
  @log = Facter::Log.new(self)
10
- @virtual = Facter::Util::Facts::VirtualDetector.new
11
10
  end
12
11
 
13
12
  def call_the_resolver
14
13
  @log.debug('FreeBSD Virtual Resolver')
15
- fact_value = @virtual.platform
14
+ fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform
16
15
  @log.debug("Fact value is: #{fact_value}")
17
16
 
18
17
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
@@ -5,10 +5,6 @@ module Facts
5
5
  class AzMetadata
6
6
  FACT_NAME = 'az_metadata'
7
7
 
8
- def initialize
9
- @virtual = Facter::Util::Facts::VirtualDetector.new
10
- end
11
-
12
8
  def call_the_resolver
13
9
  return Facter::ResolvedFact.new(FACT_NAME, nil) unless azure_hypervisor?
14
10
 
@@ -20,7 +16,7 @@ module Facts
20
16
  private
21
17
 
22
18
  def azure_hypervisor?
23
- @virtual.platform == 'hyperv'
19
+ Facter::Util::Facts::Posix::VirtualDetector.platform == 'hyperv'
24
20
  end
25
21
  end
26
22
  end
@@ -6,12 +6,8 @@ module Facts
6
6
  class Provider
7
7
  FACT_NAME = 'cloud.provider'
8
8
 
9
- def initialize
10
- @virtual = Facter::Util::Facts::VirtualDetector.new
11
- end
12
-
13
9
  def call_the_resolver
14
- provider = case @virtual.platform
10
+ provider = case Facter::Util::Facts::Posix::VirtualDetector.platform
15
11
  when 'hyperv'
16
12
  'azure' unless Facter::Resolvers::Az.resolve(:metadata).empty?
17
13
  end
@@ -5,10 +5,6 @@ module Facts
5
5
  class Ec2Metadata
6
6
  FACT_NAME = 'ec2_metadata'
7
7
 
8
- def initialize
9
- @virtual = Facter::Util::Facts::VirtualDetector.new
10
- end
11
-
12
8
  def call_the_resolver
13
9
  return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors?
14
10
 
@@ -20,7 +16,7 @@ module Facts
20
16
  private
21
17
 
22
18
  def aws_hypervisors?
23
- @virtual.platform =~ /kvm|xen|aws/
19
+ Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/
24
20
  end
25
21
  end
26
22
  end
@@ -5,10 +5,6 @@ module Facts
5
5
  class Ec2Userdata
6
6
  FACT_NAME = 'ec2_userdata'
7
7
 
8
- def initialize
9
- @virtual = Facter::Util::Facts::VirtualDetector.new
10
- end
11
-
12
8
  def call_the_resolver
13
9
  return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors?
14
10
 
@@ -20,7 +16,7 @@ module Facts
20
16
  private
21
17
 
22
18
  def aws_hypervisors?
23
- @virtual.platform =~ /kvm|xen|aws/
19
+ Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/
24
20
  end
25
21
  end
26
22
  end
@@ -8,7 +8,6 @@ module Facts
8
8
 
9
9
  def initialize
10
10
  @log = Facter::Log.new(self)
11
- @virtual = Facter::Util::Facts::VirtualDetector.new
12
11
  end
13
12
 
14
13
  def call_the_resolver
@@ -29,7 +28,7 @@ module Facts
29
28
  private
30
29
 
31
30
  def xen?
32
- @virtual.platform =~ /xen/
31
+ Facter::Util::Facts::Posix::VirtualDetector.platform =~ /xen/
33
32
  end
34
33
 
35
34
  def hvm?
@@ -5,12 +5,8 @@ module Facts
5
5
  class IsVirtual
6
6
  FACT_NAME = 'is_virtual'
7
7
 
8
- def initialize
9
- @virtual = Facter::Util::Facts::VirtualDetector.new
10
- end
11
-
12
8
  def call_the_resolver
13
- fact_value = @virtual.platform
9
+ fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform
14
10
 
15
11
  Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value))
16
12
  end
@@ -7,12 +7,11 @@ module Facts
7
7
 
8
8
  def initialize
9
9
  @log = Facter::Log.new(self)
10
- @virtual = Facter::Util::Facts::VirtualDetector.new
11
10
  end
12
11
 
13
12
  def call_the_resolver
14
13
  @log.debug('Linux Virtual Resolver')
15
- fact_value = @virtual.platform
14
+ fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform
16
15
  @log.debug("Fact value is: #{fact_value}")
17
16
 
18
17
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
@@ -6,7 +6,8 @@ module Facts
6
6
  module Macosx
7
7
  class Version
8
8
  FACT_NAME = 'os.macosx.version'
9
- ALIASES = %w[macosx_productversion macosx_productversion_major macosx_productversion_minor].freeze
9
+ ALIASES = %w[macosx_productversion macosx_productversion_major macosx_productversion_minor
10
+ macosx_productversion_patch].freeze
10
11
 
11
12
  def call_the_resolver
12
13
  fact_value = Facter::Resolvers::SwVers.resolve(:productversion)
@@ -15,7 +16,8 @@ module Facts
15
16
  [Facter::ResolvedFact.new(FACT_NAME, ver),
16
17
  Facter::ResolvedFact.new(ALIASES[0], fact_value, :legacy),
17
18
  Facter::ResolvedFact.new(ALIASES[1], ver['major'], :legacy),
18
- Facter::ResolvedFact.new(ALIASES[2], ver['minor'], :legacy)]
19
+ Facter::ResolvedFact.new(ALIASES[2], ver['minor'], :legacy),
20
+ Facter::ResolvedFact.new(ALIASES[3], ver['patch'], :legacy)]
19
21
  end
20
22
 
21
23
  def version_hash(fact_value)
@@ -23,7 +25,8 @@ module Facts
23
25
  if versions[0] == '10'
24
26
  { 'full' => fact_value, 'major' => "#{versions[0]}.#{versions[1]}", 'minor' => versions[-1] }
25
27
  else
26
- { 'full' => fact_value, 'major' => versions[0], 'minor' => "#{versions[1]}.#{versions[-1]}" }
28
+ { 'full' => fact_value, 'major' => versions[0], 'minor' => versions.fetch(1, '0'),
29
+ 'patch' => versions.fetch(2, '0') }
27
30
  end
28
31
  end
29
32
  end
@@ -16,7 +16,7 @@ module Facts
16
16
  private
17
17
 
18
18
  def azure_hypervisor?
19
- Facter::Resolvers::Virtualization.resolve(:virtual) == 'hyperv'
19
+ Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'hyperv'
20
20
  end
21
21
  end
22
22
  end
@@ -7,7 +7,7 @@ module Facts
7
7
  FACT_NAME = 'cloud.provider'
8
8
 
9
9
  def call_the_resolver
10
- virtual = Facter::Resolvers::Virtualization.resolve(:virtual)
10
+ virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual)
11
11
  provider = case virtual
12
12
  when 'hyperv'
13
13
  'azure' unless Facter::Resolvers::Az.resolve(:metadata).empty?
@@ -16,7 +16,7 @@ module Facts
16
16
  private
17
17
 
18
18
  def aws_hypervisors?
19
- virtual = Facter::Resolvers::Virtualization.resolve(:virtual)
19
+ virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual)
20
20
 
21
21
  virtual == 'kvm' || virtual =~ /xen/
22
22
  end
@@ -16,7 +16,7 @@ module Facts
16
16
  private
17
17
 
18
18
  def aws_hypervisors?
19
- virtual = Facter::Resolvers::Virtualization.resolve(:virtual)
19
+ virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual)
20
20
 
21
21
  virtual == 'kvm' || virtual =~ /xen/
22
22
  end
@@ -6,7 +6,7 @@ module Facts
6
6
  FACT_NAME = 'gce'
7
7
 
8
8
  def call_the_resolver
9
- virtualization = Facter::Resolvers::Virtualization.resolve(:virtual)
9
+ virtualization = Facter::Resolvers::Windows::Virtualization.resolve(:virtual)
10
10
 
11
11
  fact_value = virtualization&.include?('gce') ? Facter::Resolvers::Gce.resolve(:metadata) : nil
12
12
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
@@ -15,7 +15,7 @@ module Facts
15
15
  private
16
16
 
17
17
  def hyperv?
18
- Facter::Resolvers::Virtualization.resolve(:virtual) == 'hyperv' ||
18
+ Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'hyperv' ||
19
19
  Facter::Resolvers::DMIBios.resolve(:manufacturer).include?('Microsoft')
20
20
  end
21
21
  end
@@ -17,7 +17,8 @@ module Facts
17
17
  def kvm?
18
18
  product_name = Facter::Resolvers::DMIComputerSystem.resolve(:name)
19
19
 
20
- (Facter::Resolvers::Virtualization.resolve(:virtual) == 'kvm' || Facter::Resolvers::NetKVM.resolve(:kvm)) &&
20
+ (Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'kvm' ||
21
+ Facter::Resolvers::NetKVM.resolve(:kvm)) &&
21
22
  product_name != 'VirtualBox' && !product_name.match(/^Parallels/)
22
23
  end
23
24
 
@@ -15,12 +15,12 @@ module Facts
15
15
  private
16
16
 
17
17
  def virtualbox?
18
- Facter::Resolvers::Virtualization.resolve(:virtual) == 'virtualbox' ||
18
+ Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'virtualbox' ||
19
19
  Facter::Resolvers::DMIComputerSystem.resolve(:name) == 'VirtualBox'
20
20
  end
21
21
 
22
22
  def populate_version_and_revision
23
- oem_strings = Facter::Resolvers::Virtualization.resolve(:oem_strings)
23
+ oem_strings = Facter::Resolvers::Windows::Virtualization.resolve(:oem_strings)
24
24
  return unless oem_strings
25
25
 
26
26
  version = revision = ''
@@ -15,7 +15,7 @@ module Facts
15
15
  private
16
16
 
17
17
  def vmware?
18
- Facter::Resolvers::Virtualization.resolve(:virtual) == 'vmware' ||
18
+ Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'vmware' ||
19
19
  Facter::Resolvers::DMIBios.resolve(:manufacturer) == 'VMware, Inc.'
20
20
  end
21
21
  end
@@ -7,7 +7,9 @@ module Facts
7
7
  FACT_NAME = 'hypervisors.xen'
8
8
 
9
9
  def call_the_resolver
10
- fact_value = { context: hvm? ? 'hvm' : 'pv' } if Facter::Resolvers::Virtualization.resolve(:virtual) == 'xen'
10
+ if Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'xen'
11
+ fact_value = { context: hvm? ? 'hvm' : 'pv' }
12
+ end
11
13
 
12
14
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
13
15
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Windows
5
+ class IsVirtual
6
+ FACT_NAME = 'is_virtual'
7
+
8
+ def call_the_resolver
9
+ fact_value = Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)
10
+
11
+ Facter::ResolvedFact.new(FACT_NAME, fact_value)
12
+ end
13
+ end
14
+ end
15
+ end