facter 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facter.rb +1 -1
  3. data/lib/facter/config.rb +2 -0
  4. data/lib/facter/custom_facts/core/execution/posix.rb +2 -2
  5. data/lib/facter/custom_facts/core/execution/windows.rb +1 -1
  6. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  7. data/lib/facter/custom_facts/util/windows_root.rb +2 -1
  8. data/lib/facter/facts/freebsd/is_virtual.rb +1 -5
  9. data/lib/facter/facts/freebsd/virtual.rb +1 -2
  10. data/lib/facter/facts/linux/az_metadata.rb +1 -5
  11. data/lib/facter/facts/linux/cloud/provider.rb +1 -5
  12. data/lib/facter/facts/linux/ec2_metadata.rb +1 -5
  13. data/lib/facter/facts/linux/ec2_userdata.rb +1 -5
  14. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -2
  15. data/lib/facter/facts/linux/is_virtual.rb +1 -5
  16. data/lib/facter/facts/linux/virtual.rb +1 -2
  17. data/lib/facter/facts/macosx/os/macosx/version.rb +6 -3
  18. data/lib/facter/facts/windows/az_metadata.rb +1 -1
  19. data/lib/facter/facts/windows/cloud/provider.rb +1 -1
  20. data/lib/facter/facts/windows/ec2_metadata.rb +1 -1
  21. data/lib/facter/facts/windows/ec2_userdata.rb +1 -1
  22. data/lib/facter/facts/windows/gce.rb +1 -1
  23. data/lib/facter/facts/windows/hypervisors/hyperv.rb +1 -1
  24. data/lib/facter/facts/windows/hypervisors/kvm.rb +2 -1
  25. data/lib/facter/facts/windows/hypervisors/virtualbox.rb +2 -2
  26. data/lib/facter/facts/windows/hypervisors/vmware.rb +1 -1
  27. data/lib/facter/facts/windows/hypervisors/xen.rb +3 -1
  28. data/lib/facter/facts/windows/is_virtual.rb +15 -0
  29. data/lib/facter/facts/windows/virtual.rb +15 -0
  30. data/lib/facter/framework/core/cache_manager.rb +2 -2
  31. data/lib/facter/framework/core/fact/external/external_fact_manager.rb +0 -1
  32. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +41 -39
  33. data/lib/facter/framework/core/fact_filter.rb +4 -14
  34. data/lib/facter/framework/core/file_loader.rb +1 -1
  35. data/lib/facter/framework/parsers/query_parser.rb +5 -12
  36. data/lib/facter/models/fact_collection.rb +20 -3
  37. data/lib/facter/models/resolved_fact.rb +2 -3
  38. data/lib/facter/models/searched_fact.rb +2 -3
  39. data/lib/facter/resolvers/linux/networking.rb +18 -0
  40. data/lib/facter/resolvers/mountpoints.rb +16 -8
  41. data/lib/facter/resolvers/partitions.rb +1 -1
  42. data/lib/facter/resolvers/ruby.rb +1 -1
  43. data/lib/facter/resolvers/windows/ffi/identity_ffi.rb +5 -0
  44. data/lib/facter/resolvers/windows/identity.rb +1 -6
  45. data/lib/facter/resolvers/windows/virtualization.rb +46 -44
  46. data/lib/facter/resolvers/xen.rb +6 -1
  47. data/lib/facter/util/facts/posix/virtual_detector.rb +74 -0
  48. data/lib/facter/util/linux/if_inet6.rb +73 -0
  49. data/lib/facter/version.rb +1 -1
  50. metadata +26 -9
  51. data/lib/facter/facts/windows/virtualization/is_virtual.rb +0 -17
  52. data/lib/facter/facts/windows/virtualization/virtual.rb +0 -17
  53. data/lib/facter/framework/core/fact_augmenter.rb +0 -54
  54. data/lib/facter/util/facts/virtual_detector.rb +0 -83
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a6ca2540a7ccad083604f2a0a1142cd0e870714dae635dc2fd8d60baa1b1bcbf
4
- data.tar.gz: 25cec4e7c98a145d3950dd8c345ae04ee2bdc1b04ae78b08acb1674678c24d64
3
+ metadata.gz: 9921e9c05d22c7fe9c84a9061a374dd9b31b2f7a28bfa292a62fd0e33ec7eb16
4
+ data.tar.gz: 44606e1ec31a336cb71971be5b6c21138f0d33b88d023bb71955526550a54fd2
5
5
  SHA512:
