facter 4.0.9.pre → 4.0.10.pre

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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rtc.yml +11 -0
  3. data/.rubocop_todo.yml +10 -190
  4. data/VERSION +1 -1
  5. data/facter.gemspec +1 -0
  6. data/lib/custom_facts/core/aggregate.rb +4 -6
  7. data/lib/custom_facts/core/execution.rb +1 -1
  8. data/lib/custom_facts/core/execution/base.rb +15 -24
  9. data/lib/custom_facts/core/execution/posix.rb +2 -2
  10. data/lib/custom_facts/core/resolvable.rb +1 -1
  11. data/lib/custom_facts/core/suitable.rb +2 -1
  12. data/lib/custom_facts/util/fact.rb +3 -3
  13. data/lib/custom_facts/util/loader.rb +2 -2
  14. data/lib/custom_facts/util/parser.rb +7 -7
  15. data/lib/custom_facts/util/resolution.rb +1 -3
  16. data/lib/custom_facts/version.rb +1 -1
  17. data/lib/facter.rb +217 -41
  18. data/lib/facts/aix/augeas/version.rb +4 -1
  19. data/lib/facts/aix/filesystems.rb +14 -0
  20. data/lib/facts/aix/identity/user.rb +17 -0
  21. data/lib/facts/aix/puppet_version.rb +15 -0
  22. data/lib/facts/aix/system_uptime/days.rb +16 -0
  23. data/lib/facts/aix/system_uptime/hours.rb +16 -0
  24. data/lib/facts/aix/system_uptime/seconds.rb +16 -0
  25. data/lib/facts/aix/system_uptime/uptime.rb +16 -0
  26. data/lib/facts/aix/timezone.rb +14 -0
  27. data/lib/facts/debian/augeas/version.rb +19 -0
  28. data/lib/facts/debian/dmi/bios/release_date.rb +2 -1
  29. data/lib/facts/debian/dmi/bios/vendor.rb +2 -1
  30. data/lib/facts/debian/dmi/bios/version.rb +2 -1
  31. data/lib/facts/debian/dmi/board/manufacturer.rb +2 -1
  32. data/lib/facts/debian/dmi/board/product.rb +2 -1
  33. data/lib/facts/debian/dmi/board/serial_number.rb +2 -1
  34. data/lib/facts/debian/dmi/chassis/asset_tag.rb +2 -1
  35. data/lib/facts/debian/dmi/chassis/type.rb +2 -1
  36. data/lib/facts/debian/dmi/manufacturer.rb +2 -1
  37. data/lib/facts/debian/dmi/product/name.rb +2 -1
  38. data/lib/facts/debian/identity/user.rb +17 -0
  39. data/lib/facts/debian/interfaces.rb +16 -0
  40. data/lib/facts/debian/memory/swap/available.rb +2 -1
  41. data/lib/facts/debian/memory/swap/available_bytes.rb +4 -1
  42. data/lib/facts/debian/memory/swap/total.rb +2 -1
  43. data/lib/facts/debian/memory/swap/total_bytes.rb +3 -1
  44. data/lib/facts/debian/memory/system/available.rb +3 -1
  45. data/lib/facts/debian/memory/system/available_bytes.rb +4 -1
  46. data/lib/facts/debian/memory/system/total.rb +2 -1
  47. data/lib/facts/debian/memory/system/total_bytes.rb +3 -1
  48. data/lib/facts/debian/networking/mac.rb +18 -0
  49. data/lib/facts/debian/os/distro/codename.rb +21 -0
  50. data/lib/facts/debian/os/distro/description.rb +21 -0
  51. data/lib/facts/debian/os/distro/id.rb +21 -0
  52. data/lib/facts/debian/os/distro/release.rb +31 -0
  53. data/lib/facts/debian/os/distro/specification.rb +21 -0
  54. data/lib/facts/debian/os/hardware.rb +2 -1
  55. data/lib/facts/debian/os/selinux/config_mode.rb +21 -0
  56. data/lib/facts/debian/os/selinux/config_policy.rb +21 -0
  57. data/lib/facts/debian/os/selinux/current_mode.rb +21 -0
  58. data/lib/facts/debian/os/selinux/enabled.rb +21 -0
  59. data/lib/facts/debian/os/selinux/enforced.rb +21 -0
  60. data/lib/facts/debian/os/selinux/policy_version.rb +21 -0
  61. data/lib/facts/debian/processors/count.rb +2 -1
  62. data/lib/facts/debian/processors/isa.rb +3 -2
  63. data/lib/facts/debian/processors/physicalcount.rb +2 -1
  64. data/lib/facts/debian/puppet_version.rb +15 -0
  65. data/lib/facts/debian/ruby/platform.rb +2 -1
  66. data/lib/facts/debian/ruby/sitedir.rb +2 -1
  67. data/lib/facts/debian/system_uptime/days.rb +2 -1
  68. data/lib/facts/debian/system_uptime/hours.rb +2 -1
  69. data/lib/facts/debian/system_uptime/seconds.rb +18 -0
  70. data/lib/facts/debian/system_uptime/uptime.rb +2 -1
  71. data/lib/facts/el/augeas/version.rb +19 -0
  72. data/lib/facts/el/dmi/bios/release_date.rb +2 -1
  73. data/lib/facts/el/dmi/bios/vendor.rb +2 -1
  74. data/lib/facts/el/dmi/bios/version.rb +2 -1
  75. data/lib/facts/el/dmi/board/manufacturer.rb +2 -1
  76. data/lib/facts/el/dmi/board/product.rb +2 -1
  77. data/lib/facts/el/dmi/board/serial_number.rb +2 -1
  78. data/lib/facts/el/dmi/chassis/asset_tag.rb +2 -1
  79. data/lib/facts/el/dmi/chassis/type.rb +2 -1
  80. data/lib/facts/el/dmi/manufacturer.rb +2 -1
  81. data/lib/facts/el/dmi/product/name.rb +2 -1
  82. data/lib/facts/el/dmi/product/serial_number.rb +2 -1
  83. data/lib/facts/el/dmi/product/uuid.rb +2 -1
  84. data/lib/facts/el/identity/user.rb +17 -0
  85. data/lib/facts/el/interfaces.rb +16 -0
  86. data/lib/facts/el/memory/swap/available.rb +2 -1
  87. data/lib/facts/el/memory/swap/available_bytes.rb +3 -1
  88. data/lib/facts/el/memory/swap/total.rb +2 -1
  89. data/lib/facts/el/memory/swap/total_bytes.rb +3 -1
  90. data/lib/facts/el/memory/system/available.rb +2 -1
  91. data/lib/facts/el/memory/system/available_bytes.rb +3 -1
  92. data/lib/facts/el/memory/system/total.rb +2 -1
  93. data/lib/facts/el/memory/system/total_bytes.rb +3 -1
  94. data/lib/facts/el/networking/mac.rb +18 -0
  95. data/lib/facts/el/os/distro/codename.rb +21 -0
  96. data/lib/facts/el/os/distro/description.rb +21 -0
  97. data/lib/facts/el/os/distro/id.rb +21 -0
  98. data/lib/facts/el/os/distro/release.rb +31 -0
  99. data/lib/facts/el/os/distro/specification.rb +21 -0
  100. data/lib/facts/el/os/hardware.rb +2 -1
  101. data/lib/facts/el/os/selinux/config_mode.rb +21 -0
  102. data/lib/facts/el/os/selinux/config_policy.rb +21 -0
  103. data/lib/facts/el/os/selinux/current_mode.rb +21 -0
  104. data/lib/facts/el/os/selinux/enabled.rb +21 -0
  105. data/lib/facts/el/os/selinux/enforced.rb +21 -0
  106. data/lib/facts/el/os/selinux/policy_version.rb +21 -0
  107. data/lib/facts/el/processor.rb +19 -0
  108. data/lib/facts/el/processors/count.rb +2 -1
  109. data/lib/facts/el/processors/isa.rb +3 -1
  110. data/lib/facts/el/processors/physicalcount.rb +3 -1
  111. data/lib/facts/el/puppet_version.rb +15 -0
  112. data/lib/facts/el/ruby/platform.rb +3 -1
  113. data/lib/facts/el/ruby/sitedir.rb +3 -1
  114. data/lib/facts/el/ruby/version.rb +1 -0
  115. data/lib/facts/el/sshalgorithmkey.rb +16 -0
  116. data/lib/facts/el/sshfp_algorithm.rb +19 -0
  117. data/lib/facts/el/system_uptime/days.rb +3 -1
  118. data/lib/facts/el/system_uptime/hours.rb +3 -1
  119. data/lib/facts/el/system_uptime/seconds.rb +3 -1
  120. data/lib/facts/el/system_uptime/uptime.rb +3 -1
  121. data/lib/facts/macosx/augeas/version.rb +19 -0
  122. data/lib/facts/macosx/dmi/product/name.rb +2 -1
  123. data/lib/facts/macosx/identity/group.rb +2 -0
  124. data/lib/facts/macosx/identity/user.rb +2 -1
  125. data/lib/facts/macosx/interfaces.rb +15 -0
  126. data/lib/facts/macosx/memory/swap/available.rb +2 -1
  127. data/lib/facts/macosx/memory/swap/available_bytes.rb +3 -1
  128. data/lib/facts/macosx/memory/swap/encrypted.rb +2 -1
  129. data/lib/facts/macosx/memory/swap/total.rb +2 -1
  130. data/lib/facts/macosx/memory/swap/total_bytes.rb +3 -1
  131. data/lib/facts/macosx/memory/system/available.rb +2 -1
  132. data/lib/facts/macosx/memory/system/available_bytes.rb +3 -1
  133. data/lib/facts/macosx/memory/system/total.rb +2 -1
  134. data/lib/facts/macosx/memory/system/total_bytes.rb +3 -1
  135. data/lib/facts/macosx/networking/mac.rb +18 -0
  136. data/lib/facts/macosx/os/hardware.rb +2 -1
  137. data/lib/facts/macosx/os/macosx/build.rb +2 -2
  138. data/lib/facts/macosx/os/macosx/product.rb +2 -2
  139. data/lib/facts/macosx/os/macosx/version.rb +5 -1
  140. data/lib/facts/macosx/os/release.rb +11 -5
  141. data/lib/facts/macosx/processors/count.rb +2 -1
  142. data/lib/facts/macosx/processors/isa.rb +2 -1
  143. data/lib/facts/macosx/processors/models.rb +6 -1
  144. data/lib/facts/macosx/processors/physicalcount.rb +2 -1
  145. data/lib/facts/macosx/{augeas.rb → puppet_version.rb} +4 -3
  146. data/lib/facts/macosx/ruby/platform.rb +2 -2
  147. data/lib/facts/macosx/ruby/sitedir.rb +2 -2
  148. data/lib/facts/macosx/ssh.rb +26 -0
  149. data/lib/facts/macosx/sshalgorithmkey.rb +16 -0
  150. data/lib/facts/macosx/sshfp_algorithm.rb +19 -0
  151. data/lib/facts/macosx/system_profiler/boot_mode.rb +2 -1
  152. data/lib/facts/macosx/system_profiler/boot_rom_version.rb +2 -1
  153. data/lib/facts/macosx/system_profiler/boot_volume.rb +2 -1
  154. data/lib/facts/macosx/system_profiler/computer_name.rb +2 -1
  155. data/lib/facts/macosx/system_profiler/cores.rb +2 -1
  156. data/lib/facts/macosx/system_profiler/hardware_uuid.rb +2 -1
  157. data/lib/facts/macosx/system_profiler/kernel_version.rb +2 -1
  158. data/lib/facts/macosx/system_profiler/l2_cache_per_core.rb +2 -1
  159. data/lib/facts/macosx/system_profiler/l3_cache.rb +2 -1
  160. data/lib/facts/macosx/system_profiler/memory.rb +2 -1
  161. data/lib/facts/macosx/system_profiler/model_identifier.rb +2 -1
  162. data/lib/facts/macosx/system_profiler/model_name.rb +2 -1
  163. data/lib/facts/macosx/system_profiler/processor_name.rb +2 -1
  164. data/lib/facts/macosx/system_profiler/processor_speed.rb +2 -1
  165. data/lib/facts/macosx/system_profiler/processors.rb +2 -1
  166. data/lib/facts/macosx/system_profiler/secure_virtual_memory.rb +2 -1
  167. data/lib/facts/macosx/system_profiler/serial_number.rb +2 -1
  168. data/lib/facts/macosx/system_profiler/smc_version.rb +2 -1
  169. data/lib/facts/macosx/system_profiler/system_version.rb +2 -1
  170. data/lib/facts/macosx/system_profiler/uptime.rb +2 -1
  171. data/lib/facts/macosx/system_profiler/username.rb +2 -1
  172. data/lib/facts/macosx/system_uptime/days.rb +2 -1
  173. data/lib/facts/macosx/system_uptime/hours.rb +2 -1
  174. data/lib/facts/macosx/system_uptime/seconds.rb +2 -1
  175. data/lib/facts/macosx/system_uptime/uptime.rb +2 -1
  176. data/lib/facts/sles/augeas/version.rb +19 -0
  177. data/lib/facts/sles/disks.rb +15 -0
  178. data/lib/facts/sles/dmi/bios/release_date.rb +19 -0
  179. data/lib/facts/sles/dmi/bios/vendor.rb +19 -0
  180. data/lib/facts/sles/dmi/bios/version.rb +19 -0
  181. data/lib/facts/sles/dmi/board/manufacturer.rb +19 -0
  182. data/lib/facts/sles/dmi/board/product.rb +19 -0
  183. data/lib/facts/sles/dmi/board/serial_number.rb +19 -0
  184. data/lib/facts/sles/dmi/chassis/asset_tag.rb +19 -0
  185. data/lib/facts/sles/dmi/chassis/type.rb +19 -0
  186. data/lib/facts/sles/dmi/manufacturer.rb +17 -0
  187. data/lib/facts/sles/dmi/product/name.rb +19 -0
  188. data/lib/facts/sles/dmi/product/serial_number.rb +19 -0
  189. data/lib/facts/sles/dmi/product/uuid.rb +19 -0
  190. data/lib/facts/sles/filesystems.rb +14 -0
  191. data/lib/facts/sles/fips_enabled.rb +14 -0
  192. data/lib/facts/sles/identity/user.rb +17 -0
  193. data/lib/facts/sles/interfaces.rb +16 -0
  194. data/lib/facts/sles/load_averages.rb +14 -0
  195. data/lib/facts/sles/memory/swap/available.rb +2 -1
  196. data/lib/facts/sles/memory/swap/available_bytes.rb +3 -1
  197. data/lib/facts/sles/memory/swap/total.rb +2 -1
  198. data/lib/facts/sles/memory/swap/total_bytes.rb +3 -1
  199. data/lib/facts/sles/memory/swap/used.rb +1 -1
  200. data/lib/facts/sles/memory/swap/used_bytes.rb +1 -1
  201. data/lib/facts/sles/memory/system/available.rb +2 -1
  202. data/lib/facts/sles/memory/system/available_bytes.rb +3 -1
  203. data/lib/facts/sles/memory/system/total.rb +2 -1
  204. data/lib/facts/sles/memory/system/total_bytes.rb +3 -1
  205. data/lib/facts/sles/mountpoints.rb +21 -0
  206. data/lib/facts/sles/networking/mac.rb +18 -0
  207. data/lib/facts/sles/os/distro/codename.rb +21 -0
  208. data/lib/facts/sles/os/distro/description.rb +21 -0
  209. data/lib/facts/sles/os/distro/id.rb +21 -0
  210. data/lib/facts/sles/os/distro/release.rb +31 -0
  211. data/lib/facts/sles/os/distro/specification.rb +21 -0
  212. data/lib/facts/sles/os/family.rb +1 -1
  213. data/lib/facts/sles/os/hardware.rb +2 -1
  214. data/lib/facts/sles/os/release.rb +3 -3
  215. data/lib/facts/sles/os/selinux/config_mode.rb +21 -0
  216. data/lib/facts/sles/os/selinux/config_policy.rb +21 -0
  217. data/lib/facts/sles/os/selinux/current_mode.rb +21 -0
  218. data/lib/facts/sles/os/selinux/enabled.rb +21 -0
  219. data/lib/facts/sles/os/selinux/enforced.rb +21 -0
  220. data/lib/facts/sles/os/selinux/policy_version.rb +21 -0
  221. data/lib/facts/sles/puppet_version.rb +15 -0
  222. data/lib/facts/sles/ruby/platform.rb +3 -1
  223. data/lib/facts/sles/ruby/sitedir.rb +3 -1
  224. data/lib/facts/sles/ruby/version.rb +1 -0
  225. data/lib/facts/sles/sshalgorithmkey.rb +16 -0
  226. data/lib/facts/sles/sshfp_algorithm.rb +19 -0
  227. data/lib/facts/sles/system_uptime/days.rb +18 -0
  228. data/lib/facts/sles/system_uptime/hours.rb +18 -0
  229. data/lib/facts/sles/system_uptime/seconds.rb +18 -0
  230. data/lib/facts/sles/system_uptime/uptime.rb +18 -0
  231. data/lib/facts/solaris/augeas/version.rb +19 -0
  232. data/lib/facts/solaris/filesystems.rb +14 -0
  233. data/lib/facts/solaris/identity/user.rb +17 -0
  234. data/lib/facts/solaris/os/hardware.rb +3 -1
  235. data/lib/facts/solaris/puppet_version.rb +15 -0
  236. data/lib/facts/solaris/ruby/platform.rb +3 -1
  237. data/lib/facts/solaris/ruby/sitedir.rb +2 -1
  238. data/lib/facts/solaris/solaris_zones/current.rb +3 -1
  239. data/lib/facts/solaris/solaris_zones/zone.rb +39 -6
  240. data/lib/facts/solaris/ssh.rb +26 -0
  241. data/lib/facts/solaris/system_uptime/days.rb +17 -0
  242. data/lib/facts/solaris/system_uptime/hours.rb +17 -0
  243. data/lib/facts/{debian/system_uptime/minutes.rb → solaris/system_uptime/seconds.rb} +4 -4
  244. data/lib/facts/solaris/system_uptime/uptime.rb +17 -0
  245. data/lib/facts/solaris/timezone.rb +14 -0
  246. data/lib/facts/windows/augeas/version.rb +19 -0
  247. data/lib/facts/windows/puppet_version.rb +15 -0
  248. data/lib/facts_utils/bytes_converter.rb +15 -0
  249. data/lib/framework/config/block_list.rb +1 -1
  250. data/lib/framework/config/config_reader.rb +1 -1
  251. data/lib/framework/core/fact/external/external_fact_manager.rb +1 -1
  252. data/lib/framework/core/fact_loaders/external_fact_loader.rb +1 -1
  253. data/lib/framework/core/fact_manager.rb +5 -0
  254. data/lib/framework/logging/logger.rb +10 -1
  255. data/lib/models/fact_collection.rb +15 -1
  256. data/lib/models/resolved_fact.rb +5 -1
  257. data/lib/resolvers/aix/filesystem_resolver.rb +33 -0
  258. data/lib/resolvers/disk_resolver.rb +11 -3
  259. data/lib/resolvers/dmi_resolver.rb +1 -1
  260. data/lib/resolvers/filesystems_resolver.rb +2 -0
  261. data/lib/resolvers/fips_enabled_resolver.rb +2 -1
  262. data/lib/resolvers/hostname_resolver.rb +1 -1
  263. data/lib/resolvers/load_averages_resolver.rb +2 -0
  264. data/lib/resolvers/lsb_release_resolver.rb +23 -5
  265. data/lib/resolvers/macosx/ipaddress_resolver.rb +14 -1
  266. data/lib/resolvers/memory_resolver.rb +2 -0
  267. data/lib/resolvers/mountpoints_resolver.rb +2 -0
  268. data/lib/resolvers/networking_linux_resolver.rb +7 -1
  269. data/lib/resolvers/os_release_resolver.rb +1 -1
  270. data/lib/resolvers/processors_resolver.rb +2 -0
  271. data/lib/resolvers/puppet_version_resolver.rb +27 -0
  272. data/lib/resolvers/selinux_resolver.rb +36 -4
  273. data/lib/resolvers/solaris/filesystems_resolver.rb +32 -0
  274. data/lib/resolvers/solaris/zone_resolver.rb +4 -4
  275. data/lib/resolvers/ssh_resolver.rb +1 -1
  276. metadata +123 -8
  277. data/lib/facts/debian/os/distro.rb +0 -31
  278. data/lib/facts/debian/os/selinux.rb +0 -23
  279. data/lib/facts/el/os/selinux.rb +0 -23
  280. data/lib/facts/sles/os/selinux.rb +0 -23
