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,49 @@
|
|
|
1
|
+
test_name "C64315: external facts that print messages to stderr should be seen on stderr" do
|
|
2
|
+
tag 'risk:high'
|
|
3
|
+
|
|
4
|
+
require 'facter/acceptance/user_fact_utils'
|
|
5
|
+
extend Facter::Acceptance::UserFactUtils
|
|
6
|
+
|
|
7
|
+
agents.each do |agent|
|
|
8
|
+
factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
|
|
9
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
10
|
+
ext_fact = File.join(factsd, "external_fact#{ext}")
|
|
11
|
+
|
|
12
|
+
if agent['platform'] =~ /windows/
|
|
13
|
+
content = <<EOM
|
|
14
|
+
echo "SCRIPT STDERR" >&2
|
|
15
|
+
echo "test=value"
|
|
16
|
+
EOM
|
|
17
|
+
else
|
|
18
|
+
content = <<EOM
|
|
19
|
+
#!/bin/sh
|
|
20
|
+
echo "SCRIPT STDERR" >&2
|
|
21
|
+
echo "test=value"
|
|
22
|
+
EOM
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
teardown do
|
|
26
|
+
on(agent, "rm -f '#{ext_fact}'")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
step "Agent #{agent}: create facts.d directory and fact" do
|
|
30
|
+
on(agent, "mkdir -p '#{factsd}'")
|
|
31
|
+
create_remote_file(agent, ext_fact, content)
|
|
32
|
+
on(agent, "chmod +x '#{ext_fact}'")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
step "Agent #{agent}: external fact stderr messages should appear on stderr from facter" do
|
|
36
|
+
on(agent, facter) do |facter_output|
|
|
37
|
+
assert_match(/WARN.*SCRIPT STDERR/, facter_output.stderr,
|
|
38
|
+
"Expected facter to output a warning message with the stderr string from the external fact")
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
step "Agent #{agent}: external fact stderr messages should appear on stderr from puppet facts" do
|
|
43
|
+
on(agent, puppet("facts")) do |puppet_output|
|
|
44
|
+
assert_match(/Warning.*SCRIPT STDERR/, puppet_output.stderr,
|
|
45
|
+
"Expected puppet facts to output a warning message with the stderr string from the external fact")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
test_name "C14892: external facts should only be run once" do
|
|
2
|
+
tag 'risk:high'
|
|
3
|
+
|
|
4
|
+
require 'facter/acceptance/user_fact_utils'
|
|
5
|
+
extend Facter::Acceptance::UserFactUtils
|
|
6
|
+
|
|
7
|
+
agents.each do |agent|
|
|
8
|
+
factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
|
|
9
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
10
|
+
ext_fact = File.join(factsd, "external_fact#{ext}")
|
|
11
|
+
|
|
12
|
+
if agent['platform'] =~ /windows/
|
|
13
|
+
content = <<EOM
|
|
14
|
+
echo "SCRIPT CALLED" >&2
|
|
15
|
+
echo "test=value"
|
|
16
|
+
EOM
|
|
17
|
+
else
|
|
18
|
+
content = <<EOM
|
|
19
|
+
#!/bin/sh
|
|
20
|
+
echo "SCRIPT CALLED" >&2
|
|
21
|
+
echo "test=value"
|
|
22
|
+
EOM
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
teardown do
|
|
26
|
+
on(agent, "rm -f '#{ext_fact}'")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
step "Agent #{agent}: create facts.d directory and fact" do
|
|
30
|
+
on(agent, "mkdir -p '#{factsd}'")
|
|
31
|
+
create_remote_file(agent, ext_fact, content)
|
|
32
|
+
on(agent, "chmod +x '#{ext_fact}'")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
step "Agent #{agent}: ensure the fact is only executed once" do
|
|
36
|
+
on(agent, facter) do |facter_output|
|
|
37
|
+
lines = facter_output.stderr.split('\n')
|
|
38
|
+
times = lines.count { |line| line =~ /SCRIPT CALLED/ }
|
|
39
|
+
assert_equal(1, times, "External fact should only execute once: #{facter_output.stderr}")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Verify that facter uses the new AIO default paths for external facts
|
|
2
|
+
#
|
|
3
|
+
# On Unix/Linux/OS X, there are three directories:
|
|
4
|
+
# /opt/puppetlabs/facter/facts.d/
|
|
5
|
+
# /etc/puppetlabs/facter/facts.d/
|
|
6
|
+
# /etc/facter/facts.d/
|
|
7
|
+
test_name "C59201: Fact directory precedence and resolution order for facts" do
|
|
8
|
+
tag 'risk:high'
|
|
9
|
+
|
|
10
|
+
confine :except, :platform => 'windows' # windows only supports 1 directory instead of 3 on unix
|
|
11
|
+
|
|
12
|
+
require 'facter/acceptance/user_fact_utils'
|
|
13
|
+
extend Facter::Acceptance::UserFactUtils
|
|
14
|
+
|
|
15
|
+
# Generate an external fact dynamically
|
|
16
|
+
def ext_fact(value='BASIC')
|
|
17
|
+
"test: '#{value}'"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
agents.each do |agent|
|
|
21
|
+
# The directories that facter processes facts
|
|
22
|
+
os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
|
|
23
|
+
factsd_dir = get_factsd_dir(agent['platform'], os_version)
|
|
24
|
+
etc_factsd_dir = get_etc_factsd_dir(agent['platform'])
|
|
25
|
+
etc_puppetlabs_factsd_dir = get_etc_puppetlabs_factsd_dir(agent['platform'])
|
|
26
|
+
factsd_path = "#{factsd_dir}/test.yaml"
|
|
27
|
+
etc_factsd_path = "#{etc_factsd_dir}/test.yaml"
|
|
28
|
+
etc_puppetlabs_factsd_path = "#{etc_puppetlabs_factsd_dir}/test.yaml"
|
|
29
|
+
|
|
30
|
+
teardown do
|
|
31
|
+
on(agent, "rm -rf '#{factsd_dir}' '#{etc_factsd_dir}' '#{etc_puppetlabs_factsd_dir}'")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# ensure the fact directory we want to use exists
|
|
35
|
+
step "Agent #{agent}: create facts directory (#{etc_puppetlabs_factsd_dir})" do
|
|
36
|
+
on(agent, "rm -rf '#{etc_puppetlabs_factsd_dir}'")
|
|
37
|
+
on(agent, "mkdir -p '#{etc_puppetlabs_factsd_dir}'")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# A fact in the etc_puppetlabs_factsd_dir directory should resolve to the fact
|
|
41
|
+
step "Agent #{agent}: create and resolve a custom fact in #{etc_puppetlabs_factsd_dir}" do
|
|
42
|
+
create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('etc_puppetlabs_path'))
|
|
43
|
+
on(agent, facter("test")) do |facter_output|
|
|
44
|
+
assert_match(/etc_puppetlabs_path/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} did not resolve correctly")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# remove the fact
|
|
49
|
+
step "Agent #{agent}: remove the fact in #{etc_puppetlabs_factsd_dir}" do
|
|
50
|
+
on(agent, "rm -f '#{etc_puppetlabs_factsd_path}'")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# ensure the fact directory we want to use exists
|
|
54
|
+
step "Agent #{agent}: create facts directory (#{etc_factsd_dir})" do
|
|
55
|
+
on(agent, "rm -rf '#{etc_factsd_dir}'")
|
|
56
|
+
on(agent, "mkdir -p '#{etc_factsd_dir}'")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# A fact in the etc_factsd_dir directory should resolve to the fact
|
|
60
|
+
step "Agent #{agent}: create and resolve a custom fact in #{etc_factsd_dir}" do
|
|
61
|
+
create_remote_file(agent, etc_factsd_path, ext_fact('etc_path'))
|
|
62
|
+
on(agent, facter("test")) do |facter_output|
|
|
63
|
+
assert_match(/etc_path/, facter_output.stdout, "Fact from #{etc_factsd_dir} did not resolve correctly")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# remove the fact
|
|
68
|
+
step "Agent #{agent}: remove the fact in #{etc_factsd_dir}" do
|
|
69
|
+
on(agent, "rm -f '#{etc_factsd_path}'")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# ensure the fact directory we want to use exists
|
|
73
|
+
step "Agent #{agent}: create facts directory (#{factsd_dir})" do
|
|
74
|
+
on(agent, "rm -rf '#{factsd_dir}'")
|
|
75
|
+
on(agent, "mkdir -p '#{factsd_dir}'")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# A fact in the factsd_dir directory should resolve to the fact
|
|
79
|
+
step "Agent #{agent}: create and resolve a custom fact in #{factsd_dir}" do
|
|
80
|
+
create_remote_file(agent, factsd_path, ext_fact('default_factsd'))
|
|
81
|
+
on(agent, facter("test")) do |facter_output|
|
|
82
|
+
assert_match(/default_factsd/, facter_output.stdout, "Fact from #{factsd_dir} did not resolve correctly")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# remove the fact
|
|
87
|
+
step "Agent #{agent}: remove the fact in #{factsd_dir}" do
|
|
88
|
+
on(agent, "rm -f '#{factsd_path}'")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# A fact in the etc_factsd_dir directory should take precedence over the same fact in factsd_dir
|
|
92
|
+
step "Agent #{agent}: create and resolve 2 facts of the same name between #{factsd_dir} and #{etc_factsd_dir}" do
|
|
93
|
+
create_remote_file(agent, factsd_path, ext_fact('BASE'))
|
|
94
|
+
create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS'))
|
|
95
|
+
on(agent, facter("test")) do |facter_output|
|
|
96
|
+
assert_match(/ETC_FACTS/, facter_output.stdout, "Fact from #{etc_factsd_dir} should take precedence over #{factsd_dir}")
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# A fact in the etc_puppetlabs_factsd_dir should take precedence over the same fact in etc_factsd_dir
|
|
101
|
+
step "Agent #{agent}: create and resolve 2 facts of the same name between #{etc_factsd_dir} and #{etc_puppetlabs_factsd_dir}" do
|
|
102
|
+
create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS'))
|
|
103
|
+
create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('ETC_PUPPETLABS_FACTS'))
|
|
104
|
+
on(agent, facter("test")) do |facter_output|
|
|
105
|
+
assert_match(/ETC_PUPPETLABS_FACTS/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} should take precedence over #{etc_factsd_dir}")
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Verify how facter handles same external facts filename in different directories:
|
|
2
|
+
#
|
|
3
|
+
# - in case ttl not enabled, will accept same filename in two external directories
|
|
4
|
+
# - in case ttl enabled on filename, will throw error and exit 1
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
test_name 'Should handle same filename in two external directories only if ttl is not enabled' do
|
|
8
|
+
tag 'risk:high'
|
|
9
|
+
|
|
10
|
+
require 'facter/acceptance/user_fact_utils'
|
|
11
|
+
extend Facter::Acceptance::UserFactUtils
|
|
12
|
+
|
|
13
|
+
agents.each do |agent|
|
|
14
|
+
fact1 = 'fact1'
|
|
15
|
+
fact2 = 'fact2'
|
|
16
|
+
fact1_value = 'fact1_value'
|
|
17
|
+
fact2_value = 'fact2_value'
|
|
18
|
+
external_filename = 'text.yaml'
|
|
19
|
+
external_dir1 = agent.tmpdir('external_dir')
|
|
20
|
+
external_fact_file1 = File.join(external_dir1, external_filename)
|
|
21
|
+
external_dir2 = agent.tmpdir('external_dir')
|
|
22
|
+
external_fact_file2 = File.join(external_dir2, external_filename)
|
|
23
|
+
create_remote_file(agent, external_fact_file1, "#{fact1}: #{fact1_value}")
|
|
24
|
+
create_remote_file(agent, external_fact_file2, "#{fact2}: #{fact2_value}")
|
|
25
|
+
|
|
26
|
+
config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
|
|
27
|
+
config_file = File.join(config_dir, 'facter.conf')
|
|
28
|
+
|
|
29
|
+
teardown do
|
|
30
|
+
on(agent, "rm -rf '#{external_dir1}' '#{external_dir2}' '#{config_file}'")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
step 'works if ttl is not enabled' do
|
|
34
|
+
on(agent, facter("--external-dir '#{external_dir1}' --external-dir '#{external_dir2}' --debug #{fact1} #{fact2}")) do |facter_output|
|
|
35
|
+
assert_match(/#{fact1} => #{fact1_value}/, stdout, 'Expected fact to match first fact')
|
|
36
|
+
assert_match(/#{fact2} => #{fact2_value}/, stdout, 'Expected fact to match second fact')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
step 'does not work if ttl is enabled' do
|
|
41
|
+
config = <<EOM
|
|
42
|
+
facts : {
|
|
43
|
+
ttls : [
|
|
44
|
+
{ "#{external_filename}" : 30 days }
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
EOM
|
|
48
|
+
on(agent, "mkdir -p '#{config_dir}'")
|
|
49
|
+
create_remote_file(agent, config_file, config)
|
|
50
|
+
on(agent, facter("--external-dir '#{external_dir1}' --external-dir '#{external_dir2}' --debug #{fact1} #{fact2}"), :acceptable_exit_codes => 1) do |facter_output|
|
|
51
|
+
assert_match(/ERROR.*Caching is enabled for group "#{external_filename}" while there are at least two external facts files with the same filename/, stderr, 'Expected error message')
|
|
52
|
+
assert_match(/#{fact1} => #{fact1_value}/, stdout, 'Expected fact to match first fact')
|
|
53
|
+
assert_not_match(/#{fact2} => #{fact2_value}/, stdout, 'Expected fact not to match second fact')
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# verify that facter run as a non-root user honor facts in the users home directory:
|
|
2
|
+
# ~/.facter/facts.d
|
|
3
|
+
# ~/.puppetlabs/opt/facter/facts.d
|
|
4
|
+
test_name "C64580: Non-root default user external facts directory is searched for facts" do
|
|
5
|
+
tag 'risk:high'
|
|
6
|
+
|
|
7
|
+
confine :except, :platform => 'aix' # bug FACT-1586
|
|
8
|
+
|
|
9
|
+
confine :except, :platform => 'windows' # this test currently only supported on unix systems FACT-1647
|
|
10
|
+
confine :except, :platform => 'osx' # does not support managehome
|
|
11
|
+
confine :except, :platform => 'solaris' # does not work with managehome on solaris boxes
|
|
12
|
+
confine :except, :platform => 'eos-' # does not support user creation ARISTA-37
|
|
13
|
+
|
|
14
|
+
require 'facter/acceptance/user_fact_utils'
|
|
15
|
+
extend Facter::Acceptance::UserFactUtils
|
|
16
|
+
|
|
17
|
+
# Generate an external fact dynamically
|
|
18
|
+
def ext_user_fact(value='BASIC')
|
|
19
|
+
"test: '#{value}'"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Retrieve a specific user's home directory $HOME/.facter
|
|
23
|
+
#
|
|
24
|
+
def get_user_facter_dir(user_home, platform)
|
|
25
|
+
File.join(user_home, '.facter')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Retrieve a specific user's home facts directory $HOME/.facter/facts.d
|
|
29
|
+
#
|
|
30
|
+
def get_user_facts_dir(user_home, platform)
|
|
31
|
+
File.join(get_user_facter_dir(user_home, platform), 'facts.d')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Retreive a specific user's home puppetlabs directory $HOME/.puppetlabs
|
|
35
|
+
#
|
|
36
|
+
def get_user_puppetlabs_dir(user_home, platform)
|
|
37
|
+
File.join(user_home, '.puppetlabs')
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Retreive a specific user's home puppetlabs facts directory $HOME/.puppetlabs/opt/facter/facts.d
|
|
41
|
+
#
|
|
42
|
+
def get_user_puppetlabs_facts_dir(user_home, platform)
|
|
43
|
+
File.join(get_user_puppetlabs_dir(user_home, platform), 'opt', 'facter', 'facts.d')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# retrieve the user's home directory for a host and user
|
|
47
|
+
#
|
|
48
|
+
def get_home_dir(host, user_name)
|
|
49
|
+
home_dir = nil
|
|
50
|
+
on host, puppet_resource('user', user_name) do |result|
|
|
51
|
+
home_dir = result.stdout.match(/home\s*=>\s*'([^']+)'/m)[1]
|
|
52
|
+
end
|
|
53
|
+
home_dir
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
agents.each do |agent|
|
|
57
|
+
non_root_user = "nonroot"
|
|
58
|
+
|
|
59
|
+
step "Agent #{agent}: create a #{non_root_user} to run facter with" do
|
|
60
|
+
on(agent, "puppet resource user #{non_root_user} ensure=present managehome=true shell='#{user_shell(agent)}'")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
user_home = get_home_dir(agent, non_root_user)
|
|
64
|
+
|
|
65
|
+
# The directories that facter processes facts for a user from
|
|
66
|
+
user_base_facts_dir = get_user_facter_dir(user_home, agent['platform'])
|
|
67
|
+
user_facts_dir = get_user_facts_dir(user_home, agent['platform'])
|
|
68
|
+
user_facts_path = "#{user_facts_dir}/test.yaml"
|
|
69
|
+
|
|
70
|
+
user_base_puppetlabs_dir = get_user_puppetlabs_dir(user_home, agent['platform'])
|
|
71
|
+
user_puppetlabs_facts_dir = get_user_puppetlabs_facts_dir(user_home, agent['platform'])
|
|
72
|
+
user_puppetlabs_facts_path = "#{user_puppetlabs_facts_dir}/test.yaml"
|
|
73
|
+
|
|
74
|
+
step "Agent #{agent}: figure out facter program location"
|
|
75
|
+
facter_path = on(agent, "which facter").stdout.chomp
|
|
76
|
+
|
|
77
|
+
teardown do
|
|
78
|
+
on(agent, "rm -rf '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
|
|
79
|
+
on(agent, puppet("resource user #{non_root_user} ensure=absent managehome=true"))
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
step "Agent #{agent}: create facts directory (#{user_facts_dir})" do
|
|
83
|
+
on(agent, "rm -rf '#{user_facts_dir}'")
|
|
84
|
+
on(agent, "mkdir -p '#{user_facts_dir}'")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
step "Agent #{agent}: create and resolve a custom fact in #{user_facts_dir}" do
|
|
88
|
+
create_remote_file(agent, user_facts_path, ext_user_fact('USER_TEST_FACTER'))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
|
|
92
|
+
on(agent, "chown -R #{non_root_user} '#{user_base_facts_dir}'")
|
|
93
|
+
on(agent, "chmod -R a+rx '#{user_base_facts_dir}'")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do
|
|
97
|
+
on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
|
|
98
|
+
assert_match(/USER_TEST_FACTER/, facter_result.stdout, "Fact from #{user_facts_dir} did not resolve correctly")
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
step "Agent #{agent}: remove #{user_facts_path}" do
|
|
103
|
+
on(agent, "rm -rf '#{user_facts_path}'")
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
step "Agent #{agent}: create facts directory (#{user_puppetlabs_facts_dir})" do
|
|
107
|
+
on(agent, "rm -rf '#{user_puppetlabs_facts_dir}'")
|
|
108
|
+
on(agent, "mkdir -p '#{user_puppetlabs_facts_dir}'")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do
|
|
112
|
+
create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_TEST_PUPPETLABS'))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
|
|
116
|
+
on(agent, "chown -R #{non_root_user} '#{user_base_puppetlabs_dir}'")
|
|
117
|
+
on(agent, "chmod -R a+rx '#{user_base_puppetlabs_dir}'")
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do
|
|
121
|
+
on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
|
|
122
|
+
assert_match(/USER_TEST_PUPPETLABS/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly")
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do
|
|
127
|
+
create_remote_file(agent, user_facts_path, ext_user_fact('USER_PRECEDENCE_FACTER'))
|
|
128
|
+
create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_PRECEDENCE_PUPPETLABS'))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do
|
|
132
|
+
on(agent, "chown -R #{non_root_user} '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
|
|
133
|
+
on(agent, "chmod -R a+rx '#{user_base_facts_dir}' '#{user_base_puppetlabs_dir}'")
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
step "Agent #{agent}: run facter as #{non_root_user} and .facter will take precedence over .puppetlabs" do
|
|
137
|
+
on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result|
|
|
138
|
+
assert_match(/USER_PRECEDENCE_FACTER/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly")
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# facter resolves facts from the default facts.d directory
|
|
2
|
+
# on Unix this can be 3 directories (See fact_directory_precedence.rb)
|
|
3
|
+
# Unix - /opt/puppetlabs/facter/facts.d/
|
|
4
|
+
# Windows - C:\ProgramData\PuppetLabs\facter\facts.d\
|
|
5
|
+
test_name "C87571: facter resolves facts in the default facts.d directory" do
|
|
6
|
+
tag 'risk:high'
|
|
7
|
+
|
|
8
|
+
require 'facter/acceptance/user_fact_utils'
|
|
9
|
+
extend Facter::Acceptance::UserFactUtils
|
|
10
|
+
|
|
11
|
+
agents.each do |agent|
|
|
12
|
+
os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
|
|
13
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
14
|
+
factsd = get_factsd_dir(agent['platform'], os_version)
|
|
15
|
+
fact_file = File.join(factsd, "external_fact_1#{ext}")
|
|
16
|
+
content = external_fact_content(agent['platform'], 'external_fact', 'external_value')
|
|
17
|
+
|
|
18
|
+
teardown do
|
|
19
|
+
on(agent, "rm -f '#{fact_file}'")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
step "Agent #{agent}: setup default external facts directory and fact" do
|
|
23
|
+
on(agent, "mkdir -p '#{factsd}'")
|
|
24
|
+
create_remote_file(agent, fact_file, content)
|
|
25
|
+
on(agent, "chmod +x '#{fact_file}'")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
step "agent #{agent}: resolve the external fact" do
|
|
29
|
+
on(agent, facter('external_fact')) do |facter_output|
|
|
30
|
+
assert_equal('external_value', facter_output.stdout.chomp, 'Expected to resolve the external_fact')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# This test is intended to demonstrate that executable external facts can return
|
|
2
|
+
# YAML or JSON data, in addition to plain key-value pairs. If the output cannot be
|
|
3
|
+
# parsed as YAML, it will fall back to key-value pair parsing, and only fail if
|
|
4
|
+
# this is also invalid.
|
|
5
|
+
test_name "executable external facts can return structured data" do
|
|
6
|
+
|
|
7
|
+
require 'facter/acceptance/user_fact_utils'
|
|
8
|
+
extend Facter::Acceptance::UserFactUtils
|
|
9
|
+
|
|
10
|
+
unix_fact_yaml = <<EOM
|
|
11
|
+
#!/bin/sh
|
|
12
|
+
echo "yaml_fact: [ 'one', 'two', 'three' ]"
|
|
13
|
+
EOM
|
|
14
|
+
|
|
15
|
+
unix_fact_json = <<EOM
|
|
16
|
+
#!/bin/sh
|
|
17
|
+
echo "{ json_fact: { element: 1 } }"
|
|
18
|
+
EOM
|
|
19
|
+
|
|
20
|
+
unix_fact_kv = <<EOM
|
|
21
|
+
#!/bin/sh
|
|
22
|
+
echo "kv_fact=one"
|
|
23
|
+
EOM
|
|
24
|
+
|
|
25
|
+
unix_fact_bad = <<EOM
|
|
26
|
+
#!/bin/sh
|
|
27
|
+
echo "bad_fact : : not, json"
|
|
28
|
+
EOM
|
|
29
|
+
|
|
30
|
+
win_fact_yaml = <<EOM
|
|
31
|
+
@echo off
|
|
32
|
+
echo yaml_fact: [ 'one', 'two', 'three' ]
|
|
33
|
+
EOM
|
|
34
|
+
|
|
35
|
+
win_fact_json = <<EOM
|
|
36
|
+
@echo off
|
|
37
|
+
echo { json_fact: { element: 1 } }
|
|
38
|
+
EOM
|
|
39
|
+
|
|
40
|
+
win_fact_kv = <<EOM
|
|
41
|
+
@echo off
|
|
42
|
+
echo kv_fact=one
|
|
43
|
+
EOM
|
|
44
|
+
|
|
45
|
+
win_fact_bad = <<EOM
|
|
46
|
+
@echo off
|
|
47
|
+
echo bad_fact : : not, json
|
|
48
|
+
EOM
|
|
49
|
+
|
|
50
|
+
yaml_structured_output = <<EOM
|
|
51
|
+
[
|
|
52
|
+
"one",
|
|
53
|
+
"two",
|
|
54
|
+
"three"
|
|
55
|
+
]
|
|
56
|
+
EOM
|
|
57
|
+
|
|
58
|
+
json_structured_output = <<EOM
|
|
59
|
+
{
|
|
60
|
+
element => 1
|
|
61
|
+
}
|
|
62
|
+
EOM
|
|
63
|
+
|
|
64
|
+
kv_output = 'one'
|
|
65
|
+
|
|
66
|
+
agents.each do |agent|
|
|
67
|
+
os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
|
|
68
|
+
factsd = get_factsd_dir(agent['platform'], os_version)
|
|
69
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
70
|
+
|
|
71
|
+
if agent['platform'] =~ /windows/
|
|
72
|
+
yaml_content = win_fact_yaml
|
|
73
|
+
json_content = win_fact_json
|
|
74
|
+
kv_content = win_fact_kv
|
|
75
|
+
bad_fact_content = win_fact_bad
|
|
76
|
+
else
|
|
77
|
+
yaml_content = unix_fact_yaml
|
|
78
|
+
json_content = unix_fact_json
|
|
79
|
+
kv_content = unix_fact_kv
|
|
80
|
+
bad_fact_content = unix_fact_bad
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
step "Agent #{agent}: setup default external facts directory (facts.d)" do
|
|
84
|
+
on(agent, "mkdir -p '#{factsd}'")
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
teardown do
|
|
88
|
+
on(agent, "rm -rf '#{factsd}'")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
step "Agent #{agent}: create an executable yaml fact in default facts.d" do
|
|
92
|
+
yaml_fact = File.join(factsd, "yaml_fact#{ext}")
|
|
93
|
+
create_remote_file(agent, yaml_fact, yaml_content)
|
|
94
|
+
on(agent, "chmod +x '#{yaml_fact}'")
|
|
95
|
+
|
|
96
|
+
step "YAML output should produce a structured fact" do
|
|
97
|
+
on(agent, facter("yaml_fact")) do
|
|
98
|
+
assert_match(/#{yaml_structured_output}/, stdout, "Expected properly structured fact")
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
step "Agent #{agent}: create an executable json fact in default facts.d" do
|
|
104
|
+
json_fact = File.join(factsd, "json_fact#{ext}")
|
|
105
|
+
create_remote_file(agent, json_fact, json_content)
|
|
106
|
+
on(agent, "chmod +x '#{json_fact}'")
|
|
107
|
+
|
|
108
|
+
step "JSON output should produce a structured fact" do
|
|
109
|
+
on(agent, facter("json_fact")) do
|
|
110
|
+
assert_match(/#{json_structured_output}/, stdout, "Expected properly structured fact")
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
step "Agent #{agent}: create an executable key-value fact in default facts.d" do
|
|
116
|
+
kv_fact = File.join(factsd, "kv_fact#{ext}")
|
|
117
|
+
create_remote_file(agent, kv_fact, kv_content)
|
|
118
|
+
on(agent, "chmod +x '#{kv_fact}'")
|
|
119
|
+
|
|
120
|
+
step "output that is neither yaml nor json should not produce a structured fact" do
|
|
121
|
+
on(agent, facter("kv_fact")) do
|
|
122
|
+
assert_match(/#{kv_output}/, stdout, "Expected a simple key-value fact")
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
step "Agent #{agent}: create a malformed executable fact in default facts.d" do
|
|
128
|
+
bad_fact = File.join(factsd, "bad_fact#{ext}")
|
|
129
|
+
create_remote_file(agent, bad_fact, bad_fact_content)
|
|
130
|
+
on(agent, "chmod +x '#{bad_fact}'")
|
|
131
|
+
|
|
132
|
+
step "should error when output is not in a supported format" do
|
|
133
|
+
on(agent, facter("bad_fact --debug")) do
|
|
134
|
+
assert_match(/Could not parse executable fact/, stderr, "Expected parsing the malformed fact to fail")
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|