facter 4.0.35 → 4.0.40

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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/bin/facter +3 -4
  3. data/lib/facter.rb +163 -23
  4. data/lib/facter/custom_facts/core/execution/base.rb +36 -6
  5. data/lib/facter/custom_facts/util/directory_loader.rb +13 -3
  6. data/lib/facter/custom_facts/util/fact.rb +4 -1
  7. data/lib/facter/fact_groups.conf +140 -1
  8. data/lib/facter/facts/aix/disks.rb +17 -2
  9. data/lib/facter/facts/aix/kernel.rb +1 -1
  10. data/lib/facter/facts/aix/kernelmajversion.rb +1 -1
  11. data/lib/facter/facts/aix/kernelrelease.rb +1 -1
  12. data/lib/facter/facts/aix/kernelversion.rb +1 -1
  13. data/lib/facter/facts/aix/networking/scope6.rb +3 -1
  14. data/lib/facter/facts/aix/os/release.rb +1 -1
  15. data/lib/facter/facts/aix/scope6_interfaces.rb +0 -2
  16. data/lib/facter/facts/aix/serialnumber.rb +20 -0
  17. data/lib/facter/facts/aix/sshalgorithmkey.rb +17 -0
  18. data/lib/facter/facts/aix/sshfp_algorithm.rb +20 -0
  19. data/lib/facter/facts/debian/os/distro/release.rb +6 -1
  20. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +17 -0
  21. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +20 -0
  22. data/lib/facter/facts/linux/cloud.rb +15 -0
  23. data/lib/facter/facts/linux/disks.rb +20 -1
  24. data/lib/facter/facts/linux/dmi/board/asset_tag.rb +19 -0
  25. data/lib/facter/facts/linux/ec2_metadata.rb +11 -6
  26. data/lib/facter/facts/linux/ec2_userdata.rb +7 -4
  27. data/lib/facter/facts/linux/gce.rb +16 -0
  28. data/lib/facter/facts/linux/is_virtual.rb +1 -3
  29. data/lib/facter/facts/linux/networking/scope6.rb +3 -1
  30. data/lib/facter/facts/linux/partitions.rb +1 -1
  31. data/lib/facter/facts/linux/processors/speed.rb +17 -0
  32. data/lib/facter/facts/linux/scope6_interfaces.rb +1 -2
  33. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  34. data/lib/facter/facts/linux/xen.rb +28 -0
  35. data/lib/facter/facts/macosx/networking/scope6.rb +3 -1
  36. data/lib/facter/facts/macosx/scope6_interfaces.rb +0 -2
  37. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  38. data/lib/facter/facts/rhel/os/release.rb +2 -2
  39. data/lib/facter/facts/solaris/disks.rb +21 -2
  40. data/lib/facter/facts/solaris/hypervisors/ldom.rb +24 -0
  41. data/lib/facter/facts/solaris/hypervisors/zone.rb +39 -0
  42. data/lib/facter/facts/solaris/is_virtual.rb +64 -0
  43. data/lib/facter/facts/solaris/kernelmajversion.rb +1 -1
  44. data/lib/facter/facts/solaris/ldom.rb +35 -0
  45. data/lib/facter/facts/solaris/sshalgorithmkey.rb +17 -0
  46. data/lib/facter/facts/solaris/sshfp_algorithm.rb +20 -0
  47. data/lib/facter/facts/solaris/virtual.rb +60 -0
  48. data/lib/facter/facts/solaris/zones.rb +1 -1
  49. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +23 -0
  50. data/lib/facter/facts/windows/ec2_metadata.rb +5 -3
  51. data/lib/facter/facts/windows/ec2_userdata.rb +5 -3
  52. data/lib/facter/facts/windows/gce.rb +16 -0
  53. data/lib/facter/facts/windows/networking/scope6.rb +3 -1
  54. data/lib/facter/facts/windows/sshalgorithmkey.rb +22 -0
  55. data/lib/facter/facts/windows/sshfp_algorithm.rb +25 -0
  56. data/lib/facter/facts_utils/facts_utils.rb +2 -0
  57. data/lib/facter/framework/benchmarking/timer.rb +23 -0
  58. data/lib/facter/framework/cli/cli.rb +86 -34
  59. data/lib/facter/framework/cli/cli_launcher.rb +34 -38
  60. data/lib/facter/framework/config/fact_groups.rb +36 -2
  61. data/lib/facter/framework/core/cache_manager.rb +30 -18
  62. data/lib/facter/framework/core/fact/internal/core_fact.rb +2 -0
  63. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +11 -25
  64. data/lib/facter/framework/core/fact_filter.rb +13 -0
  65. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +38 -12
  66. data/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb +7 -7
  67. data/lib/facter/framework/core/file_loader.rb +2 -0
  68. data/lib/facter/framework/core/options/config_file_options.rb +5 -3
  69. data/lib/facter/framework/core/options/option_store.rb +30 -11
  70. data/lib/facter/framework/core/session_cache.rb +1 -4
  71. data/lib/facter/framework/formatters/legacy_fact_formatter.rb +8 -1
  72. data/lib/facter/framework/formatters/yaml_fact_formatter.rb +1 -1
  73. data/lib/facter/framework/logging/logger.rb +3 -11
  74. data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
  75. data/lib/facter/resolvers/aio_agent_version.rb +0 -1
  76. data/lib/facter/resolvers/aix/architecture_resolver.rb +0 -1
  77. data/lib/facter/resolvers/aix/disks.rb +2 -3
  78. data/lib/facter/resolvers/aix/filesystem_resolver.rb +0 -1
  79. data/lib/facter/resolvers/aix/hardware_resolver.rb +0 -1
  80. data/lib/facter/resolvers/aix/load_averages_resolver.rb +0 -1
  81. data/lib/facter/resolvers/aix/memory.rb +2 -3
  82. data/lib/facter/resolvers/aix/mountpoints.rb +0 -1
  83. data/lib/facter/resolvers/aix/networking_resolver.rb +0 -1
  84. data/lib/facter/resolvers/aix/nim.rb +0 -1
  85. data/lib/facter/resolvers/aix/os_level.rb +27 -0
  86. data/lib/facter/resolvers/aix/partitions.rb +2 -3
  87. data/lib/facter/resolvers/aix/processors.rb +0 -1
  88. data/lib/facter/resolvers/aix/serialnumber.rb +36 -0
  89. data/lib/facter/resolvers/augeas_resolver.rb +0 -1
  90. data/lib/facter/resolvers/base_resolver.rb +9 -4
  91. data/lib/facter/resolvers/bsd/processors.rb +0 -1
  92. data/lib/facter/resolvers/cloud.rb +39 -0
  93. data/lib/facter/resolvers/containers.rb +0 -1
  94. data/lib/facter/resolvers/debian_version.rb +0 -1
  95. data/lib/facter/resolvers/disk_resolver.rb +0 -1
  96. data/lib/facter/resolvers/dmi_decode.rb +0 -1
  97. data/lib/facter/resolvers/dmi_resolver.rb +4 -4
  98. data/lib/facter/resolvers/ec2.rb +4 -19
  99. data/lib/facter/resolvers/eos_release_resolver.rb +0 -1
  100. data/lib/facter/resolvers/facterversion_resolver.rb +0 -1
  101. data/lib/facter/resolvers/filesystems_resolver.rb +0 -1
  102. data/lib/facter/resolvers/fips_enabled_resolver.rb +0 -1
  103. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +0 -1
  104. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +0 -1
  105. data/lib/facter/resolvers/freebsd/geom_resolver.rb +0 -1
  106. data/lib/facter/resolvers/freebsd/processors.rb +0 -1
  107. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +0 -1
  108. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +0 -1
  109. data/lib/facter/resolvers/gce.rb +53 -0
  110. data/lib/facter/resolvers/hostname_resolver.rb +0 -1
  111. data/lib/facter/resolvers/identity_resolver.rb +0 -1
  112. data/lib/facter/resolvers/linux/docker_uptime.rb +0 -1
  113. data/lib/facter/resolvers/linux/load_averages.rb +0 -1
  114. data/lib/facter/resolvers/load_averages.rb +0 -1
  115. data/lib/facter/resolvers/lpar_resolver.rb +0 -1
  116. data/lib/facter/resolvers/lsb_release_resolver.rb +0 -1
  117. data/lib/facter/resolvers/lspci.rb +0 -1
  118. data/lib/facter/resolvers/macosx/dmi_resolver.rb +0 -1
  119. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -6
  120. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +0 -1
  121. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +3 -3
  122. data/lib/facter/resolvers/macosx/processor_resolver.rb +0 -1
  123. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +0 -1
  124. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +0 -1
  125. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +0 -1
  126. data/lib/facter/resolvers/memory_resolver.rb +13 -2
  127. data/lib/facter/resolvers/mountpoints_resolver.rb +0 -1
  128. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -1
  129. data/lib/facter/resolvers/networking_resolver.rb +0 -1
  130. data/lib/facter/resolvers/open_vz.rb +0 -1
  131. data/lib/facter/resolvers/os_release_resolver.rb +0 -1
  132. data/lib/facter/resolvers/partitions.rb +37 -2
  133. data/lib/facter/resolvers/path_resolver.rb +0 -1
  134. data/lib/facter/resolvers/processors_resolver.rb +24 -3
  135. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -1
  136. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -1
  137. data/lib/facter/resolvers/ruby_resolver.rb +0 -1
  138. data/lib/facter/resolvers/selinux_resolver.rb +0 -1
  139. data/lib/facter/resolvers/solaris/disks.rb +0 -1
  140. data/lib/facter/resolvers/solaris/dmi.rb +0 -1
  141. data/lib/facter/resolvers/solaris/dmi_sparc.rb +0 -1
  142. data/lib/facter/resolvers/solaris/filesystems.rb +0 -1
  143. data/lib/facter/resolvers/solaris/ipaddress.rb +0 -1
  144. data/lib/facter/resolvers/solaris/ldom.rb +69 -0
  145. data/lib/facter/resolvers/solaris/memory.rb +0 -1
  146. data/lib/facter/resolvers/solaris/networking.rb +0 -1
  147. data/lib/facter/resolvers/solaris/os_release.rb +0 -1
  148. data/lib/facter/resolvers/solaris/processors.rb +0 -1
  149. data/lib/facter/resolvers/solaris/zone.rb +0 -1
  150. data/lib/facter/resolvers/solaris/zone_name.rb +0 -1
  151. data/lib/facter/resolvers/ssh_resolver.rb +0 -1
  152. data/lib/facter/resolvers/suse_release_resolver.rb +0 -1
  153. data/lib/facter/resolvers/sw_vers_resolver.rb +0 -1
  154. data/lib/facter/resolvers/timezone_resolver.rb +0 -1
  155. data/lib/facter/resolvers/uname_resolver.rb +0 -1
  156. data/lib/facter/resolvers/uptime_resolver.rb +0 -1
  157. data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
  158. data/lib/facter/resolvers/utils/http.rb +68 -0
  159. data/lib/facter/resolvers/virt_what.rb +0 -1
  160. data/lib/facter/resolvers/vmware.rb +0 -1
  161. data/lib/facter/resolvers/windows/aio_agent_version.rb +0 -1
  162. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +0 -1
  163. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +0 -1
  164. data/lib/facter/resolvers/windows/fips_resolver.rb +0 -1
  165. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +0 -1
  166. data/lib/facter/resolvers/windows/identity_resolver.rb +0 -1
  167. data/lib/facter/resolvers/windows/kernel_resolver.rb +0 -1
  168. data/lib/facter/resolvers/windows/memory_resolver.rb +0 -1
  169. data/lib/facter/resolvers/windows/netkvm_resolver.rb +0 -1
  170. data/lib/facter/resolvers/windows/networking_resolver.rb +0 -1
  171. data/lib/facter/resolvers/windows/processors_resolver.rb +0 -1
  172. data/lib/facter/resolvers/windows/product_release_resolver.rb +0 -1
  173. data/lib/facter/resolvers/windows/ssh.rb +0 -1
  174. data/lib/facter/resolvers/windows/system32_resolver.rb +0 -1
  175. data/lib/facter/resolvers/windows/uptime_resolver.rb +0 -1
  176. data/lib/facter/resolvers/windows/virtualization_resolver.rb +0 -1
  177. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +0 -1
  178. data/lib/facter/resolvers/wpar_resolver.rb +0 -1
  179. data/lib/facter/resolvers/xen.rb +28 -1
  180. data/lib/facter/resolvers/zfs.rb +0 -1
  181. data/lib/facter/resolvers/zpool.rb +0 -1
  182. data/lib/facter/version.rb +1 -1
  183. metadata +31 -4
  184. data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -26
  185. data/lib/facter/resolvers/os_level_resolver.rb +0 -29
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Facter
4
4
  class FactGroups
