facter 4.0.28

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 (775) hide show
  1. checksums.yaml +7 -0
  2. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  3. data/.github/actions/presuite.rb +139 -0
  4. data/.github/workflows/acceptance_tests.yml +65 -0
  5. data/.github/workflows/checks.yaml +54 -0
  6. data/.github/workflows/coverage.yaml +33 -0
  7. data/.github/workflows/unit_tests.yaml +43 -0
  8. data/.gitignore +57 -0
  9. data/.jrubyrc +2 -0
  10. data/.rspec +2 -0
  11. data/.rubocop.yml +170 -0
  12. data/.rubocop_todo.yml +236 -0
  13. data/.rubycritic.yml +4 -0
  14. data/CHANGELOG.md +239 -0
  15. data/CODEOWNERS +2 -0
  16. data/CONTRIBUTING.md +93 -0
  17. data/Gemfile +12 -0
  18. data/LICENSE +21 -0
  19. data/README.md +50 -0
  20. data/Rakefile +72 -0
  21. data/VERSION +1 -0
  22. data/acceptance/.beaker.yml +15 -0
  23. data/acceptance/.gitignore +12 -0
  24. data/acceptance/Gemfile +24 -0
  25. data/acceptance/Rakefile +2 -0
  26. data/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
  27. data/acceptance/config/aio/options.rb +6 -0
  28. data/acceptance/config/git/options.rb +3 -0
  29. data/acceptance/config/nodes/aix-53-power.yaml +7 -0
  30. data/acceptance/config/nodes/aix-61-power.yaml +7 -0
  31. data/acceptance/config/nodes/aix-71-power.yaml +7 -0
  32. data/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
  33. data/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
  34. data/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
  35. data/acceptance/lib/facter/acceptance/base_fact_utils.rb +565 -0
  36. data/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
  37. data/acceptance/lib/helper.rb +3 -0
  38. data/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
  39. data/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
  40. data/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
  41. data/acceptance/setup/aio/pre-suite/001_run_with_facter_ng.rb +75 -0
  42. data/acceptance/tests/custom_facts/cached_custom_fact.rb +82 -0
  43. data/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb +106 -0
  44. data/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
  45. data/acceptance/tests/custom_facts/expand_command.rb +30 -0
  46. data/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
  47. data/acceptance/tests/custom_facts/not_expand_command.rb +30 -0
  48. data/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
  49. data/acceptance/tests/custom_facts/weighted_cached_custom_facts.rb +94 -0
  50. data/acceptance/tests/custom_facts/windows_not_expand_command.rb +30 -0
  51. data/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
  52. data/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
  53. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
  54. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
  55. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
  56. data/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
  57. data/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
  58. data/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
  59. data/acceptance/tests/external_facts/handle_same_filename_in_different_dirs.rb +59 -0
  60. data/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
  61. data/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
  62. data/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
  63. data/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
  64. data/acceptance/tests/facts/dmi.rb +51 -0
  65. data/acceptance/tests/facts/facterversion.rb +11 -0
  66. data/acceptance/tests/facts/identity.rb +52 -0
  67. data/acceptance/tests/facts/mountpoints_fact.rb +12 -0
  68. data/acceptance/tests/facts/networking_facts.rb +93 -0
  69. data/acceptance/tests/facts/nim_type.rb +12 -0
  70. data/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
  71. data/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
  72. data/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
  73. data/acceptance/tests/facts/osx_numeric_hostname.rb +23 -0
  74. data/acceptance/tests/facts/partitions.rb +37 -0
  75. data/acceptance/tests/facts/productname.rb +15 -0
  76. data/acceptance/tests/facts/ruby.rb +59 -0
  77. data/acceptance/tests/facts/ssh_key.rb +59 -0
  78. data/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
  79. data/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
  80. data/acceptance/tests/facts/windows_os.rb +64 -0
  81. data/acceptance/tests/load_libfacter.rb +66 -0
  82. data/acceptance/tests/no_errors_on_stderr.rb +10 -0
  83. data/acceptance/tests/options/color.rb +16 -0
  84. data/acceptance/tests/options/config.rb +27 -0
  85. data/acceptance/tests/options/config_file/blocklist.rb +35 -0
  86. data/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
  87. data/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
  88. data/acceptance/tests/options/config_file/custom_facts.rb +42 -0
  89. data/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
  90. data/acceptance/tests/options/config_file/debug.rb +34 -0
  91. data/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
  92. data/acceptance/tests/options/config_file/default_file_location.rb +37 -0
  93. data/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
  94. data/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
  95. data/acceptance/tests/options/config_file/external_facts.rb +37 -0
  96. data/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
  97. data/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
  98. data/acceptance/tests/options/config_file/log_level.rb +35 -0
  99. data/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
  100. data/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
  101. data/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
  102. data/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
  103. data/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
  104. data/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
  105. data/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
  106. data/acceptance/tests/options/config_file/trace.rb +48 -0
  107. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_json_output.rb +92 -0
  108. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_text_output.rb +74 -0
  109. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_yaml_output.rb +88 -0
  110. data/acceptance/tests/options/config_file/ttls_cached_external_json_resolver.rb +79 -0
  111. data/acceptance/tests/options/config_file/ttls_cached_external_text_resolver.rb +78 -0
  112. data/acceptance/tests/options/config_file/ttls_cached_external_yaml_resolver.rb +78 -0
  113. data/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
  114. data/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
  115. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
  116. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
  117. data/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
  118. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
  119. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
  120. data/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
  121. data/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
  122. data/acceptance/tests/options/config_file/verbose.rb +34 -0
  123. data/acceptance/tests/options/custom_facts.rb +34 -0
  124. data/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
  125. data/acceptance/tests/options/custom_facts_list.rb +48 -0
  126. data/acceptance/tests/options/custom_facts_load_path.rb +42 -0
  127. data/acceptance/tests/options/debug.rb +12 -0
  128. data/acceptance/tests/options/external_facts.rb +28 -0
  129. data/acceptance/tests/options/external_facts_list.rb +35 -0
  130. data/acceptance/tests/options/help.rb +13 -0
  131. data/acceptance/tests/options/json.rb +43 -0
  132. data/acceptance/tests/options/list_block_groups.rb +15 -0
  133. data/acceptance/tests/options/list_block_groups_facter_4.rb +15 -0
  134. data/acceptance/tests/options/list_cache_groups.rb +65 -0
  135. data/acceptance/tests/options/log_level.rb +13 -0
  136. data/acceptance/tests/options/no_block.rb +34 -0
  137. data/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
  138. data/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
  139. data/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
  140. data/acceptance/tests/options/no_color.rb +16 -0
  141. data/acceptance/tests/options/no_custom_facts.rb +34 -0
  142. data/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
  143. data/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
  144. data/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
  145. data/acceptance/tests/options/no_external_facts.rb +28 -0
  146. data/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
  147. data/acceptance/tests/options/no_ruby.rb +44 -0
  148. data/acceptance/tests/options/puppet_facts.rb +37 -0
  149. data/acceptance/tests/options/show_legacy.rb +18 -0
  150. data/acceptance/tests/options/strict.rb +11 -0
  151. data/acceptance/tests/options/trace.rb +36 -0
  152. data/acceptance/tests/options/verbose.rb +12 -0
  153. data/acceptance/tests/options/version.rb +12 -0
  154. data/acceptance/tests/options/yaml.rb +43 -0
  155. data/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +23 -0
  156. data/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
  157. data/agent/facter-ng.gemspec +48 -0
  158. data/agent/lib/facter-ng.rb +7 -0
  159. data/bin/facter +12 -0
  160. data/check.sh +12 -0
  161. data/config/config.rb +6 -0
  162. data/custom_facts/my_custom_fact.rb +9 -0
  163. data/custom_facts/my_custom_os_fact.rb +8 -0
  164. data/docs/diagrams/facter_user_interaction.png +0 -0
  165. data/external_facts/my_external_fact.txt +1 -0
  166. data/fact_groups.conf +169 -0
  167. data/facter.conf +25 -0
  168. data/facter.gemspec +50 -0
  169. data/lib/custom_facts/core/aggregate.rb +206 -0
  170. data/lib/custom_facts/core/directed_graph.rb +47 -0
  171. data/lib/custom_facts/core/execution.rb +129 -0
  172. data/lib/custom_facts/core/execution/base.rb +100 -0
  173. data/lib/custom_facts/core/execution/posix.rb +55 -0
  174. data/lib/custom_facts/core/execution/windows.rb +70 -0
  175. data/lib/custom_facts/core/file_loader.rb +30 -0
  176. data/lib/custom_facts/core/legacy_facter.rb +208 -0
  177. data/lib/custom_facts/core/logging.rb +203 -0
  178. data/lib/custom_facts/core/resolvable.rb +103 -0
  179. data/lib/custom_facts/core/suitable.rb +110 -0
  180. data/lib/custom_facts/util/collection.rb +182 -0
  181. data/lib/custom_facts/util/composite_loader.rb +18 -0
  182. data/lib/custom_facts/util/config.rb +96 -0
  183. data/lib/custom_facts/util/confine.rb +70 -0
  184. data/lib/custom_facts/util/directory_loader.rb +112 -0
  185. data/lib/custom_facts/util/fact.rb +226 -0
  186. data/lib/custom_facts/util/loader.rb +157 -0
  187. data/lib/custom_facts/util/normalization.rb +95 -0
  188. data/lib/custom_facts/util/nothing_loader.rb +12 -0
  189. data/lib/custom_facts/util/parser.rb +193 -0
  190. data/lib/custom_facts/util/resolution.rb +166 -0
  191. data/lib/custom_facts/util/unix_root.rb +11 -0
  192. data/lib/custom_facts/util/values.rb +109 -0
  193. data/lib/custom_facts/util/windows_root.rb +11 -0
  194. data/lib/custom_facts/version.rb +85 -0
  195. data/lib/facter.rb +381 -0
  196. data/lib/facts/aix/aio_agent_version.rb +14 -0
  197. data/lib/facts/aix/augeas/version.rb +19 -0
  198. data/lib/facts/aix/facterversion.rb +15 -0
  199. data/lib/facts/aix/filesystems.rb +14 -0
  200. data/lib/facts/aix/hypervisors/lpar.rb +20 -0
  201. data/lib/facts/aix/hypervisors/wpar.rb +19 -0
  202. data/lib/facts/aix/identity/gid.rb +16 -0
  203. data/lib/facts/aix/identity/group.rb +18 -0
  204. data/lib/facts/aix/identity/privileged.rb +16 -0
  205. data/lib/facts/aix/identity/uid.rb +16 -0
  206. data/lib/facts/aix/identity/user.rb +17 -0
  207. data/lib/facts/aix/kernel.rb +15 -0
  208. data/lib/facts/aix/kernelmajversion.rb +16 -0
  209. data/lib/facts/aix/kernelrelease.rb +15 -0
  210. data/lib/facts/aix/kernelversion.rb +16 -0
  211. data/lib/facts/aix/load_averages.rb +14 -0
  212. data/lib/facts/aix/mountpoints.rb +15 -0
  213. data/lib/facts/aix/networking/domain.rb +17 -0
  214. data/lib/facts/aix/networking/fqdn.rb +17 -0
  215. data/lib/facts/aix/networking/hostname.rb +17 -0
  216. data/lib/facts/aix/networking/ip.rb +18 -0
  217. data/lib/facts/aix/networking/primary.rb +17 -0
  218. data/lib/facts/aix/nim_type.rb +15 -0
  219. data/lib/facts/aix/os/architecture.rb +18 -0
  220. data/lib/facts/aix/os/family.rb +18 -0
  221. data/lib/facts/aix/os/hardware.rb +18 -0
  222. data/lib/facts/aix/os/name.rb +18 -0
  223. data/lib/facts/aix/os/release.rb +21 -0
  224. data/lib/facts/aix/partitions.rb +15 -0
  225. data/lib/facts/aix/path.rb +14 -0
  226. data/lib/facts/aix/processors/count.rb +17 -0
  227. data/lib/facts/aix/processors/isa.rb +18 -0
  228. data/lib/facts/aix/processors/models.rb +16 -0
  229. data/lib/facts/aix/processors/speed.rb +17 -0
  230. data/lib/facts/aix/puppet_version.rb +15 -0
  231. data/lib/facts/aix/ruby/platform.rb +17 -0
  232. data/lib/facts/aix/ruby/sitedir.rb +17 -0
  233. data/lib/facts/aix/ruby/version.rb +17 -0
  234. data/lib/facts/aix/ssh.rb +34 -0
  235. data/lib/facts/aix/system_uptime/days.rb +17 -0
  236. data/lib/facts/aix/system_uptime/hours.rb +17 -0
  237. data/lib/facts/aix/system_uptime/seconds.rb +17 -0
  238. data/lib/facts/aix/system_uptime/uptime.rb +17 -0
  239. data/lib/facts/aix/timezone.rb +14 -0
  240. data/lib/facts/bsd/bsd_example_fact.rb +14 -0
  241. data/lib/facts/bsd/kernelmajversion.rb +16 -0
  242. data/lib/facts/bsd/kernelversion.rb +14 -0
  243. data/lib/facts/bsd/load_averages.rb +14 -0
  244. data/lib/facts/bsd/os/family.rb +18 -0
  245. data/lib/facts/bsd/processors/count.rb +17 -0
  246. data/lib/facts/bsd/processors/models.rb +23 -0
  247. data/lib/facts/bsd/processors/speed.rb +17 -0
  248. data/lib/facts/debian/architecture.rb +20 -0
  249. data/lib/facts/debian/lsbdistcodename.rb +16 -0
  250. data/lib/facts/debian/lsbdistdescription.rb +16 -0
  251. data/lib/facts/debian/lsbdistid.rb +16 -0
  252. data/lib/facts/debian/os/distro/codename.rb +30 -0
  253. data/lib/facts/debian/os/distro/description.rb +19 -0
  254. data/lib/facts/debian/os/distro/id.rb +19 -0
  255. data/lib/facts/debian/os/distro/release.rb +33 -0
  256. data/lib/facts/debian/os/release.rb +36 -0
  257. data/lib/facts/freebsd/disks.rb +15 -0
  258. data/lib/facts/freebsd/os/release.rb +43 -0
  259. data/lib/facts/freebsd/partitions.rb +15 -0
  260. data/lib/facts/freebsd/processors/count.rb +17 -0
  261. data/lib/facts/freebsd/processors/models.rb +23 -0
  262. data/lib/facts/freebsd/processors/speed.rb +17 -0
  263. data/lib/facts/linux/aio_agent_version.rb +14 -0
  264. data/lib/facts/linux/augeas/version.rb +19 -0
  265. data/lib/facts/linux/dhcp_servers.rb +27 -0
  266. data/lib/facts/linux/disks.rb +15 -0
  267. data/lib/facts/linux/dmi/bios/release_date.rb +19 -0
  268. data/lib/facts/linux/dmi/bios/vendor.rb +19 -0
  269. data/lib/facts/linux/dmi/bios/version.rb +19 -0
  270. data/lib/facts/linux/dmi/board/manufacturer.rb +19 -0
  271. data/lib/facts/linux/dmi/board/product.rb +19 -0
  272. data/lib/facts/linux/dmi/board/serial_number.rb +19 -0
  273. data/lib/facts/linux/dmi/chassis/asset_tag.rb +19 -0
  274. data/lib/facts/linux/dmi/chassis/type.rb +19 -0
  275. data/lib/facts/linux/dmi/manufacturer.rb +17 -0
  276. data/lib/facts/linux/dmi/product/name.rb +19 -0
  277. data/lib/facts/linux/dmi/product/serial_number.rb +19 -0
  278. data/lib/facts/linux/dmi/product/uuid.rb +19 -0
  279. data/lib/facts/linux/ec2_metadata.rb +47 -0
  280. data/lib/facts/linux/ec2_userdata.rb +47 -0
  281. data/lib/facts/linux/facterversion.rb +15 -0
  282. data/lib/facts/linux/filesystems.rb +14 -0
  283. data/lib/facts/linux/fips_enabled.rb +14 -0
  284. data/lib/facts/linux/hypervisors.rb +18 -0
  285. data/lib/facts/linux/identity/gid.rb +16 -0
  286. data/lib/facts/linux/identity/group.rb +18 -0
  287. data/lib/facts/linux/identity/privileged.rb +16 -0
  288. data/lib/facts/linux/identity/uid.rb +16 -0
  289. data/lib/facts/linux/identity/user.rb +17 -0
  290. data/lib/facts/linux/interfaces.rb +16 -0
  291. data/lib/facts/linux/ipaddress6_interfaces.rb +20 -0
  292. data/lib/facts/linux/ipaddress_interfaces.rb +20 -0
  293. data/lib/facts/linux/is_virtual.rb +64 -0
  294. data/lib/facts/linux/kernel.rb +15 -0
  295. data/lib/facts/linux/kernelmajversion.rb +24 -0
  296. data/lib/facts/linux/kernelrelease.rb +14 -0
  297. data/lib/facts/linux/kernelversion.rb +15 -0
  298. data/lib/facts/linux/load_averages.rb +14 -0
  299. data/lib/facts/linux/lsbdistrelease.rb +23 -0
  300. data/lib/facts/linux/macaddress_interfaces.rb +20 -0
  301. data/lib/facts/linux/memory/swap/available.rb +20 -0
  302. data/lib/facts/linux/memory/swap/available_bytes.rb +21 -0
  303. data/lib/facts/linux/memory/swap/capacity.rb +18 -0
  304. data/lib/facts/linux/memory/swap/total.rb +20 -0
  305. data/lib/facts/linux/memory/swap/total_bytes.rb +20 -0
  306. data/lib/facts/linux/memory/swap/used.rb +19 -0
  307. data/lib/facts/linux/memory/swap/used_bytes.rb +18 -0
  308. data/lib/facts/linux/memory/system/available.rb +21 -0
  309. data/lib/facts/linux/memory/system/available_bytes.rb +21 -0
  310. data/lib/facts/linux/memory/system/capacity.rb +18 -0
  311. data/lib/facts/linux/memory/system/total.rb +20 -0
  312. data/lib/facts/linux/memory/system/total_bytes.rb +20 -0
  313. data/lib/facts/linux/memory/system/used.rb +19 -0
  314. data/lib/facts/linux/memory/system/used_bytes.rb +18 -0
  315. data/lib/facts/linux/mountpoints.rb +21 -0
  316. data/lib/facts/linux/mtu_interfaces.rb +20 -0
  317. data/lib/facts/linux/netmask6_interfaces.rb +20 -0
  318. data/lib/facts/linux/netmask_interfaces.rb +20 -0
  319. data/lib/facts/linux/network6_interfaces.rb +20 -0
  320. data/lib/facts/linux/network_interfaces.rb +20 -0
  321. data/lib/facts/linux/networking/dhcp.rb +20 -0
  322. data/lib/facts/linux/networking/domain.rb +17 -0
  323. data/lib/facts/linux/networking/fqdn.rb +17 -0
  324. data/lib/facts/linux/networking/hostname.rb +17 -0
  325. data/lib/facts/linux/networking/interfaces.rb +16 -0
  326. data/lib/facts/linux/networking/ip.rb +21 -0
  327. data/lib/facts/linux/networking/ip6.rb +21 -0
  328. data/lib/facts/linux/networking/mac.rb +21 -0
  329. data/lib/facts/linux/networking/mtu.rb +20 -0
  330. data/lib/facts/linux/networking/netmask.rb +21 -0
  331. data/lib/facts/linux/networking/netmask6.rb +21 -0
  332. data/lib/facts/linux/networking/network.rb +21 -0
  333. data/lib/facts/linux/networking/network6.rb +21 -0
  334. data/lib/facts/linux/networking/primary.rb +17 -0
  335. data/lib/facts/linux/networking/scope6.rb +20 -0
  336. data/lib/facts/linux/os/architecture.rb +20 -0
  337. data/lib/facts/linux/os/distro/codename.rb +21 -0
  338. data/lib/facts/linux/os/distro/description.rb +21 -0
  339. data/lib/facts/linux/os/distro/id.rb +21 -0
  340. data/lib/facts/linux/os/distro/release.rb +31 -0
  341. data/lib/facts/linux/os/distro/specification.rb +21 -0
  342. data/lib/facts/linux/os/family.rb +20 -0
  343. data/lib/facts/linux/os/hardware.rb +18 -0
  344. data/lib/facts/linux/os/name.rb +18 -0
  345. data/lib/facts/linux/os/release.rb +20 -0
  346. data/lib/facts/linux/os/selinux/config_mode.rb +21 -0
  347. data/lib/facts/linux/os/selinux/config_policy.rb +21 -0
  348. data/lib/facts/linux/os/selinux/current_mode.rb +21 -0
  349. data/lib/facts/linux/os/selinux/enabled.rb +21 -0
  350. data/lib/facts/linux/os/selinux/enforced.rb +21 -0
  351. data/lib/facts/linux/os/selinux/policy_version.rb +21 -0
  352. data/lib/facts/linux/partitions.rb +26 -0
  353. data/lib/facts/linux/path.rb +15 -0
  354. data/lib/facts/linux/processor.rb +20 -0
  355. data/lib/facts/linux/processors/count.rb +17 -0
  356. data/lib/facts/linux/processors/isa.rb +26 -0
  357. data/lib/facts/linux/processors/models.rb +16 -0
  358. data/lib/facts/linux/processors/physicalcount.rb +17 -0
  359. data/lib/facts/linux/puppet_version.rb +15 -0
  360. data/lib/facts/linux/ruby/platform.rb +18 -0
  361. data/lib/facts/linux/ruby/sitedir.rb +18 -0
  362. data/lib/facts/linux/ruby/version.rb +18 -0
  363. data/lib/facts/linux/scope6_interfaces.rb +26 -0
  364. data/lib/facts/linux/ssh.rb +26 -0
  365. data/lib/facts/linux/sshalgorithmkey.rb +17 -0
  366. data/lib/facts/linux/sshfp_algorithm.rb +20 -0
  367. data/lib/facts/linux/system_uptime/days.rb +18 -0
  368. data/lib/facts/linux/system_uptime/hours.rb +18 -0
  369. data/lib/facts/linux/system_uptime/seconds.rb +18 -0
  370. data/lib/facts/linux/system_uptime/uptime.rb +18 -0
  371. data/lib/facts/linux/timezone.rb +14 -0
  372. data/lib/facts/linux/virtual.rb +58 -0
  373. data/lib/facts/macosx/aio_agent_version.rb +14 -0
  374. data/lib/facts/macosx/augeas/version.rb +19 -0
  375. data/lib/facts/macosx/dmi/product/name.rb +19 -0
  376. data/lib/facts/macosx/facterversion.rb +15 -0
  377. data/lib/facts/macosx/filesystems.rb +14 -0
  378. data/lib/facts/macosx/identity/gid.rb +16 -0
  379. data/lib/facts/macosx/identity/group.rb +18 -0
  380. data/lib/facts/macosx/identity/privileged.rb +16 -0
  381. data/lib/facts/macosx/identity/uid.rb +16 -0
  382. data/lib/facts/macosx/identity/user.rb +17 -0
  383. data/lib/facts/macosx/interfaces.rb +15 -0
  384. data/lib/facts/macosx/is_virtual.rb +30 -0
  385. data/lib/facts/macosx/kernel.rb +14 -0
  386. data/lib/facts/macosx/kernelmajversion.rb +15 -0
  387. data/lib/facts/macosx/kernelrelease.rb +14 -0
  388. data/lib/facts/macosx/kernelversion.rb +14 -0
  389. data/lib/facts/macosx/load_averages.rb +14 -0
  390. data/lib/facts/macosx/memory/swap/available.rb +21 -0
  391. data/lib/facts/macosx/memory/swap/available_bytes.rb +20 -0
  392. data/lib/facts/macosx/memory/swap/capacity.rb +18 -0
  393. data/lib/facts/macosx/memory/swap/encrypted.rb +19 -0
  394. data/lib/facts/macosx/memory/swap/total.rb +21 -0
  395. data/lib/facts/macosx/memory/swap/total_bytes.rb +20 -0
  396. data/lib/facts/macosx/memory/swap/used.rb +20 -0
  397. data/lib/facts/macosx/memory/swap/used_bytes.rb +18 -0
  398. data/lib/facts/macosx/memory/system/available.rb +21 -0
  399. data/lib/facts/macosx/memory/system/available_bytes.rb +20 -0
  400. data/lib/facts/macosx/memory/system/capacity.rb +18 -0
  401. data/lib/facts/macosx/memory/system/total.rb +21 -0
  402. data/lib/facts/macosx/memory/system/total_bytes.rb +20 -0
  403. data/lib/facts/macosx/memory/system/used.rb +20 -0
  404. data/lib/facts/macosx/memory/system/used_bytes.rb +18 -0
  405. data/lib/facts/macosx/mountpoints.rb +16 -0
  406. data/lib/facts/macosx/networking/dhcp.rb +17 -0
  407. data/lib/facts/macosx/networking/domain.rb +17 -0
  408. data/lib/facts/macosx/networking/fqdn.rb +17 -0
  409. data/lib/facts/macosx/networking/hostname.rb +17 -0
  410. data/lib/facts/macosx/networking/interfaces.rb +21 -0
  411. data/lib/facts/macosx/networking/ip.rb +21 -0
  412. data/lib/facts/macosx/networking/ip6.rb +21 -0
  413. data/lib/facts/macosx/networking/mac.rb +21 -0
  414. data/lib/facts/macosx/networking/mtu.rb +20 -0
  415. data/lib/facts/macosx/networking/netmask.rb +21 -0
  416. data/lib/facts/macosx/networking/netmask6.rb +21 -0
  417. data/lib/facts/macosx/networking/network.rb +21 -0
  418. data/lib/facts/macosx/networking/network6.rb +21 -0
  419. data/lib/facts/macosx/networking/primary.rb +17 -0
  420. data/lib/facts/macosx/networking/scope6.rb +20 -0
  421. data/lib/facts/macosx/os/architecture.rb +17 -0
  422. data/lib/facts/macosx/os/family.rb +18 -0
  423. data/lib/facts/macosx/os/hardware.rb +17 -0
  424. data/lib/facts/macosx/os/macosx/build.rb +19 -0
  425. data/lib/facts/macosx/os/macosx/product.rb +19 -0
  426. data/lib/facts/macosx/os/macosx/version.rb +25 -0
  427. data/lib/facts/macosx/os/name.rb +18 -0
  428. data/lib/facts/macosx/os/release.rb +26 -0
  429. data/lib/facts/macosx/path.rb +15 -0
  430. data/lib/facts/macosx/processors/count.rb +17 -0
  431. data/lib/facts/macosx/processors/isa.rb +17 -0
  432. data/lib/facts/macosx/processors/models.rb +21 -0
  433. data/lib/facts/macosx/processors/physicalcount.rb +17 -0
  434. data/lib/facts/macosx/processors/speed.rb +17 -0
  435. data/lib/facts/macosx/puppet_version.rb +15 -0
  436. data/lib/facts/macosx/ruby/platform.rb +17 -0
  437. data/lib/facts/macosx/ruby/sitedir.rb +17 -0
  438. data/lib/facts/macosx/ruby/version.rb +18 -0
  439. data/lib/facts/macosx/ssh.rb +26 -0
  440. data/lib/facts/macosx/sshalgorithmkey.rb +17 -0
  441. data/lib/facts/macosx/sshfp_algorithm.rb +20 -0
  442. data/lib/facts/macosx/system_profiler/boot_mode.rb +17 -0
  443. data/lib/facts/macosx/system_profiler/boot_rom_version.rb +17 -0
  444. data/lib/facts/macosx/system_profiler/boot_volume.rb +17 -0
  445. data/lib/facts/macosx/system_profiler/computer_name.rb +17 -0
  446. data/lib/facts/macosx/system_profiler/cores.rb +17 -0
  447. data/lib/facts/macosx/system_profiler/hardware_uuid.rb +17 -0
  448. data/lib/facts/macosx/system_profiler/kernel_version.rb +17 -0
  449. data/lib/facts/macosx/system_profiler/l2_cache_per_core.rb +17 -0
  450. data/lib/facts/macosx/system_profiler/l3_cache.rb +17 -0
  451. data/lib/facts/macosx/system_profiler/memory.rb +17 -0
  452. data/lib/facts/macosx/system_profiler/model_identifier.rb +17 -0
  453. data/lib/facts/macosx/system_profiler/model_name.rb +17 -0
  454. data/lib/facts/macosx/system_profiler/processor_name.rb +17 -0
  455. data/lib/facts/macosx/system_profiler/processor_speed.rb +17 -0
  456. data/lib/facts/macosx/system_profiler/processors.rb +17 -0
  457. data/lib/facts/macosx/system_profiler/secure_virtual_memory.rb +17 -0
  458. data/lib/facts/macosx/system_profiler/serial_number.rb +17 -0
  459. data/lib/facts/macosx/system_profiler/smc_version.rb +17 -0
  460. data/lib/facts/macosx/system_profiler/system_version.rb +17 -0
  461. data/lib/facts/macosx/system_profiler/uptime.rb +17 -0
  462. data/lib/facts/macosx/system_profiler/username.rb +17 -0
  463. data/lib/facts/macosx/system_uptime/days.rb +17 -0
  464. data/lib/facts/macosx/system_uptime/hours.rb +17 -0
  465. data/lib/facts/macosx/system_uptime/seconds.rb +17 -0
  466. data/lib/facts/macosx/system_uptime/uptime.rb +17 -0
  467. data/lib/facts/macosx/timezone.rb +14 -0
  468. data/lib/facts/rhel/os/distro/codename.rb +21 -0
  469. data/lib/facts/rhel/os/distro/description.rb +21 -0
  470. data/lib/facts/rhel/os/distro/id.rb +21 -0
  471. data/lib/facts/rhel/os/distro/release.rb +31 -0
  472. data/lib/facts/rhel/os/family.rb +16 -0
  473. data/lib/facts/rhel/os/name.rb +19 -0
  474. data/lib/facts/rhel/os/release.rb +36 -0
  475. data/lib/facts/sles/os/distro/codename.rb +21 -0
  476. data/lib/facts/sles/os/distro/description.rb +21 -0
  477. data/lib/facts/sles/os/distro/id.rb +21 -0
  478. data/lib/facts/sles/os/distro/release.rb +31 -0
  479. data/lib/facts/sles/os/family.rb +16 -0
  480. data/lib/facts/sles/os/release.rb +29 -0
  481. data/lib/facts/solaris/aio_agent_version.rb +14 -0
  482. data/lib/facts/solaris/augeas/version.rb +19 -0
  483. data/lib/facts/solaris/facterversion.rb +14 -0
  484. data/lib/facts/solaris/filesystems.rb +14 -0
  485. data/lib/facts/solaris/identity/gid.rb +16 -0
  486. data/lib/facts/solaris/identity/group.rb +18 -0
  487. data/lib/facts/solaris/identity/privileged.rb +16 -0
  488. data/lib/facts/solaris/identity/uid.rb +16 -0
  489. data/lib/facts/solaris/identity/user.rb +17 -0
  490. data/lib/facts/solaris/kernel.rb +14 -0
  491. data/lib/facts/solaris/kernelmajversion.rb +16 -0
  492. data/lib/facts/solaris/kernelrelease.rb +14 -0
  493. data/lib/facts/solaris/kernelversion.rb +14 -0
  494. data/lib/facts/solaris/mountpoints.rb +21 -0
  495. data/lib/facts/solaris/networking/domain.rb +17 -0
  496. data/lib/facts/solaris/networking/fqdn.rb +17 -0
  497. data/lib/facts/solaris/networking/hostname.rb +17 -0
  498. data/lib/facts/solaris/networking/ip.rb +18 -0
  499. data/lib/facts/solaris/os/architecture.rb +18 -0
  500. data/lib/facts/solaris/os/family.rb +16 -0
  501. data/lib/facts/solaris/os/hardware.rb +18 -0
  502. data/lib/facts/solaris/os/name.rb +19 -0
  503. data/lib/facts/solaris/os/release.rb +22 -0
  504. data/lib/facts/solaris/path.rb +14 -0
  505. data/lib/facts/solaris/processors/count.rb +17 -0
  506. data/lib/facts/solaris/processors/isa.rb +17 -0
  507. data/lib/facts/solaris/processors/models.rb +21 -0
  508. data/lib/facts/solaris/processors/physicalcount.rb +17 -0
  509. data/lib/facts/solaris/processors/speed.rb +17 -0
  510. data/lib/facts/solaris/puppet_version.rb +15 -0
  511. data/lib/facts/solaris/ruby/platform.rb +18 -0
  512. data/lib/facts/solaris/ruby/sitedir.rb +17 -0
  513. data/lib/facts/solaris/ruby/version.rb +17 -0
  514. data/lib/facts/solaris/solaris_zones/current.rb +18 -0
  515. data/lib/facts/solaris/solaris_zones/zone.rb +62 -0
  516. data/lib/facts/solaris/ssh.rb +26 -0
  517. data/lib/facts/solaris/system_uptime/days.rb +18 -0
  518. data/lib/facts/solaris/system_uptime/hours.rb +18 -0
  519. data/lib/facts/solaris/system_uptime/seconds.rb +18 -0
  520. data/lib/facts/solaris/system_uptime/uptime.rb +18 -0
  521. data/lib/facts/solaris/timezone.rb +14 -0
  522. data/lib/facts/solaris/zfs_featurenumbers.rb +14 -0
  523. data/lib/facts/solaris/zfs_version.rb +14 -0
  524. data/lib/facts/solaris/zpool_featureflags.rb +14 -0
  525. data/lib/facts/solaris/zpool_featurenumbers.rb +14 -0
  526. data/lib/facts/solaris/zpool_version.rb +14 -0
  527. data/lib/facts/ubuntu/os/distro/release.rb +31 -0
  528. data/lib/facts/ubuntu/os/release.rb +20 -0
  529. data/lib/facts/windows/aio_agent_version.rb +14 -0
  530. data/lib/facts/windows/augeas/version.rb +19 -0
  531. data/lib/facts/windows/dhcp_servers.rb +26 -0
  532. data/lib/facts/windows/dmi/manufacturer.rb +18 -0
  533. data/lib/facts/windows/dmi/product/name.rb +20 -0
  534. data/lib/facts/windows/dmi/product/serial_number.rb +20 -0
  535. data/lib/facts/windows/dmi/product/uuid.rb +20 -0
  536. data/lib/facts/windows/ec2_metadata.rb +23 -0
  537. data/lib/facts/windows/ec2_userdata.rb +23 -0
  538. data/lib/facts/windows/facterversion.rb +15 -0
  539. data/lib/facts/windows/fips_enabled.rb +15 -0
  540. data/lib/facts/windows/hypervisors/hyperv.rb +24 -0
  541. data/lib/facts/windows/hypervisors/kvm.rb +36 -0
  542. data/lib/facts/windows/hypervisors/virtualbox.rb +37 -0
  543. data/lib/facts/windows/hypervisors/vmware.rb +24 -0
  544. data/lib/facts/windows/hypervisors/xen.rb +23 -0
  545. data/lib/facts/windows/identity/privileged.rb +17 -0
  546. data/lib/facts/windows/identity/user.rb +18 -0
  547. data/lib/facts/windows/interfaces.rb +15 -0
  548. data/lib/facts/windows/ipaddress6_interfaces.rb +20 -0
  549. data/lib/facts/windows/ipaddress_interfaces.rb +20 -0
  550. data/lib/facts/windows/kernel.rb +15 -0
  551. data/lib/facts/windows/kernelmajversion.rb +15 -0
  552. data/lib/facts/windows/kernelrelease.rb +15 -0
  553. data/lib/facts/windows/kernelversion.rb +15 -0
  554. data/lib/facts/windows/macaddress_interfaces.rb +20 -0
  555. data/lib/facts/windows/memory/system/available.rb +21 -0
  556. data/lib/facts/windows/memory/system/available_bytes.rb +21 -0
  557. data/lib/facts/windows/memory/system/capacity.rb +19 -0
  558. data/lib/facts/windows/memory/system/total.rb +21 -0
  559. data/lib/facts/windows/memory/system/total_bytes.rb +21 -0
  560. data/lib/facts/windows/memory/system/used.rb +20 -0
  561. data/lib/facts/windows/memory/system/used_bytes.rb +19 -0
  562. data/lib/facts/windows/mtu_interfaces.rb +20 -0
  563. data/lib/facts/windows/netmask6_interfaces.rb +20 -0
  564. data/lib/facts/windows/netmask_interfaces.rb +20 -0
  565. data/lib/facts/windows/network6_interfaces.rb +20 -0
  566. data/lib/facts/windows/network_interfaces.rb +20 -0
  567. data/lib/facts/windows/networking/dhcp.rb +17 -0
  568. data/lib/facts/windows/networking/domain.rb +18 -0
  569. data/lib/facts/windows/networking/fqdn.rb +22 -0
  570. data/lib/facts/windows/networking/hostname.rb +18 -0
  571. data/lib/facts/windows/networking/interfaces.rb +17 -0
  572. data/lib/facts/windows/networking/ip.rb +18 -0
  573. data/lib/facts/windows/networking/ip6.rb +18 -0
  574. data/lib/facts/windows/networking/mac.rb +18 -0
  575. data/lib/facts/windows/networking/mtu.rb +17 -0
  576. data/lib/facts/windows/networking/netmask.rb +18 -0
  577. data/lib/facts/windows/networking/netmask6.rb +18 -0
  578. data/lib/facts/windows/networking/network.rb +18 -0
  579. data/lib/facts/windows/networking/network6.rb +18 -0
  580. data/lib/facts/windows/networking/primary.rb +17 -0
  581. data/lib/facts/windows/networking/scope6.rb +17 -0
  582. data/lib/facts/windows/os/architecture.rb +18 -0
  583. data/lib/facts/windows/os/family.rb +18 -0
  584. data/lib/facts/windows/os/hardware.rb +18 -0
  585. data/lib/facts/windows/os/name.rb +18 -0
  586. data/lib/facts/windows/os/release.rb +35 -0
  587. data/lib/facts/windows/os/windows/edition_id.rb +20 -0
  588. data/lib/facts/windows/os/windows/installation_type.rb +20 -0
  589. data/lib/facts/windows/os/windows/product_name.rb +20 -0
  590. data/lib/facts/windows/os/windows/release_id.rb +20 -0
  591. data/lib/facts/windows/os/windows/system32.rb +20 -0
  592. data/lib/facts/windows/path.rb +15 -0
  593. data/lib/facts/windows/processor.rb +20 -0
  594. data/lib/facts/windows/processors/count.rb +18 -0
  595. data/lib/facts/windows/processors/isa.rb +18 -0
  596. data/lib/facts/windows/processors/models.rb +17 -0
  597. data/lib/facts/windows/processors/physicalcount.rb +18 -0
  598. data/lib/facts/windows/puppet_version.rb +15 -0
  599. data/lib/facts/windows/ruby/platform.rb +18 -0
  600. data/lib/facts/windows/ruby/sitedir.rb +18 -0
  601. data/lib/facts/windows/ruby/version.rb +18 -0
  602. data/lib/facts/windows/scope6_interfaces.rb +20 -0
  603. data/lib/facts/windows/ssh.rb +27 -0
  604. data/lib/facts/windows/system_uptime/days.rb +18 -0
  605. data/lib/facts/windows/system_uptime/hours.rb +18 -0
  606. data/lib/facts/windows/system_uptime/seconds.rb +18 -0
  607. data/lib/facts/windows/system_uptime/uptime.rb +18 -0
  608. data/lib/facts/windows/timezone.rb +15 -0
  609. data/lib/facts/windows/virtualization/is_virtual.rb +17 -0
  610. data/lib/facts/windows/virtualization/virtual.rb +17 -0
  611. data/lib/facts_utils/hypervisors.rb +10 -0
  612. data/lib/facts_utils/unit_converter.rb +59 -0
  613. data/lib/facts_utils/uptime_parser.rb +124 -0
  614. data/lib/facts_utils/windows_release_finder.rb +51 -0
  615. data/lib/framework/cli/cli.rb +140 -0
  616. data/lib/framework/cli/cli_launcher.rb +59 -0
  617. data/lib/framework/config/config_reader.rb +50 -0
  618. data/lib/framework/config/fact_groups.rb +56 -0
  619. data/lib/framework/core/cache_manager.rb +153 -0
  620. data/lib/framework/core/fact/external/external_fact_manager.rb +32 -0
  621. data/lib/framework/core/fact/internal/core_fact.rb +15 -0
  622. data/lib/framework/core/fact/internal/internal_fact_manager.rb +65 -0
  623. data/lib/framework/core/fact_augmenter.rb +37 -0
  624. data/lib/framework/core/fact_filter.rb +27 -0
  625. data/lib/framework/core/fact_loaders/class_discoverer.rb +32 -0
  626. data/lib/framework/core/fact_loaders/external_fact_loader.rb +46 -0
  627. data/lib/framework/core/fact_loaders/fact_loader.rb +72 -0
  628. data/lib/framework/core/fact_loaders/internal_fact_loader.rb +53 -0
  629. data/lib/framework/core/fact_manager.rb +64 -0
  630. data/lib/framework/core/file_loader.rb +58 -0
  631. data/lib/framework/core/options.rb +64 -0
  632. data/lib/framework/core/options/config_file_options.rb +92 -0
  633. data/lib/framework/core/options/option_store.rb +174 -0
  634. data/lib/framework/core/options/options_validator.rb +83 -0
  635. data/lib/framework/core/session_cache.rb +19 -0
  636. data/lib/framework/detector/os_detector.rb +73 -0
  637. data/lib/framework/detector/os_hierarchy.rb +53 -0
  638. data/lib/framework/formatters/formatter_factory.rb +13 -0
  639. data/lib/framework/formatters/formatter_helper.rb +39 -0
  640. data/lib/framework/formatters/hocon_fact_formatter.rb +50 -0
  641. data/lib/framework/formatters/json_fact_formatter.rb +35 -0
  642. data/lib/framework/formatters/legacy_fact_formatter.rb +94 -0
  643. data/lib/framework/formatters/yaml_fact_formatter.rb +64 -0
  644. data/lib/framework/logging/logger.rb +126 -0
  645. data/lib/framework/logging/logger_helper.rb +19 -0
  646. data/lib/framework/parsers/query_parser.rb +115 -0
  647. data/lib/framework/utils/utils.rb +37 -0
  648. data/lib/models/fact_collection.rb +45 -0
  649. data/lib/models/loaded_fact.rb +15 -0
  650. data/lib/models/resolved_fact.rb +28 -0
  651. data/lib/models/searched_fact.rb +16 -0
  652. data/lib/resolvers/aio_agent_version.rb +24 -0
  653. data/lib/resolvers/aix/architecture_resolver.rb +39 -0
  654. data/lib/resolvers/aix/ffi/ffi_helper.rb +35 -0
  655. data/lib/resolvers/aix/filesystem_resolver.rb +34 -0
  656. data/lib/resolvers/aix/hardware_resolver.rb +39 -0
  657. data/lib/resolvers/aix/load_averages_resolver.rb +28 -0
  658. data/lib/resolvers/aix/mountpoints.rb +69 -0
  659. data/lib/resolvers/aix/networking_resolver.rb +34 -0
  660. data/lib/resolvers/aix/nim.rb +31 -0
  661. data/lib/resolvers/aix/os_level_resolver.rb +26 -0
  662. data/lib/resolvers/aix/partitions.rb +83 -0
  663. data/lib/resolvers/aix/processors.rb +80 -0
  664. data/lib/resolvers/aix/utils/odm_query.rb +42 -0
  665. data/lib/resolvers/augeas_resolver.rb +24 -0
  666. data/lib/resolvers/base_resolver.rb +33 -0
  667. data/lib/resolvers/bsd/ffi/ffi_helper.rb +56 -0
  668. data/lib/resolvers/bsd/load_averages_resolver.rb +26 -0
  669. data/lib/resolvers/bsd/processors.rb +47 -0
  670. data/lib/resolvers/debian_version.rb +29 -0
  671. data/lib/resolvers/disk_resolver.rb +54 -0
  672. data/lib/resolvers/dmi_resolver.rb +59 -0
  673. data/lib/resolvers/docker_lxc.rb +49 -0
  674. data/lib/resolvers/ec2.rb +77 -0
  675. data/lib/resolvers/eos_release_resolver.rb +33 -0
  676. data/lib/resolvers/facterversion_resolver.rb +23 -0
  677. data/lib/resolvers/filesystems_resolver.rb +34 -0
  678. data/lib/resolvers/fips_enabled_resolver.rb +27 -0
  679. data/lib/resolvers/freebsd/ffi/ffi_helper.rb +42 -0
  680. data/lib/resolvers/freebsd/freebsd_version_resolver.rb +37 -0
  681. data/lib/resolvers/freebsd/geom_resolver.rb +109 -0
  682. data/lib/resolvers/freebsd/processors.rb +44 -0
  683. data/lib/resolvers/hostname_resolver.rb +45 -0
  684. data/lib/resolvers/identity_resolver.rb +31 -0
  685. data/lib/resolvers/load_averages_resolver.rb +27 -0
  686. data/lib/resolvers/lpar_resolver.rb +31 -0
  687. data/lib/resolvers/lsb_release_resolver.rb +49 -0
  688. data/lib/resolvers/lspci.rb +35 -0
  689. data/lib/resolvers/macosx/dmi_resolver.rb +28 -0
  690. data/lib/resolvers/macosx/filesystems_resolver.rb +32 -0
  691. data/lib/resolvers/macosx/load_averages_resolver.rb +26 -0
  692. data/lib/resolvers/macosx/mountpoints_resolver.rb +61 -0
  693. data/lib/resolvers/macosx/networking.rb +110 -0
  694. data/lib/resolvers/macosx/processor_resolver.rb +58 -0
  695. data/lib/resolvers/macosx/swap_memory_resolver.rb +42 -0
  696. data/lib/resolvers/macosx/system_memory_resolver.rb +45 -0
  697. data/lib/resolvers/macosx/system_profiler_resolver.rb +62 -0
  698. data/lib/resolvers/memory_resolver.rb +59 -0
  699. data/lib/resolvers/mountpoints_resolver.rb +62 -0
  700. data/lib/resolvers/networking_linux_resolver.rb +141 -0
  701. data/lib/resolvers/open_vz.rb +45 -0
  702. data/lib/resolvers/os_level_resolver.rb +29 -0
  703. data/lib/resolvers/os_release_resolver.rb +67 -0
  704. data/lib/resolvers/partitions.rb +110 -0
  705. data/lib/resolvers/path_resolver.rb +22 -0
  706. data/lib/resolvers/processors_resolver.rb +63 -0
  707. data/lib/resolvers/puppet_version_resolver.rb +27 -0
  708. data/lib/resolvers/redhat_release_resolver.rb +55 -0
  709. data/lib/resolvers/ruby_resolver.rb +25 -0
  710. data/lib/resolvers/selinux_resolver.rb +69 -0
  711. data/lib/resolvers/solaris/filesystems_resolver.rb +32 -0
  712. data/lib/resolvers/solaris/ipaddress_resolver.rb +39 -0
  713. data/lib/resolvers/solaris/processors.rb +36 -0
  714. data/lib/resolvers/solaris/solaris_os_release_resolver.rb +42 -0
  715. data/lib/resolvers/solaris/solaris_zone_name.rb +28 -0
  716. data/lib/resolvers/solaris/zfs_resolver.rb +34 -0
  717. data/lib/resolvers/solaris/zone_resolver.rb +48 -0
  718. data/lib/resolvers/solaris/zpool_resolver.rb +36 -0
  719. data/lib/resolvers/ssh_resolver.rb +37 -0
  720. data/lib/resolvers/suse_release_resolver.rb +35 -0
  721. data/lib/resolvers/sw_vers_resolver.rb +30 -0
  722. data/lib/resolvers/timezone_resolver.rb +22 -0
  723. data/lib/resolvers/uname_resolver.rb +42 -0
  724. data/lib/resolvers/uptime_resolver.rb +57 -0
  725. data/lib/resolvers/utils/filesystem_helper.rb +41 -0
  726. data/lib/resolvers/utils/fingerprint.rb +11 -0
  727. data/lib/resolvers/utils/networking.rb +70 -0
  728. data/lib/resolvers/utils/ssh.rb +13 -0
  729. data/lib/resolvers/utils/ssh_helper.rb +27 -0
  730. data/lib/resolvers/virt_what.rb +64 -0
  731. data/lib/resolvers/vmware.rb +29 -0
  732. data/lib/resolvers/windows/aio_agent_version.rb +56 -0
  733. data/lib/resolvers/windows/dmi_bios_resolver.rb +41 -0
  734. data/lib/resolvers/windows/dmi_computersystem_resolver.rb +40 -0
  735. data/lib/resolvers/windows/ffi/ffi.rb +65 -0
  736. data/lib/resolvers/windows/ffi/hardware_ffi.rb +17 -0
  737. data/lib/resolvers/windows/ffi/identity_ffi.rb +15 -0
  738. data/lib/resolvers/windows/ffi/ip_adapter_addresses_lh.rb +161 -0
  739. data/lib/resolvers/windows/ffi/kernel_ffi.rb +14 -0
  740. data/lib/resolvers/windows/ffi/memory_ffi.rb +12 -0
  741. data/lib/resolvers/windows/ffi/network_utils.rb +65 -0
  742. data/lib/resolvers/windows/ffi/networking_ffi.rb +34 -0
  743. data/lib/resolvers/windows/ffi/os_version_info_ex.rb +17 -0
  744. data/lib/resolvers/windows/ffi/performance_information.rb +20 -0
  745. data/lib/resolvers/windows/ffi/system32_ffi.rb +18 -0
  746. data/lib/resolvers/windows/ffi/system_info.rb +30 -0
  747. data/lib/resolvers/windows/fips_resolver.rb +32 -0
  748. data/lib/resolvers/windows/hardware_architecture_resolver.rb +64 -0
  749. data/lib/resolvers/windows/identity_resolver.rb +57 -0
  750. data/lib/resolvers/windows/kernel_resolver.rb +42 -0
  751. data/lib/resolvers/windows/memory_resolver.rb +60 -0
  752. data/lib/resolvers/windows/netkvm_resolver.rb +33 -0
  753. data/lib/resolvers/windows/networking_resolver.rb +180 -0
  754. data/lib/resolvers/windows/processors_resolver.rb +64 -0
  755. data/lib/resolvers/windows/product_release_resolver.rb +36 -0
  756. data/lib/resolvers/windows/ssh.rb +47 -0
  757. data/lib/resolvers/windows/system32_resolver.rb +45 -0
  758. data/lib/resolvers/windows/uptime_resolver.rb +77 -0
  759. data/lib/resolvers/windows/utils/win32ole.rb +24 -0
  760. data/lib/resolvers/windows/virtualization_resolver.rb +66 -0
  761. data/lib/resolvers/windows/win_os_description_resolver.rb +31 -0
  762. data/lib/resolvers/wpar_resolver.rb +34 -0
  763. data/lib/resolvers/xen.rb +26 -0
  764. data/lib/util/api_debugger.rb +43 -0
  765. data/lib/util/file_helper.rb +33 -0
  766. data/os_hierarchy.json +37 -0
  767. data/tasks/commits.rake +31 -0
  768. data/tasks/create_fact.rake +19 -0
  769. data/tasks/fact_generator/fact.erb +14 -0
  770. data/tasks/fact_generator/fact_creator.rb +105 -0
  771. data/tasks/fact_generator/fact_spec.erb +18 -0
  772. data/tasks/fact_generator/facts.json +358 -0
  773. data/tasks/fact_generator/path.rb +10 -0
  774. data/tasks/fact_list_generator.rake +26 -0
  775. metadata +976 -0
