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,33 @@
|
|
|
1
|
+
# This test verifies that we can load a custom fact using the environment variable FACTERLIB
|
|
2
|
+
test_name "C14779: custom facts are loaded from the environment variable FACTERLIB path" do
|
|
3
|
+
tag 'risk:medium'
|
|
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
|
+
"facterlib"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
EOM
|
|
15
|
+
|
|
16
|
+
agents.each do |agent|
|
|
17
|
+
step "Agent #{agent}: create custom directory and fact" do
|
|
18
|
+
custom_dir = agent.tmpdir('facter_lib_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
|
+
step "Agent #{agent}: facter should resolve a fact from the directory specified by the environment variable FACTERLIB" do
|
|
27
|
+
on(agent, facter('custom_fact', :environment => { 'FACTERLIB' => custom_dir })) do |facter_output|
|
|
28
|
+
assert_equal("facterlib", facter_output.stdout.chomp, "Incorrect custom fact value for fact in FACTERLIB")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# facter should be able to be called with multiple --custom-dir's and find a fact in each
|
|
2
|
+
# directory specified
|
|
3
|
+
test_name "C99999: custom fact commandline option --custom-dir can be specified multiple times" do
|
|
4
|
+
tag 'risk:high'
|
|
5
|
+
|
|
6
|
+
require 'json'
|
|
7
|
+
require 'facter/acceptance/user_fact_utils'
|
|
8
|
+
extend Facter::Acceptance::UserFactUtils
|
|
9
|
+
|
|
10
|
+
content_1 = <<EOM
|
|
11
|
+
Facter.add('custom_fact_1') do
|
|
12
|
+
setcode do
|
|
13
|
+
"testvalue_1"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
EOM
|
|
17
|
+
|
|
18
|
+
content_2 = <<EOM
|
|
19
|
+
Facter.add('custom_fact_2') do
|
|
20
|
+
setcode do
|
|
21
|
+
"testvalue_2"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
EOM
|
|
25
|
+
|
|
26
|
+
agents.each do |agent|
|
|
27
|
+
step "Agent #{agent}: create custom fact directory and a custom fact in each" do
|
|
28
|
+
custom_dir_1 = agent.tmpdir('custom_dir_1')
|
|
29
|
+
custom_dir_2 = agent.tmpdir('custom_dir_2')
|
|
30
|
+
custom_fact_1 = File.join(custom_dir_1, 'custom_fact.rb')
|
|
31
|
+
custom_fact_2 = File.join(custom_dir_2, 'custom_fact.rb')
|
|
32
|
+
create_remote_file(agent, custom_fact_1, content_1)
|
|
33
|
+
create_remote_file(agent, custom_fact_2, content_2)
|
|
34
|
+
|
|
35
|
+
teardown do
|
|
36
|
+
on(agent, "rm -rf '#{custom_dir_1}' '#{custom_dir_2}'")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
step "Agent #{agent}: resolve a fact from each specified --custom-dir option" do
|
|
40
|
+
on(agent, facter("--custom-dir #{custom_dir_1} --custom-dir #{custom_dir_2} --json")) do |facter_output|
|
|
41
|
+
results = JSON.parse(facter_output.stdout)
|
|
42
|
+
assert_equal("testvalue_1", results['custom_fact_1'], "Incorrect custom fact value for custom_fact_1")
|
|
43
|
+
assert_equal("testvalue_2", results['custom_fact_2'], "Incorrect custom fact value for custom_fact_2")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# This test verifies that we can load a custom fact using the ruby $LOAD_PATH variable
|
|
2
|
+
#
|
|
3
|
+
# Facter searches all directories in the Ruby $LOAD_PATH variable for subdirectories
|
|
4
|
+
# named ‘facter’, and loads all Ruby files in those directories.
|
|
5
|
+
test_name "C14777: custom facts loaded from facter subdirectory found in $LOAD_PATH directory" do
|
|
6
|
+
confine :except, :platform => 'cisco_nexus' # see BKR-749
|
|
7
|
+
|
|
8
|
+
tag 'risk:medium'
|
|
9
|
+
|
|
10
|
+
require 'puppet/acceptance/common_utils'
|
|
11
|
+
extend Puppet::Acceptance::CommandUtils
|
|
12
|
+
|
|
13
|
+
require 'facter/acceptance/user_fact_utils'
|
|
14
|
+
extend Facter::Acceptance::UserFactUtils
|
|
15
|
+
|
|
16
|
+
content = <<EOM
|
|
17
|
+
Facter.add('custom_fact') do
|
|
18
|
+
setcode do
|
|
19
|
+
"load_path"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
EOM
|
|
23
|
+
|
|
24
|
+
agents.each do |agent|
|
|
25
|
+
step "Agent #{agent}: determine $LOAD_PATH and create custom fact" do
|
|
26
|
+
on(agent, "#{ruby_command(agent)} -e 'puts $LOAD_PATH[0]'")
|
|
27
|
+
load_path_facter_dir = File.join(stdout.chomp, 'facter')
|
|
28
|
+
on(agent, "mkdir -p \"#{load_path_facter_dir}\"")
|
|
29
|
+
custom_fact = File.join(load_path_facter_dir, 'custom_fact.rb')
|
|
30
|
+
create_remote_file(agent, custom_fact, content)
|
|
31
|
+
|
|
32
|
+
teardown do
|
|
33
|
+
on(agent, "rm -rf '#{load_path_facter_dir}'")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
step("Agent #{agent}: resolve the custom fact that is in a facter directory on the $LOAD_PATH")
|
|
37
|
+
on(agent, facter("custom_fact")) do |facter_output|
|
|
38
|
+
assert_equal("load_path", facter_output.stdout.chomp, "Incorrect custom fact value for fact in $LOAD_PATH/facter")
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# This test is intended to ensure that the --debug command-line option works
|
|
2
|
+
# properly. This option prints debugging information to stderr.
|
|
3
|
+
test_name "C63191: --debug command-line option prints debugging information to stderr" do
|
|
4
|
+
|
|
5
|
+
agents.each do |agent|
|
|
6
|
+
step "Agent #{agent}: retrieve debug info from stderr using --debug option" do
|
|
7
|
+
on(agent, facter('--debug')) do
|
|
8
|
+
assert_match(/DEBUG/, stderr, "Expected DEBUG information in stderr")
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# This tests checks that we can call facter with a --external-dir and get an external fact
|
|
2
|
+
# from that directory
|
|
3
|
+
test_name "C99974: external fact commandline options --external-dir resolves an external fact" 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 an external fact directory with an external fact" 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'], 'single_fact', 'external_value'))
|
|
15
|
+
on(agent, "chmod +x '#{external_fact}'")
|
|
16
|
+
|
|
17
|
+
teardown do
|
|
18
|
+
on(agent, "rm -rf '#{external_dir}'")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
step "Agent #{agent}: resolve a fact from each specified --external_dir option" do
|
|
22
|
+
on(agent, facter("--external-dir #{external_dir} single_fact")) do |facter_output|
|
|
23
|
+
assert_equal("external_value", facter_output.stdout.chomp, "Incorrect external fact value")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# facter should be able to be called with multiple --external-dir's and find a fact in each
|
|
2
|
+
# directory specified
|
|
3
|
+
|
|
4
|
+
test_name "C99998: external fact commandline option --external-dir can be specified multiple times" do
|
|
5
|
+
tag 'risk:high'
|
|
6
|
+
|
|
7
|
+
require 'json'
|
|
8
|
+
require 'facter/acceptance/user_fact_utils'
|
|
9
|
+
extend Facter::Acceptance::UserFactUtils
|
|
10
|
+
|
|
11
|
+
agents.each do |agent|
|
|
12
|
+
step "Agent #{agent}: create external fact directories and a external fact in each" do
|
|
13
|
+
external_dir_1 = agent.tmpdir('external_dir_1')
|
|
14
|
+
external_dir_2 = agent.tmpdir('external_dir_2')
|
|
15
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
16
|
+
external_fact_1 = File.join(external_dir_1, "external_fact#{ext}")
|
|
17
|
+
external_fact_2 = File.join(external_dir_2, "external_fact#{ext}")
|
|
18
|
+
create_remote_file(agent, external_fact_1, external_fact_content(agent['platform'], 'external_fact_1', 'external_value_1'))
|
|
19
|
+
create_remote_file(agent, external_fact_2, external_fact_content(agent['platform'], 'external_fact_2', 'external_value_2'))
|
|
20
|
+
on(agent, "chmod +x '#{external_fact_1}' '#{external_fact_2}'")
|
|
21
|
+
|
|
22
|
+
teardown do
|
|
23
|
+
on(agent, "rm -rf '#{external_dir_1}' '#{external_dir_2}'")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
step "Agent #{agent}: resolve a fact from each specified --external_dir option" do
|
|
27
|
+
on(agent, facter("--external-dir #{external_dir_1} --external-dir #{external_dir_2} --json")) do |facter_output|
|
|
28
|
+
results = JSON.parse(facter_output.stdout)
|
|
29
|
+
assert_equal("external_value_1", results['external_fact_1'], "Incorrect external fact value for external_fact_1")
|
|
30
|
+
assert_equal("external_value_2", results['external_fact_2'], "Incorrect external fact value for external_fact_2")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# This test is intended to ensure that the --help command-line option works
|
|
2
|
+
# properly. This option prints usage information and available command-line
|
|
3
|
+
# options.
|
|
4
|
+
test_name "C99984: --help command-line option prints usage information to stdout" do
|
|
5
|
+
|
|
6
|
+
agents.each do |agent|
|
|
7
|
+
step "Agent #{agent}: retrieve usage info from stdout using --help option" do
|
|
8
|
+
on(agent, facter('--help')) do
|
|
9
|
+
assert_match(/(facter|facter-ng) \[options\] \[query\] \[query\] \[...\]/, stdout, "Expected stdout to contain usage information")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# This test is intended to ensure that the --json command-line option works
|
|
2
|
+
# properly. This option causes Facter to output facts in JSON format.
|
|
3
|
+
# A custom fact is used to test for parity between Facter's output and
|
|
4
|
+
# the expected JSON output.
|
|
5
|
+
test_name "C99966, C98083: --json command-line option results in valid JSON output" do
|
|
6
|
+
|
|
7
|
+
require 'json'
|
|
8
|
+
require 'facter/acceptance/user_fact_utils'
|
|
9
|
+
extend Facter::Acceptance::UserFactUtils
|
|
10
|
+
|
|
11
|
+
content = <<EOM
|
|
12
|
+
Facter.add('structured_fact') do
|
|
13
|
+
setcode do
|
|
14
|
+
{ "foo" => {"nested" => "value1"}, "bar" => "value2", "baz" => "value3", "true" => true, "false" => false }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
EOM
|
|
18
|
+
|
|
19
|
+
agents.each do |agent|
|
|
20
|
+
step "Agent #{agent}: create a structured custom fact" do
|
|
21
|
+
custom_dir = get_user_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
|
|
22
|
+
custom_fact = File.join(custom_dir, 'custom_fact.rb')
|
|
23
|
+
on(agent, "mkdir -p '#{custom_dir}'")
|
|
24
|
+
create_remote_file(agent, custom_fact, content)
|
|
25
|
+
on(agent, "chmod +x '#{custom_fact}'")
|
|
26
|
+
|
|
27
|
+
teardown do
|
|
28
|
+
on(agent, "rm -f '#{custom_fact}'")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
step "Agent #{agent}: retrieve output using the --json option" do
|
|
32
|
+
on(agent, facter("--custom-dir '#{custom_dir}' --json structured_fact")) do
|
|
33
|
+
begin
|
|
34
|
+
expected = {"structured_fact" => {"foo" => {"nested" => "value1"}, "bar" => "value2", "baz" => "value3", "true" => true, "false" => false}}
|
|
35
|
+
assert_equal(expected, JSON.parse(stdout.chomp), "JSON output does not match expected output")
|
|
36
|
+
rescue
|
|
37
|
+
fail_test "Couldn't parse output as JSON"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# This tests is intended to verify that passing the `--list-block-groups` flag
|
|
2
|
+
# will cause the names of blockable resolvers to be printed to stdout. It should not list
|
|
3
|
+
# any resolver name that is not blockable.
|
|
4
|
+
test_name "C99969: the `--list-block-groups` command line flag prints available block groups to stdout" do
|
|
5
|
+
tag 'risk:medium', 'facter_3'
|
|
6
|
+
|
|
7
|
+
agents.each do |agent|
|
|
8
|
+
step "the EC2 blockgroup should be listed" do
|
|
9
|
+
on(agent, facter("--list-block-groups")) do |facter_output|
|
|
10
|
+
assert_match(/EC2/, facter_output.stdout, "Expected the EC2 group to be listed")
|
|
11
|
+
assert_match(/ec2_metadata/, facter_output.stdout, "Expected the EC2 group's facts to be listed")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# This tests is intended to verify that passing the `--list-block-groups` flag
|
|
2
|
+
# will cause the names of blockable resolvers to be printed to stdout. It should not list
|
|
3
|
+
# any resolver name that is not blockable.
|
|
4
|
+
test_name "the `--list-block-groups` command line flag prints available block groups to stdout" do
|
|
5
|
+
tag 'risk:medium'
|
|
6
|
+
|
|
7
|
+
agents.each do |agent|
|
|
8
|
+
step "the EC2 blockgroup should be listed" do
|
|
9
|
+
on(agent, facter("--list-block-groups")) do |facter_output|
|
|
10
|
+
assert_match(/EC2/, facter_output.stdout, "Expected the EC2 group to be listed")
|
|
11
|
+
assert_match(/ec2_metadata/, facter_output.stdout, "Expected the EC2 group's facts to be listed")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# This tests is intended to verify that passing the `--list-cache-groups` flag
|
|
2
|
+
# will cause the names of cacheable resolvers to be printed to stdout.
|
|
3
|
+
test_name "C99970: the `--list-cache-groups` command line flag prints available cache groups to stdout" 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
|
+
external_dir = agent.tmpdir('external_dir')
|
|
11
|
+
etc_factsd_dir = get_etc_factsd_dir(agent['platform'])
|
|
12
|
+
filename = "test.yaml"
|
|
13
|
+
etc_factsd_path = "#{etc_factsd_dir}/#{filename}"
|
|
14
|
+
|
|
15
|
+
teardown do
|
|
16
|
+
on(agent, "rm -rf '#{external_dir}' '#{etc_factsd_path}'")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
step "the various cache groups should be listed" do
|
|
20
|
+
on(agent, facter("--list-cache-groups")) do |facter_output|
|
|
21
|
+
assert_match(/EC2/, facter_output.stdout, "EC2 group should be listed as cacheable")
|
|
22
|
+
assert_match(/ec2_metadata/, facter_output.stdout, "EC2 group's facts should be listed")
|
|
23
|
+
assert_match(/kernel/, facter_output.stdout, "kernel group should be listed as cacheable")
|
|
24
|
+
assert_match(/kernelversion/, facter_output.stdout, "kernel group's facts should be listed as cacheable")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
step "the various external facts file should be visible as caching groups" do
|
|
29
|
+
external_filename = "external_facts_filename"
|
|
30
|
+
ext = get_external_fact_script_extension(agent['platform'])
|
|
31
|
+
external_fact_script = File.join(external_dir, "#{external_filename}#{ext}")
|
|
32
|
+
create_remote_file(agent, external_fact_script, external_fact_content(agent['platform'], "a", "b"))
|
|
33
|
+
on(agent, "chmod +x '#{external_fact_script}'")
|
|
34
|
+
|
|
35
|
+
external_fact_script_txt = File.join(external_dir, "#{external_filename}.txt")
|
|
36
|
+
create_remote_file(agent, external_fact_script_txt, '')
|
|
37
|
+
|
|
38
|
+
external_fact_script_json = File.join(external_dir, "#{external_filename}.json")
|
|
39
|
+
create_remote_file(agent, external_fact_script_json, '')
|
|
40
|
+
|
|
41
|
+
external_fact_script_yaml = File.join(external_dir, "#{external_filename}.yaml")
|
|
42
|
+
create_remote_file(agent, external_fact_script_yaml, '')
|
|
43
|
+
|
|
44
|
+
on(agent, facter("--external-dir #{external_dir} --list-cache-groups")) do |facter_output|
|
|
45
|
+
assert_match(/#{external_filename}#{ext}/, facter_output.stdout, "external facts script files should be listed as cacheable")
|
|
46
|
+
assert_match(/#{external_filename}.txt/, facter_output.stdout, "external facts txt files should be listed as cacheable")
|
|
47
|
+
assert_match(/#{external_filename}.json/, facter_output.stdout, "external facts json files should be listed as cacheable")
|
|
48
|
+
assert_match(/#{external_filename}.yaml/, facter_output.stdout, "external facts yaml files should be listed as cacheable")
|
|
49
|
+
end
|
|
50
|
+
on(agent, "rm -rf '#{external_dir}'")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
step "external facts groups should be listed only without --no-external-facts" do
|
|
54
|
+
on(agent, "mkdir -p '#{etc_factsd_dir}'")
|
|
55
|
+
create_remote_file(agent, etc_factsd_path, 'test_fact: test_value')
|
|
56
|
+
on(agent, facter("--list-cache-groups")) do |facter_output|
|
|
57
|
+
assert_match(/#{filename}/, facter_output.stdout, "external facts script files should be listed as cacheable")
|
|
58
|
+
end
|
|
59
|
+
on(agent, facter("--list-cache-groups --no-external-facts")) do |facter_output|
|
|
60
|
+
assert_no_match(/#{filename}/, facter_output.stdout, "external facts script files should now be listed as cacheable when --no-external-facts is used")
|
|
61
|
+
end
|
|
62
|
+
on(agent, "rm -f '#{etc_factsd_path}'")
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# This test is intended to ensure that the --log-level command-line option works
|
|
2
|
+
# properly. This option can be used with an argument to specify the level of logging
|
|
3
|
+
# which will present in Facter's output.
|
|
4
|
+
test_name "C99985: --log-level command-line option can be used to specify logging level" do
|
|
5
|
+
|
|
6
|
+
agents.each do |agent|
|
|
7
|
+
step "Agent #{agent}: retrieve debug info from stderr using `--log-level debug` option" do
|
|
8
|
+
on(agent, facter('--log-level debug')) do
|
|
9
|
+
assert_match(/DEBUG/, stderr, "Expected DEBUG information in stderr")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# This tests is intended to verify that passing the `--no-block` command to facter will prevent
|
|
2
|
+
# fact blocking, despite a blocklist being specified in the config file.
|
|
3
|
+
test_name "C99971: the `--no-block` command line flag prevents facts from being blocked" 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
|
+
# default facter.conf
|
|
11
|
+
facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
|
|
12
|
+
facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf")
|
|
13
|
+
|
|
14
|
+
teardown do
|
|
15
|
+
on(agent, "rm -rf '#{facter_conf_default_dir}'", :acceptable_exit_codes => [0, 1])
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# create the directories
|
|
19
|
+
on(agent, "mkdir -p '#{facter_conf_default_dir}'")
|
|
20
|
+
|
|
21
|
+
step "Agent #{agent}: create config file" do
|
|
22
|
+
create_remote_file(agent, facter_conf_default_path, <<-FILE)
|
|
23
|
+
cli : { debug : true }
|
|
24
|
+
facts : { blocklist : [ "EC2" ] }
|
|
25
|
+
FILE
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
step "no facts should be blocked when `--no-block` is specified" do
|
|
29
|
+
on(agent, facter("--no-block")) do |facter_output|
|
|
30
|
+
assert_no_match(/blocking collection of .+ facts/, facter_output.stderr, "Expected no facts to be blocked")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# This test is intended to verify that the `--no-cache` command line flag will
|
|
2
|
+
# cause facter to not do any caching of facts
|
|
3
|
+
test_name "C99968: --no-cache command-line option causes facter to not cache facts" do
|
|
4
|
+
tag 'risk:high'
|
|
5
|
+
|
|
6
|
+
require 'facter/acceptance/user_fact_utils'
|
|
7
|
+
extend Facter::Acceptance::UserFactUtils
|
|
8
|
+
|
|
9
|
+
# the uptime fact should be resolvable on ALL systems
|
|
10
|
+
# Note: do NOT use the kernel fact, as it is used to configure the tests
|
|
11
|
+
cached_fact_name = "uptime"
|
|
12
|
+
config = <<-FILE
|
|
13
|
+
cli : { debug : true }
|
|
14
|
+
facts : { ttls : [ { "#{cached_fact_name}" : 30 minutes } ] }
|
|
15
|
+
FILE
|
|
16
|
+
|
|
17
|
+
agents.each do |agent|
|
|
18
|
+
kernel_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f
|
|
19
|
+
config_dir = get_default_fact_dir(agent['platform'], kernel_version)
|
|
20
|
+
config_file = File.join(config_dir, "facter.conf")
|
|
21
|
+
|
|
22
|
+
cached_facts_dir = get_cached_facts_dir(agent['platform'], kernel_version)
|
|
23
|
+
cached_fact_file = File.join(cached_facts_dir, cached_fact_name)
|
|
24
|
+
|
|
25
|
+
on(agent, "rm -f '#{cached_fact_file}'", :acceptable_exit_codes => [0, 1])
|
|
26
|
+
|
|
27
|
+
teardown do
|
|
28
|
+
on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
|
|
29
|
+
on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
step "Agent #{agent}: create config file in default location" do
|
|
33
|
+
on(agent, "mkdir -p '#{config_dir}'")
|
|
34
|
+
create_remote_file(agent, config_file, config)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
step "facter should not cache facts when --no-cache is specified" do
|
|
38
|
+
on(agent, facter("--no-cache")) do |facter_output|
|
|
39
|
+
assert_no_match(/caching/, facter_output.stderr, "facter should not have tried to cache any facts")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|