5
- attr_reader :groups, :block_list
5
+ attr_reader :groups, :block_list, :facts_ttls
6
6
 
7
7
  @groups_ttls = []
8
8
 
@@ -14,6 +14,10 @@ module Facter
14
14
  @groups ||= File.readable?(@groups_file_path) ? Hocon.load(@groups_file_path) : {}
15
15
  load_groups
16
16
  load_groups_from_options
17
+ load_facts_ttls
18
+
19
+ # Reverse sort facts so that children have precedence when caching. eg: os.macosx vs os
20
+ @facts_ttls = @facts_ttls.sort.reverse.to_h
17
21
  end
18
22
 
19
23
  # Breakes down blocked groups in blocked facts
@@ -31,6 +35,9 @@ module Facter
31
35
 
32
36
  # Get the group name a fact is part of
33
37
  def get_fact_group(fact_name)
38
+ fact = get_fact(fact_name)
39
+ return fact[:group] if fact
40
+
34
41
  @groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } }
35
42
  end
36
43
 
@@ -41,6 +48,15 @@ module Facter
41
48
  ttls_to_seconds(ttls[group_name])
42
49
  end
43
50
 
51
+ def get_fact(fact_name)
52
+ return @facts_ttls[fact_name] if @facts_ttls[fact_name]
53
+
54
+ result = @facts_ttls.select { |name, fact| break fact if fact_name =~ /^#{name}\..*/ }
55
+ return nil if result == {}
56
+
57
+ result
58
+ end
59
+
44
60
  private
45
61
 
46
62
  def load_groups_from_options
@@ -55,10 +71,28 @@ module Facter
55
71
  end
56
72
  end
57
73
 
74
+ def load_facts_ttls
75
+ @facts_ttls ||= {}
76
+ return if @groups_ttls == []
77
+
78
+ @groups_ttls.reduce(:merge).each do |group, ttls|
79
+ ttls = ttls_to_seconds(ttls)
80
+ if @groups[group]
81
+ @groups[group].each do |fact|
82
+ if (@facts_ttls[fact] && @facts_ttls[fact][:ttls] < ttls) || @facts_ttls[fact].nil?
83
+ @facts_ttls[fact] = { ttls: ttls, group: group }
84
+ end
85
+ end
86
+ else
87
+ @facts_ttls[group] = { ttls: ttls, group: group }
88
+ end
89
+ end
90
+ end
91
+
58
92
  def load_groups
59
93
  config = ConfigReader.init(Options[:config])
60
94
  @block_list = config.block_list || {}
61
- @groups_ttls = config.ttls || {}
95
+ @groups_ttls = config.ttls || []
62
96
  @groups.merge!(config.fact_groups) if config.fact_groups
63
97
  end
64
98
 
@@ -40,31 +40,42 @@ module Facter
40
40
  end
41
41
  end
42
42
 
43
- def group_cached?(group_name)
44
- cached = @fact_groups.get_group_ttls(group_name) ? true : false
45
- delete_cache(group_name) unless cached
43
+ def fact_cache_enabled?(fact_name)
44
+ fact = @fact_groups.get_fact(fact_name)
45
+ cached = if fact
46
+ !fact[:ttls].nil?
47
+ else
48
+ false
49
+ end
50
+
51
+ fact_group = @fact_groups.get_fact_group(fact_name)
52
+ delete_cache(fact_group) if fact_group && !cached
46
53
  cached
47
54
  end
48
55
 
49
56
  private
50
57
 
51
58
  def resolve_fact(searched_fact)
52
- group_name = if searched_fact.file
53
- searched_fact.name
54
- else
55
- @fact_groups.get_fact_group(searched_fact.name)
56
- end
59
+ return unless fact_cache_enabled?(searched_fact.name)
57
60
 
58
- return unless group_name
61
+ fact = if searched_fact.file
62
+ @fact_groups.get_fact(File.basename(searched_fact.file))
63
+ else
64
+ @fact_groups.get_fact(searched_fact.name)
65
+ end
59
66
 
60
- return unless group_cached?(group_name)
67
+ return unless fact
61
68
 
62
- return unless check_ttls?(group_name)
69
+ return unless check_ttls?(fact[:group], fact[:ttls])
63
70
 
64
- data = read_group_json(group_name)
71
+ read_fact(searched_fact, fact[:group])
72
+ end
73
+
74
+ def read_fact(searched_fact, fact_group)
75
+ data = read_group_json(fact_group)
65
76
  return unless data
66
77
 
67
- @log.debug("loading cached values for #{group_name} facts")
78
+ @log.debug("loading cached values for #{searched_fact.name} facts")
68
79
 
69
80
  create_facts(searched_fact, data)
70
81
  end
@@ -93,7 +104,7 @@ module Facter
93
104
  end
94
105
  return if !group_name || fact.value.nil?
95
106
 
96
- return unless group_cached?(group_name)
107
+ return unless fact_cache_enabled?(fact.name)
97
108
 
98
109
  @groups[group_name] ||= {}
99
110
  @groups[group_name][fact.name] = fact.value
@@ -106,10 +117,12 @@ module Facter
106
117
  end
107
118
 
108
119
  @groups.each do |group_name, data|
109
- next unless check_ttls?(group_name)
120
+ next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name))
110
121
 
