cfacter 3.11.0.rc.20180314
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 +7 -0
- data/ext/facter/Makefile.erb +31 -0
- data/ext/facter/cpp-hocon/CMakeLists.txt +67 -0
- data/ext/facter/cpp-hocon/CONTRIBUTING.md +9 -0
- data/ext/facter/cpp-hocon/LICENSE +17 -0
- data/ext/facter/cpp-hocon/MAINTAINERS +33 -0
- data/ext/facter/cpp-hocon/README.md +74 -0
- data/ext/facter/cpp-hocon/acceptance/Gemfile +18 -0
- data/ext/facter/cpp-hocon/acceptance/Rakefile +7 -0
- data/ext/facter/cpp-hocon/acceptance/tests/fake.rb +0 -0
- data/ext/facter/cpp-hocon/appveyor.yml +41 -0
- data/ext/facter/cpp-hocon/lib/CMakeLists.txt +94 -0
- data/ext/facter/cpp-hocon/lib/Doxyfile.in +2312 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config.hpp +734 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_exception.hpp +184 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_include_context.hpp +51 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_includer.hpp +53 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_includer_file.hpp +30 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_list.hpp +51 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_mergeable.hpp +72 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_object.hpp +81 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_origin.hpp +98 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_parse_options.hpp +139 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_parseable.hpp +47 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_render_options.hpp +128 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_resolve_options.hpp +83 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_syntax.hpp +24 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_value.hpp +267 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/config_value_factory.hpp +48 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/functional_list.hpp +318 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_document.hpp +95 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_document_factory.hpp +39 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_node.hpp +32 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/path.hpp +60 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/program_options.hpp +84 -0
- data/ext/facter/cpp-hocon/lib/inc/hocon/types.hpp +57 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/config_document_parser.hpp +83 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/config_parser.hpp +55 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/config_util.hpp +17 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/container.hpp +28 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/default_transformer.hpp +12 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/full_includer.hpp +13 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/abstract_config_node.hpp +16 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/abstract_config_node_value.hpp +12 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_array.hpp +17 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_comment.hpp +14 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_complex_value.hpp +25 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_concatenation.hpp +16 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_field.hpp +29 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_include.hpp +26 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_object.hpp +45 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_path.hpp +25 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_root.hpp +24 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_simple_value.hpp +21 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_single_token.hpp +20 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/parseable.hpp +128 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/path_builder.hpp +20 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/path_parser.hpp +55 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/replaceable_merge_stack.hpp +14 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/resolve_context.hpp +53 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/resolve_result.hpp +21 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/resolve_source.hpp +55 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/simple_config_document.hpp +28 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/simple_config_origin.hpp +67 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/simple_include_context.hpp +22 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/simple_includer.hpp +79 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/substitution_expression.hpp +28 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/token.hpp +45 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/tokenizer.hpp +143 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/tokens.hpp +135 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/unmergeable.hpp +20 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_boolean.hpp +26 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_concatenation.hpp +59 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_delayed_merge.hpp +53 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_delayed_merge_object.hpp +57 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_double.hpp +28 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_int.hpp +25 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_long.hpp +28 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_null.hpp +33 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_number.hpp +38 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_reference.hpp +38 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/config_string.hpp +32 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/simple_config_list.hpp +75 -0
- data/ext/facter/cpp-hocon/lib/inc/internal/values/simple_config_object.hpp +107 -0
- data/ext/facter/cpp-hocon/lib/namespaces.dox.in +6 -0
- data/ext/facter/cpp-hocon/lib/src/config.cc +573 -0
- data/ext/facter/cpp-hocon/lib/src/config_document_factory.cc +24 -0
- data/ext/facter/cpp-hocon/lib/src/config_document_parser.cc +620 -0
- data/ext/facter/cpp-hocon/lib/src/config_parse_options.cc +101 -0
- data/ext/facter/cpp-hocon/lib/src/config_parser.cc +399 -0
- data/ext/facter/cpp-hocon/lib/src/config_render_options.cc +44 -0
- data/ext/facter/cpp-hocon/lib/src/config_resolve_options.cc +24 -0
- data/ext/facter/cpp-hocon/lib/src/config_util.cc +95 -0
- data/ext/facter/cpp-hocon/lib/src/config_value_factory.cc +68 -0
- data/ext/facter/cpp-hocon/lib/src/default_transformer.cc +94 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/abstract_config_node.cc +19 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_array.cc +13 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_comment.cc +15 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_complex_value.cc +50 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_concatenation.cc +14 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_field.cc +80 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_include.cc +38 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_object.cc +318 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_path.cc +47 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_root.cc +70 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_simple_value.cc +50 -0
- data/ext/facter/cpp-hocon/lib/src/nodes/config_node_single_token.cc +18 -0
- data/ext/facter/cpp-hocon/lib/src/parseable.cc +325 -0
- data/ext/facter/cpp-hocon/lib/src/path.cc +219 -0
- data/ext/facter/cpp-hocon/lib/src/path_builder.cc +38 -0
- data/ext/facter/cpp-hocon/lib/src/path_parser.cc +253 -0
- data/ext/facter/cpp-hocon/lib/src/resolve_context.cc +139 -0
- data/ext/facter/cpp-hocon/lib/src/resolve_source.cc +216 -0
- data/ext/facter/cpp-hocon/lib/src/simple_config_document.cc +69 -0
- data/ext/facter/cpp-hocon/lib/src/simple_config_origin.cc +246 -0
- data/ext/facter/cpp-hocon/lib/src/simple_include_context.cc +18 -0
- data/ext/facter/cpp-hocon/lib/src/simple_includer.cc +186 -0
- data/ext/facter/cpp-hocon/lib/src/substitution_expression.cc +35 -0
- data/ext/facter/cpp-hocon/lib/src/token.cc +52 -0
- data/ext/facter/cpp-hocon/lib/src/tokenizer.cc +568 -0
- data/ext/facter/cpp-hocon/lib/src/tokens.cc +257 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_boolean.cc +34 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_concatenation.cc +260 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_delayed_merge.cc +223 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_delayed_merge_object.cc +180 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_double.cc +35 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_int.cc +35 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_long.cc +35 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_null.cc +35 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_number.cc +78 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_object.cc +97 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_reference.cc +85 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_string.cc +47 -0
- data/ext/facter/cpp-hocon/lib/src/values/config_value.cc +289 -0
- data/ext/facter/cpp-hocon/lib/src/values/simple_config_list.cc +219 -0
- data/ext/facter/cpp-hocon/lib/src/values/simple_config_object.cc +515 -0
- data/ext/facter/cpp-hocon/lib/tests/CMakeLists.txt +42 -0
- data/ext/facter/cpp-hocon/lib/tests/concatenation_test.cc +401 -0
- data/ext/facter/cpp-hocon/lib/tests/conf_parser_test.cc +715 -0
- data/ext/facter/cpp-hocon/lib/tests/config_document_parser_test.cc +208 -0
- data/ext/facter/cpp-hocon/lib/tests/config_document_tests.cc +110 -0
- data/ext/facter/cpp-hocon/lib/tests/config_node_test.cc +338 -0
- data/ext/facter/cpp-hocon/lib/tests/config_substitution_test.cc +897 -0
- data/ext/facter/cpp-hocon/lib/tests/config_test.cc +151 -0
- data/ext/facter/cpp-hocon/lib/tests/config_value_factory_test.cc +60 -0
- data/ext/facter/cpp-hocon/lib/tests/config_value_test.cc +111 -0
- data/ext/facter/cpp-hocon/lib/tests/fixtures.hpp.in +3 -0
- data/ext/facter/cpp-hocon/lib/tests/fixtures/test01.conf +91 -0
- data/ext/facter/cpp-hocon/lib/tests/fixtures/test01.json +4 -0
- data/ext/facter/cpp-hocon/lib/tests/main.cc +8 -0
- data/ext/facter/cpp-hocon/lib/tests/path_test.cc +129 -0
- data/ext/facter/cpp-hocon/lib/tests/program_options.cc +63 -0
- data/ext/facter/cpp-hocon/lib/tests/test.conf +1 -0
- data/ext/facter/cpp-hocon/lib/tests/test_utils.cc +452 -0
- data/ext/facter/cpp-hocon/lib/tests/test_utils.hpp +139 -0
- data/ext/facter/cpp-hocon/lib/tests/token_test.cc +108 -0
- data/ext/facter/cpp-hocon/lib/tests/tokenizer_test.cc +694 -0
- data/ext/facter/cpp-hocon/lib/version.h.in +28 -0
- data/ext/facter/cpp-hocon/locales/CMakeLists.txt +4 -0
- data/ext/facter/cpp-hocon/locales/cpp-hocon.pot +767 -0
- data/ext/facter/extconf.rb +22 -0
- data/ext/facter/facter/CMakeLists.txt +183 -0
- data/ext/facter/facter/CONTRIBUTING.md +99 -0
- data/ext/facter/facter/Extensibility.md +133 -0
- data/ext/facter/facter/LICENSE +17 -0
- data/ext/facter/facter/MAINTAINERS +28 -0
- data/ext/facter/facter/README.md +295 -0
- data/ext/facter/facter/Rakefile +42 -0
- data/ext/facter/facter/acceptance/Gemfile +21 -0
- data/ext/facter/facter/acceptance/Rakefile +342 -0
- data/ext/facter/facter/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
- data/ext/facter/facter/acceptance/config/aio/options.rb +9 -0
- data/ext/facter/facter/acceptance/config/git/options.rb +7 -0
- data/ext/facter/facter/acceptance/config/nodes/aix-53-power.yaml +7 -0
- data/ext/facter/facter/acceptance/config/nodes/aix-61-power.yaml +7 -0
- data/ext/facter/facter/acceptance/config/nodes/aix-71-power.yaml +7 -0
- data/ext/facter/facter/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
- data/ext/facter/facter/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
- data/ext/facter/facter/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
- data/ext/facter/facter/acceptance/lib/facter/acceptance/base_fact_utils.rb +563 -0
- data/ext/facter/facter/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
- data/ext/facter/facter/acceptance/lib/helper.rb +1 -0
- data/ext/facter/facter/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
- data/ext/facter/facter/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
- data/ext/facter/facter/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
- data/ext/facter/facter/acceptance/setup/aio/pre-suite/010_Install.rb +22 -0
- data/ext/facter/facter/acceptance/setup/aio/pre-suite/021_InstallAristaModule.rb +12 -0
- data/ext/facter/facter/acceptance/setup/aio/pre-suite/022_Remove_LD_PRELOAD.rb +11 -0
- data/ext/facter/facter/acceptance/setup/common/00_EnvSetup.rb +64 -0
- data/ext/facter/facter/acceptance/setup/common/pre-suite/000-delete-puppet-when-none.rb +11 -0
- data/ext/facter/facter/acceptance/setup/git/pre-suite/01_TestSetup.rb +31 -0
- data/ext/facter/facter/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
- data/ext/facter/facter/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
- data/ext/facter/facter/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
- data/ext/facter/facter/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
- data/ext/facter/facter/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
- data/ext/facter/facter/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
- data/ext/facter/facter/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
- data/ext/facter/facter/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
- data/ext/facter/facter/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
- data/ext/facter/facter/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
- data/ext/facter/facter/acceptance/tests/facts/dmi.rb +51 -0
- data/ext/facter/facter/acceptance/tests/facts/facterversion.rb +11 -0
- data/ext/facter/facter/acceptance/tests/facts/identity.rb +52 -0
- data/ext/facter/facter/acceptance/tests/facts/networking_facts.rb +76 -0
- data/ext/facter/facter/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
- data/ext/facter/facter/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
- data/ext/facter/facter/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
- data/ext/facter/facter/acceptance/tests/facts/partitions.rb +37 -0
- data/ext/facter/facter/acceptance/tests/facts/productname.rb +15 -0
- data/ext/facter/facter/acceptance/tests/facts/ruby.rb +59 -0
- data/ext/facter/facter/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
- data/ext/facter/facter/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
- data/ext/facter/facter/acceptance/tests/load_libfacter.rb +66 -0
- data/ext/facter/facter/acceptance/tests/no_errors_on_stderr.rb +10 -0
- data/ext/facter/facter/acceptance/tests/options/color.rb +16 -0
- data/ext/facter/facter/acceptance/tests/options/config.rb +27 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/blocklist.rb +35 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/custom_facts.rb +42 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/debug.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/default_file_location.rb +37 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/external_facts.rb +37 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/log_level.rb +35 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/trace.rb +48 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
- data/ext/facter/facter/acceptance/tests/options/config_file/verbose.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/custom_facts.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
- data/ext/facter/facter/acceptance/tests/options/custom_facts_list.rb +48 -0
- data/ext/facter/facter/acceptance/tests/options/custom_facts_load_path.rb +42 -0
- data/ext/facter/facter/acceptance/tests/options/debug.rb +12 -0
- data/ext/facter/facter/acceptance/tests/options/external_facts.rb +28 -0
- data/ext/facter/facter/acceptance/tests/options/external_facts_list.rb +35 -0
- data/ext/facter/facter/acceptance/tests/options/help.rb +13 -0
- data/ext/facter/facter/acceptance/tests/options/json.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/list_block_groups.rb +16 -0
- data/ext/facter/facter/acceptance/tests/options/list_cache_groups.rb +16 -0
- data/ext/facter/facter/acceptance/tests/options/log_level.rb +13 -0
- data/ext/facter/facter/acceptance/tests/options/no_block.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
- data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
- data/ext/facter/facter/acceptance/tests/options/no_color.rb +16 -0
- data/ext/facter/facter/acceptance/tests/options/no_custom_facts.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
- data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
- data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
- data/ext/facter/facter/acceptance/tests/options/no_external_facts.rb +28 -0
- data/ext/facter/facter/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
- data/ext/facter/facter/acceptance/tests/options/no_ruby.rb +44 -0
- data/ext/facter/facter/acceptance/tests/options/puppet_facts.rb +35 -0
- data/ext/facter/facter/acceptance/tests/options/show_legacy.rb +18 -0
- data/ext/facter/facter/acceptance/tests/options/strict.rb +11 -0
- data/ext/facter/facter/acceptance/tests/options/trace.rb +36 -0
- data/ext/facter/facter/acceptance/tests/options/verbose.rb +12 -0
- data/ext/facter/facter/acceptance/tests/options/version.rb +12 -0
- data/ext/facter/facter/acceptance/tests/options/yaml.rb +43 -0
- data/ext/facter/facter/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +22 -0
- data/ext/facter/facter/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
- data/ext/facter/facter/appveyor.yml +43 -0
- data/ext/facter/facter/cmake/FindBLKID.cmake +6 -0
- data/ext/facter/facter/cmake/FindCPPHOCON.cmake +6 -0
- data/ext/facter/facter/cmake/FindDependency.cmake +54 -0
- data/ext/facter/facter/cmake/FindOPENSSL.cmake +10 -0
- data/ext/facter/facter/cmake/FindRuby.cmake +286 -0
- data/ext/facter/facter/cmake/FindWHEREAMI.cmake +6 -0
- data/ext/facter/facter/cmake/FindYAMLCPP.cmake +17 -0
- data/ext/facter/facter/contrib/dockerfiles/travis-cpp-builder/Dockerfile +56 -0
- data/ext/facter/facter/contrib/dockerfiles/travis-facter-builder/Dockerfile +23 -0
- data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/Dockerfile +40 -0
- data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/_coverity-submit.erb +12 -0
- data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/fix_curl_command.patch +32 -0
- data/ext/facter/facter/exe/CMakeLists.txt +39 -0
- data/ext/facter/facter/exe/facter.cc +377 -0
- data/ext/facter/facter/ext/build_defaults.yaml +16 -0
- data/ext/facter/facter/ext/debian/changelog.erb +11 -0
- data/ext/facter/facter/ext/debian/compat +1 -0
- data/ext/facter/facter/ext/debian/control +14 -0
- data/ext/facter/facter/ext/debian/copyright +19 -0
- data/ext/facter/facter/ext/debian/docs +2 -0
- data/ext/facter/facter/ext/debian/facter.install +4 -0
- data/ext/facter/facter/ext/debian/lintian-overrides +0 -0
- data/ext/facter/facter/ext/debian/rules +39 -0
- data/ext/facter/facter/ext/debian/source/format +1 -0
- data/ext/facter/facter/ext/project_data.yaml +30 -0
- data/ext/facter/facter/ext/redhat/facter.spec.erb +113 -0
- data/ext/facter/facter/ext/windows/facter.bat +8 -0
- data/ext/facter/facter/ext/windows/facter_interactive.bat +6 -0
- data/ext/facter/facter/ext/windows/run_facter_interactive.bat +9 -0
- data/ext/facter/facter/factergo/example/main.go +17 -0
- data/ext/facter/facter/factergo/facter.go +42 -0
- data/ext/facter/facter/factergo/facter_test.go +25 -0
- data/ext/facter/facter/lib/CMakeLists.txt +409 -0
- data/ext/facter/facter/lib/Doxyfile +2313 -0
- data/ext/facter/facter/lib/Facter.java.in +110 -0
- data/ext/facter/facter/lib/Gemfile +11 -0
- data/ext/facter/facter/lib/Rakefile +8 -0
- data/ext/facter/facter/lib/docs/generate.rb +25 -0
- data/ext/facter/facter/lib/docs/namespaces.dox +129 -0
- data/ext/facter/facter/lib/docs/template.erb +43 -0
- data/ext/facter/facter/lib/facter.rb.in +45 -0
- data/ext/facter/facter/lib/gemspec.in +21 -0
- data/ext/facter/facter/lib/inc/facter/cwrapper.hpp +18 -0
- data/ext/facter/facter/lib/inc/facter/facts/array_value.hpp +125 -0
- data/ext/facter/facter/lib/inc/facter/facts/collection.hpp +339 -0
- data/ext/facter/facter/lib/inc/facter/facts/external/resolver.hpp +49 -0
- data/ext/facter/facter/lib/inc/facter/facts/fact.hpp +669 -0
- data/ext/facter/facter/lib/inc/facter/facts/map_value.hpp +127 -0
- data/ext/facter/facter/lib/inc/facter/facts/os.hpp +202 -0
- data/ext/facter/facter/lib/inc/facter/facts/os_family.hpp +58 -0
- data/ext/facter/facter/lib/inc/facter/facts/resolver.hpp +126 -0
- data/ext/facter/facter/lib/inc/facter/facts/scalar_value.hpp +152 -0
- data/ext/facter/facter/lib/inc/facter/facts/value.hpp +164 -0
- data/ext/facter/facter/lib/inc/facter/facts/vm.hpp +157 -0
- data/ext/facter/facter/lib/inc/facter/logging/logging.hpp +192 -0
- data/ext/facter/facter/lib/inc/facter/ruby/ruby.hpp +62 -0
- data/ext/facter/facter/lib/inc/facter/util/config.hpp +84 -0
- data/ext/facter/facter/lib/inc/facter/util/string.hpp +72 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/disk_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/filesystem_resolver.hpp +41 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/kernel_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/networking_resolver.hpp +49 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/operating_system_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/aix/serial_number_resolver.hpp +27 -0
- data/ext/facter/facter/lib/inc/internal/facts/bsd/filesystem_resolver.hpp +30 -0
- data/ext/facter/facter/lib/inc/internal/facts/bsd/networking_resolver.hpp +59 -0
- data/ext/facter/facter/lib/inc/internal/facts/bsd/uptime_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/cache.hpp +71 -0
- data/ext/facter/facter/lib/inc/internal/facts/external/execution_resolver.hpp +31 -0
- data/ext/facter/facter/lib/inc/internal/facts/external/json_resolver.hpp +31 -0
- data/ext/facter/facter/lib/inc/internal/facts/external/text_resolver.hpp +31 -0
- data/ext/facter/facter/lib/inc/internal/facts/external/windows/powershell_resolver.hpp +34 -0
- data/ext/facter/facter/lib/inc/internal/facts/external/yaml_resolver.hpp +31 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/dmi_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/networking_resolver.hpp +42 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/operating_system_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/virtualization_resolver.hpp +27 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/zfs_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/freebsd/zpool_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/glib/load_average_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/disk_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/dmi_resolver.hpp +37 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/filesystem_resolver.hpp +40 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/fips_resolver.hpp +31 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/kernel_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/networking_resolver.hpp +78 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/operating_system_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/os_cisco.hpp +114 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/os_coreos.hpp +56 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/os_cumulus.hpp +56 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/os_linux.hpp +72 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/processor_resolver.hpp +60 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/release_file.hpp +124 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/uptime_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/linux/virtualization_resolver.hpp +50 -0
- data/ext/facter/facter/lib/inc/internal/facts/openbsd/dmi_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/openbsd/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/openbsd/networking_resolver.hpp +42 -0
- data/ext/facter/facter/lib/inc/internal/facts/openbsd/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/openbsd/virtualization_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/dmi_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/networking_resolver.hpp +60 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/operating_system_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/system_profiler_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/osx/virtualization_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/identity_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/kernel_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/networking_resolver.hpp +48 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/operating_system_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/ssh_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/timezone_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/uptime_resolver.hpp +32 -0
- data/ext/facter/facter/lib/inc/internal/facts/posix/xen_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/augeas_resolver.hpp +35 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/disk_resolver.hpp +81 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/dmi_resolver.hpp +115 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/ec2_resolver.hpp +30 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/filesystem_resolver.hpp +166 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/fips_resolver.hpp +46 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/gce_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/hypervisors_resolver.hpp +69 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/identity_resolver.hpp +73 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/kernel_resolver.hpp +66 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/ldom_resolver.hpp +64 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/load_average_resolver.hpp +37 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/memory_resolver.hpp +99 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/networking_resolver.hpp +155 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/operating_system_resolver.hpp +235 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/path_resolver.hpp +28 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/processor_resolver.hpp +80 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/ruby_resolver.hpp +56 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/ssh_resolver.hpp +105 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/system_profiler_resolver.hpp +127 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/timezone_resolver.hpp +36 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/uptime_resolver.hpp +36 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/virtualization_resolver.hpp +95 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/xen_resolver.hpp +55 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/zfs_resolver.hpp +59 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/zone_resolver.hpp +95 -0
- data/ext/facter/facter/lib/inc/internal/facts/resolvers/zpool_resolver.hpp +63 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/disk_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/dmi_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/filesystem_resolver.hpp +29 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/kernel_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/ldom_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/networking_resolver.hpp +48 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/operating_system_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/processor_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/virtualization_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/zfs_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/zone_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/solaris/zpool_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/dmi_resolver.hpp +38 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/identity_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/kernel_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/memory_resolver.hpp +25 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/networking_resolver.hpp +74 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/operating_system_resolver.hpp +36 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/processor_resolver.hpp +36 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/timezone_resolver.hpp +24 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/uptime_resolver.hpp +32 -0
- data/ext/facter/facter/lib/inc/internal/facts/windows/virtualization_resolver.hpp +37 -0
- data/ext/facter/facter/lib/inc/internal/ruby/aggregate_resolution.hpp +77 -0
- data/ext/facter/facter/lib/inc/internal/ruby/chunk.hpp +83 -0
- data/ext/facter/facter/lib/inc/internal/ruby/confine.hpp +60 -0
- data/ext/facter/facter/lib/inc/internal/ruby/fact.hpp +108 -0
- data/ext/facter/facter/lib/inc/internal/ruby/module.hpp +165 -0
- data/ext/facter/facter/lib/inc/internal/ruby/resolution.hpp +126 -0
- data/ext/facter/facter/lib/inc/internal/ruby/ruby_value.hpp +119 -0
- data/ext/facter/facter/lib/inc/internal/ruby/simple_resolution.hpp +56 -0
- data/ext/facter/facter/lib/inc/internal/util/agent.hpp +29 -0
- data/ext/facter/facter/lib/inc/internal/util/aix/odm.hpp +373 -0
- data/ext/facter/facter/lib/inc/internal/util/aix/vmount.hpp +139 -0
- data/ext/facter/facter/lib/inc/internal/util/bsd/scoped_ifaddrs.hpp +33 -0
- data/ext/facter/facter/lib/inc/internal/util/posix/scoped_addrinfo.hpp +45 -0
- data/ext/facter/facter/lib/inc/internal/util/posix/scoped_bio.hpp +34 -0
- data/ext/facter/facter/lib/inc/internal/util/posix/scoped_descriptor.hpp +27 -0
- data/ext/facter/facter/lib/inc/internal/util/scoped_file.hpp +36 -0
- data/ext/facter/facter/lib/inc/internal/util/solaris/k_stat.hpp +176 -0
- data/ext/facter/facter/lib/inc/internal/util/solaris/scoped_kstat.hpp +45 -0
- data/ext/facter/facter/lib/inc/internal/util/versions.hpp +34 -0
- data/ext/facter/facter/lib/inc/internal/util/windows/wsa.hpp +92 -0
- data/ext/facter/facter/lib/inc/internal/util/yaml.hpp +25 -0
- data/ext/facter/facter/lib/schema/core_facts.pot +2017 -0
- data/ext/facter/facter/lib/schema/facter.yaml +1947 -0
- data/ext/facter/facter/lib/schema/translation_tooling.rb +67 -0
- data/ext/facter/facter/lib/spec/unit/facter_spec.rb +136 -0
- data/ext/facter/facter/lib/spec_helper.rb.in +27 -0
- data/ext/facter/facter/lib/src/cwrapper.cc +45 -0
- data/ext/facter/facter/lib/src/facts/aix/collection.cc +32 -0
- data/ext/facter/facter/lib/src/facts/aix/disk_resolver.cc +66 -0
- data/ext/facter/facter/lib/src/facts/aix/filesystem_resolver.cc +132 -0
- data/ext/facter/facter/lib/src/facts/aix/kernel_resolver.cc +27 -0
- data/ext/facter/facter/lib/src/facts/aix/memory_resolver.cc +48 -0
- data/ext/facter/facter/lib/src/facts/aix/networking_resolver.cc +245 -0
- data/ext/facter/facter/lib/src/facts/aix/operating_system_resolver.cc +61 -0
- data/ext/facter/facter/lib/src/facts/aix/processor_resolver.cc +106 -0
- data/ext/facter/facter/lib/src/facts/aix/serial_number_resolver.cc +43 -0
- data/ext/facter/facter/lib/src/facts/array_value.cc +111 -0
- data/ext/facter/facter/lib/src/facts/bsd/collection.cc +27 -0
- data/ext/facter/facter/lib/src/facts/bsd/filesystem_resolver.cc +92 -0
- data/ext/facter/facter/lib/src/facts/bsd/networking_resolver.cc +175 -0
- data/ext/facter/facter/lib/src/facts/bsd/uptime_resolver.cc +23 -0
- data/ext/facter/facter/lib/src/facts/cache.cc +117 -0
- data/ext/facter/facter/lib/src/facts/collection.cc +661 -0
- data/ext/facter/facter/lib/src/facts/external/execution_resolver.cc +89 -0
- data/ext/facter/facter/lib/src/facts/external/json_resolver.cc +219 -0
- data/ext/facter/facter/lib/src/facts/external/resolver.cc +12 -0
- data/ext/facter/facter/lib/src/facts/external/text_resolver.cc +45 -0
- data/ext/facter/facter/lib/src/facts/external/windows/powershell_resolver.cc +117 -0
- data/ext/facter/facter/lib/src/facts/external/yaml_resolver.cc +45 -0
- data/ext/facter/facter/lib/src/facts/freebsd/collection.cc +41 -0
- data/ext/facter/facter/lib/src/facts/freebsd/dmi_resolver.cc +43 -0
- data/ext/facter/facter/lib/src/facts/freebsd/memory_resolver.cc +76 -0
- data/ext/facter/facter/lib/src/facts/freebsd/networking_resolver.cc +55 -0
- data/ext/facter/facter/lib/src/facts/freebsd/operating_system_resolver.cc +17 -0
- data/ext/facter/facter/lib/src/facts/freebsd/processor_resolver.cc +63 -0
- data/ext/facter/facter/lib/src/facts/freebsd/virtualization_resolver.cc +41 -0
- data/ext/facter/facter/lib/src/facts/freebsd/zfs_resolver.cc +12 -0
- data/ext/facter/facter/lib/src/facts/freebsd/zpool_resolver.cc +12 -0
- data/ext/facter/facter/lib/src/facts/glib/load_average_resolver.cc +22 -0
- data/ext/facter/facter/lib/src/facts/linux/collection.cc +44 -0
- data/ext/facter/facter/lib/src/facts/linux/disk_resolver.cc +80 -0
- data/ext/facter/facter/lib/src/facts/linux/dmi_resolver.cc +208 -0
- data/ext/facter/facter/lib/src/facts/linux/filesystem_resolver.cc +282 -0
- data/ext/facter/facter/lib/src/facts/linux/fips_resolver.cc +31 -0
- data/ext/facter/facter/lib/src/facts/linux/kernel_resolver.cc +20 -0
- data/ext/facter/facter/lib/src/facts/linux/memory_resolver.cc +50 -0
- data/ext/facter/facter/lib/src/facts/linux/networking_resolver.cc +275 -0
- data/ext/facter/facter/lib/src/facts/linux/operating_system_resolver.cc +175 -0
- data/ext/facter/facter/lib/src/facts/linux/os_linux.cc +393 -0
- data/ext/facter/facter/lib/src/facts/linux/processor_resolver.cc +200 -0
- data/ext/facter/facter/lib/src/facts/linux/uptime_resolver.cc +15 -0
- data/ext/facter/facter/lib/src/facts/linux/virtualization_resolver.cc +282 -0
- data/ext/facter/facter/lib/src/facts/map_value.cc +119 -0
- data/ext/facter/facter/lib/src/facts/openbsd/collection.cc +37 -0
- data/ext/facter/facter/lib/src/facts/openbsd/dmi_resolver.cc +47 -0
- data/ext/facter/facter/lib/src/facts/openbsd/memory_resolver.cc +76 -0
- data/ext/facter/facter/lib/src/facts/openbsd/networking_resolver.cc +55 -0
- data/ext/facter/facter/lib/src/facts/openbsd/processor_resolver.cc +59 -0
- data/ext/facter/facter/lib/src/facts/openbsd/virtualization_resolver.cc +20 -0
- data/ext/facter/facter/lib/src/facts/osx/collection.cc +39 -0
- data/ext/facter/facter/lib/src/facts/osx/dmi_resolver.cc +32 -0
- data/ext/facter/facter/lib/src/facts/osx/memory_resolver.cc +60 -0
- data/ext/facter/facter/lib/src/facts/osx/networking_resolver.cc +71 -0
- data/ext/facter/facter/lib/src/facts/osx/operating_system_resolver.cc +49 -0
- data/ext/facter/facter/lib/src/facts/osx/processor_resolver.cc +55 -0
- data/ext/facter/facter/lib/src/facts/osx/system_profiler_resolver.cc +66 -0
- data/ext/facter/facter/lib/src/facts/osx/virtualization_resolver.cc +46 -0
- data/ext/facter/facter/lib/src/facts/posix/cache.cc +9 -0
- data/ext/facter/facter/lib/src/facts/posix/collection.cc +48 -0
- data/ext/facter/facter/lib/src/facts/posix/identity_resolver.cc +79 -0
- data/ext/facter/facter/lib/src/facts/posix/kernel_resolver.cc +25 -0
- data/ext/facter/facter/lib/src/facts/posix/networking_resolver.cc +136 -0
- data/ext/facter/facter/lib/src/facts/posix/operatingsystem_resolver.cc +29 -0
- data/ext/facter/facter/lib/src/facts/posix/processor_resolver.cc +22 -0
- data/ext/facter/facter/lib/src/facts/posix/ssh_resolver.cc +116 -0
- data/ext/facter/facter/lib/src/facts/posix/timezone_resolver.cc +26 -0
- data/ext/facter/facter/lib/src/facts/posix/uptime_resolver.cc +53 -0
- data/ext/facter/facter/lib/src/facts/posix/xen_resolver.cc +43 -0
- data/ext/facter/facter/lib/src/facts/resolver.cc +105 -0
- data/ext/facter/facter/lib/src/facts/resolvers/augeas_resolver.cc +56 -0
- data/ext/facter/facter/lib/src/facts/resolvers/disk_resolver.cc +69 -0
- data/ext/facter/facter/lib/src/facts/resolvers/dmi_resolver.cc +160 -0
- data/ext/facter/facter/lib/src/facts/resolvers/ec2_resolver.cc +174 -0
- data/ext/facter/facter/lib/src/facts/resolvers/filesystem_resolver.cc +118 -0
- data/ext/facter/facter/lib/src/facts/resolvers/fips_resolver.cc +23 -0
- data/ext/facter/facter/lib/src/facts/resolvers/gce_resolver.cc +276 -0
- data/ext/facter/facter/lib/src/facts/resolvers/hypervisors_resolver.cc +76 -0
- data/ext/facter/facter/lib/src/facts/resolvers/identity_resolver.cc +50 -0
- data/ext/facter/facter/lib/src/facts/resolvers/kernel_resolver.cc +62 -0
- data/ext/facter/facter/lib/src/facts/resolvers/ldom_resolver.cc +60 -0
- data/ext/facter/facter/lib/src/facts/resolvers/load_average_resolver.cc +36 -0
- data/ext/facter/facter/lib/src/facts/resolvers/memory_resolver.cc +88 -0
- data/ext/facter/facter/lib/src/facts/resolvers/networking_resolver.cc +280 -0
- data/ext/facter/facter/lib/src/facts/resolvers/operating_system_resolver.cc +276 -0
- data/ext/facter/facter/lib/src/facts/resolvers/path_resolver.cc +25 -0
- data/ext/facter/facter/lib/src/facts/resolvers/processor_resolver.cc +70 -0
- data/ext/facter/facter/lib/src/facts/resolvers/ruby_resolver.cc +109 -0
- data/ext/facter/facter/lib/src/facts/resolvers/ssh_resolver.cc +77 -0
- data/ext/facter/facter/lib/src/facts/resolvers/system_profiler_resolver.cc +137 -0
- data/ext/facter/facter/lib/src/facts/resolvers/timezone_resolver.cc +27 -0
- data/ext/facter/facter/lib/src/facts/resolvers/uptime_resolver.cc +63 -0
- data/ext/facter/facter/lib/src/facts/resolvers/virtualization_resolver.cc +119 -0
- data/ext/facter/facter/lib/src/facts/resolvers/xen_resolver.cc +80 -0
- data/ext/facter/facter/lib/src/facts/resolvers/zfs_resolver.cc +63 -0
- data/ext/facter/facter/lib/src/facts/resolvers/zone_resolver.cc +91 -0
- data/ext/facter/facter/lib/src/facts/resolvers/zpool_resolver.cc +93 -0
- data/ext/facter/facter/lib/src/facts/scalar_value.cc +73 -0
- data/ext/facter/facter/lib/src/facts/solaris/collection.cc +51 -0
- data/ext/facter/facter/lib/src/facts/solaris/disk_resolver.cc +35 -0
- data/ext/facter/facter/lib/src/facts/solaris/dmi_resolver.cc +86 -0
- data/ext/facter/facter/lib/src/facts/solaris/filesystem_resolver.cc +92 -0
- data/ext/facter/facter/lib/src/facts/solaris/kernel_resolver.cc +24 -0
- data/ext/facter/facter/lib/src/facts/solaris/ldom_resolver.cc +87 -0
- data/ext/facter/facter/lib/src/facts/solaris/memory_resolver.cc +91 -0
- data/ext/facter/facter/lib/src/facts/solaris/networking_resolver.cc +183 -0
- data/ext/facter/facter/lib/src/facts/solaris/operating_system_resolver.cc +83 -0
- data/ext/facter/facter/lib/src/facts/solaris/processor_resolver.cc +105 -0
- data/ext/facter/facter/lib/src/facts/solaris/virtualization_resolver.cc +38 -0
- data/ext/facter/facter/lib/src/facts/solaris/zfs_resolver.cc +12 -0
- data/ext/facter/facter/lib/src/facts/solaris/zone_resolver.cc +33 -0
- data/ext/facter/facter/lib/src/facts/solaris/zpool_resolver.cc +12 -0
- data/ext/facter/facter/lib/src/facts/windows/cache.cc +11 -0
- data/ext/facter/facter/lib/src/facts/windows/collection.cc +91 -0
- data/ext/facter/facter/lib/src/facts/windows/dmi_resolver.cc +38 -0
- data/ext/facter/facter/lib/src/facts/windows/identity_resolver.cc +46 -0
- data/ext/facter/facter/lib/src/facts/windows/kernel_resolver.cc +78 -0
- data/ext/facter/facter/lib/src/facts/windows/memory_resolver.cc +25 -0
- data/ext/facter/facter/lib/src/facts/windows/networking_resolver.cc +227 -0
- data/ext/facter/facter/lib/src/facts/windows/operating_system_resolver.cc +125 -0
- data/ext/facter/facter/lib/src/facts/windows/processor_resolver.cc +99 -0
- data/ext/facter/facter/lib/src/facts/windows/timezone_resolver.cc +28 -0
- data/ext/facter/facter/lib/src/facts/windows/uptime_resolver.cc +26 -0
- data/ext/facter/facter/lib/src/facts/windows/virtualization_resolver.cc +63 -0
- data/ext/facter/facter/lib/src/java/facter.cc +185 -0
- data/ext/facter/facter/lib/src/logging/logging.cc +151 -0
- data/ext/facter/facter/lib/src/ruby/aggregate_resolution.cc +249 -0
- data/ext/facter/facter/lib/src/ruby/chunk.cc +136 -0
- data/ext/facter/facter/lib/src/ruby/confine.cc +84 -0
- data/ext/facter/facter/lib/src/ruby/fact.cc +382 -0
- data/ext/facter/facter/lib/src/ruby/module.cc +1130 -0
- data/ext/facter/facter/lib/src/ruby/resolution.cc +230 -0
- data/ext/facter/facter/lib/src/ruby/ruby.cc +150 -0
- data/ext/facter/facter/lib/src/ruby/ruby_value.cc +288 -0
- data/ext/facter/facter/lib/src/ruby/simple_resolution.cc +156 -0
- data/ext/facter/facter/lib/src/util/bsd/scoped_ifaddrs.cc +29 -0
- data/ext/facter/facter/lib/src/util/config/config.cc +83 -0
- data/ext/facter/facter/lib/src/util/config/posix/config.cc +12 -0
- data/ext/facter/facter/lib/src/util/config/windows/config.cc +14 -0
- data/ext/facter/facter/lib/src/util/posix/scoped_addrinfo.cc +41 -0
- data/ext/facter/facter/lib/src/util/posix/scoped_bio.cc +29 -0
- data/ext/facter/facter/lib/src/util/posix/scoped_descriptor.cc +20 -0
- data/ext/facter/facter/lib/src/util/scoped_file.cc +26 -0
- data/ext/facter/facter/lib/src/util/solaris/k_stat.cc +165 -0
- data/ext/facter/facter/lib/src/util/solaris/scoped_kstat.cc +31 -0
- data/ext/facter/facter/lib/src/util/string.cc +170 -0
- data/ext/facter/facter/lib/src/util/windows/wsa.cc +69 -0
- data/ext/facter/facter/lib/src/util/yaml.cc +72 -0
- data/ext/facter/facter/lib/tasks/spec.rake +26 -0
- data/ext/facter/facter/lib/tests/CMakeLists.txt +172 -0
- data/ext/facter/facter/lib/tests/collection_fixture.cc +15 -0
- data/ext/facter/facter/lib/tests/collection_fixture.hpp +19 -0
- data/ext/facter/facter/lib/tests/cwrapper.cc +22 -0
- data/ext/facter/facter/lib/tests/facts/array_value.cc +140 -0
- data/ext/facter/facter/lib/tests/facts/boolean_value.cc +67 -0
- data/ext/facter/facter/lib/tests/facts/cache.cc +100 -0
- data/ext/facter/facter/lib/tests/facts/collection.cc +576 -0
- data/ext/facter/facter/lib/tests/facts/double_value.cc +40 -0
- data/ext/facter/facter/lib/tests/facts/external/json_resolver.cc +62 -0
- data/ext/facter/facter/lib/tests/facts/external/posix/execution_resolver.cc +69 -0
- data/ext/facter/facter/lib/tests/facts/external/text_resolver.cc +46 -0
- data/ext/facter/facter/lib/tests/facts/external/windows/execution_resolver.cc +69 -0
- data/ext/facter/facter/lib/tests/facts/external/windows/powershell_resolver.cc +122 -0
- data/ext/facter/facter/lib/tests/facts/external/yaml_resolver.cc +70 -0
- data/ext/facter/facter/lib/tests/facts/integer_value.cc +69 -0
- data/ext/facter/facter/lib/tests/facts/linux/dmi_resolver.cc +116 -0
- data/ext/facter/facter/lib/tests/facts/linux/filesystem_resolver.cc +13 -0
- data/ext/facter/facter/lib/tests/facts/linux/processor_fixture.cc +259 -0
- data/ext/facter/facter/lib/tests/facts/linux/processor_fixture.hpp +77 -0
- data/ext/facter/facter/lib/tests/facts/linux/processor_resolver.cc +312 -0
- data/ext/facter/facter/lib/tests/facts/linux/virtualization_resolver.cc +48 -0
- data/ext/facter/facter/lib/tests/facts/map_value.cc +116 -0
- data/ext/facter/facter/lib/tests/facts/posix/collection.cc +39 -0
- data/ext/facter/facter/lib/tests/facts/posix/uptime_resolver.cc +52 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/augeas_resolver.cc +58 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/disk_resolver.cc +114 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/dmi_resolver.cc +152 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/filesystem_resolver.cc +206 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/identity_resolver.cc +83 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/kernel_resolver.cc +61 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/ldom_resolver.cc +86 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/memory_resolver.cc +135 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/networking_resolver.cc +507 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/operating_system_resolver.cc +247 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/processor_resolver.cc +157 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/ruby_resolver.cc +74 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/ssh_resolver.cc +103 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/system_profiler_resolver.cc +135 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/timezone_resolver.cc +49 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/uptime_resolver.cc +151 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/virtualization_resolver.cc +175 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/xen_resolver.cc +100 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/zfs_resolver.cc +65 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/zone_resolver.cc +122 -0
- data/ext/facter/facter/lib/tests/facts/resolvers/zpool_resolver.cc +69 -0
- data/ext/facter/facter/lib/tests/facts/schema.cc +796 -0
- data/ext/facter/facter/lib/tests/facts/string_value.cc +270 -0
- data/ext/facter/facter/lib/tests/facts/windows/collection.cc +60 -0
- data/ext/facter/facter/lib/tests/facts/windows/networking_resolver.cc +217 -0
- data/ext/facter/facter/lib/tests/fixtures.cc +62 -0
- data/ext/facter/facter/lib/tests/fixtures.hpp.in +27 -0
- data/ext/facter/facter/lib/tests/fixtures/execution/with space/command_with_space.bat +2 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/json/facts.json +12 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/json/invalid.json +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/ordering/bar/foo.yaml +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/ordering/foo/foo.yaml +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/error_message +4 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/facts +5 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/failed +3 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/not_executable +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/text/facts.txt +4 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/error_message.bat +4 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/facts.bat +4 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/failed.cmd +2 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/not_executable +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/ruby_script.rb +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/error_message.ps1 +3 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/facts.ps1 +4 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/failed.ps1 +2 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/json.ps1 +21 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/not_executable +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/yaml.ps1 +18 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/yaml/facts.yaml +15 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/yaml/invalid.yaml +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/z/303/266/facts.rb +3 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/external/z/303/266/facts.txt +1 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/azure +3 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/azure-unknown +3 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/not-azure +0 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/full.txt +83 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/full_alternative.txt +83 -0
- data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/none.txt +2 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/100_resolutions.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/101_resolutions.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_invalid_require.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_block.rb +30 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_cycle.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_invalid_merge.rb +13 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_merge.rb +23 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_require.rb +16 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/array_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/array_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/bad_command.rb +19 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/bad_syntax.rb +2 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/bignum_fact_value.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/block_confine.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/block_false_confine.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/block_nil_confine.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/block_true_confine.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_false_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_false_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_true_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_true_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/command_with_space.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/confine_missing_fact.rb +22 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/confine_weight.rb +20 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/custom_dir/expect_network_init.rb +15 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/cycle.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/debug.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/debugging.rb +14 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/debugonce.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/define_aggregate_fact.rb +13 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/define_fact.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/double_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/empty_command.rb +3 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/empty_fact.rb +1 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/empty_fact_with_value.rb +1 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/empty_setcode_command.rb +3 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/exec.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/execute_on_fail_raise.rb +17 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/execute_on_fail_value.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/execute_timeout.rb +1 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/execution_failure.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/existing_aggregate_resolution.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/existing_simple_resolution.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/fact.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/facter.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/facterversion.rb +17 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/hash_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/hash_with_non_string_key.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/integer_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/log_exception.rb +21 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/lookup.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/multi_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/named_resolution.rb +13 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/negative_number.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/nil_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/nonexistent_command.rb +21 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/on_message.rb +16 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/range_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/regexp_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/ruby.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/simple.rb +11 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/simple_command.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/simple_confine.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/simple_resolution.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/single_allocation.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/stderr_output.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/string_fact.rb +5 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/timeout.rb +10 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/trace.rb +22 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/uni/341/220/201dir/customfacts/342/204/242.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/uses_exit_code.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/value.rb +6 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/version.rb +2 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/warn.rb +7 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/warnonce.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/weight.rb +20 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/weight_option.rb +17 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/which.rb +9 -0
- data/ext/facter/facter/lib/tests/fixtures/ruby/windows/ole.rb +7 -0
- data/ext/facter/facter/lib/tests/java/facter.cc +69 -0
- data/ext/facter/facter/lib/tests/log_capture.cc +29 -0
- data/ext/facter/facter/lib/tests/log_capture.hpp +35 -0
- data/ext/facter/facter/lib/tests/logging/logging.cc +69 -0
- data/ext/facter/facter/lib/tests/main.cc +20 -0
- data/ext/facter/facter/lib/tests/mock_server.cc +44 -0
- data/ext/facter/facter/lib/tests/mock_server.hpp +25 -0
- data/ext/facter/facter/lib/tests/ruby/ruby.cc +634 -0
- data/ext/facter/facter/lib/tests/ruby/ruby_dirfacts.cc +35 -0
- data/ext/facter/facter/lib/tests/ruby/ruby_helper.cc +41 -0
- data/ext/facter/facter/lib/tests/ruby/ruby_helper.hpp +8 -0
- data/ext/facter/facter/lib/tests/ruby/windows/ruby.cc +53 -0
- data/ext/facter/facter/lib/tests/util/bsd/scoped_ifaddrs.cc +10 -0
- data/ext/facter/facter/lib/tests/util/posix/scoped_addrinfo.cc +11 -0
- data/ext/facter/facter/lib/tests/util/posix/scoped_bio.cc +12 -0
- data/ext/facter/facter/lib/tests/util/posix/scoped_descriptor.cc +22 -0
- data/ext/facter/facter/lib/tests/util/string.cc +291 -0
- data/ext/facter/facter/lib/version.h.in +28 -0
- data/ext/facter/facter/locales/CMakeLists.txt +7 -0
- data/ext/facter/facter/locales/FACTER.pot +1508 -0
- data/ext/facter/facter/man/man8/facter.8 +205 -0
- data/ext/facter/facter/scripts/cpplint.py +4754 -0
- data/ext/facter/facter/scripts/travis_target.sh +83 -0
- data/ext/facter/facter/tasks/ci.rake +22 -0
- data/ext/facter/leatherman/CHANGELOG.md +430 -0
- data/ext/facter/leatherman/CMakeLists.txt +143 -0
- data/ext/facter/leatherman/CONTRIBUTING.md +98 -0
- data/ext/facter/leatherman/LICENSE +17 -0
- data/ext/facter/leatherman/LeathermanConfig.cmake.in +57 -0
- data/ext/facter/leatherman/LeathermanConfigVersion.cmake.in +11 -0
- data/ext/facter/leatherman/MAINTAINERS +28 -0
- data/ext/facter/leatherman/README.md +416 -0
- data/ext/facter/leatherman/appveyor.yml +47 -0
- data/ext/facter/leatherman/catch/CMakeLists.txt +1 -0
- data/ext/facter/leatherman/cmake/FindICU.cmake +690 -0
- data/ext/facter/leatherman/cmake/GetGitRevisionDescription.cmake +130 -0
- data/ext/facter/leatherman/cmake/GetGitRevisionDescription.cmake.in +38 -0
- data/ext/facter/leatherman/cmake/cflags.cmake +110 -0
- data/ext/facter/leatherman/cmake/generate_translations.cmake +17 -0
- data/ext/facter/leatherman/cmake/internal.cmake +241 -0
- data/ext/facter/leatherman/cmake/leatherman.cmake.in +369 -0
- data/ext/facter/leatherman/cmake/leatherman_config.cmake +80 -0
- data/ext/facter/leatherman/cmake/normalize_pot.cmake +17 -0
- data/ext/facter/leatherman/cmake/options.cmake +21 -0
- data/ext/facter/leatherman/cmake/pod2man.cmake +36 -0
- data/ext/facter/leatherman/curl/CMakeLists.txt +42 -0
- data/ext/facter/leatherman/curl/inc/leatherman/curl/client.hpp +441 -0
- data/ext/facter/leatherman/curl/inc/leatherman/curl/request.hpp +130 -0
- data/ext/facter/leatherman/curl/inc/leatherman/curl/response.hpp +80 -0
- data/ext/facter/leatherman/curl/src/client.cc +575 -0
- data/ext/facter/leatherman/curl/src/request.cc +112 -0
- data/ext/facter/leatherman/curl/src/response.cc +62 -0
- data/ext/facter/leatherman/curl/tests/CMakeLists.txt +22 -0
- data/ext/facter/leatherman/curl/tests/client_test.cc +613 -0
- data/ext/facter/leatherman/curl/tests/fixtures.cc +27 -0
- data/ext/facter/leatherman/curl/tests/fixtures.hpp +31 -0
- data/ext/facter/leatherman/curl/tests/mock_curl.cc +423 -0
- data/ext/facter/leatherman/curl/tests/mock_curl.hpp +85 -0
- data/ext/facter/leatherman/curl/tests/request_test.cc +85 -0
- data/ext/facter/leatherman/curl/tests/response_test.cc +58 -0
- data/ext/facter/leatherman/dynamic_library/CMakeLists.txt +43 -0
- data/ext/facter/leatherman/dynamic_library/inc/leatherman/dynamic_library/dynamic_library.hpp +122 -0
- data/ext/facter/leatherman/dynamic_library/src/dynamic_library.cc +57 -0
- data/ext/facter/leatherman/dynamic_library/src/posix/dynamic_library.cc +91 -0
- data/ext/facter/leatherman/dynamic_library/src/windows/dynamic_library.cc +128 -0
- data/ext/facter/leatherman/dynamic_library/tests/dynamic_library_tests.cc +94 -0
- data/ext/facter/leatherman/dynamic_library/tests/fixtures.hpp.in +3 -0
- data/ext/facter/leatherman/dynamic_library/tests/test-lib/goodbye.cc +5 -0
- data/ext/facter/leatherman/dynamic_library/tests/test-lib/hello.cc +7 -0
- data/ext/facter/leatherman/execution/CMakeLists.txt +65 -0
- data/ext/facter/leatherman/execution/inc/leatherman/execution/execution.hpp +488 -0
- data/ext/facter/leatherman/execution/src/execution.cc +510 -0
- data/ext/facter/leatherman/execution/src/posix/execution.cc +574 -0
- data/ext/facter/leatherman/execution/src/posix/generic/platform.cc +30 -0
- data/ext/facter/leatherman/execution/src/posix/platform.hpp +15 -0
- data/ext/facter/leatherman/execution/src/posix/solaris/platform.cc +197 -0
- data/ext/facter/leatherman/execution/src/windows/execution.cc +698 -0
- data/ext/facter/leatherman/execution/tests/fixtures.hpp.in +2 -0
- data/ext/facter/leatherman/execution/tests/fixtures/echo_pid +2 -0
- data/ext/facter/leatherman/execution/tests/fixtures/error_message +5 -0
- data/ext/facter/leatherman/execution/tests/fixtures/execution/selfkill.sh +3 -0
- data/ext/facter/leatherman/execution/tests/fixtures/execution/sleep.sh +3 -0
- data/ext/facter/leatherman/execution/tests/fixtures/facts +5 -0
- data/ext/facter/leatherman/execution/tests/fixtures/failed +3 -0
- data/ext/facter/leatherman/execution/tests/fixtures/ls/crlf.txt +3 -0
- data/ext/facter/leatherman/execution/tests/fixtures/ls/file1.txt +1 -0
- data/ext/facter/leatherman/execution/tests/fixtures/ls/file2.txt +1 -0
- data/ext/facter/leatherman/execution/tests/fixtures/ls/file3.txt +1 -0
- data/ext/facter/leatherman/execution/tests/fixtures/ls/file4.txt +7 -0
- data/ext/facter/leatherman/execution/tests/fixtures/not_executable +1 -0
- data/ext/facter/leatherman/execution/tests/fixtures/windows/error_message.bat +6 -0
- data/ext/facter/leatherman/execution/tests/fixtures/windows/facts.bat +4 -0
- data/ext/facter/leatherman/execution/tests/fixtures/windows/failed.cmd +2 -0
- data/ext/facter/leatherman/execution/tests/fixtures/windows/not_executable +1 -0
- data/ext/facter/leatherman/execution/tests/fixtures/windows/ruby_script.rb +1 -0
- data/ext/facter/leatherman/execution/tests/log_capture.cc +29 -0
- data/ext/facter/leatherman/execution/tests/log_capture.hpp +35 -0
- data/ext/facter/leatherman/execution/tests/lth_cat.cc +38 -0
- data/ext/facter/leatherman/execution/tests/lth_cat.hpp +9 -0
- data/ext/facter/leatherman/execution/tests/posix/execution.cc +728 -0
- data/ext/facter/leatherman/execution/tests/posix/solaris/execution.cc +54 -0
- data/ext/facter/leatherman/execution/tests/windows/execution.cc +789 -0
- data/ext/facter/leatherman/file_util/CMakeLists.txt +18 -0
- data/ext/facter/leatherman/file_util/inc/leatherman/file_util/directory.hpp +28 -0
- data/ext/facter/leatherman/file_util/inc/leatherman/file_util/file.hpp +95 -0
- data/ext/facter/leatherman/file_util/src/directory.cc +51 -0
- data/ext/facter/leatherman/file_util/src/file.cc +131 -0
- data/ext/facter/leatherman/file_util/tests/directory_utils_test.cc +87 -0
- data/ext/facter/leatherman/file_util/tests/file_utils_test.cc +195 -0
- data/ext/facter/leatherman/file_util/tests/fixtures.cc +37 -0
- data/ext/facter/leatherman/file_util/tests/fixtures.hpp +39 -0
- data/ext/facter/leatherman/json_container/CMakeLists.txt +11 -0
- data/ext/facter/leatherman/json_container/README.md +108 -0
- data/ext/facter/leatherman/json_container/inc/leatherman/json_container/json_container.hpp +443 -0
- data/ext/facter/leatherman/json_container/src/json_container.cc +655 -0
- data/ext/facter/leatherman/json_container/tests/json_container_test.cc +1129 -0
- data/ext/facter/leatherman/locale/CMakeLists.txt +46 -0
- data/ext/facter/leatherman/locale/disabled/locale.cc +38 -0
- data/ext/facter/leatherman/locale/inc/leatherman/locale/locale.hpp +263 -0
- data/ext/facter/leatherman/locale/locales/CMakeLists.txt +6 -0
- data/ext/facter/leatherman/locale/locales/fr.po +40 -0
- data/ext/facter/leatherman/locale/locales/leatherman_locale.pot +41 -0
- data/ext/facter/leatherman/locale/src/locale.cc +95 -0
- data/ext/facter/leatherman/locale/tests/format.cc +117 -0
- data/ext/facter/leatherman/locale/tests/locale.cc +190 -0
- data/ext/facter/leatherman/locales/CMakeLists.txt +7 -0
- data/ext/facter/leatherman/locales/leatherman.pot +717 -0
- data/ext/facter/leatherman/logging/CMakeLists.txt +43 -0
- data/ext/facter/leatherman/logging/inc/leatherman/logging/logging.hpp +264 -0
- data/ext/facter/leatherman/logging/locales/CMakeLists.txt +6 -0
- data/ext/facter/leatherman/logging/locales/fr.po +72 -0
- data/ext/facter/leatherman/logging/locales/leatherman_logging.pot +72 -0
- data/ext/facter/leatherman/logging/src/logging.cc +229 -0
- data/ext/facter/leatherman/logging/src/posix/logging.cc +39 -0
- data/ext/facter/leatherman/logging/src/windows/logging.cc +52 -0
- data/ext/facter/leatherman/logging/tests/logging.cc +118 -0
- data/ext/facter/leatherman/logging/tests/logging.hpp +88 -0
- data/ext/facter/leatherman/logging/tests/logging_i18n.cc +103 -0
- data/ext/facter/leatherman/logging/tests/logging_on_message.cc +61 -0
- data/ext/facter/leatherman/logging/tests/logging_stream.cc +159 -0
- data/ext/facter/leatherman/logging/tests/logging_stream_lines.cc +172 -0
- data/ext/facter/leatherman/logging/tests/posix/logging.cc +23 -0
- data/ext/facter/leatherman/logging/tests/windows/logging.cc +13 -0
- data/ext/facter/leatherman/nowide/CMakeLists.txt +7 -0
- data/ext/facter/leatherman/rapidjson/CMakeLists.txt +1 -0
- data/ext/facter/leatherman/ruby/CMakeLists.txt +26 -0
- data/ext/facter/leatherman/ruby/inc/leatherman/ruby/api.hpp +744 -0
- data/ext/facter/leatherman/ruby/src/api.cc +527 -0
- data/ext/facter/leatherman/ruby/src/posix/api.cc +14 -0
- data/ext/facter/leatherman/ruby/src/windows/api.cc +20 -0
- data/ext/facter/leatherman/ruby/tests/api-test.cc +206 -0
- data/ext/facter/leatherman/scripts/cpplint.py +6323 -0
- data/ext/facter/leatherman/tests/CMakeLists.txt +22 -0
- data/ext/facter/leatherman/tests/main.cc +17 -0
- data/ext/facter/leatherman/util/CMakeLists.txt +36 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/environment.hpp +69 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/option_set.hpp +228 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/posix/scoped_descriptor.hpp +32 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/regex.hpp +80 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/scope_exit.hpp +62 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/scoped_env.hpp +35 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/scoped_resource.hpp +130 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/strings.hpp +54 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/time.hpp +36 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/timer.hpp +43 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/uri.hpp +23 -0
- data/ext/facter/leatherman/util/inc/leatherman/util/windows/scoped_handle.hpp +32 -0
- data/ext/facter/leatherman/util/src/environment.cc +29 -0
- data/ext/facter/leatherman/util/src/posix/environment.cc +75 -0
- data/ext/facter/leatherman/util/src/posix/scoped_descriptor.cc +23 -0
- data/ext/facter/leatherman/util/src/posix/time.cc +9 -0
- data/ext/facter/leatherman/util/src/scope_exit.cc +43 -0
- data/ext/facter/leatherman/util/src/scoped_env.cc +37 -0
- data/ext/facter/leatherman/util/src/strings.cc +41 -0
- data/ext/facter/leatherman/util/src/time.cc +49 -0
- data/ext/facter/leatherman/util/src/uri.cc +75 -0
- data/ext/facter/leatherman/util/src/windows/environment.cc +75 -0
- data/ext/facter/leatherman/util/src/windows/scoped_handle.cc +24 -0
- data/ext/facter/leatherman/util/src/windows/time.cc +10 -0
- data/ext/facter/leatherman/util/tests/environment.cc +90 -0
- data/ext/facter/leatherman/util/tests/option_set.cc +234 -0
- data/ext/facter/leatherman/util/tests/posix/environment.cc +36 -0
- data/ext/facter/leatherman/util/tests/scoped_env.cc +52 -0
- data/ext/facter/leatherman/util/tests/strings_test.cc +71 -0
- data/ext/facter/leatherman/util/tests/timer.cc +39 -0
- data/ext/facter/leatherman/util/tests/uri.cc +104 -0
- data/ext/facter/leatherman/util/tests/windows/environment.cc +30 -0
- data/ext/facter/leatherman/vendor/Catch-1.10.0.zip +0 -0
- data/ext/facter/leatherman/vendor/nowide/build/Jamfile.v2 +26 -0
- data/ext/facter/leatherman/vendor/nowide/doc/Doxyfile +1632 -0
- data/ext/facter/leatherman/vendor/nowide/doc/LICENSE_1_0.txt +23 -0
- data/ext/facter/leatherman/vendor/nowide/doc/gendoc.sh +11 -0
- data/ext/facter/leatherman/vendor/nowide/doc/main.txt +354 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/args.hpp +167 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cenv.hpp +126 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/config.hpp +54 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/convert.hpp +154 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cstdio.hpp +101 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cstdlib.hpp +16 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/filebuf.hpp +415 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/fstream.hpp +283 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/integration/filesystem.hpp +28 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/iostream.hpp +99 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/stackstring.hpp +154 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/system.hpp +46 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/utf8_codecvt.hpp +499 -0
- data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/windows.hpp +39 -0
- data/ext/facter/leatherman/vendor/nowide/index.html +16 -0
- data/ext/facter/leatherman/vendor/nowide/src/iostream.cpp +263 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/CMakeLists.txt +104 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/MinGW.cmake +9 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/config.hpp +37 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/convert +34 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/encoding_errors.hpp +58 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/encoding_utf.hpp +84 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/run_convert_and_build.sh +17 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/scoped_ptr.hpp +93 -0
- data/ext/facter/leatherman/vendor/nowide/standalone/utf.hpp +469 -0
- data/ext/facter/leatherman/vendor/nowide/template.hpp +19 -0
- data/ext/facter/leatherman/vendor/nowide/test/Jamfile.v2 +43 -0
- data/ext/facter/leatherman/vendor/nowide/test/test.hpp +25 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_codecvt.cpp +254 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_convert.cpp +101 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_env.cpp +49 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_fs.cpp +48 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_fstream.cpp +184 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_iostream.cpp +52 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_stdio.cpp +60 -0
- data/ext/facter/leatherman/vendor/nowide/test/test_system.cpp +91 -0
- data/ext/facter/leatherman/vendor/rapidjson-1.0.2.zip +0 -0
- data/ext/facter/leatherman/windows/CMakeLists.txt +27 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/file_util.hpp +23 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/process.hpp +22 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/registry.hpp +56 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/system_error.hpp +23 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/user.hpp +30 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/windows.hpp +10 -0
- data/ext/facter/leatherman/windows/inc/leatherman/windows/wmi.hpp +188 -0
- data/ext/facter/leatherman/windows/src/file_util.cc +28 -0
- data/ext/facter/leatherman/windows/src/process.cc +42 -0
- data/ext/facter/leatherman/windows/src/registry.cc +96 -0
- data/ext/facter/leatherman/windows/src/system_error.cc +33 -0
- data/ext/facter/leatherman/windows/src/user.cc +76 -0
- data/ext/facter/leatherman/windows/src/wmi.cc +208 -0
- data/ext/facter/leatherman/windows/tests/file_utils_test.cc +13 -0
- metadata +1089 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
#include <leatherman/execution/execution.hpp>
|
2
|
+
#include <leatherman/locale/locale.hpp>
|
3
|
+
#include "../platform.hpp"
|
4
|
+
|
5
|
+
// Mark string for translation (alias for leatherman::locale::format)
|
6
|
+
using leatherman::locale::_;
|
7
|
+
|
8
|
+
namespace leatherman { namespace execution {
|
9
|
+
|
10
|
+
pid_t create_child(leatherman::util::option_set<execution_options> const& options,
|
11
|
+
int in_fd, int out_fd, int err_fd, uint64_t max_fd,
|
12
|
+
char const* program, char const** argv, char const** envp)
|
13
|
+
{
|
14
|
+
// Fork the child process
|
15
|
+
// Note: this uses vfork (unless the thread_safe execution option is specified), which is inherently unsafe
|
16
|
+
// (the parent's address space is shared with the child)
|
17
|
+
pid_t pid = options[execution_options::thread_safe] ? fork() : vfork();
|
18
|
+
if (pid < 0) {
|
19
|
+
throw execution_exception(format_error(_("failed to fork child process")));
|
20
|
+
}
|
21
|
+
|
22
|
+
if (pid == 0) { // Is this the child process?
|
23
|
+
// Exec the child; this never returns
|
24
|
+
exec_child(in_fd, out_fd, err_fd, max_fd, program, argv, envp);
|
25
|
+
}
|
26
|
+
|
27
|
+
return pid;
|
28
|
+
}
|
29
|
+
|
30
|
+
}} // namespace leatherman::execution
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <unistd.h>
|
2
|
+
#include <errno.h>
|
3
|
+
|
4
|
+
namespace leatherman { namespace execution {
|
5
|
+
|
6
|
+
std::string format_error(std::string const& message = std::string(), int error = errno);
|
7
|
+
|
8
|
+
pid_t create_child(leatherman::util::option_set<execution_options> const& options,
|
9
|
+
int in_fd, int out_fd, int err_fd, uint64_t max_fd,
|
10
|
+
char const* program, char const** argv, char const** envp);
|
11
|
+
|
12
|
+
void exec_child(int in_fd, int out_fd, int err_fd, uint64_t max_fd,
|
13
|
+
char const* program, char const** argv, char const** envp);
|
14
|
+
|
15
|
+
}} // namespace leatherman::execution
|
@@ -0,0 +1,197 @@
|
|
1
|
+
/*
|
2
|
+
* Portions of this file were copied from OpenSSH's
|
3
|
+
* openbsd-compat/port-solaris.c file, that file
|
4
|
+
* contained the following copyright notice:
|
5
|
+
*
|
6
|
+
* Copyright (c) 2006 Chad Mynhier.
|
7
|
+
*
|
8
|
+
* Permission to use, copy, modify, and distribute this software for any
|
9
|
+
* purpose with or without fee is hereby granted, provided that the above
|
10
|
+
* copyright notice and this permission notice appear in all copies.
|
11
|
+
*
|
12
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
13
|
+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
14
|
+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
15
|
+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
16
|
+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
17
|
+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
18
|
+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
19
|
+
*/
|
20
|
+
|
21
|
+
#include <leatherman/execution/execution.hpp>
|
22
|
+
#include <leatherman/locale/locale.hpp>
|
23
|
+
#include <boost/format.hpp>
|
24
|
+
|
25
|
+
#include <fcntl.h>
|
26
|
+
#include <libcontract.h>
|
27
|
+
#include <sys/ctfs.h>
|
28
|
+
#include <sys/contract/process.h>
|
29
|
+
|
30
|
+
#include "../platform.hpp"
|
31
|
+
|
32
|
+
#define CT_TEMPLATE CTFS_ROOT "/process/template"
|
33
|
+
#define CT_LATEST CTFS_ROOT "/process/latest"
|
34
|
+
|
35
|
+
// Mark string for translation (alias for leatherman::locale::format)
|
36
|
+
using leatherman::locale::_;
|
37
|
+
|
38
|
+
using namespace std;
|
39
|
+
|
40
|
+
namespace leatherman { namespace execution {
|
41
|
+
|
42
|
+
static int activate_new_contract_template(void)
|
43
|
+
{
|
44
|
+
int tmpl_fd;
|
45
|
+
int err;
|
46
|
+
|
47
|
+
// Open a template
|
48
|
+
if ((tmpl_fd = open(CT_TEMPLATE, O_RDWR)) == -1) {
|
49
|
+
err = errno;
|
50
|
+
goto fail;
|
51
|
+
}
|
52
|
+
|
53
|
+
// Set the template parameters and event sets
|
54
|
+
if ((err = ct_pr_tmpl_set_param(tmpl_fd, CT_PR_PGRPONLY)) != 0) {
|
55
|
+
goto close_fail;
|
56
|
+
}
|
57
|
+
if ((err = ct_pr_tmpl_set_fatal(tmpl_fd, CT_PR_EV_HWERR)) != 0) {
|
58
|
+
goto close_fail;
|
59
|
+
}
|
60
|
+
if ((err = ct_tmpl_set_critical(tmpl_fd, 0)) != 0) {
|
61
|
+
goto close_fail;
|
62
|
+
}
|
63
|
+
if ((err = ct_tmpl_set_informative(tmpl_fd, CT_PR_EV_HWERR)) != 0) {
|
64
|
+
goto close_fail;
|
65
|
+
}
|
66
|
+
|
67
|
+
// Now make this the active template for this process
|
68
|
+
if ((err = ct_tmpl_activate(tmpl_fd)) != 0) {
|
69
|
+
goto close_fail;
|
70
|
+
}
|
71
|
+
|
72
|
+
return tmpl_fd;
|
73
|
+
|
74
|
+
close_fail:
|
75
|
+
close(tmpl_fd);
|
76
|
+
fail:
|
77
|
+
throw execution_exception(format_error(_("failed to create process contract template"), err));
|
78
|
+
}
|
79
|
+
|
80
|
+
static int deactivate_contract_template(int tmpl_fd)
|
81
|
+
{
|
82
|
+
// WARNING: this function is potentially called from a vfork'd child
|
83
|
+
// Do not modify program state from this function; only call setpgid, dup2, close, execve, and _exit
|
84
|
+
// Do not allocate heap memory or throw exceptions
|
85
|
+
// The child is sharing the address space of the parent process, so carelessly modifying this
|
86
|
+
// function may lead to parent state corruption, memory leaks, and/or total protonic reversal
|
87
|
+
|
88
|
+
if (tmpl_fd < 0) {
|
89
|
+
return 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
// Deactivate the template
|
93
|
+
int err = ct_tmpl_clear(tmpl_fd);
|
94
|
+
|
95
|
+
close(tmpl_fd);
|
96
|
+
|
97
|
+
return err;
|
98
|
+
}
|
99
|
+
|
100
|
+
// Lookup the latest child process contract ID
|
101
|
+
static ctid_t get_latest_child_contract_id(void)
|
102
|
+
{
|
103
|
+
int stat_fd;
|
104
|
+
ct_stathdl_t stathdl;
|
105
|
+
ctid_t ctid;
|
106
|
+
int err;
|
107
|
+
|
108
|
+
if ((stat_fd = open(CT_LATEST, O_RDONLY)) < 0) {
|
109
|
+
err = errno;
|
110
|
+
goto fail;
|
111
|
+
}
|
112
|
+
|
113
|
+
if ((err = ct_status_read(stat_fd, CTD_COMMON, &stathdl)) != 0) {
|
114
|
+
close(stat_fd);
|
115
|
+
goto fail;
|
116
|
+
}
|
117
|
+
|
118
|
+
ctid = ct_status_get_id(stathdl);
|
119
|
+
err = errno;
|
120
|
+
|
121
|
+
ct_status_free(stathdl);
|
122
|
+
close(stat_fd);
|
123
|
+
|
124
|
+
if (ctid < 0) {
|
125
|
+
goto fail;
|
126
|
+
}
|
127
|
+
|
128
|
+
return ctid;
|
129
|
+
|
130
|
+
fail:
|
131
|
+
throw execution_exception(format_error(_("failed to lookup the latest child process contract"), err));
|
132
|
+
}
|
133
|
+
|
134
|
+
static void abandon_latest_child_contract()
|
135
|
+
{
|
136
|
+
ctid_t ctid = get_latest_child_contract_id();
|
137
|
+
int ctl_fd;
|
138
|
+
int err;
|
139
|
+
|
140
|
+
if ((ctl_fd = open((boost::format { "%s/process/%d/ctl" } % CTFS_ROOT % ctid).str().c_str(), O_WRONLY)) < 0) {
|
141
|
+
err = errno;
|
142
|
+
goto fail;
|
143
|
+
}
|
144
|
+
|
145
|
+
// Abandon the contract created for the child process
|
146
|
+
err = ct_ctl_abandon(ctl_fd);
|
147
|
+
|
148
|
+
close(ctl_fd);
|
149
|
+
|
150
|
+
if (err == 0) {
|
151
|
+
return;
|
152
|
+
}
|
153
|
+
|
154
|
+
fail:
|
155
|
+
throw execution_exception(format_error(_("failed to abandon contract created for a child process"), err));
|
156
|
+
}
|
157
|
+
|
158
|
+
pid_t create_child(leatherman::util::option_set<execution_options> const& options,
|
159
|
+
int in_fd, int out_fd, int err_fd, uint64_t max_fd,
|
160
|
+
char const* program, char const** argv, char const** envp)
|
161
|
+
{
|
162
|
+
bool detach = options[execution_options::create_detached_process];
|
163
|
+
// Create a new process contract template & activate it
|
164
|
+
int tmpl_fd = detach ? activate_new_contract_template() : -1;
|
165
|
+
int err;
|
166
|
+
|
167
|
+
// Fork the child process
|
168
|
+
// Note: this uses vfork (unless the thread_safe execution option is specified), which is inherently unsafe
|
169
|
+
// (the parent's address space is shared with the child)
|
170
|
+
pid_t pid = options[execution_options::thread_safe] ? fork() : vfork();
|
171
|
+
if (pid < 0) {
|
172
|
+
err = errno;
|
173
|
+
deactivate_contract_template(tmpl_fd);
|
174
|
+
throw execution_exception(format_error(_("failed to fork child process"), err));
|
175
|
+
}
|
176
|
+
|
177
|
+
if (pid == 0) { // Is this the child process?
|
178
|
+
if ((err = deactivate_contract_template(tmpl_fd)) != 0) {
|
179
|
+
_exit(err);
|
180
|
+
}
|
181
|
+
// Exec the child; this never returns
|
182
|
+
exec_child(in_fd, out_fd, err_fd, max_fd, program, argv, envp);
|
183
|
+
}
|
184
|
+
|
185
|
+
// This is the parent process
|
186
|
+
if ((err = deactivate_contract_template(tmpl_fd)) != 0) {
|
187
|
+
throw execution_exception(format_error(_("failed to deactivate contract template created for a child process"), err));
|
188
|
+
}
|
189
|
+
if (detach) {
|
190
|
+
// Abandon the contract created for the child process
|
191
|
+
abandon_latest_child_contract();
|
192
|
+
}
|
193
|
+
|
194
|
+
return pid;
|
195
|
+
}
|
196
|
+
|
197
|
+
}} // namespace leatherman::execution
|
@@ -0,0 +1,698 @@
|
|
1
|
+
#include <leatherman/execution/execution.hpp>
|
2
|
+
#include <leatherman/util/environment.hpp>
|
3
|
+
#include <leatherman/util/scope_exit.hpp>
|
4
|
+
#include <leatherman/util/windows/scoped_handle.hpp>
|
5
|
+
#include <leatherman/util/scoped_env.hpp>
|
6
|
+
#include <leatherman/windows/system_error.hpp>
|
7
|
+
#include <leatherman/windows/windows.hpp>
|
8
|
+
#include <leatherman/logging/logging.hpp>
|
9
|
+
#include <leatherman/locale/locale.hpp>
|
10
|
+
#include <boost/filesystem.hpp>
|
11
|
+
#include <boost/algorithm/string.hpp>
|
12
|
+
#include <boost/nowide/convert.hpp>
|
13
|
+
#include <boost/uuid/uuid.hpp>
|
14
|
+
#include <boost/uuid/uuid_generators.hpp>
|
15
|
+
#include <boost/uuid/uuid_io.hpp>
|
16
|
+
#include <cstdlib>
|
17
|
+
#include <cstdio>
|
18
|
+
#include <sstream>
|
19
|
+
#include <cstring>
|
20
|
+
#include <random>
|
21
|
+
|
22
|
+
// Mark string for translation (alias for leatherman::locale::format)
|
23
|
+
using leatherman::locale::_;
|
24
|
+
|
25
|
+
using namespace std;
|
26
|
+
using namespace leatherman::windows;
|
27
|
+
using namespace leatherman::logging;
|
28
|
+
using namespace leatherman::util;
|
29
|
+
using namespace leatherman::util::windows;
|
30
|
+
using namespace boost::filesystem;
|
31
|
+
using namespace boost::algorithm;
|
32
|
+
|
33
|
+
namespace leatherman { namespace execution {
|
34
|
+
|
35
|
+
void log_execution(string const& file, vector<string> const* arguments);
|
36
|
+
|
37
|
+
const char *const command_shell = "cmd.exe";
|
38
|
+
const char *const command_args = "/c";
|
39
|
+
|
40
|
+
struct extpath_helper
|
41
|
+
{
|
42
|
+
vector<string> const& ext_paths() const
|
43
|
+
{
|
44
|
+
return _extpaths;
|
45
|
+
}
|
46
|
+
|
47
|
+
bool contains(const string & ext) const
|
48
|
+
{
|
49
|
+
return binary_search(_extpaths.begin(), _extpaths.end(), to_lower_copy(ext));
|
50
|
+
}
|
51
|
+
|
52
|
+
private:
|
53
|
+
// Use sorted, lower-case operations to ignore case and use binary search.
|
54
|
+
vector<string> _extpaths = {".bat", ".cmd", ".com", ".exe"};;
|
55
|
+
};
|
56
|
+
|
57
|
+
static bool is_executable(path const& p, extpath_helper const* helper = nullptr)
|
58
|
+
{
|
59
|
+
// If there's an error accessing file status, we assume is_executable
|
60
|
+
// is false and return. The reason for failure doesn't matter to us.
|
61
|
+
boost::system::error_code ec;
|
62
|
+
bool isfile = is_regular_file(p, ec);
|
63
|
+
if (ec) {
|
64
|
+
LOG_TRACE("error reading status of path {1}: {2} ({3})", p, ec.message(), ec.value());
|
65
|
+
}
|
66
|
+
|
67
|
+
if (helper) {
|
68
|
+
// Checking extensions aren't needed if we explicitly specified it.
|
69
|
+
// If helper was passed, then we haven't and should check the ext.
|
70
|
+
isfile &= helper->contains(p.extension().string());
|
71
|
+
}
|
72
|
+
return isfile;
|
73
|
+
}
|
74
|
+
|
75
|
+
string which(string const& file, vector<string> const& directories)
|
76
|
+
{
|
77
|
+
// On Windows, everything has execute permission; Ruby determined
|
78
|
+
// executability based on extension {com, exe, bat, cmd}. We'll do the
|
79
|
+
// same check here using extpath_helper.
|
80
|
+
static extpath_helper helper;
|
81
|
+
|
82
|
+
// If the file is already absolute, return it if it's executable.
|
83
|
+
path p = file;
|
84
|
+
if (p.is_absolute()) {
|
85
|
+
return is_executable(p, &helper) ? p.string() : string();
|
86
|
+
}
|
87
|
+
|
88
|
+
// On Windows, treat 'echo' as a command that can be found
|
89
|
+
if (file == "echo") {
|
90
|
+
return "echo";
|
91
|
+
}
|
92
|
+
|
93
|
+
// Otherwise, check for an executable file under the given search paths
|
94
|
+
for (auto const& dir : directories) {
|
95
|
+
path p = path(dir) / file;
|
96
|
+
if (!p.has_extension()) {
|
97
|
+
path pext = p;
|
98
|
+
for (auto const&ext : helper.ext_paths()) {
|
99
|
+
pext.replace_extension(ext);
|
100
|
+
if (is_executable(pext)) {
|
101
|
+
return pext.string();
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
if (is_executable(p, &helper)) {
|
106
|
+
return p.string();
|
107
|
+
}
|
108
|
+
}
|
109
|
+
return {};
|
110
|
+
}
|
111
|
+
|
112
|
+
// Create a pipe, throwing if there's an error. Returns {read, write} handles.
|
113
|
+
// Always creates overlapped pipes.
|
114
|
+
static tuple<scoped_handle, scoped_handle> CreatePipeThrow()
|
115
|
+
{
|
116
|
+
static LONG counter = 0;
|
117
|
+
static boost::uuids::random_generator rand_uuid;
|
118
|
+
|
119
|
+
SECURITY_ATTRIBUTES attributes = {};
|
120
|
+
attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
|
121
|
+
attributes.bInheritHandle = TRUE;
|
122
|
+
attributes.lpSecurityDescriptor = NULL;
|
123
|
+
|
124
|
+
// Format a name for the pipe. Use the thread id to ensure no two threads try to use the same
|
125
|
+
// pipe, and a counter to generate multiple pipes for the same process invocation.
|
126
|
+
// A scenario exists using timeouts where we could release the invoking end of a named pipe
|
127
|
+
// but the other end doesn't release. Then the invoking thread shuts down and another with
|
128
|
+
// the same thread id is started and reconnects to the existing named pipe. Use the process
|
129
|
+
// id and a random UUID to make that highly unlikely.
|
130
|
+
wstring name = boost::nowide::widen(_("\\\\.\\Pipe\\leatherman.{1}.{2}.{3}.{4}",
|
131
|
+
GetCurrentProcessId(),
|
132
|
+
GetCurrentThreadId(),
|
133
|
+
InterlockedIncrement(&counter),
|
134
|
+
to_string(rand_uuid())));
|
135
|
+
|
136
|
+
// Create the read pipe
|
137
|
+
scoped_handle read_handle(CreateNamedPipeW(
|
138
|
+
name.c_str(),
|
139
|
+
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
|
140
|
+
PIPE_TYPE_BYTE | PIPE_WAIT,
|
141
|
+
1,
|
142
|
+
4096,
|
143
|
+
4096,
|
144
|
+
0,
|
145
|
+
&attributes));
|
146
|
+
|
147
|
+
if (read_handle == INVALID_HANDLE_VALUE) {
|
148
|
+
LOG_ERROR("failed to create read pipe: {1}.", windows::system_error());
|
149
|
+
throw execution_exception(_("failed to create read pipe."));
|
150
|
+
}
|
151
|
+
|
152
|
+
// Open the write pipe
|
153
|
+
scoped_handle write_handle(CreateFileW(
|
154
|
+
name.c_str(),
|
155
|
+
GENERIC_WRITE,
|
156
|
+
0,
|
157
|
+
&attributes,
|
158
|
+
OPEN_EXISTING,
|
159
|
+
FILE_ATTRIBUTE_NORMAL,
|
160
|
+
nullptr));
|
161
|
+
|
162
|
+
if (write_handle == INVALID_HANDLE_VALUE) {
|
163
|
+
LOG_ERROR("failed to create write pipe: {1}.", windows::system_error());
|
164
|
+
throw execution_exception(_("failed to create write pipe."));
|
165
|
+
}
|
166
|
+
|
167
|
+
return make_tuple(move(read_handle), move(write_handle));
|
168
|
+
}
|
169
|
+
|
170
|
+
// Source: http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
|
171
|
+
static string ArgvToCommandLine(vector<string> const& arguments, bool preserve = false)
|
172
|
+
{
|
173
|
+
// Unless we're told otherwise, don't quote unless we actually need to do so - hopefully avoid problems if
|
174
|
+
// programs won't parse quotes properly.
|
175
|
+
string commandline;
|
176
|
+
for (auto const& arg : arguments) {
|
177
|
+
if (arg.empty()) {
|
178
|
+
continue;
|
179
|
+
} else if (preserve || arg.find_first_of(" \t\n\v\"") == arg.npos) {
|
180
|
+
commandline += arg;
|
181
|
+
} else {
|
182
|
+
commandline += '"';
|
183
|
+
for (auto it = arg.begin(); ; ++it) {
|
184
|
+
unsigned num_back_slashes = 0;
|
185
|
+
while (it != arg.end() && *it == '\\') {
|
186
|
+
++it;
|
187
|
+
++num_back_slashes;
|
188
|
+
}
|
189
|
+
|
190
|
+
if (it == arg.end()) {
|
191
|
+
// Escape all backslashes, but let the terminating double quotation mark we add below be
|
192
|
+
// interpreted as a metacharacter.
|
193
|
+
commandline.append(num_back_slashes * 2, '\\');
|
194
|
+
break;
|
195
|
+
} else if (*it == '"') {
|
196
|
+
// Escape all backslashes and the following double quotation mark.
|
197
|
+
commandline.append(num_back_slashes * 2 + 1, '\\');
|
198
|
+
commandline.push_back(*it);
|
199
|
+
} else {
|
200
|
+
// Backslashes aren't special here.
|
201
|
+
commandline.append(num_back_slashes, '\\');
|
202
|
+
commandline.push_back(*it);
|
203
|
+
}
|
204
|
+
}
|
205
|
+
commandline += '"';
|
206
|
+
}
|
207
|
+
commandline += ' ';
|
208
|
+
}
|
209
|
+
|
210
|
+
// Strip the trailing space.
|
211
|
+
boost::trim_right(commandline);
|
212
|
+
return commandline;
|
213
|
+
}
|
214
|
+
|
215
|
+
// Represents information about a pipe
|
216
|
+
struct pipe
|
217
|
+
{
|
218
|
+
// cppcheck-suppress passedByValue
|
219
|
+
pipe(string pipe_name, scoped_handle pipe_handle, function<bool(string const&)> cb) :
|
220
|
+
name(move(pipe_name)),
|
221
|
+
handle(move(pipe_handle)),
|
222
|
+
overlapped{},
|
223
|
+
pending(false),
|
224
|
+
read(true),
|
225
|
+
callback(move(cb))
|
226
|
+
{
|
227
|
+
init();
|
228
|
+
}
|
229
|
+
|
230
|
+
// cppcheck-suppress passedByValue
|
231
|
+
pipe(string pipe_name, scoped_handle pipe_handle, string buf) :
|
232
|
+
name(move(pipe_name)),
|
233
|
+
handle(move(pipe_handle)),
|
234
|
+
overlapped{},
|
235
|
+
pending(false),
|
236
|
+
read(false),
|
237
|
+
buffer(move(buf))
|
238
|
+
{
|
239
|
+
init();
|
240
|
+
}
|
241
|
+
|
242
|
+
const string name;
|
243
|
+
scoped_handle handle;
|
244
|
+
OVERLAPPED overlapped;
|
245
|
+
scoped_handle event;
|
246
|
+
bool pending;
|
247
|
+
bool read;
|
248
|
+
string buffer;
|
249
|
+
function<bool(string const&)> callback;
|
250
|
+
|
251
|
+
private:
|
252
|
+
void init()
|
253
|
+
{
|
254
|
+
if (handle != INVALID_HANDLE_VALUE) {
|
255
|
+
event = scoped_handle(CreateEvent(nullptr, TRUE, FALSE, nullptr));
|
256
|
+
if (!event) {
|
257
|
+
LOG_ERROR("failed to create {1} read event: {2}.", name, windows::system_error());
|
258
|
+
throw execution_exception(_("failed to create read event."));
|
259
|
+
}
|
260
|
+
overlapped.hEvent = event;
|
261
|
+
}
|
262
|
+
}
|
263
|
+
};
|
264
|
+
|
265
|
+
static void rw_from_child(DWORD child, array<pipe, 3>& pipes, uint32_t timeout, HANDLE timer, bool convert_newlines)
|
266
|
+
{
|
267
|
+
vector<HANDLE> wait_handles;
|
268
|
+
while (true)
|
269
|
+
{
|
270
|
+
// Process all pipes
|
271
|
+
for (auto& pipe : pipes) {
|
272
|
+
// If the handle is closed or is pending, skip
|
273
|
+
if (pipe.handle == INVALID_HANDLE_VALUE || pipe.pending) {
|
274
|
+
continue;
|
275
|
+
}
|
276
|
+
|
277
|
+
// Process the pipe until pending
|
278
|
+
while (true) {
|
279
|
+
// Before doing anything, check to see if there's been a timeout
|
280
|
+
// This is done pre-emptively in case ReadFile never returns ERROR_IO_PENDING
|
281
|
+
if (timeout && WaitForSingleObject(timer, 0) == WAIT_OBJECT_0) {
|
282
|
+
throw timeout_exception(_("command timed out after {1} seconds.", timeout), static_cast<size_t>(child));
|
283
|
+
}
|
284
|
+
|
285
|
+
if (pipe.read) {
|
286
|
+
// Read the data
|
287
|
+
pipe.buffer.resize(4096);
|
288
|
+
}
|
289
|
+
|
290
|
+
DWORD count = 0;
|
291
|
+
auto success = pipe.read ?
|
292
|
+
ReadFile(pipe.handle, &pipe.buffer[0], pipe.buffer.size(), &count, &pipe.overlapped) :
|
293
|
+
WriteFile(pipe.handle, pipe.buffer.c_str(), pipe.buffer.size(), &count, &pipe.overlapped);
|
294
|
+
if (!success) {
|
295
|
+
// Treat broken pipes as closed pipes
|
296
|
+
if (GetLastError() == ERROR_BROKEN_PIPE) {
|
297
|
+
pipe.handle = {};
|
298
|
+
break;
|
299
|
+
}
|
300
|
+
// Check to see if it's a pending operation
|
301
|
+
if (GetLastError() == ERROR_IO_PENDING) {
|
302
|
+
pipe.pending = true;
|
303
|
+
break;
|
304
|
+
}
|
305
|
+
LOG_ERROR("{1} pipe i/o failed: {2}.", pipe.name, windows::system_error());
|
306
|
+
throw execution_exception(_("child i/o failed."));
|
307
|
+
}
|
308
|
+
|
309
|
+
// Check for closed pipe
|
310
|
+
if (count == 0) {
|
311
|
+
pipe.handle = {};
|
312
|
+
break;
|
313
|
+
}
|
314
|
+
|
315
|
+
if (pipe.read) {
|
316
|
+
// Read completed immediately, process the data
|
317
|
+
pipe.buffer.resize(count);
|
318
|
+
if (convert_newlines) {
|
319
|
+
pipe.buffer.erase(
|
320
|
+
std::remove(pipe.buffer.begin(), pipe.buffer.end(), '\r'),
|
321
|
+
pipe.buffer.end());
|
322
|
+
}
|
323
|
+
if (!pipe.callback(pipe.buffer)) {
|
324
|
+
// Callback signaled that we're done
|
325
|
+
return;
|
326
|
+
}
|
327
|
+
} else {
|
328
|
+
// Register written data
|
329
|
+
pipe.buffer.erase(0, count);
|
330
|
+
}
|
331
|
+
}
|
332
|
+
}
|
333
|
+
|
334
|
+
// All pipes should be pending now
|
335
|
+
wait_handles.clear();
|
336
|
+
for (auto const& pipe : pipes) {
|
337
|
+
if (pipe.handle == INVALID_HANDLE_VALUE || !pipe.pending) {
|
338
|
+
continue;
|
339
|
+
}
|
340
|
+
wait_handles.push_back(pipe.event);
|
341
|
+
}
|
342
|
+
|
343
|
+
// If no wait handles, then we're done processing
|
344
|
+
if (wait_handles.empty()) {
|
345
|
+
return;
|
346
|
+
}
|
347
|
+
|
348
|
+
if (timeout) {
|
349
|
+
wait_handles.push_back(timer);
|
350
|
+
}
|
351
|
+
|
352
|
+
// Wait for data (and, optionally, timeout)
|
353
|
+
auto result = WaitForMultipleObjects(wait_handles.size(), wait_handles.data(), FALSE, INFINITE);
|
354
|
+
if (result >= (WAIT_OBJECT_0 + wait_handles.size())) {
|
355
|
+
LOG_ERROR("failed to wait for child process i/o: {1}.", windows::system_error());
|
356
|
+
throw execution_exception(_("failed to wait for child process i/o."));
|
357
|
+
}
|
358
|
+
|
359
|
+
// Check for timeout
|
360
|
+
DWORD index = result - WAIT_OBJECT_0;
|
361
|
+
if (timeout && wait_handles[index] == timer) {
|
362
|
+
throw timeout_exception(_("command timed out after {1} seconds.", timeout), static_cast<size_t>(child));
|
363
|
+
}
|
364
|
+
|
365
|
+
// Find the pipe for the event that was signalled
|
366
|
+
for (auto& pipe : pipes) {
|
367
|
+
if (pipe.handle == INVALID_HANDLE_VALUE || !pipe.pending || pipe.event != wait_handles[index]) {
|
368
|
+
continue;
|
369
|
+
}
|
370
|
+
|
371
|
+
// Pipe is no longer pending
|
372
|
+
pipe.pending = false;
|
373
|
+
|
374
|
+
// Get the overlapped result and process it
|
375
|
+
DWORD count = 0;
|
376
|
+
if (!GetOverlappedResult(pipe.handle, &pipe.overlapped, &count, FALSE)) {
|
377
|
+
if (GetLastError() != ERROR_BROKEN_PIPE) {
|
378
|
+
LOG_ERROR("asynchronous i/o on {1} failed: {2}.", pipe.name, windows::system_error());
|
379
|
+
throw execution_exception(_("asynchronous i/o failed."));
|
380
|
+
}
|
381
|
+
// Treat a broken pipe as nothing left to read
|
382
|
+
count = 0;
|
383
|
+
}
|
384
|
+
// Check for closed pipe
|
385
|
+
if (count == 0) {
|
386
|
+
pipe.handle = {};
|
387
|
+
break;
|
388
|
+
}
|
389
|
+
|
390
|
+
if (pipe.read) {
|
391
|
+
// Read completed, process the data
|
392
|
+
pipe.buffer.resize(count);
|
393
|
+
if (convert_newlines) {
|
394
|
+
pipe.buffer.erase(
|
395
|
+
std::remove(pipe.buffer.begin(), pipe.buffer.end(), '\r'),
|
396
|
+
pipe.buffer.end());
|
397
|
+
}
|
398
|
+
if (!pipe.callback(pipe.buffer)) {
|
399
|
+
// Callback signaled that we're done
|
400
|
+
return;
|
401
|
+
}
|
402
|
+
} else {
|
403
|
+
// Register written data
|
404
|
+
pipe.buffer.erase(0, count);
|
405
|
+
}
|
406
|
+
break;
|
407
|
+
}
|
408
|
+
}
|
409
|
+
}
|
410
|
+
|
411
|
+
result execute(
|
412
|
+
string const& file,
|
413
|
+
vector<string> const* arguments,
|
414
|
+
string const* input,
|
415
|
+
map<string, string> const* environment,
|
416
|
+
function<void(size_t)> const& pid_callback,
|
417
|
+
function<bool(string&)> const& stdout_callback,
|
418
|
+
function<bool(string&)> const& stderr_callback,
|
419
|
+
option_set<execution_options> const& options,
|
420
|
+
uint32_t timeout)
|
421
|
+
{
|
422
|
+
// Since we use a job object in the windows world, we want to
|
423
|
+
// be sure we're not in a job object, or at least able to
|
424
|
+
// break our processes out if we are in one.
|
425
|
+
BOOL in_job;
|
426
|
+
bool use_job_object = true;
|
427
|
+
if (!IsProcessInJob(GetCurrentProcess(), nullptr, &in_job)) {
|
428
|
+
throw execution_exception(_("could not determine if the parent process is running in a job object"));
|
429
|
+
}
|
430
|
+
if (in_job) {
|
431
|
+
JOBOBJECT_BASIC_LIMIT_INFORMATION limits;
|
432
|
+
if (!QueryInformationJobObject(nullptr, JobObjectBasicLimitInformation, &limits, sizeof(limits), nullptr)
|
433
|
+
|| !(limits.LimitFlags & JOB_OBJECT_LIMIT_BREAKAWAY_OK)) { // short-circuits if QueryInformationJobObject fails
|
434
|
+
use_job_object = false;
|
435
|
+
}
|
436
|
+
}
|
437
|
+
|
438
|
+
// Search for the executable
|
439
|
+
string executable = which(file);
|
440
|
+
log_execution(executable.empty() ? file : executable, arguments);
|
441
|
+
if (executable.empty()) {
|
442
|
+
LOG_DEBUG("{1} was not found on the PATH.", file);
|
443
|
+
if (options[execution_options::throw_on_nonzero_exit]) {
|
444
|
+
throw child_exit_exception(_("child process returned non-zero exit status."), 127, {}, {});
|
445
|
+
}
|
446
|
+
return {false, "", "", 127, 0};
|
447
|
+
}
|
448
|
+
|
449
|
+
// Setup the execution environment
|
450
|
+
vector<wchar_t> modified_environ;
|
451
|
+
vector<scoped_env> scoped_environ;
|
452
|
+
if (options[execution_options::merge_environment]) {
|
453
|
+
// Modify the existing environment, then restore it after. There's no way to modify environment variables
|
454
|
+
// after the child has started. An alternative would be to use GetEnvironmentStrings and add/modify the block,
|
455
|
+
// but searching for and modifying existing environment strings to update would be cumbersome in that form.
|
456
|
+
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009(v=vs.85).aspx
|
457
|
+
if (!options[execution_options::inherit_locale]) {
|
458
|
+
// Unless inherit_locale is specified, override with a C locale to ensure consistent behavior from
|
459
|
+
// command-line tools.
|
460
|
+
if (!environment || environment->count("LC_ALL") == 0) {
|
461
|
+
scoped_environ.emplace_back("LC_ALL", "C");
|
462
|
+
}
|
463
|
+
if (!environment || environment->count("LANG") == 0) {
|
464
|
+
scoped_environ.emplace_back("LANG", "C");
|
465
|
+
}
|
466
|
+
}
|
467
|
+
if (environment) {
|
468
|
+
for (auto const& kv : *environment) {
|
469
|
+
// Use scoped_env to save the old state and restore it on return.
|
470
|
+
LOG_DEBUG("child environment {1}={2}", kv.first, kv.second);
|
471
|
+
scoped_environ.emplace_back(kv.first, kv.second);
|
472
|
+
}
|
473
|
+
}
|
474
|
+
} else {
|
475
|
+
// We aren't inheriting the environment, so create an environment block instead of changing existing env.
|
476
|
+
// Environment variables must be sorted alphabetically and case-insensitive,
|
477
|
+
// so copy them all into the same map with case-insensitive key compare:
|
478
|
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009(v=vs.85).aspx
|
479
|
+
map<string, string, bool(*)(string const&, string const&)> sortedEnvironment(
|
480
|
+
[](string const& a, string const& b) { return ilexicographical_compare(a, b); });
|
481
|
+
if (environment) {
|
482
|
+
sortedEnvironment.insert(environment->begin(), environment->end());
|
483
|
+
}
|
484
|
+
|
485
|
+
// Insert LANG and LC_ALL if they aren't already present. Emplace ensures this behavior.
|
486
|
+
string locale_env;
|
487
|
+
if (options[execution_options::inherit_locale] && environment::get("LC_ALL", locale_env)) {
|
488
|
+
sortedEnvironment.emplace("LC_ALL", locale_env);
|
489
|
+
} else if (!options[execution_options::inherit_locale]) {
|
490
|
+
sortedEnvironment.emplace("LC_ALL", "C");
|
491
|
+
}
|
492
|
+
if (options[execution_options::inherit_locale] && environment::get("LANG", locale_env)) {
|
493
|
+
sortedEnvironment.emplace("LANG", locale_env);
|
494
|
+
} else if (!options[execution_options::inherit_locale]) {
|
495
|
+
sortedEnvironment.emplace("LANG", "C");
|
496
|
+
}
|
497
|
+
|
498
|
+
// An environment block is a NULL-terminated list of NULL-terminated strings.
|
499
|
+
for (auto const& variable : sortedEnvironment) {
|
500
|
+
LOG_DEBUG("child environment {1}={2}", variable.first, variable.second);
|
501
|
+
string var = variable.first + "=" + variable.second;
|
502
|
+
for (auto c : boost::nowide::widen(var)) {
|
503
|
+
modified_environ.push_back(c);
|
504
|
+
}
|
505
|
+
modified_environ.push_back(L'\0');
|
506
|
+
}
|
507
|
+
modified_environ.push_back(L'\0');
|
508
|
+
if (sortedEnvironment.empty()) {
|
509
|
+
// The environment block is terminated by two nulls, so if the environment is
|
510
|
+
// empty add a second one.
|
511
|
+
modified_environ.push_back(L'\0');
|
512
|
+
}
|
513
|
+
}
|
514
|
+
|
515
|
+
// Execute the command, reading the results into a buffer until there's no more to read.
|
516
|
+
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
|
517
|
+
// for details on redirecting input/output.
|
518
|
+
scoped_handle stdInRd, stdInWr;
|
519
|
+
tie(stdInRd, stdInWr) = CreatePipeThrow();
|
520
|
+
if (!SetHandleInformation(stdInWr, HANDLE_FLAG_INHERIT, 0)) {
|
521
|
+
throw execution_exception(_("pipe could not be modified"));
|
522
|
+
}
|
523
|
+
|
524
|
+
scoped_handle stdOutRd, stdOutWr;
|
525
|
+
tie(stdOutRd, stdOutWr) = CreatePipeThrow();
|
526
|
+
if (!SetHandleInformation(stdOutRd, HANDLE_FLAG_INHERIT, 0)) {
|
527
|
+
throw execution_exception(_("pipe could not be modified"));
|
528
|
+
}
|
529
|
+
|
530
|
+
scoped_handle stdErrRd, stdErrWr;
|
531
|
+
if (!options[execution_options::redirect_stderr_to_stdout]) {
|
532
|
+
// If redirecting to null, open the "NUL" device and inherit the handle
|
533
|
+
if (options[execution_options::redirect_stderr_to_null]) {
|
534
|
+
SECURITY_ATTRIBUTES attributes = {};
|
535
|
+
attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
|
536
|
+
attributes.bInheritHandle = TRUE;
|
537
|
+
stdErrWr = scoped_handle(CreateFileW(L"nul", GENERIC_WRITE, FILE_SHARE_WRITE, &attributes, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr));
|
538
|
+
if (stdErrWr == INVALID_HANDLE_VALUE) {
|
539
|
+
throw execution_exception(_("cannot open NUL device for redirecting stderr."));
|
540
|
+
}
|
541
|
+
} else {
|
542
|
+
// Otherwise, we're reading from stderr, so create a pipe
|
543
|
+
tie(stdErrRd, stdErrWr) = CreatePipeThrow();
|
544
|
+
if (!SetHandleInformation(stdErrRd, HANDLE_FLAG_INHERIT, 0)) {
|
545
|
+
throw execution_exception(_("pipe could not be modified"));
|
546
|
+
}
|
547
|
+
}
|
548
|
+
}
|
549
|
+
|
550
|
+
// Execute the command with arguments. Prefix arguments with the executable, or quoted arguments won't work.
|
551
|
+
auto commandLine = arguments ?
|
552
|
+
boost::nowide::widen(ArgvToCommandLine({ executable }) + " " + ArgvToCommandLine(*arguments, options[execution_options::preserve_arguments])) : L"";
|
553
|
+
|
554
|
+
STARTUPINFO startupInfo = {};
|
555
|
+
startupInfo.cb = sizeof(startupInfo);
|
556
|
+
startupInfo.dwFlags |= STARTF_USESTDHANDLES;
|
557
|
+
startupInfo.hStdInput = stdInRd;
|
558
|
+
startupInfo.hStdOutput = stdOutWr;
|
559
|
+
|
560
|
+
// Set up stderr redirection to out or the pipe (which may be INVALID_HANDLE_VALUE, i.e. "null")
|
561
|
+
if (options[execution_options::redirect_stderr_to_stdout]) {
|
562
|
+
startupInfo.hStdError = stdOutWr;
|
563
|
+
} else {
|
564
|
+
startupInfo.hStdError = stdErrWr;
|
565
|
+
}
|
566
|
+
|
567
|
+
PROCESS_INFORMATION procInfo = {};
|
568
|
+
|
569
|
+
// Set up flags for CreateProcess based on whether the create_detached_process
|
570
|
+
// option was set and the parent process is running in a Job object.
|
571
|
+
auto creation_flags = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
|
572
|
+
|
573
|
+
if (use_job_object) {
|
574
|
+
creation_flags |= CREATE_BREAKAWAY_FROM_JOB;
|
575
|
+
}
|
576
|
+
if (options[execution_options::create_detached_process]) {
|
577
|
+
creation_flags |= CREATE_NEW_PROCESS_GROUP;
|
578
|
+
}
|
579
|
+
|
580
|
+
if (!CreateProcessW(
|
581
|
+
boost::nowide::widen(executable).c_str(),
|
582
|
+
&commandLine[0], /* Pass a modifiable string buffer; the contents may be modified */
|
583
|
+
NULL, /* Don't allow child process to inherit process handle */
|
584
|
+
NULL, /* Don't allow child process to inherit thread handle */
|
585
|
+
TRUE, /* Inherit handles from the calling process for communication */
|
586
|
+
creation_flags,
|
587
|
+
options[execution_options::merge_environment] ? NULL : modified_environ.data(),
|
588
|
+
NULL, /* Use existing current directory */
|
589
|
+
&startupInfo, /* STARTUPINFO for child process */
|
590
|
+
&procInfo)) { /* PROCESS_INFORMATION pointer for output */
|
591
|
+
LOG_ERROR("failed to create process: {1}.", windows::system_error());
|
592
|
+
throw execution_exception(_("failed to create child process."));
|
593
|
+
}
|
594
|
+
|
595
|
+
// Release unused pipes, to avoid any races in process completion.
|
596
|
+
if (!input) {
|
597
|
+
stdInWr.release();
|
598
|
+
}
|
599
|
+
stdInRd.release();
|
600
|
+
stdOutWr.release();
|
601
|
+
stdErrWr.release();
|
602
|
+
|
603
|
+
scoped_handle hProcess(procInfo.hProcess);
|
604
|
+
scoped_handle hThread(procInfo.hThread);
|
605
|
+
|
606
|
+
// Use a Job Object to group any child processes spawned by the CreateProcess invocation, so we can
|
607
|
+
// easily stop them in case of a timeout.
|
608
|
+
bool create_job_object = use_job_object && !options[execution_options::create_detached_process];
|
609
|
+
scoped_handle hJob;
|
610
|
+
if (create_job_object) {
|
611
|
+
hJob = scoped_handle(CreateJobObjectW(nullptr, nullptr));
|
612
|
+
if (hJob == NULL) {
|
613
|
+
LOG_ERROR("failed to create job object: {1}.", windows::system_error());
|
614
|
+
throw execution_exception(_("failed to create job object."));
|
615
|
+
} else if (!AssignProcessToJobObject(hJob, hProcess)) {
|
616
|
+
LOG_ERROR("failed to associate process with job object: {1}.", windows::system_error());
|
617
|
+
throw execution_exception(_("failed to associate process with job object."));
|
618
|
+
}
|
619
|
+
}
|
620
|
+
|
621
|
+
bool terminate = true;
|
622
|
+
scope_exit reaper([&]() {
|
623
|
+
if (terminate) {
|
624
|
+
// Terminate the process on an exception
|
625
|
+
if (create_job_object) {
|
626
|
+
if (!TerminateJobObject(hJob, -1)) {
|
627
|
+
LOG_ERROR("failed to terminate process: {1}.", windows::system_error());
|
628
|
+
}
|
629
|
+
} else {
|
630
|
+
LOG_WARNING("could not terminate process {1} because a job object could not be used.", procInfo.dwProcessId);
|
631
|
+
}
|
632
|
+
}
|
633
|
+
});
|
634
|
+
|
635
|
+
// Create a waitable timer if given a timeout
|
636
|
+
scoped_handle timer;
|
637
|
+
if (timeout) {
|
638
|
+
timer = scoped_handle(CreateWaitableTimer(nullptr, TRUE, nullptr));
|
639
|
+
if (!timer) {
|
640
|
+
LOG_ERROR("failed to create waitable timer: {1}.", windows::system_error());
|
641
|
+
throw execution_exception(_("failed to create waitable timer."));
|
642
|
+
}
|
643
|
+
|
644
|
+
// "timeout" in X intervals in the future (1 interval = 100 ns)
|
645
|
+
// The negative value indicates relative to the current time
|
646
|
+
LARGE_INTEGER future;
|
647
|
+
future.QuadPart = timeout * -10000000ll;
|
648
|
+
if (!SetWaitableTimer(timer, &future, 0, nullptr, nullptr, FALSE)) {
|
649
|
+
LOG_ERROR("failed to set waitable timer: {1}.", windows::system_error());
|
650
|
+
throw execution_exception(_("failed to set waitable timer."));
|
651
|
+
}
|
652
|
+
}
|
653
|
+
|
654
|
+
// Execute the PID callback
|
655
|
+
if (pid_callback) {
|
656
|
+
pid_callback(procInfo.dwProcessId);
|
657
|
+
}
|
658
|
+
|
659
|
+
string output, error;
|
660
|
+
tie(output, error) = process_streams(options[execution_options::trim_output], stdout_callback, stderr_callback, [&](function<bool(string const&)> const& process_stdout, function<bool(string const&)> const& process_stderr) {
|
661
|
+
// Read the child output
|
662
|
+
array<pipe, 3> pipes = { {
|
663
|
+
input ? pipe("stdin", move(stdInWr), *input) : pipe("stdin", {}, ""),
|
664
|
+
pipe("stdout", move(stdOutRd), process_stdout),
|
665
|
+
pipe("stderr", move(stdErrRd), process_stderr)
|
666
|
+
} };
|
667
|
+
|
668
|
+
rw_from_child(procInfo.dwProcessId, pipes, timeout, timer, options[execution_options::convert_newlines]);
|
669
|
+
});
|
670
|
+
|
671
|
+
HANDLE handles[2] = { hProcess, timer };
|
672
|
+
auto wait_result = WaitForMultipleObjects(timeout ? 2 : 1, handles, FALSE, INFINITE);
|
673
|
+
if (wait_result == WAIT_OBJECT_0) {
|
674
|
+
// Process has terminated
|
675
|
+
terminate = false;
|
676
|
+
} else if (wait_result == WAIT_OBJECT_0 + 1) {
|
677
|
+
// Timeout while waiting on the process to complete
|
678
|
+
throw timeout_exception(_("command timed out after {1} seconds.", timeout), static_cast<size_t>(procInfo.dwProcessId));
|
679
|
+
} else {
|
680
|
+
LOG_ERROR("failed to wait for child process to terminate: {1}.", windows::system_error());
|
681
|
+
throw execution_exception(_("failed to wait for child process to terminate."));
|
682
|
+
}
|
683
|
+
|
684
|
+
// Now check the process return status.
|
685
|
+
DWORD exit_code;
|
686
|
+
if (!GetExitCodeProcess(hProcess, &exit_code)) {
|
687
|
+
throw execution_exception(_("error retrieving exit code of completed process"));
|
688
|
+
}
|
689
|
+
|
690
|
+
LOG_DEBUG("process exited with exit code {1}.", exit_code);
|
691
|
+
|
692
|
+
if (exit_code != 0 && options[execution_options::throw_on_nonzero_exit]) {
|
693
|
+
throw child_exit_exception(_("child process returned non-zero exit status."), exit_code, output, error);
|
694
|
+
}
|
695
|
+
return {exit_code == 0, move(output), move(error), static_cast<int>(exit_code), static_cast<size_t>(procInfo.dwProcessId)};
|
696
|
+
}
|
697
|
+
|
698
|
+
}} // namespace leatherman::execution
|