6
- metadata.gz: e43bf9233eca175b442b0cbda693efcae3f3b0f1e370b9b9ef5bca1c81a9450e4bfc3000d957463cbf49900abc6bf9769ba9664cc6750c17f58ad8abd4cf9730
7
- data.tar.gz: 47c5a45dd7dfc505cda3d71634258ed7c7ca13e24ee6858219d89480f9b260e278cd8b602a59501a24ec61a7fcb62f1b929330cc5c4b54d34b13718b818280d5
6
+ metadata.gz: c01cbeb07ac105bbcfcd41598a818962dae3634a72b24f5e850c9dd8b0410c31d52eef1553d9fcc2f3111166d24cba5cb8ae129c3470a1c67a9fc8be12a669cf
7
+ data.tar.gz: d53fe66fd09af1c5d73a3789160a38c236eacf45e43a5096357ab5eb719dcff38d251e8e29dab09a1763d0e2056909977758453e9fb0a272a229f30d70d85ba1
data/lib/facter.rb CHANGED
@@ -555,7 +555,7 @@ module Facter
555
555
  begin
556
556
  value = fact_collection.value(user_query)
557
557
  add_fact_to_searched_facts(user_query, value)
558
- rescue KeyError
558
+ rescue KeyError, TypeError
559
559
  nil
560
560
  end
561
561
  end
data/lib/facter/config.rb CHANGED
@@ -166,6 +166,7 @@ module Facter
166
166
  macosx_productversion
167
167
  macosx_productversion_major
168
168
  macosx_productversion_minor
169
+ macosx_productversion_patch
169
170
  windows_edition_id
170
171
  windows_installation_type
171
172
  windows_product_name
@@ -301,6 +302,7 @@ module Facter
301
302
  'macosx_productversion',
302
303
  'macosx_productversion_major',
303
304
  'macosx_productversion_minor',
305
+ 'macosx_productversion_patch',
304
306
  'manufacturer',
305
307
  'memoryfree',
306
308
  'memoryfree_mb',
@@ -29,8 +29,8 @@ module Facter
29
29
  !!(path =~ ABSOLUTE_PATH_REGEX)
30
30
  end
31
31
 
32
- DOUBLE_QUOTED_COMMAND = /^"(.+?)"(?:\s+(.*))?/.freeze
33
- SINGLE_QUOTED_COMMAND = /^'(.+?)'(?:\s+(.*))?/.freeze
32
+ DOUBLE_QUOTED_COMMAND = /\A"(.+?)"(?:\s+(.*))?/.freeze
33
+ SINGLE_QUOTED_COMMAND = /\A'(.+?)'(?:\s+(.*))?/.freeze
34
34
 
35
35
  def expand_command(command)
36
36
  exe = nil
@@ -38,7 +38,7 @@ module Facter
38
38
  !!(path =~ ABSOLUTE_PATH_REGEX)
39
39
  end
40
40
 
41
- DOUBLE_QUOTED_COMMAND = /^"(.+?)"(?:\s+(.*))?/.freeze
41
+ DOUBLE_QUOTED_COMMAND = /\A"(.+?)"(?:\s+(.*))?/.freeze
42
42
 
43
43
  def expand_command(command)
44
44
  exe = nil
@@ -63,7 +63,7 @@ module LegacyFacter
63
63
  Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\
64
64
  'there are at least two external facts files with the same filename'))
65
65
  else
66
- searched_fact = Facter::SearchedFact.new(basename, nil, [], nil, :file)
66
+ searched_fact = Facter::SearchedFact.new(basename, nil, nil, :file)
67
67
  searched_fact.file = file
68
68
  facts << searched_fact
69
69
  end
@@ -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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Windows
5
+ class Virtual
6
+ FACT_NAME = 'virtual'
7
+
8
+ def call_the_resolver
9
+ fact_value = Facter::Resolvers::Windows::Virtualization.resolve(:virtual)
10
+
11
+ Facter::ResolvedFact.new(FACT_NAME, fact_value)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -123,7 +123,7 @@ cache_format_version is incorrect!")
123
123
  return unless data[searched_fact.name]
124
124
 
125
125
  [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type,
126
- searched_fact.user_query, searched_fact.filter_tokens)]
126
+ searched_fact.user_query)]
127
127
  end
128
128
  end
129
129
 
@@ -133,7 +133,7 @@ cache_format_version is incorrect!")
133
133
  next if fact_name == 'cache_format_version'
134
134
 
135
135
  fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type,
136
- searched_fact.user_query, searched_fact.filter_tokens)
136
+ searched_fact.user_query)
137
137
  fact.file = searched_fact.file
138
138
  facts << fact
139
139
  end
@@ -19,7 +19,6 @@ module Facter
19
19
  custom_facts.each do |custom_fact|
20
20
  fact = LegacyFacter[custom_fact.name]
21
21
  resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom)
