facter 4.0.26 → 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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/.github/actions/presuite.rb +1 -12
  3. data/.github/workflows/acceptance_tests.yml +4 -4
  4. data/.github/workflows/checks.yaml +9 -3
  5. data/.github/workflows/coverage.yaml +1 -1
  6. data/.github/workflows/unit_tests.yaml +2 -2
  7. data/.rubocop.yml +5 -0
  8. data/.rubocop_todo.yml +6 -4
  9. data/CHANGELOG.md +22 -0
  10. data/Rakefile +2 -1
  11. data/VERSION +1 -1
  12. data/acceptance/.beaker.yml +15 -0
  13. data/acceptance/.gitignore +12 -0
  14. data/acceptance/Gemfile +24 -0
  15. data/acceptance/Rakefile +2 -0
  16. data/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
  17. data/acceptance/config/aio/options.rb +6 -0
  18. data/acceptance/config/git/options.rb +3 -0
  19. data/acceptance/config/nodes/aix-53-power.yaml +7 -0
  20. data/acceptance/config/nodes/aix-61-power.yaml +7 -0
  21. data/acceptance/config/nodes/aix-71-power.yaml +7 -0
  22. data/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
  23. data/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
  24. data/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
  25. data/acceptance/lib/facter/acceptance/base_fact_utils.rb +565 -0
  26. data/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
  27. data/acceptance/lib/helper.rb +3 -0
  28. data/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
  29. data/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
  30. data/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
  31. data/acceptance/setup/aio/pre-suite/001_run_with_facter_ng.rb +75 -0
  32. data/acceptance/tests/custom_facts/cached_custom_fact.rb +82 -0
  33. data/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb +106 -0
  34. data/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
  35. data/acceptance/tests/custom_facts/expand_command.rb +30 -0
  36. data/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
  37. data/acceptance/tests/custom_facts/not_expand_command.rb +30 -0
  38. data/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
  39. data/acceptance/tests/custom_facts/weighted_cached_custom_facts.rb +94 -0
  40. data/acceptance/tests/custom_facts/windows_not_expand_command.rb +30 -0
  41. data/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
  42. data/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
  43. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
  44. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
  45. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
  46. data/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
  47. data/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
  48. data/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
  49. data/acceptance/tests/external_facts/handle_same_filename_in_different_dirs.rb +59 -0
  50. data/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
  51. data/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
  52. data/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
  53. data/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
  54. data/acceptance/tests/facts/dmi.rb +51 -0
  55. data/acceptance/tests/facts/facterversion.rb +11 -0
  56. data/acceptance/tests/facts/identity.rb +52 -0
  57. data/acceptance/tests/facts/mountpoints_fact.rb +12 -0
  58. data/acceptance/tests/facts/networking_facts.rb +93 -0
  59. data/acceptance/tests/facts/nim_type.rb +12 -0
  60. data/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
  61. data/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
  62. data/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
  63. data/acceptance/tests/facts/osx_numeric_hostname.rb +23 -0
  64. data/acceptance/tests/facts/partitions.rb +37 -0
  65. data/acceptance/tests/facts/productname.rb +15 -0
  66. data/acceptance/tests/facts/ruby.rb +59 -0
  67. data/acceptance/tests/facts/ssh_key.rb +59 -0
  68. data/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
  69. data/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
  70. data/acceptance/tests/facts/windows_os.rb +64 -0
  71. data/acceptance/tests/load_libfacter.rb +66 -0
  72. data/acceptance/tests/no_errors_on_stderr.rb +10 -0
  73. data/acceptance/tests/options/color.rb +16 -0
  74. data/acceptance/tests/options/config.rb +27 -0
  75. data/acceptance/tests/options/config_file/blocklist.rb +35 -0
  76. data/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
  77. data/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
  78. data/acceptance/tests/options/config_file/custom_facts.rb +42 -0
  79. data/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
  80. data/acceptance/tests/options/config_file/debug.rb +34 -0
  81. data/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
  82. data/acceptance/tests/options/config_file/default_file_location.rb +37 -0
  83. data/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
  84. data/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
  85. data/acceptance/tests/options/config_file/external_facts.rb +37 -0
  86. data/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
  87. data/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
  88. data/acceptance/tests/options/config_file/log_level.rb +35 -0
  89. data/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
  90. data/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
  91. data/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
  92. data/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
  93. data/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
  94. data/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
  95. data/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
  96. data/acceptance/tests/options/config_file/trace.rb +48 -0
  97. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_json_output.rb +92 -0
  98. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_text_output.rb +74 -0
  99. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_yaml_output.rb +88 -0
  100. data/acceptance/tests/options/config_file/ttls_cached_external_json_resolver.rb +79 -0
  101. data/acceptance/tests/options/config_file/ttls_cached_external_text_resolver.rb +78 -0
  102. data/acceptance/tests/options/config_file/ttls_cached_external_yaml_resolver.rb +78 -0
  103. data/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
  104. data/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
  105. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
  106. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
  107. data/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
  108. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
  109. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
  110. data/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
  111. data/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
  112. data/acceptance/tests/options/config_file/verbose.rb +34 -0
  113. data/acceptance/tests/options/custom_facts.rb +34 -0
  114. data/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
  115. data/acceptance/tests/options/custom_facts_list.rb +48 -0
  116. data/acceptance/tests/options/custom_facts_load_path.rb +42 -0
  117. data/acceptance/tests/options/debug.rb +12 -0
  118. data/acceptance/tests/options/external_facts.rb +28 -0
  119. data/acceptance/tests/options/external_facts_list.rb +35 -0
  120. data/acceptance/tests/options/help.rb +13 -0
  121. data/acceptance/tests/options/json.rb +43 -0
  122. data/acceptance/tests/options/list_block_groups.rb +15 -0
  123. data/acceptance/tests/options/list_block_groups_facter_4.rb +15 -0
  124. data/acceptance/tests/options/list_cache_groups.rb +65 -0
  125. data/acceptance/tests/options/log_level.rb +13 -0
  126. data/acceptance/tests/options/no_block.rb +34 -0
  127. data/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
  128. data/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
  129. data/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
  130. data/acceptance/tests/options/no_color.rb +16 -0
  131. data/acceptance/tests/options/no_custom_facts.rb +34 -0
  132. data/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
  133. data/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
  134. data/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
  135. data/acceptance/tests/options/no_external_facts.rb +28 -0
  136. data/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
  137. data/acceptance/tests/options/no_ruby.rb +44 -0
  138. data/acceptance/tests/options/puppet_facts.rb +37 -0
  139. data/acceptance/tests/options/show_legacy.rb +18 -0
  140. data/acceptance/tests/options/strict.rb +11 -0
  141. data/acceptance/tests/options/trace.rb +36 -0
  142. data/acceptance/tests/options/verbose.rb +12 -0
  143. data/acceptance/tests/options/version.rb +12 -0
  144. data/acceptance/tests/options/yaml.rb +43 -0
  145. data/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +23 -0
  146. data/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
  147. data/lib/custom_facts/core/execution/base.rb +18 -18
  148. data/lib/custom_facts/util/collection.rb +2 -7
  149. data/lib/custom_facts/util/config.rb +1 -1
  150. data/lib/custom_facts/util/directory_loader.rb +51 -24
  151. data/lib/custom_facts/util/fact.rb +10 -1
  152. data/lib/custom_facts/util/resolution.rb +1 -1
  153. data/lib/facts/aix/aio_agent_version.rb +14 -0
  154. data/lib/facts/bsd/processors/count.rb +17 -0
  155. data/lib/facts/bsd/processors/models.rb +23 -0
  156. data/lib/facts/bsd/processors/speed.rb +17 -0
  157. data/lib/facts/freebsd/disks.rb +15 -0
  158. data/lib/facts/freebsd/partitions.rb +15 -0
  159. data/lib/facts/freebsd/processors/count.rb +17 -0
  160. data/lib/facts/freebsd/processors/models.rb +23 -0
  161. data/lib/facts/freebsd/processors/speed.rb +17 -0
  162. data/lib/facts/linux/aio_agent_version.rb +14 -0
  163. data/lib/facts/linux/ec2_metadata.rb +47 -0
  164. data/lib/facts/linux/ec2_userdata.rb +47 -0
  165. data/lib/facts/linux/is_virtual.rb +2 -5
  166. data/lib/facts/linux/virtual.rb +1 -5
  167. data/lib/facts/macosx/aio_agent_version.rb +14 -0
  168. data/lib/facts/macosx/interfaces.rb +2 -2
  169. data/lib/facts/macosx/networking/dhcp.rb +17 -0
  170. data/lib/facts/macosx/networking/interfaces.rb +21 -0
  171. data/lib/facts/macosx/networking/ip.rb +4 -1
  172. data/lib/facts/macosx/networking/ip6.rb +21 -0
  173. data/lib/facts/macosx/networking/mac.rb +4 -1
  174. data/lib/facts/macosx/networking/mtu.rb +20 -0
  175. data/lib/facts/macosx/networking/netmask.rb +21 -0
  176. data/lib/facts/macosx/networking/netmask6.rb +21 -0
  177. data/lib/facts/macosx/networking/network.rb +21 -0
  178. data/lib/facts/macosx/networking/network6.rb +21 -0
  179. data/lib/facts/macosx/networking/primary.rb +17 -0
  180. data/lib/facts/macosx/networking/scope6.rb +20 -0
  181. data/lib/facts/solaris/aio_agent_version.rb +14 -0
  182. data/lib/facts/windows/aio_agent_version.rb +14 -0
  183. data/lib/facts/windows/ec2_metadata.rb +23 -0
  184. data/lib/facts/windows/ec2_userdata.rb +23 -0
  185. data/lib/facts_utils/hypervisors.rb +10 -0
  186. data/lib/framework/core/cache_manager.rb +42 -18
  187. data/lib/framework/core/fact/external/external_fact_manager.rb +3 -2
  188. data/lib/framework/core/fact_loaders/external_fact_loader.rb +3 -2
  189. data/lib/framework/formatters/legacy_fact_formatter.rb +6 -5
  190. data/lib/framework/parsers/query_parser.rb +14 -2
  191. data/lib/models/loaded_fact.rb +3 -1
  192. data/lib/models/resolved_fact.rb +1 -1
  193. data/lib/models/searched_fact.rb +1 -0
  194. data/lib/resolvers/{agent_resolver.rb → aio_agent_version.rb} +4 -3
  195. data/lib/resolvers/bsd/ffi/ffi_helper.rb +31 -0
  196. data/lib/resolvers/bsd/processors.rb +47 -0
  197. data/lib/resolvers/ec2.rb +77 -0
  198. data/lib/resolvers/freebsd/ffi/ffi_helper.rb +42 -0
  199. data/lib/resolvers/freebsd/geom_resolver.rb +109 -0
  200. data/lib/resolvers/freebsd/processors.rb +44 -0
  201. data/lib/resolvers/macosx/networking.rb +110 -0
  202. data/lib/resolvers/networking_linux_resolver.rb +8 -30
  203. data/lib/resolvers/utils/networking.rb +70 -0
  204. data/lib/resolvers/windows/aio_agent_version.rb +56 -0
  205. metadata +175 -5
  206. data/lib/resolvers/macosx/ipaddress_resolver.rb +0 -52
