facter 4.0.41 → 4.0.47

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 (269) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate.rb +32 -0
  3. data/lib/docs/template.erb +34 -0
  4. data/lib/facter.rb +110 -25
  5. data/lib/facter/config.rb +386 -0
  6. data/lib/facter/custom_facts/core/aggregate.rb +51 -17
  7. data/lib/facter/custom_facts/core/execution.rb +54 -38
  8. data/lib/facter/custom_facts/core/execution/base.rb +46 -40
  9. data/lib/facter/custom_facts/util/collection.rb +1 -2
  10. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  11. data/lib/facter/custom_facts/util/fact.rb +19 -2
  12. data/lib/facter/custom_facts/util/loader.rb +1 -1
  13. data/lib/facter/custom_facts/util/parser.rb +17 -3
  14. data/lib/facter/custom_facts/util/resolution.rb +41 -12
  15. data/lib/facter/facts/aix/interfaces.rb +1 -0
  16. data/lib/facter/facts/aix/memory/swap/available.rb +1 -1
  17. data/lib/facter/facts/aix/memory/swap/available_bytes.rb +1 -1
  18. data/lib/facter/facts/aix/memory/swap/total.rb +1 -1
  19. data/lib/facter/facts/aix/memory/swap/total_bytes.rb +1 -1
  20. data/lib/facter/facts/aix/memory/swap/used.rb +1 -1
  21. data/lib/facter/facts/aix/memory/system/available.rb +1 -1
  22. data/lib/facter/facts/aix/memory/system/available_bytes.rb +1 -1
  23. data/lib/facter/facts/aix/memory/system/total.rb +1 -1
  24. data/lib/facter/facts/aix/memory/system/total_bytes.rb +1 -1
  25. data/lib/facter/facts/aix/memory/system/used.rb +1 -1
  26. data/lib/facter/facts/aix/processors/speed.rb +1 -1
  27. data/lib/facter/facts/bsd/processors/speed.rb +1 -1
  28. data/lib/facter/facts/freebsd/is_virtual.rb +25 -0
  29. data/lib/facter/facts/freebsd/memory/swap/available.rb +1 -1
  30. data/lib/facter/facts/freebsd/memory/swap/available_bytes.rb +1 -1
  31. data/lib/facter/facts/freebsd/memory/swap/total.rb +1 -1
  32. data/lib/facter/facts/freebsd/memory/swap/total_bytes.rb +1 -1
  33. data/lib/facter/facts/freebsd/memory/swap/used.rb +1 -1
  34. data/lib/facter/facts/freebsd/memory/system/available.rb +1 -1
  35. data/lib/facter/facts/freebsd/memory/system/available_bytes.rb +1 -1
  36. data/lib/facter/facts/freebsd/memory/system/total.rb +1 -1
  37. data/lib/facter/facts/freebsd/memory/system/total_bytes.rb +1 -1
  38. data/lib/facter/facts/freebsd/memory/system/used.rb +1 -1
  39. data/lib/facter/facts/freebsd/processors/speed.rb +1 -1
  40. data/lib/facter/facts/freebsd/virtual.rb +22 -0
  41. data/lib/facter/facts/linux/dhcp_servers.rb +1 -0
  42. data/lib/facter/facts/linux/ec2_metadata.rb +1 -1
  43. data/lib/facter/facts/linux/ec2_userdata.rb +1 -1
  44. data/lib/facter/facts/linux/hypervisors/kvm.rb +1 -1
  45. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -1
  46. data/lib/facter/facts/linux/interfaces.rb +1 -0
  47. data/lib/facter/facts/linux/is_virtual.rb +2 -2
  48. data/lib/facter/facts/linux/memory/swap/available.rb +1 -1
  49. data/lib/facter/facts/linux/memory/swap/available_bytes.rb +1 -1
  50. data/lib/facter/facts/linux/memory/swap/total.rb +1 -1
  51. data/lib/facter/facts/linux/memory/swap/total_bytes.rb +1 -1
  52. data/lib/facter/facts/linux/memory/swap/used.rb +1 -1
  53. data/lib/facter/facts/linux/memory/system/available.rb +1 -1
  54. data/lib/facter/facts/linux/memory/system/available_bytes.rb +1 -1
  55. data/lib/facter/facts/linux/memory/system/total.rb +1 -1
  56. data/lib/facter/facts/linux/memory/system/total_bytes.rb +1 -1
  57. data/lib/facter/facts/linux/memory/system/used.rb +1 -1
  58. data/lib/facter/facts/linux/processors/speed.rb +1 -1
  59. data/lib/facter/facts/linux/virtual.rb +1 -1
  60. data/lib/facter/facts/macosx/dhcp_servers.rb +1 -0
  61. data/lib/facter/facts/macosx/interfaces.rb +1 -0
  62. data/lib/facter/facts/macosx/memory/swap/available.rb +1 -1
  63. data/lib/facter/facts/macosx/memory/swap/available_bytes.rb +1 -1
  64. data/lib/facter/facts/macosx/memory/swap/total.rb +1 -1
  65. data/lib/facter/facts/macosx/memory/swap/total_bytes.rb +1 -1
  66. data/lib/facter/facts/macosx/memory/swap/used.rb +1 -1
  67. data/lib/facter/facts/macosx/memory/system/available.rb +1 -1
  68. data/lib/facter/facts/macosx/memory/system/available_bytes.rb +1 -1
  69. data/lib/facter/facts/macosx/memory/system/total.rb +1 -1
  70. data/lib/facter/facts/macosx/memory/system/total_bytes.rb +1 -1
  71. data/lib/facter/facts/macosx/memory/system/used.rb +1 -1
  72. data/lib/facter/facts/macosx/processors/speed.rb +1 -1
  73. data/lib/facter/facts/rhel/os/release.rb +1 -1
  74. data/lib/facter/facts/solaris/dhcp_servers.rb +1 -0
  75. data/lib/facter/facts/solaris/hypervisors/ldom.rb +3 -0
  76. data/lib/facter/facts/solaris/interfaces.rb +1 -0
  77. data/lib/facter/facts/solaris/is_virtual.rb +2 -2
  78. data/lib/facter/facts/solaris/ldom.rb +34 -4
  79. data/lib/facter/facts/solaris/memory/swap/available.rb +1 -1
  80. data/lib/facter/facts/solaris/memory/swap/available_bytes.rb +1 -1
  81. data/lib/facter/facts/solaris/memory/swap/total.rb +1 -1
  82. data/lib/facter/facts/solaris/memory/swap/total_bytes.rb +1 -1
  83. data/lib/facter/facts/solaris/memory/swap/used.rb +1 -1
  84. data/lib/facter/facts/solaris/memory/system/available.rb +1 -1
  85. data/lib/facter/facts/solaris/memory/system/available_bytes.rb +1 -1
  86. data/lib/facter/facts/solaris/memory/system/total.rb +1 -1
  87. data/lib/facter/facts/solaris/memory/system/total_bytes.rb +1 -1
  88. data/lib/facter/facts/solaris/memory/system/used.rb +1 -1
  89. data/lib/facter/facts/solaris/processors/speed.rb +1 -1
  90. data/lib/facter/facts/solaris/virtual.rb +1 -1
  91. data/lib/facter/facts/solaris/zones.rb +1 -1
  92. data/lib/facter/facts/windows/dhcp_servers.rb +1 -0
  93. data/lib/facter/facts/windows/interfaces.rb +1 -0
  94. data/lib/facter/facts/windows/memory/system/available.rb +1 -1
  95. data/lib/facter/facts/windows/memory/system/available_bytes.rb +1 -1
  96. data/lib/facter/facts/windows/memory/system/total.rb +1 -1
  97. data/lib/facter/facts/windows/memory/system/total_bytes.rb +1 -1
  98. data/lib/facter/facts/windows/memory/system/used.rb +1 -1
  99. data/lib/facter/facts/windows/os/release.rb +1 -1
  100. data/lib/facter/framework/benchmarking/timer.rb +4 -2
  101. data/lib/facter/framework/cli/cli.rb +20 -6
  102. data/lib/facter/framework/config/fact_groups.rb +10 -8
  103. data/lib/facter/framework/core/cache_manager.rb +79 -29
  104. data/lib/facter/framework/core/fact/internal/core_fact.rb +6 -1
  105. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +38 -4
  106. data/lib/facter/framework/core/fact_augmenter.rb +1 -1
  107. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +4 -2
  108. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +17 -1
  109. data/lib/facter/framework/core/fact_manager.rb +15 -3
  110. data/lib/facter/framework/core/file_loader.rb +6 -2
  111. data/lib/facter/framework/core/options/config_file_options.rb +16 -5
  112. data/lib/facter/framework/core/options/option_store.rb +40 -20
  113. data/lib/facter/framework/detector/os_hierarchy.rb +5 -9
  114. data/lib/facter/framework/logging/logger.rb +3 -3
  115. data/lib/facter/models/fact_collection.rb +11 -1
  116. data/lib/facter/models/loaded_fact.rb +2 -1
  117. data/lib/facter/resolvers/aio_agent_version.rb +2 -2
  118. data/lib/facter/resolvers/aix/architecture_resolver.rb +19 -4
  119. data/lib/facter/resolvers/aix/disks.rb +6 -5
  120. data/lib/facter/resolvers/aix/filesystem_resolver.rb +2 -2
  121. data/lib/facter/resolvers/aix/hardware_resolver.rb +4 -3
  122. data/lib/facter/resolvers/aix/load_averages_resolver.rb +2 -1
  123. data/lib/facter/resolvers/aix/memory.rb +4 -3
  124. data/lib/facter/resolvers/aix/mountpoints.rb +6 -5
  125. data/lib/facter/resolvers/aix/networking_resolver.rb +4 -3
  126. data/lib/facter/resolvers/aix/nim.rb +1 -1
  127. data/lib/facter/resolvers/aix/os_level.rb +2 -2
  128. data/lib/facter/resolvers/aix/partitions.rb +7 -6
  129. data/lib/facter/resolvers/aix/processors.rb +5 -4
  130. data/lib/facter/resolvers/aix/serialnumber.rb +2 -2
  131. data/lib/facter/resolvers/augeas_resolver.rb +8 -2
  132. data/lib/facter/resolvers/base_resolver.rb +14 -4
  133. data/lib/facter/resolvers/bsd/processors.rb +13 -8
  134. data/lib/facter/resolvers/cloud.rb +2 -2
  135. data/lib/facter/resolvers/containers.rb +5 -4
  136. data/lib/facter/resolvers/debian_version.rb +2 -2
  137. data/lib/facter/resolvers/disk_resolver.rb +17 -6
  138. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  139. data/lib/facter/resolvers/dmi_resolver.rb +5 -4
  140. data/lib/facter/resolvers/ec2.rb +5 -2
  141. data/lib/facter/resolvers/eos_release_resolver.rb +2 -2
  142. data/lib/facter/resolvers/facterversion_resolver.rb +1 -1
  143. data/lib/facter/resolvers/filesystems_resolver.rb +5 -2
  144. data/lib/facter/resolvers/fips_enabled_resolver.rb +5 -2
  145. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +1 -1
  146. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +9 -7
  147. data/lib/facter/resolvers/freebsd/geom_resolver.rb +15 -22
  148. data/lib/facter/resolvers/freebsd/processors.rb +13 -8
  149. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +5 -3
  150. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +4 -2
  151. data/lib/facter/resolvers/freebsd/virtual_resolver.rb +45 -0
  152. data/lib/facter/resolvers/gce.rb +3 -2
  153. data/lib/facter/resolvers/hostname_resolver.rb +69 -21
  154. data/lib/facter/resolvers/identity_resolver.rb +2 -1
  155. data/lib/facter/resolvers/linux/docker_uptime.rb +3 -2
  156. data/lib/facter/resolvers/linux/load_averages.rb +3 -2
  157. data/lib/facter/resolvers/load_averages.rb +5 -3
  158. data/lib/facter/resolvers/lpar_resolver.rb +1 -1
  159. data/lib/facter/resolvers/lsb_release_resolver.rb +1 -1
  160. data/lib/facter/resolvers/lspci.rb +1 -1
  161. data/lib/facter/resolvers/macosx/dmi_resolver.rb +1 -1
  162. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -1
  163. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +2 -1
  164. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +9 -8
  165. data/lib/facter/resolvers/macosx/processor_resolver.rb +2 -1
  166. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +2 -1
  167. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +2 -1
  168. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +4 -6
  169. data/lib/facter/resolvers/memory_resolver.rb +16 -16
  170. data/lib/facter/resolvers/mountpoints_resolver.rb +56 -25
  171. data/lib/facter/resolvers/networking_linux_resolver.rb +188 -83
  172. data/lib/facter/resolvers/networking_resolver.rb +9 -6
  173. data/lib/facter/resolvers/open_vz.rb +2 -4
  174. data/lib/facter/resolvers/os_release_resolver.rb +2 -2
  175. data/lib/facter/resolvers/partitions.rb +67 -63
  176. data/lib/facter/resolvers/path_resolver.rb +1 -1
  177. data/lib/facter/resolvers/processors_resolver.rb +10 -3
  178. data/lib/facter/resolvers/redhat_release_resolver.rb +2 -2
  179. data/lib/facter/resolvers/ruby_resolver.rb +1 -1
  180. data/lib/facter/resolvers/selinux_resolver.rb +4 -4
  181. data/lib/facter/resolvers/solaris/disks.rb +2 -2
  182. data/lib/facter/resolvers/solaris/dmi.rb +3 -1
  183. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  184. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  185. data/lib/facter/resolvers/solaris/ipaddress.rb +2 -1
  186. data/lib/facter/resolvers/solaris/ldom.rb +1 -3
  187. data/lib/facter/resolvers/solaris/memory.rb +4 -3
  188. data/lib/facter/resolvers/solaris/mountpoints.rb +61 -0
  189. data/lib/facter/resolvers/solaris/networking.rb +51 -44
  190. data/lib/facter/resolvers/solaris/os_release.rb +7 -5
  191. data/lib/facter/resolvers/solaris/processors.rb +2 -1
  192. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  193. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  194. data/lib/facter/resolvers/ssh_resolver.rb +11 -7
  195. data/lib/facter/resolvers/suse_release_resolver.rb +2 -2
  196. data/lib/facter/resolvers/sw_vers_resolver.rb +2 -2
  197. data/lib/facter/resolvers/timezone_resolver.rb +1 -1
  198. data/lib/facter/resolvers/uname_resolver.rb +1 -1
  199. data/lib/facter/resolvers/uptime_resolver.rb +3 -3
  200. data/lib/facter/resolvers/virt_what.rb +1 -1
  201. data/lib/facter/resolvers/vmware.rb +1 -1
  202. data/lib/facter/resolvers/windows/aio_agent_version.rb +2 -2
  203. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +2 -2
  204. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +2 -2
  205. data/lib/facter/resolvers/windows/fips_resolver.rb +2 -1
  206. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +2 -1
  207. data/lib/facter/resolvers/windows/identity_resolver.rb +2 -1
  208. data/lib/facter/resolvers/windows/kernel_resolver.rb +3 -1
  209. data/lib/facter/resolvers/windows/memory_resolver.rb +7 -1
  210. data/lib/facter/resolvers/windows/netkvm_resolver.rb +2 -1
  211. data/lib/facter/resolvers/windows/networking_resolver.rb +5 -4
  212. data/lib/facter/resolvers/windows/processors_resolver.rb +3 -2
  213. data/lib/facter/resolvers/windows/product_release_resolver.rb +2 -1
  214. data/lib/facter/resolvers/windows/ssh.rb +5 -3
  215. data/lib/facter/resolvers/windows/system32_resolver.rb +3 -1
  216. data/lib/facter/resolvers/windows/uptime_resolver.rb +3 -2
  217. data/lib/facter/resolvers/windows/virtualization_resolver.rb +3 -2
  218. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +4 -2
  219. data/lib/facter/resolvers/wpar_resolver.rb +1 -1
  220. data/lib/facter/resolvers/xen.rb +2 -2
  221. data/lib/facter/resolvers/zfs.rb +2 -1
  222. data/lib/facter/resolvers/zpool.rb +2 -1
  223. data/lib/facter/util/aix/info_extractor.rb +24 -0
  224. data/lib/facter/util/aix/odm_query.rb +46 -0
  225. data/lib/facter/util/api_debugger.rb +33 -29
  226. data/lib/facter/util/facts/facts_utils.rb +14 -0
  227. data/lib/facter/util/facts/unit_converter.rb +61 -0
  228. data/lib/facter/util/facts/uptime_parser.rb +128 -0
  229. data/lib/facter/util/facts/virtual_detector.rb +90 -0
  230. data/lib/facter/util/facts/windows_release_finder.rb +55 -0
  231. data/lib/facter/{resolvers/macosx/utils → util/macosx}/system_profile_executor.rb +1 -1
  232. data/lib/facter/util/resolvers/aws_token.rb +37 -0
  233. data/lib/facter/{resolvers/utils → util/resolvers}/ffi/load_averages.rb +2 -2
  234. data/lib/facter/util/resolvers/filesystem_helper.rb +47 -0
  235. data/lib/facter/util/resolvers/fingerprint.rb +15 -0
  236. data/lib/facter/{resolvers/utils → util/resolvers}/http.rb +17 -10
  237. data/lib/facter/util/resolvers/networking.rb +90 -0
  238. data/lib/facter/util/resolvers/networking/dhcp.rb +21 -0
  239. data/lib/facter/util/resolvers/networking/networking.rb +109 -0
  240. data/lib/facter/util/resolvers/networking/primary_interface.rb +82 -0
  241. data/lib/facter/util/resolvers/ssh.rb +17 -0
  242. data/lib/facter/util/resolvers/ssh_helper.rb +31 -0
  243. data/lib/facter/{resolvers/utils → util/resolvers}/uptime_helper.rb +2 -2
  244. data/lib/facter/{framework/utils → util}/utils.rb +0 -0
  245. data/lib/facter/util/windows/win32ole.rb +30 -0
  246. data/lib/facter/version.rb +1 -1
  247. metadata +33 -44
  248. data/lib/facter/fact_groups.conf +0 -308
  249. data/lib/facter/facts/aix/puppet_version.rb +0 -15
  250. data/lib/facter/facts/freebsd/puppet_version.rb +0 -15
  251. data/lib/facter/facts/linux/puppet_version.rb +0 -15
  252. data/lib/facter/facts/macosx/puppet_version.rb +0 -15
  253. data/lib/facter/facts/solaris/puppet_version.rb +0 -15
  254. data/lib/facter/facts/windows/puppet_version.rb +0 -15
  255. data/lib/facter/facts_utils/facts_utils.rb +0 -12
  256. data/lib/facter/facts_utils/unit_converter.rb +0 -59
  257. data/lib/facter/facts_utils/uptime_parser.rb +0 -124
  258. data/lib/facter/facts_utils/virtual_detector.rb +0 -78
  259. data/lib/facter/facts_utils/windows_release_finder.rb +0 -51
  260. data/lib/facter/os_hierarchy.json +0 -36
  261. data/lib/facter/resolvers/aix/utils/info_extractor.rb +0 -20
  262. data/lib/facter/resolvers/aix/utils/odm_query.rb +0 -42
  263. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -26
  264. data/lib/facter/resolvers/utils/filesystem_helper.rb +0 -43
  265. data/lib/facter/resolvers/utils/fingerprint.rb +0 -11
  266. data/lib/facter/resolvers/utils/networking.rb +0 -86
  267. data/lib/facter/resolvers/utils/ssh.rb +0 -13
  268. data/lib/facter/resolvers/utils/ssh_helper.rb +0 -27
  269. data/lib/facter/resolvers/windows/utils/win32ole.rb +0 -24
