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
@@ -18,22 +18,31 @@ module Facter
18
18
  include LegacyFacter::Core::Resolvable
19
19
 
20
20
  # @!attribute [r] name
21
- # @return [Symbol] The name of the aggregate resolution
21
+ #
22
+ # @return [Symbol] The name of the aggregate resolution
23
+ #
24
+ # @api public
22
25
  attr_reader :name
23
26
 
24
27
  # @!attribute [r] deps
25
- # @api private
26
- # @return [LegacyFacter::Core::DirectedGraph]
28
+ #
29
+ # @return [LegacyFacter::Core::DirectedGraph]
30
+ #
31
+ # @api private
27
32
  attr_reader :deps
28
33
 
29
34
  # @!attribute [r] confines
30
- # @return [Array<LegacyFacter::Core::Confine>] An array of confines restricting
31
- # this to a specific platform
32
- # @see Facter::Core::Suitable
35
+ #
36
+ # @return [Array<LegacyFacter::Core::Confine>] An array of confines restricting
37
+ # this to a specific platform
38
+ #
39
+ # @api private
33
40
  attr_reader :confines
34
41
 
35
42
  # @!attribute [r] fact
43
+ #
36
44
  # @return [Facter::Util::Fact]
45
+ #
37
46
  # @api private
38
47
  attr_reader :fact
39
48
 
@@ -48,10 +57,20 @@ module Facter
48
57
  @deps = LegacyFacter::Core::DirectedGraph.new
49
58
  end
50
59
 
60
+ # Compares the weight of two aggregate facts
61
+ #
62
+ # @return [bool] Weight comparison result
63
+ #
64
+ # @api private
51
65
  def <=>(other)
52
66
  weight <=> other.weight
53
67
  end
54
68
 
69
+ # Sets options for the aggregate fact
70
+ #
71
+ # @return [nil]
72
+ #
73
+ # @api private
55
74
  def options(options)
56
75
  accepted_options = %i[name timeout weight fact_type]
57
76
  accepted_options.each do |option_name|
@@ -60,14 +79,17 @@ module Facter
60
79
  raise ArgumentError, "Invalid aggregate options #{options.keys.inspect}" unless options.keys.empty?
61
80
  end
62
81
 
82
+ # Evaluates the given block
83
+ #
84
+ # @return [String] Result of the block's evaluation
85
+ #
86
+ # @api private
63
87
  def evaluate(&block)
64
88
  instance_eval(&block)
65
89
  end
66
90
 
67
91
  # Define a new chunk for the given aggregate
68
92
  #
69
- # @api public
70
- #
71
93
  # @example Defining a chunk with no dependencies
72
94
  # aggregate.chunk(:mountpoints) do
73
95
  # # generate mountpoint information
@@ -80,14 +102,14 @@ module Facter
80
102
  # end
81
103
  #
82
104
  # @param name [Symbol] A name unique to this aggregate describing the chunk
83
- # @param opts [Hash]
84
- # @options opts [Array<Symbol>, Symbol] :require One or more chunks
85
- # to evaluate and pass to this block.
86
- # @yield [*Object] Zero or more chunk results
87
105
  #
88
- # @return [void]
106
+ # @param opts [Hash] Hash with options for the aggregate fact
107
+ #
108
+ # @return [Facter::Core::Aggregate] The aggregate object
109
+ #
110
+ # @api public
89
111
  def chunk(name, opts = {}, &block)
90
- raise ArgumentError, "#{self.class.name}#chunk requires a block" unless block_given?
112
+ evaluate_params(name, &block)
91
113
 
92
114
  deps = Array(opts.delete(:require))
93
115
 
@@ -97,12 +119,11 @@ module Facter
97
119
 
98
120
  @deps[name] = deps
99
121
  @chunks[name] = block
122
+ self
100
123
  end
101
124
 
102
125
  # Define how all chunks should be combined
103
126
  #
104
- # @api public
105
- #
106
127
  # @example Merge all chunks
107
128
  # aggregate.aggregate do |chunks|
108
129
  # final_result = {}
@@ -124,19 +145,32 @@ module Facter
124
145
  # @yield [Hash<Symbol, Object>] A hash containing chunk names and
125
146
  # chunk values
126
147
  #
127
- # @return [void]
148
+ # @return [Facter::Core::Aggregate] The aggregate fact
149
+ #
150
+ # @api public
128
151
  def aggregate(&block)
