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,43 @@
1
+ # This test verifies that setting both custom-dir and no-custom-facts results in an error
2
+ test_name "C99994: config option no-custom-facts conflicts with custom-dir" do
3
+ tag 'risk:low'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ content = <<EOM
9
+ Facter.add('custom_fact') do
10
+ setcode do
11
+ "testvalue"
12
+ end
13
+ end
14
+ EOM
15
+
16
+ agents.each do |agent|
17
+ step "Agent #{agent}: create a custom fact directory and fact and a config file" do
18
+ custom_dir = agent.tmpdir('custom_dir')
19
+ custom_fact = File.join(custom_dir, 'custom_fact.rb')
20
+ create_remote_file(agent, custom_fact, content)
21
+
22
+ config_dir = agent.tmpdir("config_dir")
23
+ config_file = File.join(config_dir, "facter.conf")
24
+ config_content = <<EOM
25
+ global : {
26
+ custom-dir : "#{custom_dir}"
27
+ no-custom-facts : true,
28
+ }
29
+ EOM
30
+ create_remote_file(agent, config_file, config_content)
31
+
32
+ teardown do
33
+ on(agent, "rm -rf '#{custom_fact}' '#{config_dir}'")
34
+ end
35
+
36
+ step "Agent #{agent}: config option no-custom-facts : true and custom-dir should result in an options conflict error" do
37
+ on(agent, facter("--config '#{config_file}'"), :acceptable_exit_codes => 1) do |facter_output|
38
+ assert_match(/options conflict/, facter_output.stderr, "Output does not contain error string")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # This test verifies that setting no-custom-facts in the config file disables
2
+ # finding facts under the environment variable FACTERLIB
3
+ test_name "C99997: config option no-custom-facts : true does not load facts from FACTERLIB" do
4
+ tag 'risk:low'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ content = <<EOM
10
+ Facter.add('custom_fact') do
11
+ setcode do
12
+ "testvalue"
13
+ end
14
+ end
15
+ EOM
16
+
17
+ agents.each do |agent|
18
+ step "Agent #{agent}: create a custom fact directory and fact and a config file" do
19
+ facterlib_dir = agent.tmpdir('facterlib')
20
+ custom_fact = File.join(facterlib_dir, 'custom_fact.rb')
21
+ create_remote_file(agent, custom_fact, content)
22
+
23
+ config_dir = agent.tmpdir("config_dir")
24
+ config_file = File.join(config_dir, "facter.conf")
25
+ config_content = <<EOM
26
+ global : {
27
+ no-custom-facts : true,
28
+ }
29
+ EOM
30
+ create_remote_file(agent, config_file, config_content)
31
+
32
+ teardown do
33
+ on(agent, "rm -rf '#{facterlib_dir}' '#{config_dir}'")
34
+ end
35
+
36
+ step "Agent #{agent}: no-custom-facts should ignore the FACTERLIB environment variable" do
37
+ on(agent, facter("--config '#{config_file}' custom_fact", :environment => {'FACTERLIB' => facterlib_dir})) do |facter_output|
38
+ assert_equal("", facter_output.stdout.chomp, "Custom fact in FACTERLIB should not have resolved")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,49 @@
1
+ # This test verifies that setting no-custom-facts in the config file disables the
2
+ # the loading of custom facts in facter directories under the $LOAD_PATH
3
+ test_name "C100004: config file option no-custom-facts : true does not load $LOAD_PATH facter directories" do
4
+ confine :except, :platform => 'cisco_nexus' # see BKR-749
5
+ tag 'risk:low'
6
+
7
+ require 'puppet/acceptance/common_utils'
8
+ extend Puppet::Acceptance::CommandUtils
9
+
10
+ require 'facter/acceptance/user_fact_utils'
11
+ extend Facter::Acceptance::UserFactUtils
12
+
13
+ content = <<EOM
14
+ Facter.add('custom_fact') do
15
+ setcode do
16
+ "testvalue"
17
+ end
18
+ end
19
+ EOM
20
+
21
+ agents.each do |agent|
22
+ step("Agent #{agent}: determine the load path and create a custom facter directory on it and a config file") do
23
+ ruby_path = on(agent, "#{ruby_command(agent)} -e 'puts $LOAD_PATH[0]'").stdout.chomp
24
+ load_path_facter_dir = File.join(ruby_path, 'facter')
25
+ on(agent, "mkdir -p \"#{load_path_facter_dir}\"")
26
+ custom_fact = File.join(load_path_facter_dir, 'custom_fact.rb')
27
+ create_remote_file(agent, custom_fact, content)
28
+
29
+ config_dir = agent.tmpdir("config_dir")
30
+ config_file = File.join(config_dir, "facter.conf")
31
+ config_content = <<EOM
32
+ global : {
33
+ no-custom-facts : true,
34
+ }
35
+ EOM
36
+ create_remote_file(agent, config_file, config_content)
37
+
38
+ teardown do
39
+ on(agent, "rm -rf '#{load_path_facter_dir}' '#{config_dir}'")
40
+ end
41
+
42
+ step("Agent #{agent}: using config no-custom-facts : true should not resolve facts in facter directories on the $LOAD_PATH") do
43
+ on(agent, facter("--config '#{config_file}' custom_fact")) do |facter_output|
44
+ assert_equal("", facter_output.stdout.chomp, "Custom fact in $LOAD_PATH/facter should not have resolved")
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,38 @@
1
+ # This test verifies that no-external-facts : true set in the configuration file
2
+ # does not load external facts
3
+ test_name "C99962: config no-external-facts : true does not load external facts" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ agents.each do |agent|
10
+ step "Agent #{agent}: create external fact directory and external fact and a config file" do
11
+ external_dir = agent.tmpdir('external_dir')
12
+ ext = get_external_fact_script_extension(agent['platform'])
13
+ external_fact = File.join(external_dir, "external_fact#{ext}")
14
+ create_remote_file(agent, external_fact, external_fact_content(agent['platform'], 'external_fact', 'external_value'))
15
+ on(agent, "chmod +x '#{external_fact}'")
16
+
17
+ config_dir = agent.tmpdir("config_dir")
18
+ config_file = File.join(config_dir, "facter.conf")
19
+ config_content = <<EOM
20
+ global : {
21
+ no-external-facts : true,
22
+ }
23
+ EOM
24
+ create_remote_file(agent, config_file, config_content)
25
+
26
+
27
+ teardown do
28
+ on(agent, "rm -rf '#{external_dir}' '#{config_dir}'")
29
+ end
30
+
31
+ step "Agent #{agent}: --no-external-facts option should not load external facts" do
32
+ on(agent, facter("--no-external-facts external_fact")) do |facter_output|
33
+ assert_equal("", facter_output.stdout.chomp, "External fact should not have resolved")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ # This test verifies that setting external-dir and no-external-facts in the config file
2
+ # results in an error
3
+ test_name "C99993: config option no-external-facts conflicts with external-dir" do
4
+ tag 'risk:low'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ agents.each do |agent|
10
+ step "Agent #{agent}: create the exernal-dir and a config file" do
11
+ external_dir = agent.tmpdir('external_dir')
12
+
13
+ config_dir = agent.tmpdir("config_dir")
14
+ config_file = File.join(config_dir, "facter.conf")
15
+ config_content = <<EOM
16
+ global : {
17
+ external-dir : "#{external_dir}"
18
+ no-external-facts : true,
19
+ }
20
+ EOM
21
+ create_remote_file(agent, config_file, config_content)
22
+
23
+ teardown do
24
+ on(agent, "rm -rf '#{external_dir}' '#{config_dir}'")
25
+ end
26
+
27
+ step "Agent #{agent}: config option no-external-facts : true and external-dir should result in an options conflict error" do
28
+ on(agent, facter("--config '#{config_file}'"), :acceptable_exit_codes => 1) do |facter_output|
29
+ assert_match(/options conflict/, facter_output.stderr, "Output does not contain error string")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ # This test is intended to demonstrate that the global.no-ruby config file field
2
+ # disables custom fact lookup.
3
+ test_name "C100045: config no-ruby to true should disable custom facts" do
4
+ tag 'risk:high'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ config = <<EOM
10
+ global : {
11
+ no-ruby : true
12
+ }
13
+ EOM
14
+
15
+ custom_fact_content = <<EOM
16
+ Facter.add('custom_fact') do
17
+ setcode do
18
+ "testvalue"
19
+ end
20
+ end
21
+ EOM
22
+
23
+ agents.each do |agent|
24
+ step "Agent #{agent}: create config file" do
25
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
26
+ config_file = File.join(config_dir, "facter.conf")
27
+ on(agent, "mkdir -p '#{config_dir}'")
28
+ create_remote_file(agent, config_file, config)
29
+
30
+ teardown do
31
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0,1])
32
+ end
33
+
34
+ step "no-ruby option should disable custom facts" do
35
+ step "Agent #{agent}: create custom fact directory and custom fact" do
36
+ custom_dir = get_user_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
37
+ on(agent, "mkdir -p '#{custom_dir}'")
38
+ custom_fact = File.join(custom_dir, 'custom_fact.rb')
39
+ create_remote_file(agent, custom_fact, custom_fact_content)
40
+
41
+ teardown do
42
+ on(agent, "rm -rf '#{custom_dir}'", :acceptable_exit_codes => [0,1])
43
+ end
44
+
45
+ on(agent, facter("custom_fact", :environment => { 'FACTERLIB' => custom_dir })) do |facter_output|
46
+ assert_equal("", facter_output.stdout.chomp, "Expected custom fact to be disabled when no-ruby is true")
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,34 @@
1
+ # This test verifies that the global.no-ruby config file field disables
2
+ # ruby facts
3
+ test_name "C99964: no-ruby config field flag disables requiring Ruby" do
4
+ tag 'risk:high'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ config = <<EOM
10
+ global : {
11
+ no-ruby : true
12
+ }
13
+ EOM
14
+
15
+ agents.each do |agent|
16
+ step "Agent #{agent}: create config file" do
17
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
18
+ config_file = File.join(config_dir, "facter.conf")
19
+ on(agent, "mkdir -p '#{config_dir}'")
20
+ create_remote_file(agent, config_file, config)
21
+
22
+ teardown do
23
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0,1])
24
+ end
25
+
26
+ step "no-ruby option should disable Ruby and facts requiring Ruby" do
27
+ on(agent, facter("ruby")) do |facter_output|
28
+ assert_equal("", facter_output.stdout.chomp, "Expected Ruby and Ruby fact to be disabled")
29
+ assert_equal("", facter_output.stderr.chomp, "Expected no warnings about Ruby on stderr")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,48 @@
1
+ # This test is intended to demonstrate that setting the cli.trace field to true
2
+ # enables backtrace reporting for errors in custom facts.
3
+ test_name "C99988: trace config field enables backtraces for custom facts" do
4
+ tag 'risk:high'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ erroring_custom_fact = <<EOM
10
+ Facter.add('custom_fact') do
11
+ setcode do
12
+ non_existent_value
13
+ end
14
+ end
15
+ EOM
16
+
17
+ config = <<EOM
18
+ cli : {
19
+ trace : true
20
+ }
21
+ EOM
22
+
23
+ agents.each do |agent|
24
+ step "Agent #{agent}: create custom fact directory and executable custom fact" do
25
+ custom_dir = get_user_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
26
+ on(agent, "mkdir -p '#{custom_dir}'")
27
+ custom_fact = File.join(custom_dir, "custom_fact.rb")
28
+ create_remote_file(agent, custom_fact, erroring_custom_fact)
29
+ on(agent, "chmod +x '#{custom_fact}'")
30
+
31
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
32
+ config_file = File.join(config_dir, "facter.conf")
33
+ on(agent, "mkdir -p '#{config_dir}'")
34
+ create_remote_file(agent, config_file, config)
35
+
36
+ teardown do
37
+ on(agent, "rm -rf '#{custom_dir}' '#{config_dir}'", :acceptable_exit_codes => [0, 1])
38
+ end
39
+
40
+ step "trace setting should provide a backtrace for a custom fact with errors" do
41
+ on(agent, facter("--custom-dir '#{custom_dir}' custom_fact"), :acceptable_exit_codes => [1]) do |facter_output|
42
+ assert_match(/backtrace:\s+#{custom_fact}/, facter_output.stderr, "Expected a backtrace for erroneous custom fact")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,92 @@
1
+ # This test verifies that a ttls configured cached facts when initially called
2
+ # create a json cache file
3
+ test_name "ttls configured cached external execution resolver with json output creates and read json cache files" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ # This fact must be resolvable on ALL platforms
10
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
11
+ external_cachegroup = 'external_fact'
12
+ cached_fact_name = 'single_fact'
13
+ initial_fact_value = 'external_value'
14
+ cached_fact_value = 'cached_external_value'
15
+
16
+ agents.each do |agent|
17
+ step "Agent #{agent}: create config file" do
18
+ external_dir = agent.tmpdir('external_dir')
19
+ ext = get_external_fact_script_extension(agent['platform'])
20
+ external_fact = File.join(external_dir, "#{external_cachegroup}#{ext}")
21
+ if agent['platform'] =~ /windows/
22
+ external_fact_content = <<EOM
23
+ cat << EOF
24
+ {
25
+ "#{cached_fact_name}": "#{initial_fact_value}"
26
+ }
27
+ EOF
28
+ EOM
29
+ else
30
+ external_fact_content = <<EOM
31
+ #!/bin/sh
32
+ cat << EOF
33
+ {
34
+ "#{cached_fact_name}": "#{initial_fact_value}"
35
+ }
36
+ EOF
37
+ EOM
38
+ end
39
+ create_remote_file(agent, external_fact, external_fact_content)
40
+ on(agent, "chmod +x '#{external_fact}'")
41
+
42
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
43
+ config_file = File.join(config_dir, "facter.conf")
44
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
45
+
46
+ cached_fact_file = File.join(cached_facts_dir, "#{external_cachegroup}#{ext}")
47
+
48
+ # Setup facter conf
49
+ on(agent, "mkdir -p '#{config_dir}'")
50
+ cached_fact_content = <<EOM
51
+ {
52
+ "#{cached_fact_name}": "#{cached_fact_value}"
53
+ }
54
+ EOM
55
+
56
+ config = <<EOM
57
+ facts : {
58
+ ttls : [
59
+ { "#{external_cachegroup}#{ext}" : 30 days }
60
+ ]
61
+ }
62
+ EOM
63
+ create_remote_file(agent, config_file, config)
64
+
65
+ teardown do
66
+ on(agent, "rm -rf '#{config_dir}' '#{cached_facts_dir}' '#{external_dir}'")
67
+ end
68
+
69
+ step "should create a JSON file for a fact that is to be cached" do
70
+ on(agent, "rm -rf '#{cached_facts_dir}'")
71
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}")) do |facter_output|
72
+ assert_match(/caching values for .+ facts/, facter_output.stderr, "Expected debug message to state that values will be cached")
73
+ end
74
+ on(agent, "cat #{cached_fact_file}", :acceptable_exit_codes => [0]) do |cat_output|
75
+ assert_match(/#{cached_fact_name}/, cat_output.stdout, "Expected cached fact file to contain fact information")
76
+ end
77
+ end
78
+
79
+ step "should read from a cached JSON file for a fact that has been cached" do
80
+ on(agent, "rm -rf '#{cached_facts_dir}'")
81
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}"))
82
+
83
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
84
+
85
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}")) do |facter_output|
86
+ assert_match(/loading cached values for .+ facts/, stderr, "Expected debug message to state that values are read from cache")
87
+ assert_match(/#{cached_fact_value}/, stdout, "Expected fact to match the cached fact file")
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,74 @@
1
+ # This test verifies that a ttls configured cached facts when initially called
2
+ # create a json cache file
3
+ test_name "ttls configured cached external execution resolver with text output creates and read json cache files" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ # This fact must be resolvable on ALL platforms
10
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
11
+ external_cachegroup = 'external_fact'
12
+ cached_fact_name = 'single_fact'
13
+ initial_fact_value = 'external_value'
14
+ cached_fact_value = 'cached_external_value'
15
+
16
+ agents.each do |agent|
17
+ step "Agent #{agent}: create config file" do
18
+ external_dir = agent.tmpdir('external_dir')
19
+ ext = get_external_fact_script_extension(agent['platform'])
20
+ external_fact = File.join(external_dir, "#{external_cachegroup}#{ext}")
21
+ create_remote_file(agent, external_fact, external_fact_content(agent['platform'], cached_fact_name, initial_fact_value))
22
+ on(agent, "chmod +x '#{external_fact}'")
23
+
24
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
25
+ config_file = File.join(config_dir, "facter.conf")
26
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
27
+
28
+ cached_fact_file = File.join(cached_facts_dir, "#{external_cachegroup}#{ext}")
29
+
30
+ # Setup facter conf
31
+ on(agent, "mkdir -p '#{config_dir}'")
32
+ cached_fact_content = <<EOM
33
+ {
34
+ "#{cached_fact_name}": "#{cached_fact_value}"
35
+ }
36
+ EOM
37
+
38
+ config = <<EOM
39
+ facts : {
40
+ ttls : [
41
+ { "#{external_cachegroup}#{ext}" : 30 days }
42
+ ]
43
+ }
44
+ EOM
45
+ create_remote_file(agent, config_file, config)
46
+
47
+ teardown do
48
+ on(agent, "rm -rf '#{config_dir}' '#{cached_facts_dir}' '#{external_dir}'")
49
+ end
50
+
51
+ step "should create a JSON file for a fact that is to be cached" do
52
+ on(agent, "rm -rf '#{cached_facts_dir}'")
53
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}")) do |facter_output|
54
+ assert_match(/caching values for .+ facts/, facter_output.stderr, "Expected debug message to state that values will be cached")
55
+ end
56
+ on(agent, "cat #{cached_fact_file}", :acceptable_exit_codes => [0]) do |cat_output|
57
+ assert_match(/#{cached_fact_name}/, cat_output.stdout, "Expected cached fact file to contain fact information")
58
+ end
59
+ end
60
+
61
+ step "should read from a cached JSON file for a fact that has been cached" do
62
+ on(agent, "rm -rf '#{cached_facts_dir}'")
63
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}"))
64
+
65
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
66
+
67
+ on(agent, facter("--external-dir '#{external_dir}' --debug #{cached_fact_name}")) do |facter_output|
68
+ assert_match(/loading cached values for .+ facts/, stderr, "Expected debug message to state that values are read from cache")
69
+ assert_match(/#{cached_fact_value}/, stdout, "Expected fact to match the cached fact file")
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end