@@ -11,7 +11,12 @@ module Facter
11
11
 
12
12
  return unless fact_class
13
13
 
14
- fact_class.new.call_the_resolver
14
+ fact_value = nil
15
+ Facter::Framework::Benchmarking::Timer.measure(@searched_fact.name) do
16
+ fact_value = fact_class.new.call_the_resolver
17
+ end
18
+
19
+ fact_value
15
20
  end
16
21
  end
17
22
  end
@@ -7,7 +7,15 @@ module Facter
7
7
  def resolve_facts(searched_facts)
8
8
  internal_searched_facts = filter_internal_facts(searched_facts)
9
9
 
10
- resolved_facts = resolve(internal_searched_facts)
10
+ resolved_facts = if Options[:sequential]
11
+ @@log.debug('Resolving facts sequentially')
12
+ resolve_sequentially(internal_searched_facts)
13
+ else
14
+ @@log.debug('Resolving fact in parallel')
15
+ threads = start_threads(internal_searched_facts)
16
+ join_threads(threads, internal_searched_facts)
17
+ end
18
+
11
19
  nil_resolved_facts = resolve_nil_facts(searched_facts)
12
20
 
13
21
  resolved_facts.concat(nil_resolved_facts)
@@ -28,7 +36,7 @@ module Facter
28
36
  resolved_facts