111
- @log.debug("caching values for #{group_name} facts")
112
122
  cache_file_name = File.join(@cache_dir, group_name)
123
+ next if File.readable?(cache_file_name)
124
+
125
+ @log.debug("caching values for #{group_name} facts")
113
126
  File.write(cache_file_name, JSON.pretty_generate(data))
114
127
  end
115
128
  end
@@ -128,8 +141,7 @@ module Facter
128
141
  @groups[group_name] = data
129
142
  end
130
143
 
131
- def check_ttls?(group_name)
132
- ttls = @fact_groups.get_group_ttls(group_name)
144
+ def check_ttls?(group_name, ttls)
133
145
  return false unless ttls
134
146
 
135
147
  cache_file_name = File.join(@cache_dir, group_name)
@@ -9,6 +9,8 @@ module Facter
9
9
  def create
10
10
  fact_class = @searched_fact.fact_class
11
11
 
12
+ return unless fact_class
13
+
12
14
  fact_class.new.call_the_resolver
13
15
  end
14
16
  end
@@ -6,9 +6,8 @@ module Facter
6
6
 
7
7
  def resolve_facts(searched_facts)
8
8
  internal_searched_facts = filter_internal_facts(searched_facts)
9
- threads = start_threads(internal_searched_facts)
10
- resolved_facts = join_threads(threads, internal_searched_facts)
11
9
 