@@ -13,11 +13,11 @@ module LegacyFacter
13
13
 
14
14
  def which(bin)
15
15
  if absolute_path?(bin)
16
- return bin if File.executable?(bin) && File.file?(bin)
16
+ return bin if File.executable?(bin) && FileTest.file?(bin)
17
17
  else
18
18
  search_paths.each do |dir|
19
19
  dest = File.join(dir, bin)
20
- return dest if File.executable?(dest) && File.file?(dest)
20
+ return dest if File.executable?(dest) && FileTest.file?(dest)
21
21
  end
22
22
  end
23
23
  nil
@@ -5,7 +5,7 @@ require 'timeout'
5
5
  # The resolvable mixin defines behavior for evaluating and returning fact
6
6
  # resolutions.
7
7
  #
8
- # Classes including this mixin should implement at #name method describing
8
+ # Classes including this mixin should implement a #name method describing
9
9
  # the value being resolved and a #resolve_value that actually executes the code
10
10
  # to resolve the value.
11
11
  module LegacyFacter
@@ -20,6 +20,7 @@ module LegacyFacter
20
20
  # @api public
21
21
  def has_weight(weight)
22
22
  @weight = weight
23
+ self
23
24
  end
24
25
 
25
26
  # Sets the conditions for this resolution to be used. This method accepts