129
152
  raise ArgumentError, "#{self.class.name}#aggregate requires a block" unless block_given?
130
153
 
131
154
  @aggregate = block
155
+ self
132
156
  end
133
157
 
158
+ # Returns the fact's resolution type
159
+ #
160
+ # @return [Symbol] The fact's type
161
+ #
162
+ # @api private
134
163
  def resolution_type
135
164
  :aggregate
136
165
  end
137
166
 
138
167
  private
139
168
 
169
+ def evaluate_params(name)
170
+ raise ArgumentError, "#{self.class.name}#chunk requires a block" unless block_given?
171
+ raise ArgumentError, "#{self.class.name}#expected chunk name to be a Symbol" unless name.is_a? Symbol
172
+ end
173
+
140
174
  # Evaluate the results of this aggregate.
141
175
  #
142
176
  # @see Facter::Core::Resolvable#value
@@ -3,10 +3,6 @@
3
3
  module Facter
4
4
  module Core
5
5
  module Execution
6
- # require_relative 'execution/base'
7
- # require_relative 'execution/windows'
8
- # require_relative 'execution/posix'
9
-
10
6
  @@impl = if LegacyFacter::Util::Config.windows?
11
7
  Facter::Core::Execution::Windows.new
12
8
  else
@@ -20,24 +16,22 @@ module Facter
20
16
  module_function
21
17
 
22
18
  # Returns the locations to be searched when looking for a binary. This
23
- # is currently determined by the +PATH+ environment variable plus
24
- # `/sbin` and `/usr/sbin` when run on unix
19
+ # is currently determined by the +PATH+ environment variable plus
20
+ # `/sbin` and `/usr/sbin` when run on unix
21
+ #
22
+ # @return [Array<String>] The paths to be searched for binaries
25
23
  #
26
- # @return [Array<String>] the paths to be searched for binaries
27
24
  # @api private
28
25
  def search_paths
29
26
  @@impl.search_paths
30
27
  end
31
28
 
32
29
  # Determines the full path to a binary. If the supplied filename does not
33
- # already describe an absolute path then different locations (determined
34
- # by {search_paths}) will be searched for a match.
35
- #
36
- # Returns nil if no matching executable can be found otherwise returns
37
- # the expanded pathname.
30
+ # already describe an absolute path then different locations (determined
31
+ # by {search_paths}) will be searched for a match.
32
+ # @param bin [String] The executable to locate
38
33
  #
39
- # @param bin [String] the executable to locate
40
- # @return [String,nil] the full path to the executable or nil if not
34
+ # @return [String/nil] The full path to the executable or nil if not
41
35
  # found
42
36
  #
43
37
  # @api public
@@ -46,10 +40,12 @@ module Facter
46
40
  end
47
41
 
48
42
  # Determine in a platform-specific way whether a path is absolute. This
49
- # defaults to the local platform if none is specified.
43
+ # defaults to the local platform if none is specified.
44
+ # @param path [String] The path to check
45
+
46
+ # @param platform [:posix/:windows/nil] The platform logic to use
50
47
  #
51
- # @param path [String] the path to check
52
- # @param platform [:posix,:windows,nil] the platform logic to use
48
+ # @api private
53
49
  def absolute_path?(path, platform = nil)
54
50
  case platform
55
51
  when :posix
@@ -62,38 +58,35 @@ module Facter
62
58
  end
63
59
 
64
60
  # Given a command line, this returns the command line with the
65
- # executable written as an absolute path. If the executable contains
66
- # spaces, it has be put in double quotes to be properly recognized.
67
- #
61
+ # executable written as an absolute path. If the executable contains
62
+ # spaces, it has to be put in double quotes to be properly recognized.
68
63
  # @param command [String] the command line
69
64
  #
70
- # @return [String, nil] the command line with the executable's path
71
- # expanded, or nil if the executable cannot be found.
65
+ # @return [String/nil] The command line with the executable's path
66
+ # expanded, or nil if the executable cannot be found.
67
+ #
68
+ # @api private
72
69
  def expand_command(command)
73
70
  @@impl.expand_command(command)
74
71
  end
75
72
 
76
73
  # Overrides environment variables within a block of code. The
77
- # specified values will be set for the duration of the block, after
78
- # which the original values (if any) will be restored.
79
- #
80
- # @overload with_env(values, { || ... })
81
- #
74
+ # specified values will be set for the duration of the block, after
75
+ # which the original values (if any) will be restored.
82
76
  # @param values [Hash<String=>String>] A hash of the environment