10
+ resolved_facts = resolve(internal_searched_facts)
12
11
  nil_resolved_facts = resolve_nil_facts(searched_facts)
13
12
 
14
13
  resolved_facts.concat(nil_resolved_facts)
@@ -29,36 +28,23 @@ module Facter
29
28
  resolved_facts
30
29
  end
31
30
 
32
- def start_threads(searched_facts)
33
- threads = []
34
- # only resolve a fact once, even if multiple search facts depend on that fact
31
+ def resolve(searched_facts)
32
+ resolved_facts = []
33
+
35
34
  searched_facts
36
35
  .uniq { |searched_fact| searched_fact.fact_class.name }
37
36
  .each do |searched_fact|
38
- threads << Thread.new do
39
- begin
40
- fact = CoreFact.new(searched_fact)
41
- fact.create
42
- rescue StandardError => e
43
- @@log.log_exception(e)
44
- nil
45
- end
37
+ begin
38
+ fact = CoreFact.new(searched_fact)
39
+ fact_value = nil
40
+ Facter::Framework::Benchmarking::Timer.measure(searched_fact.name) { fact_value = fact.create }
41
+ resolved_facts << fact_value unless fact_value.nil?
42
+ rescue StandardError => e
43
+ @@log.log_exception(e)
46
44
  end