@@ -69,7 +70,7 @@ module LegacyFacter
69
70
  # evaluates to `false` or `nil` then the confined fact will not be
70
71
  # evaluated.
71
72
  # @example Confine the fact to systems with a specific file.
72
- # confine { File.exist? '/bin/foo' }
73
+ # confine { File.readable? '/bin/foo' }
73
74
  def confine(confines = nil, &block)
74
75
  case confines
75
76
  when Hash
@@ -11,7 +11,7 @@ module LegacyFacter
11
11
  class Fact
12
12
  # The name of the fact
13
13
  # @return [String]
14
- attr_accessor :name
14
+ attr_reader :name
15
15
 
16
16
  # @return [String]
17
17
  # @deprecated
@@ -161,7 +161,7 @@ module LegacyFacter
161
161
  end
162
162
 
163
163
  def sort_by_weight(resolutions)
164
- resolutions.sort { |a, b| b.weight.to_i <=> a.weight.to_i }
164
+ resolutions.sort { |a, b| b.weight <=> a.weight }
165
165
  end
166
166
 
167
167
  def find_first_real_value(resolutions)
@@ -171,7 +171,7 @@ module LegacyFacter
171
171
  rescue Facter::ResolveCustomFactError
172
172
  break
173
173
  end
174
- @used_resolution_weight = resolve.weight || 0
174
+ @used_resolution_weight = resolve.weight
175
175
  return value unless value.nil?