@@ -0,0 +1,30 @@
1
+ test_name "C100153: custom fact with weight of >= 10001 overrides an external fact" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ fact_name = 'test'
8
+ # Use a static external fact
9
+ ext_fact = "#{fact_name}: 'EXTERNAL'"
10
+
11
+ agents.each do |agent|
12
+ facts_dir = agent.tmpdir('facts.d')
13
+ ext_fact_path = "#{facts_dir}/test.yaml"
14
+ cust_fact_path = "#{facts_dir}/test.rb"
15
+ create_remote_file(agent, ext_fact_path, ext_fact)
16
+ create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM', "has_weight 10001"))
17
+
18
+ teardown do
19
+ on(agent, "rm -rf '#{facts_dir}'")
20
+ end
21
+
22
+ # Custom fact with weight >= 10001 should override an external fact
23
+ step "Agent #{agent}: resolve a custom fact with weight of 10001 overriding the external fact" do
24
+ on(agent, facter("--external-dir=#{facts_dir} --custom-dir=#{facts_dir} test")) do |facter_output|
25
+ assert_equal("CUSTOM", facter_output.stdout.chomp)
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,30 @@
1
+ test_name 'FACT-2054: Custom facts that execute a shell command should expand it' do
2
+ tag 'risk:high'
3
+
4
+ confine :to, :platform => /el-7/
5
+
6
+ content = <<-EOM
7
+ Facter.add(:foo) do
8
+ setcode do
9
+ Facter::Core::Execution.execute("cd /opt/puppetlabs && pwd")
10
+ end
11
+ end
12
+ EOM
13
+
14
+ agents.each do |agent|
15
+ fact_dir = agent.tmpdir('facter')
16
+ fact_file = File.join(fact_dir, 'test_facts.rb')
17
+ create_remote_file(agent, fact_file, content)
18
+ env = {'FACTERLIB' => fact_dir}
19
+
20
+ teardown do
21
+ on(agent, "rm -rf '#{fact_dir}'")
22
+ end
23
+
24
+ step "Agent: Verify that command is expanded" do
25
+ on(agent, facter('foo', :environment => env)) do |facter_result|
26
+ refute_equal('/opt/puppetlabs', facter_result.stdout.chomp, 'command was not expanded')
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ test_name 'C14893: Facter should handle multiple facts in a single file' do
2
+ tag 'risk:high'
3
+
4
+ fact_content = <<-EOM
5
+ Facter.add(:test_fact1) do
6
+ setcode do
7
+ "test fact 1"
8
+ end
9
+ end
10
+
11
+ Facter.add(:test_fact2) do
12
+ setcode do
13
+ "test fact 2"
14
+ end
15
+ end
16
+ EOM
17
+
18
+ agents.each do |agent|
19
+ fact_dir = agent.tmpdir('facter')
20
+ fact_file = File.join(fact_dir, 'test_facts.rb')
21
+ create_remote_file(agent, fact_file, fact_content)
22
+ env = {'FACTERLIB' => fact_dir}
23
+
24
+ teardown do
25
+ on(agent, "rm -rf '#{fact_dir}'")
26
+ end
27
+
28
+ step "Agent: Verify test_fact1 from #{fact_file}" do
29
+ on(agent, facter('test_fact1', :environment => env)) do |facter_result|
30
+ assert_equal('test fact 1', facter_result.stdout.chomp, 'test_fact1 is not the correct value')
31
+ end
32
+ end
33
+
34
+ step "Agent: Verify test_fact2 from #{fact_file}" do
35
+ on(agent, facter('test_fact2', :environment => env)) do |facter_result|
36
+ assert_equal('test fact 2', facter_result.stdout.chomp, 'test_fact2 is not the correct value')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ test_name 'FACT-2054: Custom facts that execute a shell command should not expand it' do
2
+ tag 'risk:high'
3
+
4
+ confine :to, :platform => /el-7/
5
+
6
+ content = <<-EOM
7
+ Facter.add(:foo) do
8
+ setcode do
9
+ Facter::Core::Execution.execute("cd /opt/puppetlabs && pwd", {:expand => false})
10
+ end
11
+ end
12
+ EOM
13
+
14
+ agents.each do |agent|
15
+ fact_dir = agent.tmpdir('facter')
16
+ fact_file = File.join(fact_dir, 'test_facts.rb')
17
+ create_remote_file(agent, fact_file, content)
18
+ env = {'FACTERLIB' => fact_dir}
19
+
20
+ teardown do
21
+ on(agent, "rm -rf '#{fact_dir}'")
22
+ end
23
+
24
+ step "Agent: Verify that command is not expanded" do
25
+ on(agent, facter('foo', :environment => env)) do |facter_result|
26
+ assert_equal('/opt/puppetlabs', facter_result.stdout.chomp, 'command was expanded')
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ test_name 'C92060: Custom facts should not hang Facter when using win32ole' do
2
+ tag 'risk:high'
3
+
4
+ confine :to, :platform => /windows/
5
+ require 'timeout'
6
+
7
+ content = <<-EOM
8
+ Facter.add('custom_fact') do
9
+ setcode do
10
+ require 'win32ole'
11
+ locator = WIN32OLE.new('WbemScripting.SWbemLocator')
12
+ locator.ConnectServer('', "root/CIMV2", '', '', nil, nil, nil, nil).to_s
13
+ end
14
+ end
15
+ EOM
16
+
17
+ agents.each do |agent|
18
+ custom_dir = agent.tmpdir('arbitrary_dir')
19
+ custom_fact = File.join(custom_dir, 'custom_fact.rb')
20
+ create_remote_file(agent, custom_fact, content)
21
+
22
+ teardown do
23
+ on(agent, "rm -rf '#{custom_dir}'")
24
+ end
25
+
26
+ # Test is assumed to have hung if it takes longer than 5 seconds.
27
+ Timeout::timeout(5) do
28
+ on agent, facter('--custom-dir', custom_dir, 'custom_fact') do |facter_result|
29
+ assert_match(/#<WIN32OLE:0x[0-9a-f]+>/, facter_result.stdout.chomp, 'Custom fact output does not match expected output')
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,94 @@
1
+ test_name 'ttls configured weighted custom facts files creates cache file and reads cache file depending on weight' do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ custom_fact_file = 'custom_facts.rb'
8
+ duplicate_custom_fact_name = 'random_custom_fact'
9
+ custom_fact_value = 'custom fact value with weight:'
10
+
11
+ fact_content = <<-CUSTOM_FACT
12
+ Facter.add(:#{duplicate_custom_fact_name}) do
13
+ has_weight 90
14
+ setcode do
15
+ "#{custom_fact_value} 90"
16
+ end
17
+ end
18
+ Facter.add(:#{duplicate_custom_fact_name}) do
19
+ has_weight 100
20
+ setcode do
21
+ "#{custom_fact_value} 100"
22
+ end
23
+ end
24
+ Facter.add(:#{duplicate_custom_fact_name}) do
25
+ has_weight 110
26
+ setcode do
27
+ "#{custom_fact_value} 110"
28
+ end
29
+ end
30
+ CUSTOM_FACT
31
+
32
+ cached_file_content_highest_weight = <<~CACHED_FILE
33
+ {
34
+ "#{duplicate_custom_fact_name}": "#{custom_fact_value} 110"
35
+ }
36
+ CACHED_FILE
37
+
38
+ config_data = <<~FACTER_CONF
39
+ facts : {
40
+ ttls : [
41
+ { "cached-custom-facts" : 3 days }
42
+ ]
43
+ }
44
+ fact-groups : {
45
+ cached-custom-facts : [ "#{duplicate_custom_fact_name}" ]
46
+ }
47
+ FACTER_CONF
48
+
49
+ agents.each do |agent|
50
+ cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
51
+ fact_dir = agent.tmpdir('facter')
52
+ env = { 'FACTERLIB' => fact_dir }
53
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
54
+ config_file = File.join(config_dir, 'facter.conf')
55
+
56
+ step "Agent #{agent}: create config file" do
57
+ on(agent, "mkdir -p '#{config_dir}'")
58
+ create_remote_file(agent, config_file, config_data)
59
+ fact_file = File.join(fact_dir, custom_fact_file)
60
+ create_remote_file(agent, fact_file, fact_content)
61
+ end
62
+
63
+ teardown do
64
+ on(agent, "rm -rf '#{fact_dir}'")
65
+ on(agent, "rm -rf #{cache_folder}/*")
66
+ on(agent, "rm -rf #{config_dir}/facter.conf")
67
+ end
68
+
69
+ step "should log that it creates cache file and it caches custom facts found in facter.conf with the highest weight" do
70
+ on(agent, facter("#{duplicate_custom_fact_name} --debug", environment: env)) do |facter_result|
71
+ assert_equal(custom_fact_value + " 110", facter_result.stdout.chomp, "#{duplicate_custom_fact_name} value changed")
72
+ assert_match(/facts cache file expired\/missing/, facter_result.stderr,
73
+ 'Expected debug message to state that custom facts cache file is missing or expired')
74
+ assert_match(/Saving cached custom facts to ".+"|caching values for cached-custom-facts facts/, facter_result.stderr,
75
+ 'Expected debug message to state that custom facts will be cached')
76
+ end
77
+ end
78
+
79
+ step "should create a cached-custom-facts cache file that containt fact information from the highest weight fact" do
80
+ result = agent.file_exist?("#{cache_folder}/cached-custom-facts")
81
+ assert_equal(true, result)
82
+ on(agent, "cat #{cache_folder}/cached-custom-facts", acceptable_exit_codes: [0]) do |cat_output|
83
+ assert_match(cached_file_content_highest_weight.chomp, cat_output.stdout, 'Expected cached custom fact file to contain fact information from the highest weight fact')
84
+ end
85
+ end
86
+
87
+ step 'should read from the cached file for a custom fact that has been cached' do
88
+ on(agent, facter("#{duplicate_custom_fact_name} --debug", environment: env)) do |facter_result|
89
+ assert_match(/Loading cached custom facts from file ".+"|loading cached values for cached-custom-facts facts/, facter_result.stderr,
90
+ 'Expected debug message to state that cached custom facts are read from file')
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,30 @@
1
+ test_name 'FACT-2054: Execute on Windows with expand => false should raise an error' do
2
+ tag 'risk:high'
3
+
4
+ confine :to, :platform => /windows/
5
+
6
+ content = <<-EOM
7
+ Facter.add(:foo) do
8
+ setcode do
9
+ Facter::Core::Execution.execute("cmd", {:expand => false})
10
+ end
11
+ end
12
+ EOM
13
+
14
+ agents.each do |agent|
15
+ fact_dir = agent.tmpdir('facter')
16
+ fact_file = File.join(fact_dir, 'test_facts.rb')
17
+ create_remote_file(agent, fact_file, content)
18
+ env = {'FACTERLIB' => fact_dir}
19
+
20
+ teardown do
21
+ on(agent, "rm -rf '#{fact_dir}'")
22
+ end
23
+
24
+ step "Agent: Verify that exception is raised" do
25
+ on(agent, facter('foo', :environment => env), :acceptable_exit_codes => [0, 1]) do |output|
26
+ assert_match(/Unsupported argument on Windows/, output.stderr, '{:expand => false} on Windows should raise error')
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,46 @@
1
+ test_name 'C100537: FACTER_ env var should override external fact' do
2
+ tag 'risk:medium'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ agents.each do |agent|
8
+ fact_name = 'external_fact'
9
+ fact_value = 'from_script'
10
+ override_value = 'override_fact'
11
+ external_dir = agent.tmpdir('facts.d')
12
+ fact_file = File.join(external_dir,
13
+ "#{fact_name}#{get_external_fact_script_extension(agent['platform'])}")
14
+
15
+ teardown do
16
+ on(agent, "rm -rf '#{external_dir}'")
17
+ end
18
+
19
+ step "Agent #{agent}: setup external fact" do
20
+ on(agent, "mkdir -p '#{external_dir}'")
21
+ create_remote_file(agent,
22
+ fact_file,
23
+ external_fact_content(agent['platform'], fact_name, fact_value))
24
+ on(agent, "chmod +x '#{fact_file}'")
25
+ end
26
+
27
+ step "Agent: #{agent}: ensure external fact resolves correctly" do
28
+ on(agent, facter("--external-dir '#{external_dir}' #{fact_name}")) do |facter_output|
29
+ assert_equal(fact_value,
30
+ facter_output.stdout.chomp,
31
+ 'Expected external fact to resolve as defined in script')
32
+ end
33
+ end
34
+
35
+ step "Agent #{agent}: the fact value from FACTER_ env var should override the external fact value" do
36
+ on(agent, facter("--external-dir '#{external_dir}' #{fact_name}",
37
+ :environment => { "FACTER_#{fact_name}" => override_value })) do |facter_output|
38
+ assert_equal(override_value,
39
+ facter_output.stdout.chomp,
40
+ 'Expected `FACTER_` fact value to override external fact')
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,34 @@
1
+ test_name "C100154: --external-dir fact overrides fact in default facts.d directory" 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
+ os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
9
+ ext = get_external_fact_script_extension(agent['platform'])
10
+ factsd = get_factsd_dir(agent['platform'], os_version)
11
+ external_dir = agent.tmpdir('facts.d')
12
+ fact_file = File.join(factsd, "external_fact#{ext}")
13
+ content = external_fact_content(agent['platform'], 'external_fact', 'value')
14
+ override_fact_file = File.join(external_dir, "external_fact#{ext}")
15
+ override_content = external_fact_content(agent['platform'], 'external_fact', 'OVERRIDE_value')
16
+
17
+ teardown do
18
+ on(agent, "rm -f '#{fact_file}' '#{override_fact_file}'")
19
+ end
20
+
21
+ step "Agent #{agent}: setup default external facts directories and the test facts" do
22
+ on(agent, "mkdir -p '#{factsd}'")
23
+ create_remote_file(agent, fact_file, content)
24
+ create_remote_file(agent, override_fact_file, override_content)
25
+ on(agent, "chmod +x '#{fact_file}' '#{override_fact_file}'")
26
+ end
27
+
28
+ step "Agent #{agent}: the fact value from the custom external dir should override that of facts.d" do
29
+ on(agent, facter("--external-dir '#{external_dir}' external_fact")) do |facter_output|
30
+ assert_equal('OVERRIDE_value', facter_output.stdout.chomp, 'Expected to resolve override version of the external_fact')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ test_name "C100150: external fact overrides custom fact without a weight" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ fact_name = 'test'
8
+ # Use a static external fact
9
+ ext_fact = "#{fact_name}: 'EXTERNAL'"
10
+
11
+ agents.each do |agent|
12
+ facts_dir = agent.tmpdir('facts.d')
13
+ ext_fact_path = "#{facts_dir}/test.yaml"
14
+ cust_fact_path = "#{facts_dir}/test.rb"
15
+ create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM'))
16
+ create_remote_file(agent, ext_fact_path, ext_fact)
17
+
18
+ teardown do
19
+ on(agent, "rm -rf '#{facts_dir}'")
20
+ end
21
+
22
+ step "Agent #{agent}: resolve an external fact over a custom fact" do
23
+ on(agent, facter("--external-dir=#{facts_dir} --custom-dir=#{facts_dir} #{fact_name}")) do |facter_output|
24
+ assert_equal("EXTERNAL", facter_output.stdout.chomp)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,30 @@
1
+ test_name "C100151: external fact overrides a custom fact of weight 10000 or less" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ fact_name = 'test'
8
+ # Use a static external fact
9
+ ext_fact = "#{fact_name}: 'EXTERNAL'"
10
+
11
+ agents.each do |agent|
12
+ facts_dir = agent.tmpdir('facts.d')
13
+ ext_fact_path = "#{facts_dir}/test.yaml"
14
+ cust_fact_path = "#{facts_dir}/test.rb"
15
+ create_remote_file(agent, ext_fact_path, ext_fact)
16
+ create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM', "has_weight 10000"))
17
+
18
+ teardown do
19
+ on(agent, "rm -rf '#{facts_dir}'")
20
+ end
21
+
22
+ # Custom fact with weight <= 10000 should give precedence to the EXTERNAL fact
23
+ step "Agent #{agent}: resolve an external fact over the custom fact with a weight of 10000" do
24
+ on(agent, facter("--external-dir=#{facts_dir} --custom-dir=#{facts_dir} #{fact_name}")) do |facter_output|
25
+ assert_equal("EXTERNAL", facter_output.stdout.chomp)
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,35 @@
1
+ test_name "C100152: external fact overrides a custom fact with a confine" do
2
+ tag 'risk:high'
3
+
4
+ require 'facter/acceptance/user_fact_utils'
5
+ extend Facter::Acceptance::UserFactUtils
6
+
7
+ fact_name = "test"
8
+ # Use a static external fact
9
+ ext_fact = "#{fact_name}: 'EXTERNAL'"
10
+
11
+ agents.each do |agent|
12
+ # Shared directory for external and custom facts
13
+ facts_dir = agent.tmpdir('facts.d')
14
+ ext_fact_path = "#{facts_dir}/test.yaml"
15
+ cust_fact_path = "#{facts_dir}/test.rb"
16
+ create_remote_file(agent, ext_fact_path, ext_fact)
17
+
18
+ agent_kernel = on(agent, facter('kernel')).stdout.chomp
19
+ create_remote_file(agent, cust_fact_path,
20
+ custom_fact_content(fact_name, 'CUSTOM', "confine :kernel=>'#{agent_kernel}'"))
21
+
22
+ teardown do
23
+ on(agent, "rm -rf '#{facts_dir}'")
24
+ end
25
+
26
+ # External fact should take precedence over a custom fact with a confine
27
+ # (from FACT-1413)
28
+ step "Agent #{agent}: resolve external fact over a custom fact with a confine" do
29
+ on(agent, facter("--external-dir=#{facts_dir} --custom-dir=#{facts_dir} test")) do |facter_output|
30
+ assert_equal("EXTERNAL", facter_output.stdout.chomp)
31
+ end
32
+ end
33
+ end
34
+ end
35
+