29
37
  end
30
38
 
31
- def resolve(searched_facts)
39
+ def resolve_sequentially(searched_facts)
32
40
  resolved_facts = []
33
41
 
34
42
  searched_facts
@@ -36,8 +44,7 @@ module Facter
36
44
  .each do |searched_fact|
37
45
  begin
38
46
  fact = CoreFact.new(searched_fact)
39
- fact_value = nil
40
- Facter::Framework::Benchmarking::Timer.measure(searched_fact.name) { fact_value = fact.create }
47
+ fact_value = fact.create
41
48
  resolved_facts << fact_value unless fact_value.nil?
42
49
  rescue StandardError => e
43
50
  @@log.log_exception(e)
@@ -47,5 +54,32 @@ module Facter
47
54
  resolved_facts.flatten!
48
55
  FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
49
56
  end
57
+
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
+ end
66
+ end
67
+ end
68
+
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)
78
+ fact = CoreFact.new(searched_fact)
79
+ fact.create
80
+ rescue StandardError => e
81
+ @@log.log_exception(e)
82
+ nil
83
+ end
50
84
  end
51
85
  end
@@ -16,7 +16,7 @@ module Facter
16
16
  private_class_method def self.get_resolved_facts_for_searched_fact(searched_fact, resolved_facts)
