facter 4.0.35 → 4.0.40

Sign up to get free protection for your applications and to get access to all the features.
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