83
77
  # variables to override
84
78
  #
85
- # @return [void]
79
+ # @return [String] The block's return string
86
80
  #
87
- # @api public
81
+ # @api private
88
82
  def with_env(values, &block)
89
83
  @@impl.with_env(values, &block)
90
84
  end
91
85
 
92
86
  # Try to execute a command and return the output.
87
+ # @param command [String] Command to run
93
88
  #
94
- # @param code [String] the program to run
95
- #
96
- # @return [String] the output of the program, or nil if the command does
89
+ # @return [String/nil] Output of the program, or nil if the command does
97
90
  # not exist or could not be executed.
98
91
  #
99
92
  # @deprecated Use #{execute} instead
@@ -103,26 +96,49 @@ module Facter
103
96
  end
104
97
 
105
98
  # Execute a command and return the output of that program.
99
+ # @param command [String] Command to run
106
100
  #
107
- # @param code [String] the program to run
108
- # @param options [Hash]
101
+ # @param options [Hash] Hash with options for the command
109
102
  #
110
- # @option options [Object] :on_fail How to behave when the command could
103
+ # Options accepted values :on_fail How to behave when the command could
111
104
  # not be run. Specifying :raise will raise an error, anything else will
112
105
  # return that object on failure. Default is :raise.
106
+ # :logger Optional logger used to log the command's stderr.
107
+ # :time_limit Optional time out for the specified command. If no time_limit is passed,
108
+ # a default of 300 seconds is used.
113
109
  #
114
110
  # @raise [Facter::Core::Execution::ExecutionFailure] If the command does
115
- # not exist or could not be executed.
111
+ # not exist or could not be executed and :on_fail is set to :raise
116
112
  #
117
- # @return [String] the output of the program, or the value of :on_fail if
113
+ # @return [String] the output of the program, or the value of :on_fail (if it's different than :raise) if
118
114
  # command execution failed and :on_fail was specified.
119
115
  #
120
116
  # @api public
121
- # @since 2.0.1
122
117
  def execute(command, options = {})
123
118
  @@impl.execute(command, options)
124
119
  end
125
120
 
121
+ # Execute a command and return the stdout and stderr of that program.
122
+ # @param command [String] Command to run
123
+ #
124
+ # @param on_fail[Object] How to behave when the command could
125
+ # not be run. Specifying :raise will raise an error, anything else will
126
+ # return that object on failure. Default is :raise.
127
+ # @param logger Optional logger used to log the command's stderr.
128
+ # @param time_limit Optional time out for the specified command. If no time_limit is passed,
129
+ # a default of 300 seconds is used.
130
+ #
131
+ # @raise [Facter::Core::Execution::ExecutionFailure] If the command does
132
+ # not exist or could not be executed and :on_fail is set to :raise
133
+ #
134
+ # @return [String, String] the stdout and stderr of the program, or the value of
135
+ # :on_fail if command execution failed and :on_fail was specified.
136
+ #
137
+ # @api private
138
+ def execute_command(command, on_fail = nil, logger = nil, time_limit = nil)
139
+ @@impl.execute_command(command, on_fail, logger, time_limit)
140
+ end
141
+
126
142
  class ExecutionFailure < StandardError; end
127
143
  end
128
144
  end
@@ -4,7 +4,7 @@ module Facter
4
4
  module Core
5
5
  module Execution
6
6
  class Base
7
- STDERR_MESSAGE = 'Command %s resulted with the following stderr message: %s'
7
+ STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s'
8
8
 
9
9
  def initialize
10
10
  @log = Log.new(self)
@@ -57,40 +57,12 @@ module Facter
57
57
  return on_fail
58
58
  end
59
59
 
60
- execute_command(expanded_command, on_fail, logger, time_limit)
60
+ out, = execute_command(expanded_command, on_fail, logger, time_limit)
61
+ out
61
62
  end
62
63
 