17
17
  if searched_fact.name.include?('.*')
18
18
  resolved_facts
19
- .select { |resolved_fact| resolved_fact.name.match(searched_fact.user_query) }
19
+ .select { |resolved_fact| resolved_fact.name.match(searched_fact.name) }
20
20
  .reject(&:user_query)
21
21
  .uniq(&:name)
22
22
  else
@@ -21,8 +21,9 @@ module Facter
21
21
 
22
22
  custom_facts_to_load = LegacyFacter.collection.custom_facts
23
23
 
24
- custom_facts_to_load&.each do |custom_fact_name|
25
- loaded_fact = LoadedFact.new(custom_fact_name.to_s, nil, :custom)
24
+ custom_facts_to_load&.each do |k, v|
25
+ loaded_fact = LoadedFact.new(k.to_s, nil, :custom)
26
+ loaded_fact.is_env = v.options[:is_env] if v.options[:is_env]
26
27
  custom_facts << loaded_fact
27
28
  end
28
29
 
@@ -37,6 +38,7 @@ module Facter
37
38
  external_facts_to_load&.each do |k, v|
38
39
  loaded_fact = LoadedFact.new(k.to_s, nil, :external)
39
40
  loaded_fact.file = v.options[:file]
41
+ loaded_fact.is_env = v.options[:is_env]
40
42
  external_facts << loaded_fact