@@ -0,0 +1,49 @@
1
+ test_name "C64315: external facts that print messages to stderr should be seen on stderr" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ agents.each do |agent|
8
+ factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
9
+ ext = get_external_fact_script_extension(agent['platform'])
10
+ ext_fact = File.join(factsd, "external_fact#{ext}")
11
+
12
+ if agent['platform'] =~ /windows/
13
+ content = <<EOM
14
+ echo "SCRIPT STDERR" >&2
15
+ echo "test=value"
16
+ EOM
17
+ else
18
+ content = <<EOM
19
+ #!/bin/sh
20
+ echo "SCRIPT STDERR" >&2
21
+ echo "test=value"
22
+ EOM
23
+ end
24
+
25
+ teardown do
26
+ on(agent, "rm -f '#{ext_fact}'")
27
+ end
28
+
29
+ step "Agent #{agent}: create facts.d directory and fact" do
30
+ on(agent, "mkdir -p '#{factsd}'")
31
+ create_remote_file(agent, ext_fact, content)
32
+ on(agent, "chmod +x '#{ext_fact}'")
33
+ end
34
+
35
+ step "Agent #{agent}: external fact stderr messages should appear on stderr from facter" do
36
+ on(agent, facter) do |facter_output|
37
+ assert_match(/WARN.*SCRIPT STDERR/, facter_output.stderr,
38
+ "Expected facter to output a warning message with the stderr string from the external fact")
39
+ end
40
+ end
41
+
42
+ step "Agent #{agent}: external fact stderr messages should appear on stderr from puppet facts" do
43
+ on(agent, puppet("facts")) do |puppet_output|
44
+ assert_match(/Warning.*SCRIPT STDERR/, puppet_output.stderr,
45
+ "Expected puppet facts to output a warning message with the stderr string from the external fact")
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ test_name "C14892: external facts should only be run once" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ agents.each do |agent|
8
+ factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
9
+ ext = get_external_fact_script_extension(agent['platform'])
10
+ ext_fact = File.join(factsd, "external_fact#{ext}")
11
+
12
+ if agent['platform'] =~ /windows/
13
+ content = <<EOM
14
+ echo "SCRIPT CALLED" >&2
15
+ echo "test=value"
16
+ EOM
17
+ else
18
+ content = <<EOM
19
+ #!/bin/sh
20
+ echo "SCRIPT CALLED" >&2
21
+ echo "test=value"
22
+ EOM
23
+ end
24
+
25
+ teardown do
26
+ on(agent, "rm -f '#{ext_fact}'")
27
+ end
28
+
29
+ step "Agent #{agent}: create facts.d directory and fact" do
30
+ on(agent, "mkdir -p '#{factsd}'")
31
+ create_remote_file(agent, ext_fact, content)
32
+ on(agent, "chmod +x '#{ext_fact}'")
33
+ end
34
+
35
+ step "Agent #{agent}: ensure the fact is only executed once" do
36
+ on(agent, facter) do |facter_output|
37
+ lines = facter_output.stderr.split('\n')
38
+ times = lines.count { |line| line =~ /SCRIPT CALLED/ }
39
+ assert_equal(1, times, "External fact should only execute once: #{facter_output.stderr}")
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,109 @@
1
+ # Verify that facter uses the new AIO default paths for external facts
2
+ #
3
+ # On Unix/Linux/OS X, there are three directories:
4
+ # /opt/puppetlabs/facter/facts.d/
5
+ # /etc/puppetlabs/facter/facts.d/
6
+ # /etc/facter/facts.d/
7
+ test_name "C59201: Fact directory precedence and resolution order for facts" do
8
+ tag 'risk:high'
9
+
10
+ confine :except, :platform => 'windows' # windows only supports 1 directory instead of 3 on unix
11
+
12
+ require 'facter/acceptance/user_fact_utils'
13
+ extend Facter::Acceptance::UserFactUtils
14
+
15
+ # Generate an external fact dynamically
16
+ def ext_fact(value='BASIC')
17
+ "test: '#{value}'"
18
+ end
19
+
20
+ agents.each do |agent|
21
+ # The directories that facter processes facts
22
+ os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
23
+ factsd_dir = get_factsd_dir(agent['platform'], os_version)
24
+ etc_factsd_dir = get_etc_factsd_dir(agent['platform'])
25
+ etc_puppetlabs_factsd_dir = get_etc_puppetlabs_factsd_dir(agent['platform'])
26
+ factsd_path = "#{factsd_dir}/test.yaml"
27
+ etc_factsd_path = "#{etc_factsd_dir}/test.yaml"
28
+ etc_puppetlabs_factsd_path = "#{etc_puppetlabs_factsd_dir}/test.yaml"
29
+
30
+ teardown do
31
+ on(agent, "rm -rf '#{factsd_dir}' '#{etc_factsd_dir}' '#{etc_puppetlabs_factsd_dir}'")
32
+ end
33
+
34
+ # ensure the fact directory we want to use exists
35
+ step "Agent #{agent}: create facts directory (#{etc_puppetlabs_factsd_dir})" do
36
+ on(agent, "rm -rf '#{etc_puppetlabs_factsd_dir}'")
37
+ on(agent, "mkdir -p '#{etc_puppetlabs_factsd_dir}'")
38
+ end
39
+
40
+ # A fact in the etc_puppetlabs_factsd_dir directory should resolve to the fact
41
+ step "Agent #{agent}: create and resolve a custom fact in #{etc_puppetlabs_factsd_dir}" do
42
+ create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('etc_puppetlabs_path'))
43
+ on(agent, facter("test")) do |facter_output|
44
+ assert_match(/etc_puppetlabs_path/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} did not resolve correctly")
45
+ end
46
+ end
47
+
48
+ # remove the fact
49
+ step "Agent #{agent}: remove the fact in #{etc_puppetlabs_factsd_dir}" do
50
+ on(agent, "rm -f '#{etc_puppetlabs_factsd_path}'")
51
+ end
52
+
53
+ # ensure the fact directory we want to use exists
54
+ step "Agent #{agent}: create facts directory (#{etc_factsd_dir})" do
55
+ on(agent, "rm -rf '#{etc_factsd_dir}'")
56
+ on(agent, "mkdir -p '#{etc_factsd_dir}'")
57
+ end
58
+
59
+ # A fact in the etc_factsd_dir directory should resolve to the fact
60
+ step "Agent #{agent}: create and resolve a custom fact in #{etc_factsd_dir}" do
61
+ create_remote_file(agent, etc_factsd_path, ext_fact('etc_path'))
62
+ on(agent, facter("test")) do |facter_output|
63
+ assert_match(/etc_path/, facter_output.stdout, "Fact from #{etc_factsd_dir} did not resolve correctly")
64
+ end
65
+ end
66
+
67
+ # remove the fact
68
+ step "Agent #{agent}: remove the fact in #{etc_factsd_dir}" do
69
+ on(agent, "rm -f '#{etc_factsd_path}'")
70
+ end
71
+
72
+ # ensure the fact directory we want to use exists
73
+ step "Agent #{agent}: create facts directory (#{factsd_dir})" do
74
+ on(agent, "rm -rf '#{factsd_dir}'")
75
+ on(agent, "mkdir -p '#{factsd_dir}'")
76
+ end
77
+
78
+ # A fact in the factsd_dir directory should resolve to the fact
79
+ step "Agent #{agent}: create and resolve a custom fact in #{factsd_dir}" do
80
+ create_remote_file(agent, factsd_path, ext_fact('default_factsd'))
81
+ on(agent, facter("test")) do |facter_output|
82
+ assert_match(/default_factsd/, facter_output.stdout, "Fact from #{factsd_dir} did not resolve correctly")
83
+ end
84
+ end
85
+
86
+ # remove the fact
87
+ step "Agent #{agent}: remove the fact in #{factsd_dir}" do
88
+ on(agent, "rm -f '#{factsd_path}'")
89
+ end
90
+
91
+ # A fact in the etc_factsd_dir directory should take precedence over the same fact in factsd_dir
92
+ step "Agent #{agent}: create and resolve 2 facts of the same name between #{factsd_dir} and #{etc_factsd_dir}" do
93
+ create_remote_file(agent, factsd_path, ext_fact('BASE'))
94
+ create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS'))
95
+ on(agent, facter("test")) do |facter_output|
96
+ assert_match(/ETC_FACTS/, facter_output.stdout, "Fact from #{etc_factsd_dir} should take precedence over #{factsd_dir}")
97
+ end
98
+ end
99
+
100
+ # A fact in the etc_puppetlabs_factsd_dir should take precedence over the same fact in etc_factsd_dir
101
+ step "Agent #{agent}: create and resolve 2 facts of the same name between #{etc_factsd_dir} and #{etc_puppetlabs_factsd_dir}" do
102
+ create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS'))
103
+ create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('ETC_PUPPETLABS_FACTS'))
104
+ on(agent, facter("test")) do |facter_output|
105
+ assert_match(/ETC_PUPPETLABS_FACTS/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} should take precedence over #{etc_factsd_dir}")
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,59 @@
1
+ # Verify how facter handles same external facts filename in different directories:
2
+ #
3
+ # - in case ttl not enabled, will accept same filename in two external directories
4
+ # - in case ttl enabled on filename, will throw error and exit 1
5
+ #
6
+
7
+ test_name 'Should handle same filename in two external directories only if ttl is not enabled' do
8
+ tag 'risk:high'
9
+
10
+ require 'facter/acceptance/user_fact_utils'
11
+ extend Facter::Acceptance::UserFactUtils
12
+
13
+ agents.each do |agent|
14
+ fact1 = 'fact1'
15
+ fact2 = 'fact2'
16
+ fact1_value = 'fact1_value'
17
+ fact2_value = 'fact2_value'
18
+ external_filename = 'text.yaml'
19
+ external_dir1 = agent.tmpdir('external_dir')
20
+ external_fact_file1 = File.join(external_dir1, external_filename)
21
+ external_dir2 = agent.tmpdir('external_dir')
22
+ external_fact_file2 = File.join(external_dir2, external_filename)
23
+ create_remote_file(agent, external_fact_file1, "#{fact1}: #{fact1_value}")
24
+ create_remote_file(agent, external_fact_file2, "#{fact2}: #{fact2_value}")
25
+
26
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
27
+ config_file = File.join(config_dir, 'facter.conf')
28
+
29
+ teardown do
30
+ on(agent, "rm -rf '#{external_dir1}' '#{external_dir2}' '#{config_file}'")
31
+ end
32
+
33
+ step 'works if ttl is not enabled' do
34
+ on(agent, facter("--external-dir '#{external_dir1}' --external-dir '#{external_dir2}' --debug #{fact1} #{fact2}")) do |facter_output|
35
+ assert_match(/#{fact1} => #{fact1_value}/, stdout, 'Expected fact to match first fact')
36
+ assert_match(/#{fact2} => #{fact2_value}/, stdout, 'Expected fact to match second fact')
37
+ end
38
+ end
39
+
40
+ step 'does not work if ttl is enabled' do
41
+ config = <<EOM
42
+ facts : {
43
+ ttls : [
44
+ { "#{external_filename}" : 30 days }
45
+ ]
46
+ }
47
+ EOM
48
+ on(agent, "mkdir -p '#{config_dir}'")
49
+ create_remote_file(agent, config_file, config)
50
+ on(agent, facter("--external-dir '#{external_dir1}' --external-dir '#{external_dir2}' --debug #{fact1} #{fact2}"), :acceptable_exit_codes => 1) do |facter_output|
51
+ assert_match(/ERROR.*Caching is enabled for group "#{external_filename}" while there are at least two external facts files with the same filename/, stderr, 'Expected error message')
52
+ assert_match(/#{fact1} => #{fact1_value}/, stdout, 'Expected fact to match first fact')
53
+ assert_not_match(/#{fact2} => #{fact2_value}/, stdout, 'Expected fact not to match second fact')
54
+ end
55
+ end
56
+
57
+
58
+ end
59
+ end
@@ -0,0 +1,142 @@
1
+ # verify that facter run as a non-root user honor facts in the users home directory:
2
+ # ~/.facter/facts.d
3
+ # ~/.puppetlabs/opt/facter/facts.d
4
+ test_name "C64580: Non-root default user external facts directory is searched for facts" do
5
+ tag 'risk:high'
6
+
7
+ confine :except, :platform => 'aix' # bug FACT-1586
8
+
9
+ confine :except, :platform => 'windows' # this test currently only supported on unix systems FACT-1647
10
+ confine :except, :platform => 'osx' # does not support managehome
11
+ confine :except, :platform => 'solaris' # does not work with managehome on solaris boxes
12
+ confine :except, :platform => 'eos-' # does not support user creation ARISTA-37
13
+
14
+ require 'facter/acceptance/user_fact_utils'
15
+ extend Facter::Acceptance::UserFactUtils
16
+
17
+ # Generate an external fact dynamically
18
+ def ext_user_fact(value='BASIC')
19
+ "test: '#{value}'"
20
+ end
21
+
22
+ # Retrieve a specific user's home directory $HOME/.facter
23
+ #
24
+ def get_user_facter_dir(user_home, platform)
25
+ File.join(user_home, '.facter')
26
+ end
27
+
28
+ # Retrieve a specific user's home facts directory $HOME/.facter/facts.d
29
+ #
30
+ def get_user_facts_dir(user_home, platform)
31
+ File.join(get_user_facter_dir(user_home, platform), 'facts.d')
32
+ end
33
+
34
+ # Retreive a specific user's home puppetlabs directory $HOME/.puppetlabs
35
+ #
36
+ def get_user_puppetlabs_dir(user_home, platform)
37
+ File.join(user_home, '.puppetlabs')
38
+ end
39
+
40
+ # Retreive a specific user's home puppetlabs facts directory $HOME/.puppetlabs/opt/facter/facts.d
41
+ #
42
+ def get_user_puppetlabs_facts_dir(user_home, platform)
43
+ File.join(get_user_puppetlabs_dir(user_home, platform), 'opt', 'facter', 'facts.d')
44
+ end
45
+
46
+ # retrieve the user's home directory for a host and user
47
+ #
48
+ def get_home_dir(host, user_name)
49
+ home_dir = nil
50
+ on host, puppet_resource('user', user_name) do |result|
51
+ home_dir = result.stdout.match(/home\s*=>\s*'([^']+)'/m)[1]
52
+ end
53
+ home_dir
54
+ end
55
+
56
+ agents.each do |agent|
57
+ non_root_user = "nonroot"
58
+
59
+ step "Agent #{agent}: create a #{non_root_user} to run facter with" do
60
+ on(agent, "puppet resource user #{non_root_user} ensure=present managehome=true shell='#{user_shell(agent)}'")
61
+ end
62
+
63
+ user_home = get_home_dir(agent, non_root_user)
64
+
65
+ # The directories that facter processes facts for a user from
66
+ user_base_facts_dir = get_user_facter_dir(user_home, agent['platform'])
67
+ user_facts_dir = get_user_facts_dir(user_home, agent['platform'])
68
+ user_facts_path = "#{user_facts_dir}/test.yaml"
69
+
70
+ user_base_puppetlabs_dir = get_user_puppetlabs_dir(user_home, agent['platform'])
71
+ user_puppetlabs_facts_dir = get_user_puppetlabs_facts_dir(user_home, agent['platform'])
72
+ user_puppetlabs_facts_path = "#{user_puppetlabs_facts_dir}/test.yaml"
73
+
74
+ step "Agent #{agent}: figure out facter program location"
75
+ facter_path = on(agent, "which facter").stdout.chomp
76
+
77
+ teardown do
78
+ on(agent, "rm -rf '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
79
+ on(agent, puppet("resource user #{non_root_user} ensure=absent managehome=true"))
80
+ end
81
+
82
+ step "Agent #{agent}: create facts directory (#{user_facts_dir})" do
83
+ on(agent, "rm -rf '#{user_facts_dir}'")
84
+ on(agent, "mkdir -p '#{user_facts_dir}'")
85
+ end
86
+
87
+ step "Agent #{agent}: create and resolve a custom fact in #{user_facts_dir}" do
88
+ create_remote_file(agent, user_facts_path, ext_user_fact('USER_TEST_FACTER'))
89
+ end
90
+
91
+ step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
92
+ on(agent, "chown -R #{non_root_user} '#{user_base_facts_dir}'")
93
+ on(agent, "chmod -R a+rx '#{user_base_facts_dir}'")
94
+ end
95
+
96
+ step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do
97
+ on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
98
+ assert_match(/USER_TEST_FACTER/, facter_result.stdout, "Fact from #{user_facts_dir} did not resolve correctly")
99
+ end
100
+ end
101
+
102
+ step "Agent #{agent}: remove #{user_facts_path}" do
103
+ on(agent, "rm -rf '#{user_facts_path}'")
104
+ end
105
+
106
+ step "Agent #{agent}: create facts directory (#{user_puppetlabs_facts_dir})" do
107
+ on(agent, "rm -rf '#{user_puppetlabs_facts_dir}'")
108
+ on(agent, "mkdir -p '#{user_puppetlabs_facts_dir}'")
109
+ end
110
+
111
+ step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do
112
+ create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_TEST_PUPPETLABS'))
113
+ end
114
+
115
+ step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
116
+ on(agent, "chown -R #{non_root_user} '#{user_base_puppetlabs_dir}'")
117
+ on(agent, "chmod -R a+rx '#{user_base_puppetlabs_dir}'")
118
+ end
119
+
120
+ step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do
121
+ on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
122
+ assert_match(/USER_TEST_PUPPETLABS/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly")
123
+ end
124
+ end
125
+
126
+ step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do
127
+ create_remote_file(agent, user_facts_path, ext_user_fact('USER_PRECEDENCE_FACTER'))
128
+ create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_PRECEDENCE_PUPPETLABS'))
129
+ end
130
+
131
+ step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
132
+ on(agent, "chown -R #{non_root_user} '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
133
+ on(agent, "chmod -R a+rx '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
134
+ end
135
+
136
+ step "Agent #{agent}: run facter as #{non_root_user} and .facter will take precedence over .puppetlabs" do
137
+ on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
138
+ assert_match(/USER_PRECEDENCE_FACTER/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly")
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,34 @@
1
+ # facter resolves facts from the default facts.d directory
2
+ # on Unix this can be 3 directories (See fact_directory_precedence.rb)
3
+ # Unix - /opt/puppetlabs/facter/facts.d/
4
+ # Windows - C:\ProgramData\PuppetLabs\facter\facts.d\
5
+ test_name "C87571: facter resolves facts in the default facts.d directory" do
6
+ tag 'risk:high'
7
+
8
+ require 'facter/acceptance/user_fact_utils'
9
+ extend Facter::Acceptance::UserFactUtils
10
+
11
+ agents.each do |agent|
12
+ os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
13
+ ext = get_external_fact_script_extension(agent['platform'])
14
+ factsd = get_factsd_dir(agent['platform'], os_version)
15
+ fact_file = File.join(factsd, "external_fact_1#{ext}")
16
+ content = external_fact_content(agent['platform'], 'external_fact', 'external_value')
17
+
18
+ teardown do
19
+ on(agent, "rm -f '#{fact_file}'")
20
+ end
21
+
22
+ step "Agent #{agent}: setup default external facts directory and fact" do
23
+ on(agent, "mkdir -p '#{factsd}'")
24
+ create_remote_file(agent, fact_file, content)
25
+ on(agent, "chmod +x '#{fact_file}'")
26
+ end
27
+
28
+ step "agent #{agent}: resolve the external fact" do
29
+ on(agent, facter('external_fact')) do |facter_output|
30
+ assert_equal('external_value', facter_output.stdout.chomp, 'Expected to resolve the external_fact')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,139 @@
1
+ # This test is intended to demonstrate that executable external facts can return
2
+ # YAML or JSON data, in addition to plain key-value pairs. If the output cannot be
3
+ # parsed as YAML, it will fall back to key-value pair parsing, and only fail if
4
+ # this is also invalid.
5
+ test_name "executable external facts can return structured data" do
6
+
7
+ require 'facter/acceptance/user_fact_utils'
8
+ extend Facter::Acceptance::UserFactUtils
9
+
10
+ unix_fact_yaml = <<EOM
11
+ #!/bin/sh
12
+ echo "yaml_fact: [ 'one', 'two', 'three' ]"
13
+ EOM
14
+
15
+ unix_fact_json = <<EOM
16
+ #!/bin/sh
17
+ echo "{ json_fact: { element: 1 } }"
18
+ EOM
19
+
20
+ unix_fact_kv = <<EOM
21
+ #!/bin/sh
22
+ echo "kv_fact=one"
23
+ EOM
24
+
25
+ unix_fact_bad = <<EOM
26
+ #!/bin/sh
27
+ echo "bad_fact : : not, json"
28
+ EOM
29
+
30
+ win_fact_yaml = <<EOM
31
+ @echo off
32
+ echo yaml_fact: [ 'one', 'two', 'three' ]
33
+ EOM
34
+
35
+ win_fact_json = <<EOM
36
+ @echo off
37
+ echo { json_fact: { element: 1 } }
38
+ EOM
39
+
40
+ win_fact_kv = <<EOM
41
+ @echo off
42
+ echo kv_fact=one
43
+ EOM
44
+
45
+ win_fact_bad = <<EOM
46
+ @echo off
47
+ echo bad_fact : : not, json
48
+ EOM
49
+
50
+ yaml_structured_output = <<EOM
51
+ [
52
+ "one",
53
+ "two",
54
+ "three"
55
+ ]
56
+ EOM
57
+
58
+ json_structured_output = <<EOM
59
+ {
60
+ element => 1
61
+ }
62
+ EOM
63
+
64
+ kv_output = 'one'
65
+
66
+ agents.each do |agent|
67
+ os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
68
+ factsd = get_factsd_dir(agent['platform'], os_version)
69
+ ext = get_external_fact_script_extension(agent['platform'])
70
+
71
+ if agent['platform'] =~ /windows/
72
+ yaml_content = win_fact_yaml
73
+ json_content = win_fact_json
74
+ kv_content = win_fact_kv
75
+ bad_fact_content = win_fact_bad
76
+ else
77
+ yaml_content = unix_fact_yaml
78
+ json_content = unix_fact_json
79
+ kv_content = unix_fact_kv
80
+ bad_fact_content = unix_fact_bad
81
+ end
82
+
83
+ step "Agent #{agent}: setup default external facts directory (facts.d)" do
84
+ on(agent, "mkdir -p '#{factsd}'")
85
+ end
86
+
87
+ teardown do
88
+ on(agent, "rm -rf '#{factsd}'")
89
+ end
90
+
91
+ step "Agent #{agent}: create an executable yaml fact in default facts.d" do
92
+ yaml_fact = File.join(factsd, "yaml_fact#{ext}")
93
+ create_remote_file(agent, yaml_fact, yaml_content)
94
+ on(agent, "chmod +x '#{yaml_fact}'")
95
+
96
+ step "YAML output should produce a structured fact" do
97
+ on(agent, facter("yaml_fact")) do
98
+ assert_match(/#{yaml_structured_output}/, stdout, "Expected properly structured fact")
99
+ end
100
+ end
101
+ end
102
+
103
+ step "Agent #{agent}: create an executable json fact in default facts.d" do
104
+ json_fact = File.join(factsd, "json_fact#{ext}")
105
+ create_remote_file(agent, json_fact, json_content)
106
+ on(agent, "chmod +x '#{json_fact}'")
107
+
108
+ step "JSON output should produce a structured fact" do
109
+ on(agent, facter("json_fact")) do
110
+ assert_match(/#{json_structured_output}/, stdout, "Expected properly structured fact")
111
+ end
112
+ end
113
+ end
114
+
115
+ step "Agent #{agent}: create an executable key-value fact in default facts.d" do
116
+ kv_fact = File.join(factsd, "kv_fact#{ext}")
117
+ create_remote_file(agent, kv_fact, kv_content)
118
+ on(agent, "chmod +x '#{kv_fact}'")
119
+
120
+ step "output that is neither yaml nor json should not produce a structured fact" do
121
+ on(agent, facter("kv_fact")) do
122
+ assert_match(/#{kv_output}/, stdout, "Expected a simple key-value fact")
123
+ end
124
+ end
125
+ end
126
+
127
+ step "Agent #{agent}: create a malformed executable fact in default facts.d" do
128
+ bad_fact = File.join(factsd, "bad_fact#{ext}")
129
+ create_remote_file(agent, bad_fact, bad_fact_content)
130
+ on(agent, "chmod +x '#{bad_fact}'")
131
+
132
+ step "should error when output is not in a supported format" do
133
+ on(agent, facter("bad_fact --debug")) do
134
+ assert_match(/Could not parse executable fact/, stderr, "Expected parsing the malformed fact to fail")
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end