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.
- checksums.yaml +4 -4
- data/.github/actions/presuite.rb +1 -12
- data/.github/workflows/acceptance_tests.yml +4 -4
- data/.github/workflows/checks.yaml +9 -3
- data/.github/workflows/coverage.yaml +1 -1
- data/.github/workflows/unit_tests.yaml +2 -2
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +6 -4
- data/CHANGELOG.md +22 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/acceptance/.beaker.yml +15 -0
- data/acceptance/.gitignore +12 -0
- data/acceptance/Gemfile +24 -0
- data/acceptance/Rakefile +2 -0
- data/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
- data/acceptance/config/aio/options.rb +6 -0
- data/acceptance/config/git/options.rb +3 -0
- data/acceptance/config/nodes/aix-53-power.yaml +7 -0
- data/acceptance/config/nodes/aix-61-power.yaml +7 -0
- data/acceptance/config/nodes/aix-71-power.yaml +7 -0
- data/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
- data/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
- data/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
- data/acceptance/lib/facter/acceptance/base_fact_utils.rb +565 -0
- data/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
- data/acceptance/lib/helper.rb +3 -0
- data/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
- data/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
- data/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
- data/acceptance/setup/aio/pre-suite/001_run_with_facter_ng.rb +75 -0
- data/acceptance/tests/custom_facts/cached_custom_fact.rb +82 -0
- data/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb +106 -0
- data/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
- data/acceptance/tests/custom_facts/expand_command.rb +30 -0
- data/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
- data/acceptance/tests/custom_facts/not_expand_command.rb +30 -0
- data/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
- data/acceptance/tests/custom_facts/weighted_cached_custom_facts.rb +94 -0
- data/acceptance/tests/custom_facts/windows_not_expand_command.rb +30 -0
- data/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
- data/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
- data/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
- data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
- data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
- data/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
- data/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
- data/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
- data/acceptance/tests/external_facts/handle_same_filename_in_different_dirs.rb +59 -0
- data/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
- data/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
- data/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
- data/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
- data/acceptance/tests/facts/dmi.rb +51 -0
- data/acceptance/tests/facts/facterversion.rb +11 -0
- data/acceptance/tests/facts/identity.rb +52 -0
- data/acceptance/tests/facts/mountpoints_fact.rb +12 -0
- data/acceptance/tests/facts/networking_facts.rb +93 -0
- data/acceptance/tests/facts/nim_type.rb +12 -0
- data/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
- data/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
- data/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
- data/acceptance/tests/facts/osx_numeric_hostname.rb +23 -0
- data/acceptance/tests/facts/partitions.rb +37 -0
- data/acceptance/tests/facts/productname.rb +15 -0
- data/acceptance/tests/facts/ruby.rb +59 -0
- data/acceptance/tests/facts/ssh_key.rb +59 -0
- data/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
- data/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
- data/acceptance/tests/facts/windows_os.rb +64 -0
- data/acceptance/tests/load_libfacter.rb +66 -0
- data/acceptance/tests/no_errors_on_stderr.rb +10 -0
- data/acceptance/tests/options/color.rb +16 -0
- data/acceptance/tests/options/config.rb +27 -0
- data/acceptance/tests/options/config_file/blocklist.rb +35 -0
- data/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
- data/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
- data/acceptance/tests/options/config_file/custom_facts.rb +42 -0
- data/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
- data/acceptance/tests/options/config_file/debug.rb +34 -0
- data/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
- data/acceptance/tests/options/config_file/default_file_location.rb +37 -0
- data/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
- data/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
- data/acceptance/tests/options/config_file/external_facts.rb +37 -0
- data/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
- data/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
- data/acceptance/tests/options/config_file/log_level.rb +35 -0
- data/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
- data/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
- data/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
- data/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
- data/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
- data/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
- data/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
- data/acceptance/tests/options/config_file/trace.rb +48 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_json_output.rb +92 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_text_output.rb +74 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_yaml_output.rb +88 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_json_resolver.rb +79 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_text_resolver.rb +78 -0
- data/acceptance/tests/options/config_file/ttls_cached_external_yaml_resolver.rb +78 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
- data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
- data/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
- data/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
- data/acceptance/tests/options/config_file/verbose.rb +34 -0
- data/acceptance/tests/options/custom_facts.rb +34 -0
- data/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
- data/acceptance/tests/options/custom_facts_list.rb +48 -0
- data/acceptance/tests/options/custom_facts_load_path.rb +42 -0
- data/acceptance/tests/options/debug.rb +12 -0
- data/acceptance/tests/options/external_facts.rb +28 -0
- data/acceptance/tests/options/external_facts_list.rb +35 -0
- data/acceptance/tests/options/help.rb +13 -0
- data/acceptance/tests/options/json.rb +43 -0
- data/acceptance/tests/options/list_block_groups.rb +15 -0
- data/acceptance/tests/options/list_block_groups_facter_4.rb +15 -0
- data/acceptance/tests/options/list_cache_groups.rb +65 -0
- data/acceptance/tests/options/log_level.rb +13 -0
- data/acceptance/tests/options/no_block.rb +34 -0
- data/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
- data/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
- data/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
- data/acceptance/tests/options/no_color.rb +16 -0
- data/acceptance/tests/options/no_custom_facts.rb +34 -0
- data/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
- data/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
- data/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
- data/acceptance/tests/options/no_external_facts.rb +28 -0
- data/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
- data/acceptance/tests/options/no_ruby.rb +44 -0
- data/acceptance/tests/options/puppet_facts.rb +37 -0
- data/acceptance/tests/options/show_legacy.rb +18 -0
- data/acceptance/tests/options/strict.rb +11 -0
- data/acceptance/tests/options/trace.rb +36 -0
- data/acceptance/tests/options/verbose.rb +12 -0
- data/acceptance/tests/options/version.rb +12 -0
- data/acceptance/tests/options/yaml.rb +43 -0
- data/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +23 -0
- data/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
- data/lib/custom_facts/core/execution/base.rb +18 -18
- data/lib/custom_facts/util/collection.rb +2 -7
- data/lib/custom_facts/util/config.rb +1 -1
- data/lib/custom_facts/util/directory_loader.rb +51 -24
- data/lib/custom_facts/util/fact.rb +10 -1
- data/lib/custom_facts/util/resolution.rb +1 -1
- data/lib/facts/aix/aio_agent_version.rb +14 -0
- data/lib/facts/bsd/processors/count.rb +17 -0
- data/lib/facts/bsd/processors/models.rb +23 -0
- data/lib/facts/bsd/processors/speed.rb +17 -0
- data/lib/facts/freebsd/disks.rb +15 -0
- data/lib/facts/freebsd/partitions.rb +15 -0
- data/lib/facts/freebsd/processors/count.rb +17 -0
- data/lib/facts/freebsd/processors/models.rb +23 -0
- data/lib/facts/freebsd/processors/speed.rb +17 -0
- data/lib/facts/linux/aio_agent_version.rb +14 -0
- data/lib/facts/linux/ec2_metadata.rb +47 -0
- data/lib/facts/linux/ec2_userdata.rb +47 -0
- data/lib/facts/linux/is_virtual.rb +2 -5
- data/lib/facts/linux/virtual.rb +1 -5
- data/lib/facts/macosx/aio_agent_version.rb +14 -0
- data/lib/facts/macosx/interfaces.rb +2 -2
- data/lib/facts/macosx/networking/dhcp.rb +17 -0
- data/lib/facts/macosx/networking/interfaces.rb +21 -0
- data/lib/facts/macosx/networking/ip.rb +4 -1
- data/lib/facts/macosx/networking/ip6.rb +21 -0
- data/lib/facts/macosx/networking/mac.rb +4 -1
- data/lib/facts/macosx/networking/mtu.rb +20 -0
- data/lib/facts/macosx/networking/netmask.rb +21 -0
- data/lib/facts/macosx/networking/netmask6.rb +21 -0
- data/lib/facts/macosx/networking/network.rb +21 -0
- data/lib/facts/macosx/networking/network6.rb +21 -0
- data/lib/facts/macosx/networking/primary.rb +17 -0
- data/lib/facts/macosx/networking/scope6.rb +20 -0
- data/lib/facts/solaris/aio_agent_version.rb +14 -0
- data/lib/facts/windows/aio_agent_version.rb +14 -0
- data/lib/facts/windows/ec2_metadata.rb +23 -0
- data/lib/facts/windows/ec2_userdata.rb +23 -0
- data/lib/facts_utils/hypervisors.rb +10 -0
- data/lib/framework/core/cache_manager.rb +42 -18
- data/lib/framework/core/fact/external/external_fact_manager.rb +3 -2
- data/lib/framework/core/fact_loaders/external_fact_loader.rb +3 -2
- data/lib/framework/formatters/legacy_fact_formatter.rb +6 -5
- data/lib/framework/parsers/query_parser.rb +14 -2
- data/lib/models/loaded_fact.rb +3 -1
- data/lib/models/resolved_fact.rb +1 -1
- data/lib/models/searched_fact.rb +1 -0
- data/lib/resolvers/{agent_resolver.rb → aio_agent_version.rb} +4 -3
- data/lib/resolvers/bsd/ffi/ffi_helper.rb +31 -0
- data/lib/resolvers/bsd/processors.rb +47 -0
- data/lib/resolvers/ec2.rb +77 -0
- data/lib/resolvers/freebsd/ffi/ffi_helper.rb +42 -0
- data/lib/resolvers/freebsd/geom_resolver.rb +109 -0
- data/lib/resolvers/freebsd/processors.rb +44 -0
- data/lib/resolvers/macosx/networking.rb +110 -0
- data/lib/resolvers/networking_linux_resolver.rb +8 -30
- data/lib/resolvers/utils/networking.rb +70 -0
- data/lib/resolvers/windows/aio_agent_version.rb +56 -0
- metadata +175 -5
- 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
|
+
|