41
43
  end
42
44
 
@@ -24,11 +24,27 @@ module Facter
24
24
  @internal_facts = load_internal_facts(options)
25
25
  @external_facts = load_external_facts(options)
26
26
 
27
+ filter_env_facts
28
+
27
29
  @facts = @internal_facts + @external_facts
28
30
  end
29
31
 
30
32
  private
31
33
 
34
+ def filter_env_facts
35
+ env_fact_names = @external_facts.select { |fact| fact.is_env == true }.map(&:name)
36
+ return unless env_fact_names.any?
37
+
38
+ @internal_facts.delete_if do |fact|
39
+ if env_fact_names.include?(fact.name)
40
+ @log.debug("Reading #{fact.name} fact from environment variable")
41
+ true
42
+ else
43
+ false
44
+ end
45
+ end
46
+ end
47
+
32
48
  def load_internal_facts(options)
33
49
  @log.debug('Loading internal facts')
34
50
  internal_facts = []
@@ -84,7 +100,7 @@ module Facter
84
100
 
85
101
  blocked_facts.each do |blocked|
86
102
  facts.each do |fact|
87
- next unless fact.name =~ /^#{blocked}/
103
+ next unless fact.name =~ /^#{blocked}\..*|^#{blocked}$/
88
104
 
89
105
  if fact.type == :core