22
- resolved_fact.filter_tokens = []
23
22
  resolved_fact.user_query = custom_fact.user_query
24
23
  resolved_fact.file = fact.options[:file]
25
24
 
@@ -2,20 +2,25 @@
2
2
 
3
3
  module Facter
4
4
  class InternalFactManager
5
- @@log = Facter::Log.new(self)
6
-
5
+ # resolves each SearchFact and filter out facts that do not match the given user query
6
+ # @param searched_facts [Array<Facter::SearchedFact>] array of searched facts
7
+ #
8
+ # @return [Array<Facter::ResolvedFact>]
9
+ #
10
+ # @api private
7
11
  def resolve_facts(searched_facts)
8
12
  internal_searched_facts = filter_internal_facts(searched_facts)
9
-
10
13
  resolved_facts = if Options[:sequential]
11
- @@log.debug('Resolving facts sequentially')
14
+ log.debug('Resolving facts sequentially')
12
15
  resolve_sequentially(internal_searched_facts)
13
16
  else
14
- @@log.debug('Resolving fact in parallel')
15
- threads = start_threads(internal_searched_facts)
16
- join_threads(threads, internal_searched_facts)
17
+ log.debug('Resolving fact in parallel')
18
+ resolve_in_parallel(internal_searched_facts)
17
19
  end
18
20
 
21
+ resolved_facts.flatten!
22
+ resolved_facts.compact!
23
+
19
24
  nil_resolved_facts = resolve_nil_facts(searched_facts)
20
25
 
21
26
  resolved_facts.concat(nil_resolved_facts)
@@ -27,6 +32,17 @@ module Facter
27
32
  searched_facts.select { |searched_fact| %i[core legacy].include? searched_fact.type }
28
33
  end
29
34
 
35
+ def valid_fact?(searched_fact, resolved_fact)
36
+ return if resolved_fact.value.nil?
37
+
38
+ searched_fact_name = searched_fact.name
39
+ if searched_fact_name.include?('.*')
40
+ resolved_fact.name.match(searched_fact_name)
41
+ else
42
+ resolved_fact.name == searched_fact_name
43
+ end
44
+ end
45
+
30
46
  def resolve_nil_facts(searched_facts)
31
47
  resolved_facts = []
32
48
  searched_facts.select { |fact| fact.type == :nil }.each do |fact|
@@ -37,49 +53,35 @@ module Facter
37
53
  end
38
54
 
39
55
  def resolve_sequentially(searched_facts)
40
- resolved_facts = []
41
-
42
- searched_facts
43
- .uniq { |searched_fact| searched_fact.fact_class.name }
44
- .each do |searched_fact|
45
- begin
46
- fact = CoreFact.new(searched_fact)
47
- fact_value = fact.create
48
- resolved_facts << fact_value unless fact_value.nil?
49
- rescue StandardError => e
50
- @@log.log_exception(e)
51
- end
52
- end
56
+ searched_facts.map! { |searched_fact| resolve_fact(searched_fact) }
57
+ end
53
58
 
54
- resolved_facts.flatten!
55
- FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
59
+ def resolve_in_parallel(searched_facts)
60
+ searched_facts.map! do |searched_fact|
61
+ Thread.new { resolve_fact(searched_fact) }
62
+ end.map!(&:value)
56
63
  end
57
64
 
58
- def start_threads(searched_facts)
59
- # only resolve a fact once, even if multiple search facts depend on that fact
60
- searched_facts
61
- .uniq { |searched_fact| searched_fact.fact_class.name }
62
- .map do |searched_fact|
63
- Thread.new do
64
- resolve_fact(searched_fact)
65
+ def resolve_fact(searched_fact)
66
+ fact_value = core_fact(searched_fact)
67
+ Array(fact_value).map! do |resolved_fact|
68
+ if valid_fact?(searched_fact, resolved_fact)
69
+ resolved_fact.user_query = searched_fact.user_query
70
+ resolved_fact
65
71
  end
66
72
  end
67
73
  end
68
74
 
69
- def join_threads(threads, searched_facts)
70
- resolved_facts = threads.map(&:value)
71
- resolved_facts.compact!
72
- resolved_facts.flatten!
73
-
74
- FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
75
- end
76
-
77
- def resolve_fact(searched_fact)
75
+ def core_fact(searched_fact)
78
76
  fact = CoreFact.new(searched_fact)
79
77
  fact.create
80
78
  rescue StandardError => e
81
- @@log.log_exception(e)
79
+ log.log_exception(e)
82
80
  nil
83
81
  end
82
+
83
+ def log
84
+ @log ||= Facter::Log.new(self)
85
+ end
84
86
  end
85
87
  end