47
45
  end
48
46
 
49
- threads
50
- end
51
-
52
- def join_threads(threads, searched_facts)
53
- resolved_facts = []
54
-
55
- threads.each do |thread|
56
- thread.join
57
- resolved_facts << thread.value unless thread.value.nil?
58
- end
59
-
60
47
  resolved_facts.flatten!
61
-
62
48
  FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
63
49
  end
64
50
  end
@@ -7,6 +7,8 @@ module Facter
7
7
  class FactFilter
8
8
  def filter_facts!(searched_facts)
9
9
  filter_legacy_facts!(searched_facts)
10
+ filter_blocked_legacy_facts!(searched_facts)
11
+
10
12
  searched_facts.each do |fact|
11
13
  fact.value = if fact.filter_tokens.any? && fact.value.respond_to?(:dig)
12
14
  fact.value.dig(*fact.filter_tokens)
@@ -18,6 +20,17 @@ module Facter
18
20
 
19
21
  private
20
22
 
23
+ # This will filter out the legacy facts that should be blocked. Because some legacy facts are just aliases
24
+ # to the core ones, even if they are blocked, facter will resolved them but they won't be displayed.
25
+
26
+ def filter_blocked_legacy_facts!(facts)
27
+ blocked_facts = Options[:blocked_facts] || []
28
+
29
+ facts.reject! do |fact|
30
+ blocked_facts.select { |blocked_fact| fact.name.match(/^#{blocked_fact}/) && fact.type == :legacy }.any?
31
+ end
32
+ end
33
+
21
34
  def filter_legacy_facts!(resolved_facts)
22
35
  return unless !Options[:show_legacy] && Options[:user_query].empty?
23
36
 
@@ -20,55 +20,81 @@ module Facter
20
20
 
21
21
  @facts = []
22
22
  @external_facts = []
23
- load_internal_facts(options)
24
- load_external_facts(options)
25
23
 
26
- @facts
24
+ @internal_facts = load_internal_facts(options)
25
+ @external_facts = load_external_facts(options)
26
+
27
+ @facts = @internal_facts + @external_facts
27
28
  end
28
29
 
29
30
  private
30
31
 
31
32
  def load_internal_facts(options)
32
33
  @log.debug('Loading internal facts')
34
+ internal_facts = []
33
35
 
34
36
  if options[:user_query] || options[:show_legacy]
35
37
  # if we have a user query, then we must search in core facts and legacy facts
36
38
  @log.debug('Loading all internal facts')
37
- @internal_facts = @internal_loader.facts
39
+ internal_facts = @internal_loader.facts
38
40
  else
39
41
  @log.debug('Load only core facts')
40
- @internal_facts = @internal_loader.core_facts
42
+ internal_facts = @internal_loader.core_facts
41
43
  end
42
44
 
43
- @internal_facts = block_facts(@internal_facts, options)
44
- @facts.concat(@internal_facts)
45
+ block_facts(internal_facts, options)
45
46
  end
46
47
 
47
48
  def load_external_facts(options)
48
49
  @log.debug('Loading external facts')
50
+ external_facts = []
51
+
49
52
  if options[:custom_facts]
50
53
  @log.debug('Loading custom facts')
51
- @external_facts.concat(@external_fact_loader.custom_facts)
54
+ external_facts += @external_fact_loader.custom_facts
52
55
  end
53
56
 
54
- @external_facts = block_facts(@external_facts, options)
57
+ external_facts = block_facts(external_facts, options)
55
58
 
56
59
  if options[:external_facts]
57
60
  @log.debug('Loading external facts')
58
- @external_facts.concat(@external_fact_loader.external_facts)
61
+ external_facts += @external_fact_loader.external_facts
59
62
  end
60
63
 
61
- @facts.concat(@external_facts)
64
+ external_facts
62
65
  end
63
66
 
64
67
  def block_facts(facts, options)
65
68
  blocked_facts = options[:blocked_facts] || []
66
69
 
70
+ reject_list_core, reject_list_legacy = construct_reject_lists(blocked_facts, facts)
71
+
67
72
  facts = facts.reject do |fact|
68
- blocked_facts.select { |blocked_fact| fact.name.match(/^#{blocked_fact}/) }.any?
73
+ reject_list_core.include?(fact) || reject_list_core.find do |fact_to_block|
74
+ fact_to_block.klass == fact.klass
75
+ end || reject_list_legacy.include?(fact)
69
76
  end
70
77
 
71
78
  facts
72
79
  end
80
+
81
+ def construct_reject_lists(blocked_facts, facts)
82
+ reject_list_core = []
83
+ reject_list_legacy = []
84
+
85
+ blocked_facts.each do |blocked|
86
+ facts.each do |fact|
87
+ next unless fact.name =~ /^#{blocked}/
88
+
89
+ if fact.type == :core
90
+ reject_list_core << fact
91
+ else
92
+ reject_list_legacy << fact
93
+ end
94
+ end
95
+ end
96
+
97
+ [reject_list_core, reject_list_legacy]
98
+ end
73
99
  end
74
100
  end
@@ -30,18 +30,18 @@ module Facter
30
30
  def load_for_os(operating_system)
31
31
  # select only classes
32
32
  classes = ClassDiscoverer.instance.discover_classes(operating_system)
33
-
34
33
  classes.each do |class_name|
35
34
  fact_name = class_name::FACT_NAME
36
-
37
35
  # if fact is already loaded, skip it
38
- next if @facts.any? { |fact| fact.name == fact_name }
39
-
40
- type = class_name.const_defined?('TYPE') ? class_name::TYPE : :core
41
- load_fact(fact_name, class_name, type)
36
+ unless @facts.any? { |fact| fact.name == fact_name }
37
+ type = class_name.const_defined?('TYPE') ? class_name::TYPE : :core
38
+ load_fact(fact_name, class_name, type)
39
+ end
42
40
  next unless class_name.const_defined?('ALIASES')
43
41
 
44
- [*class_name::ALIASES].each { |fact_alias| load_fact(fact_alias, class_name, :legacy) }
42
+ [*class_name::ALIASES].each do |fact_alias|
43
+ load_fact(fact_alias, class_name, :legacy) unless @facts.any? { |fact| fact.name == fact_alias }
44
+ end
45
45
  end
46
46
  end
47
47
 
@@ -39,6 +39,8 @@ load_dir(['resolvers'])
39
39
  load_dir(['facts_utils'])
40
40
  load_dir(%w[framework core])
41
41
  load_dir(['models'])
42
+ load_dir(%w[framework benchmarking])
43
+
42
44
  load_dir(%w[framework core fact_loaders])
43
45
  load_dir(%w[framework core fact internal])
44
46
  load_dir(%w[framework core fact external])
@@ -46,7 +46,9 @@ module Facter
46
46
  return unless file_global_conf
47
47
 
48
48
  if Options.cli?
49
- @options[:custom_facts] = !file_global_conf['no-custom-facts'] unless file_global_conf['no-custom-facts'].nil?
49
+ unless file_global_conf['no-custom-facts'].nil?
50
+ @options[:no_custom_facts] = file_global_conf['no-custom-facts']
51
+ end
50
52
  end
51
53
 
52
54
  @options[:custom_dir] = file_global_conf['custom-dir'] unless file_global_conf['custom-dir'].nil?
@@ -57,7 +59,7 @@ module Facter
57
59
  return unless global_conf
58
60
 
59
61
  if Options.cli?
60
- @options[:external_facts] = !global_conf['no-external-facts'] unless global_conf['no-external-facts'].nil?
62
+ @options[:no_external_facts] = global_conf['no-external-facts'] unless global_conf['no-external-facts'].nil?
61
63
  end
62
64
 
63
65
  @options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil?
@@ -67,7 +69,7 @@ module Facter
67
69
  def augment_ruby(global_conf)
68
70
  return unless global_conf
69
71
 
70
- @options[:ruby] = global_conf['no-ruby'].nil? ? true : !global_conf['no-ruby']
72
+ @options[:no_ruby] = global_conf['no-ruby'].nil? ? false : global_conf['no-ruby']
71
73
  end
72
74
 
73
75
  def augment_show_legacy(global_conf)
@@ -22,16 +22,17 @@ module Facter
22
22
  @user_query = []
23
23
  @block_list = {}
24
24
  @fact_groups = {}
25
- @color = false
25
+ @color = true
26
+ @timing = false
26
27
 
27
28
  class << self
28
- attr_reader :debug, :verbose, :log_level, :show_legacy, :ruby,
29
- :custom_facts, :blocked_facts
29
+ attr_reader :debug, :verbose, :log_level, :show_legacy,
30
+ :custom_facts, :blocked_facts, :ruby, :external_facts
30
31
 
31
- attr_accessor :config, :user_query, :strict, :json, :haml, :external_facts,
32
+ attr_accessor :config, :user_query, :strict, :json, :haml,
32
33
  :cache, :yaml, :puppet, :ttls, :block, :cli, :config_file_custom_dir,
33
34
  :config_file_external_dir, :default_external_dir, :fact_groups,
34
- :block_list, :color, :trace
35
+ :block_list, :color, :trace, :timing
35
36
 
36
37
  attr_writer :external_dir
37
38
 
@@ -44,16 +45,28 @@ module Facter
44
45
  options
45
46
  end
46
47
 
47
- def ruby=(bool)
48
- if bool == true
49
- @ruby = true
50
- else
48
+ def no_ruby=(bool)
49
+ if bool
51
50
  @ruby = false
52
51
  @custom_facts = false
53
52
  @blocked_facts << 'ruby'
53
+ else
54
+ @ruby = true
54
55
  end
55
56
  end
56
57
 
58
+ def no_block=(bool)
59
+ @block = !bool
60
+ end
61
+
62
+ def no_cache=(bool)
63
+ @cache = !bool
64
+ end
65
+
66
+ def no_color=(bool)
67
+ @color = !bool
68
+ end
69
+
57
70
  def external_dir
58
71
  return fallback_external_dir if @external_dir.empty? && @external_facts
59
72
 
@@ -98,8 +111,8 @@ module Facter
98
111
  end
99
112
  end
100
113
 
101
- def custom_facts=(bool)
102
- if bool == true
114
+ def no_custom_facts=(bool)
115
+ if bool == false
103
116
  @custom_facts = true
104
117
  @ruby = true
105
118
  else
@@ -107,6 +120,10 @@ module Facter
107
120
  end
108
121
  end
109
122
 
123
+ def no_external_facts=(bool)
124
+ @external_facts = !bool
125
+ end
126
+
110
127
  def log_level=(level)
111
128
  level = level.to_sym
112
129
  case level
@@ -155,10 +172,12 @@ module Facter
155
172
  @custom_facts = true
156
173
  @external_dir = []
157
174
  @default_external_dir = []
175
+ @config_file_external_dir = []
158
176
  @external_facts = true
159
177
  @blocked_facts = []
160
178
  @fact_groups = {}
161
179
  @block_list = {}
180
+ @timing = false
162
181
  end
163
182
 
164
183
  def fallback_external_dir