90
106
  reject_list_core << fact
@@ -17,8 +17,7 @@ module Facter
17
17
  end
18
18
 
19
19
  def resolve_facts(user_query = [])
20
- loaded_facts = @fact_loader.load(Options.get)
21
- searched_facts = QueryParser.parse(user_query, loaded_facts)
20
+ searched_facts = parse_user_query(user_query)
22
21
 
23
22
  cache_manager = Facter::CacheManager.new
24
23
  searched_facts, cached_facts = cache_manager.resolve_facts(searched_facts)
@@ -27,11 +26,12 @@ module Facter
27
26
 
28
27
  resolved_facts = override_core_facts(internal_facts, external_facts)
29
28
 
30
- cache_manager.cache_facts(resolved_facts)
31
29
  resolved_facts = resolved_facts.concat(cached_facts)
30
+ cache_manager.cache_facts(resolved_facts)
32
31
 
33
32
  FactFilter.new.filter_facts!(resolved_facts)
34
33
 
34
+ log_resolved_facts(resolved_facts)
35
35
  resolved_facts
36
36
  end
37
37
 
@@ -47,6 +47,12 @@ module Facter
47
47
 
48
48
  private
49
49
 
50
+ def parse_user_query(user_query)
51
+ loaded_facts = @fact_loader.load(Options.get)
52
+
53
+ QueryParser.parse(user_query, loaded_facts)
54
+ end
55
+
50
56
  def override_core_facts(core_facts, custom_facts)
51
57
  return core_facts unless custom_facts
52
58
 
@@ -60,5 +66,11 @@ module Facter
60
66
  def root_fact_name(fact)
61
67
  fact.name.split('.').first
62
68
  end
69
+
70
+ def log_resolved_facts(resolved_facts)
71
+ resolved_facts.each do |fact|
72
+ @log.debug("fact \"#{fact.name}\" has resolved to: #{fact.value}") unless fact.value.nil?
73
+ end
74
+ end
63
75
  end
64
76
  end
@@ -34,7 +34,11 @@ require 'facter/framework/config/fact_groups'
34
34
 
35
35
  load_dir(['config'])
36
36
 
37
- load_dir(%w[resolvers utils])
37
+ load_dir(['util'])
38
+ load_dir(%w[util resolvers])
39
+ load_dir(%w[util facts])
40
+ load_dir(%w[util resolvers networking])
41
+
38
42
  load_dir(['resolvers'])
39
43
  load_dir(['facts_utils'])
40
44
  load_dir(%w[framework core])
@@ -47,12 +51,12 @@ load_dir(%w[framework core fact external])
47
51
  load_dir(%w[framework formatters])
48
52
 