176
176
  end
177
177
  nil
@@ -25,7 +25,7 @@ module LegacyFacter
25
25
  # Load individual files
26
26
  file = File.join(dir, filename)
27
27
 
28
- load_file(file) if File.file?(file)
28
+ load_file(file) if FileTest.file?(file)
29
29
  end
30
30
  end
31
31
 
@@ -42,7 +42,7 @@ module LegacyFacter
42
42
  # dir is already an absolute path
43
43
  Dir.glob(File.join(dir, '*.rb')).each do |path|
44
44
  # exclude dirs that end with .rb
45
- load_file(path) if File.file?(path)
45
+ load_file(path) if FileTest.file?(path)
46
46
  end
47
47
  end
48
48
 
@@ -131,7 +131,7 @@ module LegacyFacter
131
131
 
132
132
  class ScriptParser < Base
133
133
  def parse_results
134
- parse_executable_output(LegacyFacter::Core::Execution.exec(quote(filename)))
134
+ parse_executable_output(Facter::Core::Execution.exec(quote(filename)))
135
135
  end
136
136
 
137
137
  private
@@ -143,9 +143,9 @@ module LegacyFacter
143
143
 
144
144
  register(ScriptParser) do |filename|
145
145
  if LegacyFacter::Util::Config.windows?