63
- private
64
-
65
- def extract_options(options)
66
- on_fail = options.fetch(:on_fail, :raise)
67
- expand = options.fetch(:expand, true)
68
- logger = options[:logger]
69
- time_limit = options[:limit].to_i
70
- time_limit = time_limit.positive? ? time_limit : nil
71
-
72
- [on_fail, expand, logger, time_limit]
73
- end
74
-
75
- def log_stderr(msg, command, logger)
76
- return if !msg || msg.empty?
77
-
78
- if logger
79
- logger.debug(format(STDERR_MESSAGE, command, msg.strip))
80
- else
81
- file_name = command.split('/').last
82
- logger = Facter::Log.new(file_name)
83
- logger.warn(format(STDERR_MESSAGE, command, msg.strip))
84
- end
85
- end
86
-
87
- def builtin_command?(command)
88
- output, _status = Open3.capture2("type #{command}")
89
- output.chomp =~ /builtin/ ? true : false
90
- end
91
-
92
- def execute_command(command, on_fail, logger = nil, time_limit = nil)
93
- time_limit ||= 1.5
64
+ def execute_command(command, on_fail = nil, logger = nil, time_limit = nil)
65
+ time_limit ||= 300
94
66
  begin
95
67
  # Set LC_ALL and LANG to force i18n to C for the duration of this exec;
96
68
  # this ensures that any code that parses the
@@ -100,18 +72,24 @@ module Facter
100
72
  @log.debug("Executing command: #{command}")
101
73
  out, stderr = Open3.popen3(opts, command.to_s) do |_, stdout, stderr, wait_thr|
102
74
  pid = wait_thr.pid
103
- output = +''
104
- err = +''
75
+ stdout_messages = +''
76
+ stderr_messages = +''
77
+ out_reader = Thread.new { stdout.read }
78
+ err_reader = Thread.new { stderr.read }
105
79
  begin
106
80
  Timeout.timeout(time_limit) do
107
- output << stdout.read
108
- err << stderr.read
81
+ stdout_messages << out_reader.value
82
+ stderr_messages << err_reader.value
109
83
  end
110
84
  rescue Timeout::Error
111
- @log.debug("Timeout encounter after #{time_limit}s, killing process with pid: #{pid}")
85
+ message = "Timeout encounter after #{time_limit}s, killing process with pid: #{pid}"
112
86
  Process.kill('KILL', pid)
87
+ on_fail == :raise ? (raise StandardError, message) : @log.debug(message)
88
+ ensure
89
+ out_reader.kill
90
+ err_reader.kill
113
91
  end
114
- [output, err]
92
+ [stdout_messages, stderr_messages]
115
93
  end
116
94
  log_stderr(stderr, command, logger)
117
95
  rescue StandardError => e
@@ -122,7 +100,35 @@ module Facter
122
100
  "Failed while executing '#{command}': #{e.message}"
123
101
  end
124
102
 
125
- out.strip
103
+ [out.strip, stderr]
104
+ end
105
+
106
+ private
107
+
108
+ def extract_options(options)
109
+ on_fail = options.fetch(:on_fail, :raise)
110
+ expand = options.fetch(:expand, true)
111
+ logger = options[:logger]
112
+ time_limit = options[:limit].to_i
113
+ time_limit = time_limit.positive? ? time_limit : nil
114
+
115
+ [on_fail, expand, logger, time_limit]
116
+ end
117
+
118
+ def log_stderr(msg, command, logger)
119
+ return if !msg || msg.empty?
120
+
121
+ unless logger
122
+ file_name = command.split('/').last
123
+ logger = Facter::Log.new(file_name)
124
+ end
125
+
126
+ logger.debug(format(STDERR_MESSAGE, command, msg.strip))
127
+ end
128
+
129
+ def builtin_command?(command)
130
+ output, _status = Open3.capture2("type #{command}")
131
+ output.chomp =~ /builtin/ ? true : false
126
132
  end
127
133
  end
128
134
  end
@@ -115,8 +115,7 @@ module LegacyFacter
115
115
  internal_loader.load_all unless @loaded
116
116
  @loaded = true
117
117
 
118
- custom_facts = @facts.select { |_k, v| v.options[:fact_type] == :custom }
119
- @custom_facts = Facter::Utils.deep_copy(custom_facts.keys)
118
+ @custom_facts = @facts.select { |_k, v| v.options[:fact_type] == :custom }
120
119
  end
121
120
 
122
121
  def load(name)
@@ -109,7 +109,7 @@ module LegacyFacter
109
109
 
110
110
  def entries
111
111
  dirs = @directories.select { |directory| File.directory?(directory) }.map do |directory|
112
- Dir.entries(directory).map { |directory_entry| File.join(directory, directory_entry) }
112
+ Dir.entries(directory).map { |directory_entry| File.join(directory, directory_entry) }.sort.reverse!
113
113
  end
114
114
  dirs.flatten.select { |f| should_parse?(f) }
115
115
  rescue Errno::ENOENT