49
53
  os_hierarchy = OsDetector.instance.hierarchy
54
+ os_hierarchy.each { |operating_system| load_dir(['util', operating_system.downcase, '**']) }
50
55
  os_hierarchy.each { |operating_system| load_dir(['facts', operating_system.downcase, '**']) }
51
56
  os_hierarchy.each { |operating_system| load_dir(['resolvers', operating_system.downcase, '**']) }
52
57
 
53
58
  require 'facter/custom_facts/core/legacy_facter'
54
59
  load_dir(%w[framework utils])
55
- load_dir(['util'])
56
60
 
57
61
  require 'facter/framework/core/fact_augmenter'
58
62
  require 'facter/framework/parsers/query_parser'
@@ -19,14 +19,18 @@ module Facter
19
19
  private
20
20
 
21
21
  def augment_all
22
- if Options.cli?
23
- augment_cli(Facter::ConfigReader.cli)
24
- augment_ruby(Facter::ConfigReader.global)
25
- end
22
+ augment_cli(Facter::ConfigReader.cli) if Options.cli?
23
+ augment_globals
24
+ augment_facts(Facter::ConfigReader.ttls, Facter::ConfigReader.fact_groups)
25
+ end
26
+
27
+ def augment_globals
28
+ augment_ruby(Facter::ConfigReader.global)
29
+
26
30
  augment_custom(Facter::ConfigReader.global)
27
31
  augment_external(Facter::ConfigReader.global)
28
32
  augment_show_legacy(Facter::ConfigReader.global)
29
- augment_facts(Facter::ConfigReader.ttls, Facter::ConfigReader.fact_groups)
33
+ augment_sequential(Facter::ConfigReader.global)
30
34
  end
31
35
 
32
36
  def augment_config_path(config_path)
@@ -68,6 +72,7 @@ module Facter
68
72
 
69
73
  def augment_ruby(global_conf)
70
74
  return unless global_conf
75
+ return unless Options.cli?
71
76
 
72
77
  @options[:no_ruby] = global_conf['no-ruby'].nil? ? false : global_conf['no-ruby']
73
78
  end
@@ -78,6 +83,12 @@ module Facter
78
83
  @options[:show_legacy] = global_conf['show-legacy'] unless global_conf['show-legacy'].nil?
79
84
  end
80
85
 
86
+ def augment_sequential(global_conf)
87
+ return unless global_conf
88
+
89
+ @options[:sequential] = global_conf['sequential'] unless global_conf['sequential'].nil?
90
+ end
91
+
81
92
  def augment_facts(ttls, groups)
82
93
  fact_groups = Facter::FactGroups.new
83
94
 
@@ -8,31 +8,41 @@ module Facter
8
8
  # TODO: constant is not yet available when running puppet facts
9
9
  @log_level = :warn
10
10
  @show_legacy = true
11
+ @custom_facts = true
12
+ @blocked_facts = []
13
+ @ruby = true
14
+ @external_facts = true
15
+ @config = nil
16
+ @user_query = []
17
+ @strict = false
18
+ @json = false
19
+ @cache = true
20
+ @yaml = false
21
+ @puppet = false
22
+ @ttls = []
11
23
  @block = true
12
- @custom_dir = []
24
+ @cli = nil
13
25
  @config_file_custom_dir = []
14
- @custom_facts = true
15
- @external_dir = []
16
26
  @config_file_external_dir = []
17
27
  @default_external_dir = []
18
- @external_facts = true
19
- @ruby = true
20
- @cache = true
21
- @blocked_facts = []
22
- @user_query = []
23
- @block_list = {}
24
28
  @fact_groups = {}
29
+ @sequential = true
30
+ @ttls = []
31
+ @block_list = []
25
32
  @color = true
33
+ @trace = false
26
34
  @timing = false
35
+ @external_dir = []
36
+ @custom_dir = []
27
37
 
28
38
  class << self
29
39
  attr_reader :debug, :verbose, :log_level, :show_legacy,
30
40
  :custom_facts, :blocked_facts, :ruby, :external_facts
31
41
 
32
- attr_accessor :config, :user_query, :strict, :json, :haml,
42
+ attr_accessor :config, :user_query, :strict, :json,
33
43
  :cache, :yaml, :puppet, :ttls, :block, :cli, :config_file_custom_dir,
34
44
  :config_file_external_dir, :default_external_dir, :fact_groups,
35
- :block_list, :color, :trace, :timing
45
+ :block_list, :color, :trace, :sequential, :timing
36
46
 
37
47
  attr_writer :external_dir
38
48
 
@@ -158,26 +168,36 @@ module Facter
158
168
  # TODO: constant is not yet available when running puppet facts
159
169
  @log_level = :warn