146
- extension_matches?(filename, %w[bat cmd com exe]) && File.file?(filename)
146
+ extension_matches?(filename, %w[bat cmd com exe]) && FileTest.file?(filename)
147
147
  else
148
- File.executable?(filename) && File.file?(filename) && !extension_matches?(filename, %w[bat cmd com exe])
148
+ File.executable?(filename) && FileTest.file?(filename) && !extension_matches?(filename, %w[bat cmd com exe])
149
149
  end
150
150
  end
151
151
 
@@ -154,9 +154,9 @@ module LegacyFacter
154
154
  # Returns a hash of facts from powershell output
155
155
  def parse_results
156
156
  powershell =
157
- if File.exist?("#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe")
157
+ if File.readable?("#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe")
158
158
  "#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe"
159
- elsif File.exist?("#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe")
159
+ elsif File.readable?("#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe")
160
160
  "#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe"
161
161
  else
162
162
  'powershell.exe'
@@ -164,13 +164,13 @@ module LegacyFacter
164
164
 
165
165
  shell_command =
166
166
  "\"#{powershell}\" -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File \"#{filename}\""
167
- output = LegacyFacter::Core::Execution.exec(shell_command)
167
+ output = Facter::Core::Execution.exec(shell_command)
168
168
  parse_executable_output(output)