160
170
  @show_legacy = true
161
- @block = true
162
171
  @ruby = true
163
172
  @user_query = []
164
- @cli = nil
173
+ @json = false
165
174
  @cache = true
166
- @trace = false
175
+ @yaml = false
176
+ @puppet = false
177
+ @ttls = []
178
+ @block = true
179
+ @cli = nil
180
+ @custom_facts = true
167
181
  reset_config
168
182
  end
169
183
 
170
184
  def reset_config
171
- @custom_dir = []
172
- @custom_facts = true
173
- @external_dir = []
174
- @default_external_dir = []
175
- @config_file_external_dir = []
176
- @external_facts = true
177
185
  @blocked_facts = []
186
+ @external_facts = true
187
+ @config = nil
188
+ @strict = false
189
+ @config_file_custom_dir = []
190
+ @config_file_external_dir = []
191
+ @default_external_dir = []
178
192
  @fact_groups = {}
179
193
  @block_list = {}
194
+ @color = true
195
+ @sequential = true
196
+ @ttls = []
197
+ @trace = false
180
198
  @timing = false
199
+ @external_dir = []
200
+ @custom_dir = []
181
201
  end
182
202
 
183
203
  def fallback_external_dir
@@ -1,29 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'facter/config'
4
+
3
5
  module Facter
4
6
  class OsHierarchy
5
7
  def initialize
6
8
  @log = Log.new(self)
7
- json_file_path = File.join(File.dirname(__FILE__), '../../os_hierarchy.json')
8
- json_file = Util::FileHelper.safe_read(json_file_path)
9
- begin
10
- @json_os_hierarchy = JSON.parse(json_file)
11
- rescue JSON::ParserError => _e
12
- @log.error('Could not parse os_hierarchy json')
13
- end
9
+ @os_hierarchy = Facter::Config::OS_HIERARCHY
14
10
  end
15
11
 
16
12
  def construct_hierarchy(searched_os)
17
13
  return [] if searched_os.nil?
18
14
 
19
15
  searched_os = searched_os.to_s.capitalize
20
- if @json_os_hierarchy.nil?
16
+ if @os_hierarchy.nil?
21
17
  @log.debug("There is no os_hierarchy, will fall back to: #{searched_os}")
22
18
  return [searched_os]
23
19
  end
24
20
 
25
21
  @searched_path = []
26
- search(@json_os_hierarchy, searched_os, [])
22
+ search(@os_hierarchy, searched_os, [])
27
23
 
28
24
  @searched_path.map { |os_name| os_name.to_s.capitalize }
29
25
  end
@@ -100,10 +100,10 @@ module Facter
100
100
  end
101
101
 
102
102
  def log_exception(exception)
103
- msg = colorize(exception.message, RED) + "\n"
104
- msg += exception.backtrace.join("\n") if Options[:trace]
103
+ msg = exception.message
104
+ msg += "\n" + exception.backtrace.join("\n") if Options[:trace]
105
105
 
106
- @@logger.error(@class_name + ' - ' + msg)
106
+ error(msg, true)
107
107
  end
108
108
 
109
109
  private
@@ -4,6 +4,7 @@ module Facter
4
4
  class FactCollection < Hash
5
5
  def initialize
6
6
  super
7
+ @log = Log.new(self)
7
8
  end
8
9
 
9
10
  def build_fact_collection!(facts)
@@ -39,7 +40,16 @@ module Facter
39
40
  private
40
41
 
41
42
  def bury_fact(fact)
42
- bury(*fact.name.split('.') + fact.filter_tokens << fact.value)
43
+ split_fact_name = extract_fact_name(fact)
44
+ bury(*split_fact_name + fact.filter_tokens << fact.value)
45
+ rescue NoMethodError
46
+ @log.error("#{fact.type.to_s.capitalize} fact `#{fact.name}` cannot be added to collection."\
47
+ ' The format of this fact is incompatible with other'\
48
+ " facts that belong to `#{fact.name.split('.').first}` group")
49
+ end
50
+
51
+ def extract_fact_name(fact)
52
+ fact.type == :legacy ? [fact.name] : fact.name.split('.')
43
53
  end
44
54
  end
45
55
  end
@@ -3,13 +3,14 @@
3
3
  module Facter
4
4
  class LoadedFact
5
5
  attr_reader :name, :klass, :type
6
- attr_accessor :file
6
+ attr_accessor :file, :is_env
7
7
 
8
8
  def initialize(name, klass, type = nil, file = nil)
9
9
  @name = name
10
10
  @klass = klass
11
11
  @type = type.nil? ? :core : type
12
12
  @file = file
13
+ @is_env = false
13
14
  end
14
15
  end
15
16
  end