169
169
  end
170
170
  end
171
171
 
172
172
  register(PowershellParser) do |filename|
173
- LegacyFacter::Util::Config.windows? && extension_matches?(filename, 'ps1') && File.file?(filename)
173
+ LegacyFacter::Util::Config.windows? && extension_matches?(filename, 'ps1') && FileTest.file?(filename)
174
174
  end
175
175
 
176
176
  # A parser that is used when there is no other parser that can handle the file
@@ -16,9 +16,7 @@ module Facter
16
16
  attr_accessor :code
17
17
  attr_writer :value
18
18
 
19
- attr_reader :weight
20
-
21
- extend LegacyFacter::Core::Execution
19
+ extend Facter::Core::Execution
22
20
 
23
21
  class << self
24
22
  # Expose command execution methods that were extracted into
@@ -79,7 +79,7 @@ module LegacyFacter
79
79
  # @return [String] the version -- for example: "1.6.14-6-gea42046" or nil if the VERSION
80
80
  # file does not exist.
81
81
  def self.read_version_file(path)
82
- File.read(path).chomp if File.exist?(path)
82
+ File.read(path).chomp if File.readable?(path)
83
83
  end
84
84
  private_class_method :read_version_file
85
85
  end
@@ -13,18 +13,47 @@ module Facter
13
13
  @options = Options.instance
14
14
  Log.add_legacy_logger(STDOUT)
15
15
  @logger = Log.new(self)
16
+ @already_searched = {}
16
17
 
17
18
  class << self
19
+ def clear_messages
20
+ @logger.debug('clear_messages is not implemented')
21
+ end
22
+
23
+ # Alias method for Facter.fact()
24
+ # @param name [string] fact name
25
+ #
26
+ # @return [LegacyFacter::Util::Fact, nil] The fact object, or nil if no fact
27
+ # is found.
28
+ #
29
+ # @api public
18
30
  def [](name)
19
31
  fact(name)
20
32
  end
21
33
 
34
+ # Add custom facts to fact collection
35
+ # @param name [String] Custom fact name
36
+ # @param options = {} [Hash] optional parameters for the fact - attributes
37
+ # of {Facter::Util::Fact} and {Facter::Util::Resolution} can be
38
+ # supplied here
39
+ # @param block [Proc] a block defining a fact resolution
40
+ #
41
+ # @return [LegacyFacter::Util::Fact] the fact object, which includes any previously
42
+ # defined resolutions
43
+ #
44
+ # @api public
22
45
  def add(name, options = {}, &block)
23
46
  options[:fact_type] = :custom
24
47
  LegacyFacter.add(name, options, &block)
25
48
  end
26
49
 
50
+ # Clears all cached values and removes all facts from memory.
51
+ #
52
+ # @return [nil]
53
+ #
54
+ # @api public
27
55
  def clear
56
+ @already_searched = {}
28
57
  LegacyFacter.clear
29
58
  end
30
59
 
@@ -36,6 +65,12 @@ module Facter
36
65
  fact_collection.dig(*splitted_user_query)
37
66
  end
38
67
 
68
+ # Prints out a debug message when debug option is set to true
69
+ # @param msg [String] Message to be printed out
70
+ #
71
+ # @return [nil]
72
+ #
73
+ # @api public
39
74
  def debug(msg)
40
75
  return unless debugging?
41
76
 
@@ -47,10 +82,21 @@ module Facter
47
82
  Facter::Log.on_message(&block)
48
83
  end
49
84
 
85
+ # Check whether debuging is enabled
86
+ #
87
+ # @return [bool]
88
+ #
89
+ # @api public
50
90
  def debugging?
51
91
  Options[:debug]
52
92
  end
53
93
 
94
+ # Enable or disable debugging
95
+ # @param debug_bool [bool] State which debugging should have
96
+ #
97
+ # @return [type] [description]
98
+ #
99
+ # @api public
54
100
  def debugging(debug_bool)
55
101
  @options.priority_options[:debug] = debug_bool
56
102
  @options.refresh
@@ -58,52 +104,83 @@ module Facter
58
104
  debug_bool
59
105
  end
60
106
 
61
- def fact(name)
62
- fact = Facter::Util::Fact.new(name)
63
- val = value(name)
64
- fact.add({}) { setcode { val } }
65
- fact
66
- end
67
-
68
- def log_errors(missing_names)
69
- missing_names.each do |missing_name|
70
- @logger.error("fact \"#{missing_name}\" does not exist.", true)
71
- end
72
- end
107
+ # Returns a fact object by name. If you use this, you still have to
108
+ # call {Facter::Util::Fact#value `value`} on it to retrieve the actual
109
+ # value.
110
+ #
111
+ # @param name [String] the name of the fact
112
+ #
113
+ # @return [LegacyFacter::Util::Fact, nil] The fact object, or nil if no fact
114
+ # is found.
115
+ #
116
+ # @api public
117
+ def fact(user_query)
118
+ user_query = user_query.to_s
119
+ resolve_fact(user_query)
73
120
 
74
- def method_missing(name, *args, &block)
75
- @logger.error(
76
- "--#{name}-- not implemented but required \n" \
77
- 'with params: ' \
78
- "#{args.inspect} \n" \
79
- 'with block: ' \
80
- "#{block.inspect} \n" \
81
- "called by: \n" \
82
- "#{caller} \n"
83
- )
84
- nil
121
+ @already_searched[user_query]
85
122
  end
86
123
 
124
+ # Reset search paths for custom and external facts
125
+ # If config file is set custom and external facts will be reloaded
126
+ #
127
+ # @return [nil]
128
+ #
129
+ # @api public
87
130
  def reset
88
131
  LegacyFacter.reset
132
+ LegacyFacter.search(*Options.custom_dir)
133
+ LegacyFacter.search_external(Options.external_dir)
134
+ nil
89
135
  end
90
136
 
137
+ # Register directories to be searched for custom facts. The registered directories
138
+ # must be absolute paths or they will be ignored.
139
+ #
140
+ # @param dirs [Array<String>] An array of searched directories
141
+ #
142
+ # @return [void]
143
+ #
144
+ # @api public
91
145
  def search(*dirs)
92
146
  LegacyFacter.search(*dirs)
93
147
  end
94
148
 
149
+ # Registers directories to be searched for external facts.
150
+ #
151
+ # @param dirs [Array<String>] An array of searched directories
152
+ #
153
+ # @return [void]
154
+ #
155
+ # @api public
95
156
  def search_external(dirs)
96
157
  LegacyFacter.search_external(dirs)
97
158
  end
98
159
 
160
+ # Returns the registered search directories.for external facts.
161
+ #
162
+ # @return [Array<String>] An array of searched directories
163
+ #
164
+ # @api public
99
165
  def search_external_path
100
166
  LegacyFacter.search_external_path
101
167
  end
102
168
 
169
+ # Returns the registered search directories for custom facts.
170
+ #
171
+ # @return [Array<String>] An array of the directories searched
172
+ #
173
+ # @api public
103
174
  def search_path
104
175
  LegacyFacter.search_path
105
176
  end
106
177
 
178
+ # Gets a hash mapping fact names to their values
179
+ # The hash contains core facts, legacy facts, custom facts and external facts (all facts that can be resolved).
180
+ #
181
+ # @return [FactCollection] the hash of fact names and values
182
+ #
183
+ # @api public
107
184
  def to_hash
108
185
  @options.priority_options[:to_hash] = true
109
186
  @options.refresh
@@ -115,6 +192,52 @@ module Facter
115
192
  FactCollection.new.build_fact_collection!(resolved_facts)
116
193
  end
117
194
 
195
+ # Check whether printing stack trace is enabled
196
+ #
197
+ # @return [bool]
198
+ #
199
+ # @api public
200
+ def trace?
201
+ LegacyFacter.trace?
202
+ end
203
+
204
+ # Enable or disable trace
205
+ # @param debug_bool [bool] Set trace on debug state
206
+ #
207
+ # @return [type] [description]
208
+ #
209
+ # @api public
210
+ def trace(bool)
211
+ LegacyFacter.trace(bool)
212
+ end
213
+
214
+ # Gets the value for a fact. Returns `nil` if no such fact exists.
215
+ #
216
+ # @param name [String] the fact name
217
+ # @return [String] the value of the fact, or nil if no fact is found
218
+ #
219
+ # @api public
220
+ def value(user_query)
221
+ user_query = user_query.to_s
222
+ resolve_fact(user_query)
223
+ @already_searched[user_query]&.value
224
+ end
225
+
226
+ # Returns Facter version
227
+ #
228
+ # @return [String] Current version
229
+ #
230
+ # @api public
231
+ def version
232
+ version_file = ::File.join(ROOT_DIR, 'VERSION')
233
+ ::File.read(version_file).strip
234
+ end
235
+
236
+ # Gets a hash mapping fact names to their values
237
+ #
238
+ # @return [Array] the hash of fact names and values
239
+ #
240
+ # @api private
118
241
  def to_user_output(cli_options, *args)
119
242
  @options.priority_options = { is_cli: true }.merge!(cli_options.map { |(k, v)| [k.to_sym, v] }.to_h)
120
243
  @options.refresh(args)
@@ -130,36 +253,43 @@ module Facter
130
253
  [fact_formatter.format(resolved_facts), status || 0]
131
254
  end
132
255
 
133
- def trace?
134
- LegacyFacter.trace?
135
- end
256
+ private
136
257
 
137
- def trace(bool)
138
- LegacyFacter.trace(bool)
258
+ def add_fact_to_searched_facts(user_query, value)
259
+ @already_searched[user_query] ||= ResolvedFact.new(user_query, value)
260
+ @already_searched[user_query].value = value
139
261
  end
140
262
 
141
- def value(user_query)
263
+ # Returns a ResolvedFact and saves the result in @already_searched array that is used as a global collection.
264
+ # @param user_query [String] Fact that needs resolution
265
+ #
266
+ # @return [ResolvedFact]
267
+ def resolve_fact(user_query)
142
268
  @options.refresh([user_query])
143
269
  user_query = user_query.to_s
144
270
  resolved_facts = Facter::FactManager.instance.resolve_facts([user_query])
145
271
  CacheManager.invalidate_all_caches
146
272
  fact_collection = FactCollection.new.build_fact_collection!(resolved_facts)
147
273
  splitted_user_query = Facter::Utils.split_user_query(user_query)
148
- fact_collection.dig(*splitted_user_query)
149
- end
150
-
151
- def version
152
- version_file = ::File.join(ROOT_DIR, 'VERSION')
153
- ::File.read(version_file).strip
154
- end
155
274
 
156
- private
157
-
158
- def log_blocked_facts
159
- block_list = BlockList.instance.block_list
160
- @logger.debug("blocking collection of #{block_list.join("\s")} facts") if block_list.any? && Options[:block]
275
+ begin
276
+ value = fact_collection.value(*splitted_user_query)
277
+ add_fact_to_searched_facts(user_query, value)
278
+ rescue KeyError
279
+ nil
280
+ end
161
281
  end
162
282
 
283
+ # Returns exit status when user query contains facts that do
284
+ # not exist
285
+ #
286
+ # @param dirs [Array] Arguments sent to CLI
287
+ # @param dirs [Array] List of resolved facts
288
+ #
289
+ # @return [Integer, nil] Will return status 1 if user query contains
290
+ # facts that are not found or resolved, otherwise it will return nil
291
+ #
292
+ # @api private
163
293
  def error_check(args, resolved_facts)
164
294
  if Options.instance[:strict]
165
295
  missing_names = args - resolved_facts.map(&:user_query).uniq
@@ -173,5 +303,51 @@ module Facter
173
303
 
174
304
  status
175
305
  end
306
+
307
+ # Prints out blocked facts before to_hash or to_user_output is called
308
+ #
309
+ # @return [nil]
310
+ #
311
+ # @api private
312
+ def log_blocked_facts
313
+ block_list = BlockList.instance.block_list
314
+ @logger.debug("blocking collection of #{block_list.join("\s")} facts") if block_list.any? && Options[:block]
315
+ end
316
+
317
+ # Used for printing errors regarding CLI user input validation
318
+ #
319
+ # @param missing_names [Array] List of facts that were requested
320
+ # but not found
321
+ #
322
+ # @return [nil]
323
+ #
324
+ # @api private
325
+ def log_errors(missing_names)
326
+ missing_names.each do |missing_name|
327
+ @logger.error("fact \"#{missing_name}\" does not exist.", true)
328
+ end
329
+ end
330
+
331
+ # Proxy method that catches not yet implemented method calls
332
+ #
333
+ # @param name [type] [description]
334
+ # @param *args [type] [description]
335
+ # @param &block [type] [description]
336
+ #
337
+ # @return [type] [description]
338
+ #
339
+ # @api private
340
+ def method_missing(name, *args, &block)
341
+ @logger.error(
342
+ "--#{name}-- not implemented but required \n" \
343
+ 'with params: ' \
344
+ "#{args.inspect} \n" \
345
+ 'with block: ' \
346
+ "#{block.inspect} \n" \
347
+ "called by: \n" \
348
+ "#{caller} \n"
349
+ )
350
+ nil
351
+ end
176
352
  end
177
353
  end