puppet 6.15.0-x64-mingw32 → 6.19.1-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -7
- data/Gemfile +4 -2
- data/Gemfile.lock +29 -27
- data/README.md +3 -4
- data/Rakefile +4 -12
- data/lib/puppet.rb +32 -8
- data/lib/puppet/agent.rb +18 -4
- data/lib/puppet/agent/locker.rb +0 -7
- data/lib/puppet/application/agent.rb +23 -8
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/ssl.rb +1 -1
- data/lib/puppet/configurer.rb +61 -21
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/confine.rb +2 -2
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +119 -39
- data/lib/puppet/environments.rb +51 -10
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/config.rb +46 -16
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/node.rb +3 -3
- data/lib/puppet/face/node/clean.rb +2 -2
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/face/status.rb +1 -1
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_bucket/dipper.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +4 -4
- data/lib/puppet/file_system/uniquefile.rb +12 -16
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/new.rb +8 -3
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/http.rb +1 -0
- data/lib/puppet/http/client.rb +28 -12
- data/lib/puppet/http/external_client.rb +0 -6
- data/lib/puppet/http/redirector.rb +9 -7
- data/lib/puppet/http/resolver.rb +5 -8
- data/lib/puppet/http/resolver/server_list.rb +18 -36
- data/lib/puppet/http/resolver/settings.rb +4 -4
- data/lib/puppet/http/resolver/srv.rb +5 -5
- data/lib/puppet/http/response.rb +19 -0
- data/lib/puppet/http/service.rb +3 -1
- data/lib/puppet/http/service/compiler.rb +1 -1
- data/lib/puppet/http/service/file_server.rb +1 -1
- data/lib/puppet/http/service/puppetserver.rb +39 -0
- data/lib/puppet/http/session.rb +5 -4
- data/lib/puppet/indirector.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/facts/yaml.rb +1 -1
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_content/rest.rb +1 -1
- data/lib/puppet/indirector/file_metadata/http.rb +28 -8
- data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/indirector/request.rb +5 -5
- data/lib/puppet/indirector/rest.rb +7 -1
- data/lib/puppet/indirector/yaml.rb +1 -1
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/connection_adapter.rb +184 -0
- data/lib/puppet/network/http/nocache_pool.rb +1 -0
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/network/http_pool.rb +2 -2
- data/lib/puppet/node/environment.rb +12 -5
- data/lib/puppet/node/facts.rb +17 -0
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +31 -4
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
- data/lib/puppet/parser/compiler.rb +29 -26
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +21 -17
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +18 -11
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- data/lib/puppet/pops/validation/checker4_0.rb +29 -15
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +38 -1
- data/lib/puppet/provider/package/aptitude.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +24 -4
- data/lib/puppet/provider/package/dpkg.rb +1 -1
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/pip.rb +60 -37
- data/lib/puppet/provider/package/pip2.rb +17 -0
- data/lib/puppet/provider/package/portage.rb +2 -2
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
- data/lib/puppet/provider/package/yum.rb +9 -1
- data/lib/puppet/provider/package/zypper.rb +62 -1
- data/lib/puppet/provider/service/systemd.rb +21 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +16 -5
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/reports/http.rb +7 -3
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/rest/route.rb +2 -2
- data/lib/puppet/runtime.rb +25 -2
- data/lib/puppet/settings.rb +43 -6
- data/lib/puppet/ssl/ssl_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- data/lib/puppet/ssl/state_machine.rb +33 -8
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +19 -14
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +12 -8
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +15 -7
- data/lib/puppet/type/file.rb +40 -15
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +33 -13
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/package.rb +16 -1
- data/lib/puppet/type/service.rb +59 -8
- data/lib/puppet/type/user.rb +19 -10
- data/lib/puppet/util.rb +41 -3
- data/lib/puppet/util/autoload.rb +10 -25
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/connection.rb +8 -8
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/log/destinations.rb +1 -10
- data/lib/puppet/util/package/version/range.rb +4 -1
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/run_mode.rb +5 -1
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/api_types.rb +60 -33
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +4 -4
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/user.rb +242 -8
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +541 -427
- data/man/man5/puppet.conf.5 +84 -19
- data/man/man8/puppet-agent.8 +7 -4
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +6 -6
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +4 -4
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +2 -2
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
- data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/integration/application/agent_spec.rb +202 -52
- data/spec/integration/application/apply_spec.rb +149 -149
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +70 -21
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +75 -2
- data/spec/integration/configurer_spec.rb +14 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/defaults_spec.rb +27 -3
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/http/client_spec.rb +6 -1
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/network/http_pool_spec.rb +73 -0
- data/spec/integration/node/environment_spec.rb +1 -1
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/adsi_spec.rb +7 -2
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +47 -5
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet_spec/https.rb +6 -0
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +8 -0
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +47 -1
- data/spec/unit/application/agent_spec.rb +7 -8
- data/spec/unit/application/doc_spec.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +41 -10
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/application_spec.rb +9 -4
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +4 -4
- data/spec/unit/configurer_spec.rb +86 -37
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/environments_spec.rb +99 -32
- data/spec/unit/face/config_spec.rb +59 -1
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/node_spec.rb +2 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +29 -0
- data/spec/unit/file_system_spec.rb +1 -2
- data/spec/unit/http/client_spec.rb +74 -19
- data/spec/unit/http/external_client_spec.rb +9 -9
- data/spec/unit/http/resolver_spec.rb +24 -5
- data/spec/unit/http/response_spec.rb +6 -0
- data/spec/unit/http/service/ca_spec.rb +2 -3
- data/spec/unit/http/service/compiler_spec.rb +2 -3
- data/spec/unit/http/service/file_server_spec.rb +2 -3
- data/spec/unit/http/service/puppetserver_spec.rb +82 -0
- data/spec/unit/http/service/report_spec.rb +2 -3
- data/spec/unit/http/service_spec.rb +0 -1
- data/spec/unit/http/session_spec.rb +8 -21
- data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
- data/spec/unit/indirector/catalog/json_spec.rb +1 -1
- data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
- data/spec/unit/indirector/facts/rest_spec.rb +1 -1
- data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
- data/spec/unit/indirector/json_spec.rb +8 -8
- data/spec/unit/indirector/msgpack_spec.rb +8 -8
- data/spec/unit/indirector/node/rest_spec.rb +1 -1
- data/spec/unit/indirector/request_spec.rb +5 -5
- data/spec/unit/indirector/rest_spec.rb +14 -1
- data/spec/unit/indirector/status/rest_spec.rb +1 -1
- data/spec/unit/indirector/yaml_spec.rb +7 -7
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
- data/spec/unit/network/http/connection_spec.rb +552 -190
- data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/node/environment_spec.rb +18 -1
- data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- data/spec/unit/provider/exec_spec.rb +4 -3
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +77 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
- data/spec/unit/provider/package/dpkg_spec.rb +22 -7
- data/spec/unit/provider/package/openbsd_spec.rb +2 -0
- data/spec/unit/provider/package/pip2_spec.rb +36 -0
- data/spec/unit/provider/package/pip_spec.rb +42 -16
- data/spec/unit/provider/package/portage_spec.rb +5 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
- data/spec/unit/provider/package/yum_spec.rb +47 -8
- data/spec/unit/provider/package/zypper_spec.rb +98 -0
- data/spec/unit/provider/service/base_spec.rb +2 -4
- data/spec/unit/provider/service/bsd_spec.rb +5 -1
- data/spec/unit/provider/service/daemontools_spec.rb +1 -1
- data/spec/unit/provider/service/debian_spec.rb +3 -5
- data/spec/unit/provider/service/freebsd_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +4 -5
- data/spec/unit/provider/service/init_spec.rb +46 -5
- data/spec/unit/provider/service/launchd_spec.rb +5 -6
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openrc_spec.rb +4 -5
- data/spec/unit/provider/service/openwrt_spec.rb +2 -1
- data/spec/unit/provider/service/redhat_spec.rb +10 -1
- data/spec/unit/provider/service/runit_spec.rb +2 -1
- data/spec/unit/provider/service/smf_spec.rb +1 -1
- data/spec/unit/provider/service/src_spec.rb +3 -5
- data/spec/unit/provider/service/systemd_spec.rb +87 -19
- data/spec/unit/provider/service/upstart_spec.rb +4 -5
- data/spec/unit/provider/service/windows_spec.rb +50 -14
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +30 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
- data/spec/unit/puppet_pal_2pec.rb +40 -0
- data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
- data/spec/unit/puppet_spec.rb +33 -0
- data/spec/unit/reports/http_spec.rb +1 -1
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/resource_spec.rb +3 -3
- data/spec/unit/rest/route_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +182 -22
- data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +52 -8
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/transaction/report_spec.rb +3 -1
- data/spec/unit/type/file/source_spec.rb +4 -4
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/filebucket_spec.rb +1 -1
- data/spec/unit/type/service_spec.rb +218 -8
- data/spec/unit/type/user_spec.rb +32 -3
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/command_line_spec.rb +11 -6
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/range_spec.rb +22 -1
- data/spec/unit/util/run_mode_spec.rb +6 -6
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/manpages.rake +5 -35
- metadata +43 -49
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -51
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/integration/test/test_helper_spec.rb +0 -31
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
    
        data/lib/puppet/util/autoload.rb
    CHANGED
    
    | @@ -10,11 +10,20 @@ require 'puppet/concurrent/synchronized' | |
| 10 10 | 
             
            # @api private
         | 
| 11 11 | 
             
            class Puppet::Util::ModuleDirectoriesAdapter < Puppet::Pops::Adaptable::Adapter
         | 
| 12 12 | 
             
              attr_accessor :directories
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def self.create_adapter(env)
         | 
| 15 | 
            +
                adapter = super(env)
         | 
| 16 | 
            +
                adapter.directories = env.modulepath.flat_map do |dir|
         | 
| 17 | 
            +
                  Dir.glob(File.join(dir, '*', 'lib'))
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                adapter
         | 
| 20 | 
            +
              end
         | 
| 13 21 | 
             
            end
         | 
| 14 22 |  | 
| 15 23 | 
             
            # Autoload paths, either based on names or all at once.
         | 
| 16 24 | 
             
            class Puppet::Util::Autoload
         | 
| 17 25 | 
             
              include Puppet::Concurrent::Synchronized
         | 
| 26 | 
            +
              extend Puppet::Concurrent::Synchronized
         | 
| 18 27 |  | 
| 19 28 | 
             
              @loaded = {}
         | 
| 20 29 |  | 
| @@ -118,26 +127,7 @@ class Puppet::Util::Autoload | |
| 118 127 | 
             
                def module_directories(env)
         | 
| 119 128 | 
             
                  raise ArgumentError, "Autoloader requires an environment" unless env
         | 
| 120 129 |  | 
| 121 | 
            -
                  Puppet::Util::ModuleDirectoriesAdapter.adapt(env) | 
| 122 | 
            -
                    a.directories ||= env.modulepath.collect do |dir|
         | 
| 123 | 
            -
                      Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f, "lib") }
         | 
| 124 | 
            -
                    end.flatten.find_all do |d|
         | 
| 125 | 
            -
                      FileTest.directory?(d)
         | 
| 126 | 
            -
                    end
         | 
| 127 | 
            -
                  end.directories
         | 
| 128 | 
            -
                end
         | 
| 129 | 
            -
             | 
| 130 | 
            -
                # @api private
         | 
| 131 | 
            -
                def vendored_modules
         | 
| 132 | 
            -
                  dir = Puppet[:vendormoduledir]
         | 
| 133 | 
            -
                  if dir && File.directory?(dir)
         | 
| 134 | 
            -
                    Dir.entries(dir)
         | 
| 135 | 
            -
                      .reject { |f| f =~ /^\./ }
         | 
| 136 | 
            -
                      .collect { |f| File.join(dir, f, "lib") }
         | 
| 137 | 
            -
                      .find_all { |d| FileTest.directory?(d) }
         | 
| 138 | 
            -
                  else
         | 
| 139 | 
            -
                    []
         | 
| 140 | 
            -
                  end
         | 
| 130 | 
            +
                  Puppet::Util::ModuleDirectoriesAdapter.adapt(env).directories
         | 
| 141 131 | 
             
                end
         | 
| 142 132 |  | 
| 143 133 | 
             
                # @api private
         | 
| @@ -167,11 +157,6 @@ class Puppet::Util::Autoload | |
| 167 157 | 
             
                  # "app_defaults_initialized?" method on the main puppet Settings object.
         | 
| 168 158 | 
             
                  # --cprice 2012-03-16
         | 
| 169 159 | 
             
                  if Puppet.settings.app_defaults_initialized?
         | 
| 170 | 
            -
                    unless @initialized
         | 
| 171 | 
            -
                      $LOAD_PATH.unshift(Puppet[:libdir])
         | 
| 172 | 
            -
                      $LOAD_PATH.concat(vendored_modules)
         | 
| 173 | 
            -
                      @initialized = true
         | 
| 174 | 
            -
                    end
         | 
| 175 160 | 
             
                    gem_directories + module_directories(env) + $LOAD_PATH
         | 
| 176 161 | 
             
                  else
         | 
| 177 162 | 
             
                    gem_directories + $LOAD_PATH
         | 
| @@ -19,8 +19,9 @@ module Puppet::Util::CharacterEncoding | |
| 19 19 | 
             
                  begin
         | 
| 20 20 | 
             
                    if original_encoding == Encoding::UTF_8
         | 
| 21 21 | 
             
                      if !string_copy.valid_encoding?
         | 
| 22 | 
            -
                        Puppet.debug | 
| 23 | 
            -
                          { value: string.dump } | 
| 22 | 
            +
                        Puppet.debug {
         | 
| 23 | 
            +
                          _("%{value} is already labeled as UTF-8 but this encoding is invalid. It cannot be transcoded by Puppet.") % { value: string.dump }
         | 
| 24 | 
            +
                        }
         | 
| 24 25 | 
             
                      end
         | 
| 25 26 | 
             
                      # String is already valid UTF-8 - noop
         | 
| 26 27 | 
             
                      return string_copy
         | 
| @@ -40,8 +41,9 @@ module Puppet::Util::CharacterEncoding | |
| 40 41 | 
             
                    # Catch both our own self-determined failure to transcode as well as any
         | 
| 41 42 | 
             
                    # error on ruby's part, ie Encoding::UndefinedConversionError on a
         | 
| 42 43 | 
             
                    # failure to encode!.
         | 
| 43 | 
            -
                    Puppet.debug | 
| 44 | 
            -
                      { error: detail.inspect, value: string.dump } | 
| 44 | 
            +
                    Puppet.debug {
         | 
| 45 | 
            +
                      _("%{error}: %{value} cannot be transcoded by Puppet.") % { error: detail.inspect, value: string.dump }
         | 
| 46 | 
            +
                    }
         | 
| 45 47 | 
             
                    return string_copy
         | 
| 46 48 | 
             
                  end
         | 
| 47 49 | 
             
                end
         | 
| @@ -67,7 +69,9 @@ module Puppet::Util::CharacterEncoding | |
| 67 69 | 
             
                  if string_copy.force_encoding(Encoding::UTF_8).valid_encoding?
         | 
| 68 70 | 
             
                    return string_copy
         | 
| 69 71 | 
             
                  else
         | 
| 70 | 
            -
                    Puppet.debug | 
| 72 | 
            +
                    Puppet.debug {
         | 
| 73 | 
            +
                      _("%{value} is not valid UTF-8 and result of overriding encoding would be invalid.") % { value: string.dump }
         | 
| 74 | 
            +
                    }
         | 
| 71 75 | 
             
                    # Set copy back to its original encoding before returning
         | 
| 72 76 | 
             
                    return string_copy.force_encoding(original_encoding)
         | 
| 73 77 | 
             
                  end
         | 
| @@ -7,11 +7,26 @@ require 'time' | |
| 7 7 | 
             
            module Puppet::Util::Checksums
         | 
| 8 8 | 
             
              module_function
         | 
| 9 9 |  | 
| 10 | 
            +
              KNOWN_CHECKSUMS = [
         | 
| 11 | 
            +
                :sha256, :sha256lite,
         | 
| 12 | 
            +
                :md5, :md5lite,
         | 
| 13 | 
            +
                :sha1, :sha1lite,
         | 
| 14 | 
            +
                :sha512,
         | 
| 15 | 
            +
                :sha384,
         | 
| 16 | 
            +
                :sha224,
         | 
| 17 | 
            +
                :mtime, :ctime, :none
         | 
| 18 | 
            +
              ].freeze
         | 
| 19 | 
            +
             | 
| 10 20 | 
             
              # It's not a good idea to use some of these in some contexts: for example, I
         | 
| 11 21 | 
             
              # wouldn't try bucketing a file using the :none checksum type.
         | 
| 12 22 | 
             
              def known_checksum_types
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
             | 
| 23 | 
            +
                KNOWN_CHECKSUMS
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def valid_checksum?(type, value)
         | 
| 27 | 
            +
                !!send("#{type}?", value)
         | 
| 28 | 
            +
              rescue NoMethodError
         | 
| 29 | 
            +
                false
         | 
| 15 30 | 
             
              end
         | 
| 16 31 |  | 
| 17 32 | 
             
              class FakeChecksum
         | 
| @@ -223,7 +238,7 @@ module Puppet::Util::Checksums | |
| 223 238 |  | 
| 224 239 | 
             
              # Return the :mtime timestamp of a file.
         | 
| 225 240 | 
             
              def mtime_file(filename)
         | 
| 226 | 
            -
                Puppet::FileSystem.stat(filename). | 
| 241 | 
            +
                Puppet::FileSystem.stat(filename).mtime
         | 
| 227 242 | 
             
              end
         | 
| 228 243 |  | 
| 229 244 | 
             
              # by definition this doesn't exist
         | 
| @@ -293,7 +308,7 @@ module Puppet::Util::Checksums | |
| 293 308 |  | 
| 294 309 | 
             
              # Return the :ctime of a file.
         | 
| 295 310 | 
             
              def ctime_file(filename)
         | 
| 296 | 
            -
                Puppet::FileSystem.stat(filename). | 
| 311 | 
            +
                Puppet::FileSystem.stat(filename).ctime
         | 
| 297 312 | 
             
              end
         | 
| 298 313 |  | 
| 299 314 | 
             
              def ctime_stream(&block)
         | 
| @@ -8,7 +8,7 @@ module Puppet::Util | |
| 8 8 | 
             
                # The logic for server and port is kind of gross. In summary:
         | 
| 9 9 | 
             
                # IF an endpoint-specific setting is requested AND that setting has been set by the user
         | 
| 10 10 | 
             
                #    Use that setting.
         | 
| 11 | 
            -
                #         The defaults for these settings are the "normal" server/ | 
| 11 | 
            +
                #         The defaults for these settings are the "normal" server/serverport settings, so
         | 
| 12 12 | 
             
                #         when they are unset we instead want to "fall back" to the failover-selected
         | 
| 13 13 | 
             
                #         host/port pair.
         | 
| 14 14 | 
             
                # ELSE IF we have a failover-selected host/port
         | 
| @@ -17,7 +17,7 @@ module Puppet::Util | |
| 17 17 | 
             
                #    Use the first entry - failover hasn't happened yet, but that
         | 
| 18 18 | 
             
                #    setting is still authoritative
         | 
| 19 19 | 
             
                # ELSE
         | 
| 20 | 
            -
                #    Go for the legacy server/ | 
| 20 | 
            +
                #    Go for the legacy server/serverport settings, and hope for the best
         | 
| 21 21 |  | 
| 22 22 | 
             
                # Determines which server to use based on the specified setting, taking into
         | 
| 23 23 | 
             
                # account HA fallback from server_list.
         | 
| @@ -55,7 +55,7 @@ module Puppet::Util | |
| 55 55 | 
             
                # @param [Symbol] server_setting The server setting assoicated with this route.
         | 
| 56 56 | 
             
                # @return [Integer] the port to use for use in the request
         | 
| 57 57 | 
             
                def self.determine_port(port_setting, server_setting)
         | 
| 58 | 
            -
                  if (port_setting && port_setting != : | 
| 58 | 
            +
                  if (port_setting && port_setting != :serverport && Puppet.settings.set_by_config?(port_setting)) ||
         | 
| 59 59 | 
             
                     (server_setting && server_setting != :server && Puppet.settings.set_by_config?(server_setting))
         | 
| 60 60 | 
             
                    debug_once _("Selected port from the %{setting} setting: %{port}") % {setting: port_setting, port: Puppet.settings[port_setting].to_i}
         | 
| 61 61 | 
             
                    Puppet.settings[port_setting].to_i
         | 
| @@ -65,18 +65,18 @@ module Puppet::Util | |
| 65 65 | 
             
                      if primary_server
         | 
| 66 66 | 
             
                        # Port might not be set, so we want to fallback in that
         | 
| 67 67 | 
             
                        # case. We know we don't need to use `setting` here, since
         | 
| 68 | 
            -
                        # the default value of every port setting is ` | 
| 68 | 
            +
                        # the default value of every port setting is `serverport`
         | 
| 69 69 | 
             
                        if primary_server[1]
         | 
| 70 70 | 
             
                          #TRANSLATORS 'server_list' is the name of a setting and should not be translated
         | 
| 71 71 | 
             
                          debug_once _("Dynamically-bound port lookup failed; using first entry from the `server_list` setting: %{port}") % {port: primary_server[1]}
         | 
| 72 72 | 
             
                          primary_server[1]
         | 
| 73 73 | 
             
                        else
         | 
| 74 | 
            -
                          #TRANSLATORS ' | 
| 75 | 
            -
                          debug_once _("Dynamically-bound port lookup failed; falling back to ` | 
| 76 | 
            -
                          Puppet.settings[: | 
| 74 | 
            +
                          #TRANSLATORS 'serverport' is the name of a setting and should not be translated
         | 
| 75 | 
            +
                          debug_once _("Dynamically-bound port lookup failed; falling back to `serverport` setting: %{port}") % {port: Puppet.settings[:serverport]}
         | 
| 76 | 
            +
                          Puppet.settings[:serverport]
         | 
| 77 77 | 
             
                        end
         | 
| 78 78 | 
             
                      else
         | 
| 79 | 
            -
                        port_setting ||= : | 
| 79 | 
            +
                        port_setting ||= :serverport
         | 
| 80 80 | 
             
                        debug_once _("Dynamically-bound port lookup failed; falling back to %{setting} setting: %{port}") % {setting: port_setting, port: Puppet.settings[port_setting]}
         | 
| 81 81 | 
             
                        Puppet.settings[port_setting]
         | 
| 82 82 | 
             
                      end
         | 
| @@ -68,7 +68,7 @@ module Puppet::Util::Execution | |
| 68 68 | 
             
                if respond_to? :debug
         | 
| 69 69 | 
             
                  debug "Executing '#{command_str}'"
         | 
| 70 70 | 
             
                else
         | 
| 71 | 
            -
                  Puppet.debug "Executing '#{command_str}'"
         | 
| 71 | 
            +
                  Puppet.debug { "Executing '#{command_str}'" }
         | 
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 74 | 
             
                # force the run of the command with
         | 
| @@ -186,7 +186,7 @@ module Puppet::Util::Execution | |
| 186 186 | 
             
                if respond_to? :debug
         | 
| 187 187 | 
             
                  debug "Executing#{user_log_s}: '#{command_str}'"
         | 
| 188 188 | 
             
                else
         | 
| 189 | 
            -
                  Puppet.debug "Executing#{user_log_s}: '#{command_str}'"
         | 
| 189 | 
            +
                  Puppet.debug { "Executing#{user_log_s}: '#{command_str}'" }
         | 
| 190 190 | 
             
                end
         | 
| 191 191 |  | 
| 192 192 | 
             
                null_file = Puppet::Util::Platform.windows? ? 'NUL' : '/dev/null'
         | 
| @@ -300,7 +300,7 @@ module Puppet::Util::FileParsing | |
| 300 300 | 
             
              def record_line(name, options, &block)
         | 
| 301 301 | 
             
                raise ArgumentError, _("Must include a list of fields") unless options.include?(:fields)
         | 
| 302 302 |  | 
| 303 | 
            -
                record = FileRecord.new(:record, options, &block)
         | 
| 303 | 
            +
                record = FileRecord.new(:record, **options, &block)
         | 
| 304 304 | 
             
                record.name = name.intern
         | 
| 305 305 |  | 
| 306 306 | 
             
                new_line_type(record)
         | 
| @@ -315,7 +315,7 @@ module Puppet::Util::FileParsing | |
| 315 315 | 
             
              def text_line(name, options, &block)
         | 
| 316 316 | 
             
                raise ArgumentError, _("You must provide a :match regex for text lines") unless options.include?(:match)
         | 
| 317 317 |  | 
| 318 | 
            -
                record = FileRecord.new(:text, options, &block)
         | 
| 318 | 
            +
                record = FileRecord.new(:text, **options, &block)
         | 
| 319 319 | 
             
                record.name = name.intern
         | 
| 320 320 |  | 
| 321 321 | 
             
                new_line_type(record)
         | 
| @@ -91,18 +91,9 @@ Puppet::Util::Log.newdesttype :file do | |
| 91 91 | 
             
                  end
         | 
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 | 
            -
                file = File.open(path, | 
| 94 | 
            +
                file = File.open(path, File::WRONLY|File::CREAT|File::APPEND)
         | 
| 95 95 | 
             
                file.puts('[') if need_array_start
         | 
| 96 96 |  | 
| 97 | 
            -
                # Give ownership to the user and group puppet will run as
         | 
| 98 | 
            -
                if Puppet.features.root? && !Puppet::Util::Platform.windows? && !file_exists
         | 
| 99 | 
            -
                  begin
         | 
| 100 | 
            -
                    FileUtils.chown(Puppet[:user], Puppet[:group], path)
         | 
| 101 | 
            -
                  rescue ArgumentError, Errno::EPERM
         | 
| 102 | 
            -
                    Puppet.err _("Unable to set ownership to %{user}:%{group} for log file: %{path}") % { user: Puppet[:user], group: Puppet[:group], path: path }
         | 
| 103 | 
            -
                  end
         | 
| 104 | 
            -
                end
         | 
| 105 | 
            -
             | 
| 106 97 | 
             
                @file = file
         | 
| 107 98 |  | 
| 108 99 | 
             
                @autoflush = Puppet[:autoflush]
         | 
| @@ -2,6 +2,7 @@ require 'puppet/util/package/version/range/lt' | |
| 2 2 | 
             
            require 'puppet/util/package/version/range/lt_eq'
         | 
| 3 3 | 
             
            require 'puppet/util/package/version/range/gt'
         | 
| 4 4 | 
             
            require 'puppet/util/package/version/range/gt_eq'
         | 
| 5 | 
            +
            require 'puppet/util/package/version/range/eq'
         | 
| 5 6 | 
             
            require 'puppet/util/package/version/range/min_max'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module Puppet::Util::Package::Version
         | 
| @@ -20,7 +21,7 @@ module Puppet::Util::Package::Version | |
| 20 21 | 
             
                #   * ex. `">1.0.0 <=2.3.0"`
         | 
| 21 22 | 
             
                #
         | 
| 22 23 | 
             
                RANGE_SPLIT = /\s+/
         | 
| 23 | 
            -
                FULL_REGEX = /\A((?:[<>=]) | 
| 24 | 
            +
                FULL_REGEX = /\A((?:[<>=])*)(.+)\Z/
         | 
| 24 25 |  | 
| 25 26 | 
             
                # @param range_string [String] the version range string to parse
         | 
| 26 27 | 
             
                # @param version_class [Version] a version class implementing comparison operators and parse method
         | 
| @@ -40,6 +41,8 @@ module Puppet::Util::Package::Version | |
| 40 41 | 
             
                      Lt.new(version_class::parse(version))
         | 
| 41 42 | 
             
                    when '<='
         | 
| 42 43 | 
             
                      LtEq.new(version_class::parse(version))
         | 
| 44 | 
            +
                    when ''
         | 
| 45 | 
            +
                      Eq.new(version_class::parse(version))
         | 
| 43 46 | 
             
                    else
         | 
| 44 47 | 
             
                      raise ValidationFailure, "Operator '#{operator}' is not implemented"
         | 
| 45 48 | 
             
                    end
         | 
| @@ -62,7 +62,7 @@ module Puppet::Util::ProviderFeatures | |
| 62 62 | 
             
                @features ||= {}
         | 
| 63 63 | 
             
                raise Puppet::DevError, _("Feature %{name} is already defined") % { name: name } if @features.include?(name)
         | 
| 64 64 | 
             
                begin
         | 
| 65 | 
            -
                  obj = ProviderFeature.new(name, docs, hash)
         | 
| 65 | 
            +
                  obj = ProviderFeature.new(name, docs, **hash)
         | 
| 66 66 | 
             
                  @features[obj.name] = obj
         | 
| 67 67 | 
             
                rescue ArgumentError => detail
         | 
| 68 68 | 
             
                  error = ArgumentError.new(
         | 
    
        data/lib/puppet/util/run_mode.rb
    CHANGED
    
    
    
        data/lib/puppet/util/windows.rb
    CHANGED
    
    
| @@ -19,15 +19,11 @@ module Puppet::Util::Windows::APITypes | |
| 19 19 |  | 
| 20 20 | 
             
              class ::FFI::Pointer
         | 
| 21 21 | 
             
                NULL_HANDLE = 0
         | 
| 22 | 
            +
                WCHAR_NULL = "\0\0".encode('UTF-16LE').freeze
         | 
| 22 23 |  | 
| 23 24 | 
             
                def self.from_string_to_wide_string(str, &block)
         | 
| 24 25 | 
             
                  str = Puppet::Util::Windows::String.wide_string(str)
         | 
| 25 | 
            -
                  FFI::MemoryPointer. | 
| 26 | 
            -
                    # uchar here is synonymous with byte
         | 
| 27 | 
            -
                    ptr.put_array_of_uchar(0, str.bytes.to_a)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                    yield ptr
         | 
| 30 | 
            -
                  end
         | 
| 26 | 
            +
                  FFI::MemoryPointer.from_wide_string(str, &block)
         | 
| 31 27 |  | 
| 32 28 | 
             
                  # ptr has already had free called, so nothing to return
         | 
| 33 29 | 
             
                  nil
         | 
| @@ -53,12 +49,18 @@ module Puppet::Util::Windows::APITypes | |
| 53 49 | 
             
                alias_method :read_word,  :read_uint16
         | 
| 54 50 | 
             
                alias_method :read_array_of_wchar, :read_array_of_uint16
         | 
| 55 51 |  | 
| 56 | 
            -
                def read_wide_string(char_length, dst_encoding = Encoding::UTF_8, encode_options = {})
         | 
| 52 | 
            +
                def read_wide_string(char_length, dst_encoding = Encoding::UTF_8, strip = false, encode_options = {})
         | 
| 57 53 | 
             
                  # char_length is number of wide chars (typically excluding NULLs), *not* bytes
         | 
| 58 54 | 
             
                  str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  if strip
         | 
| 57 | 
            +
                    i = str.index(WCHAR_NULL)
         | 
| 58 | 
            +
                    str = str[0, i] if i
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 59 61 | 
             
                  str.encode(dst_encoding, str.encoding, encode_options)
         | 
| 60 | 
            -
                rescue  | 
| 61 | 
            -
                  Puppet.debug "Unable to convert value #{str.nil? ? 'nil' : str.dump} to encoding #{dst_encoding} due to #{e.inspect}"
         | 
| 62 | 
            +
                rescue EncodingError => e
         | 
| 63 | 
            +
                  Puppet.debug { "Unable to convert value #{str.nil? ? 'nil' : str.dump} to encoding #{dst_encoding} due to #{e.inspect}" }
         | 
| 62 64 | 
             
                  raise
         | 
| 63 65 | 
             
                end
         | 
| 64 66 |  | 
| @@ -68,32 +70,31 @@ module Puppet::Util::Windows::APITypes | |
| 68 70 | 
             
                #   null_terminator = :double_null, then the terminating sequence is four bytes of zero.  This is UNIT32 = 0
         | 
| 69 71 | 
             
                # @param encode_options [Hash] Accepts the same option hash that may be passed to String#encode in Ruby
         | 
| 70 72 | 
             
                def read_arbitrary_wide_string_up_to(max_char_length = 512, null_terminator = :single_null, encode_options = {})
         | 
| 71 | 
            -
                   | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 73 | 
            +
                  idx = case null_terminator
         | 
| 74 | 
            +
                        when :single_null
         | 
| 75 | 
            +
                          # find index of wide null between 0 and max (exclusive)
         | 
| 76 | 
            +
                          (0...max_char_length).find do |i|
         | 
| 77 | 
            +
                            get_uint16(i * 2) == 0
         | 
| 78 | 
            +
                          end
         | 
| 79 | 
            +
                        when :double_null
         | 
| 80 | 
            +
                          # find index of double-wide null between 0 and max - 1 (exclusive)
         | 
| 81 | 
            +
                          (0...max_char_length - 1).find do |i|
         | 
| 82 | 
            +
                            get_uint32(i * 2) == 0
         | 
| 83 | 
            +
                          end
         | 
| 84 | 
            +
                        else
         | 
| 85 | 
            +
                          raise _("Unable to read wide strings with %{null_terminator} terminal nulls") % { null_terminator: null_terminator }
         | 
| 86 | 
            +
                        end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  read_wide_string(idx || max_char_length, Encoding::UTF_8, false, encode_options)
         | 
| 85 89 | 
             
                end
         | 
| 86 90 |  | 
| 87 91 | 
             
                def read_win32_local_pointer(&block)
         | 
| 88 | 
            -
                  ptr =  | 
| 92 | 
            +
                  ptr = read_pointer
         | 
| 89 93 | 
             
                  begin
         | 
| 90 | 
            -
                    ptr = read_pointer
         | 
| 91 94 | 
             
                    yield ptr
         | 
| 92 95 | 
             
                  ensure
         | 
| 93 | 
            -
                    if ptr &&  | 
| 94 | 
            -
                       | 
| 95 | 
            -
                        Puppet.debug "LocalFree memory leak"
         | 
| 96 | 
            -
                      end
         | 
| 96 | 
            +
                    if !ptr.null? && FFI::WIN32::LocalFree(ptr.address) != FFI::Pointer::NULL_HANDLE
         | 
| 97 | 
            +
                      Puppet.debug "LocalFree memory leak"
         | 
| 97 98 | 
             
                    end
         | 
| 98 99 | 
             
                  end
         | 
| 99 100 |  | 
| @@ -102,23 +103,35 @@ module Puppet::Util::Windows::APITypes | |
| 102 103 | 
             
                end
         | 
| 103 104 |  | 
| 104 105 | 
             
                def read_com_memory_pointer(&block)
         | 
| 105 | 
            -
                  ptr =  | 
| 106 | 
            +
                  ptr = read_pointer
         | 
| 106 107 | 
             
                  begin
         | 
| 107 | 
            -
                    ptr = read_pointer
         | 
| 108 108 | 
             
                    yield ptr
         | 
| 109 109 | 
             
                  ensure
         | 
| 110 | 
            -
                    FFI::WIN32::CoTaskMemFree(ptr)  | 
| 110 | 
            +
                    FFI::WIN32::CoTaskMemFree(ptr) unless ptr.null?
         | 
| 111 111 | 
             
                  end
         | 
| 112 112 |  | 
| 113 113 | 
             
                  # ptr has already had CoTaskMemFree called, so nothing to return
         | 
| 114 114 | 
             
                  nil
         | 
| 115 115 | 
             
                end
         | 
| 116 116 |  | 
| 117 | 
            -
             | 
| 118 117 | 
             
                alias_method :write_dword, :write_uint32
         | 
| 119 118 | 
             
                alias_method :write_word, :write_uint16
         | 
| 120 119 | 
             
              end
         | 
| 121 120 |  | 
| 121 | 
            +
              class FFI::MemoryPointer
         | 
| 122 | 
            +
                # Return a MemoryPointer that points to wide string. This is analogous to the
         | 
| 123 | 
            +
                # FFI::MemoryPointer.from_string method.
         | 
| 124 | 
            +
                def self.from_wide_string(wstr)
         | 
| 125 | 
            +
                  ptr = FFI::MemoryPointer.new(:uchar, wstr.bytesize + 2)
         | 
| 126 | 
            +
                  ptr.put_array_of_uchar(0, wstr.bytes.to_a)
         | 
| 127 | 
            +
                  ptr.put_uint16(wstr.bytesize, 0)
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  yield ptr if block_given?
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                  ptr
         | 
| 132 | 
            +
                end
         | 
| 133 | 
            +
              end
         | 
| 134 | 
            +
             | 
| 122 135 | 
             
              # FFI Types
         | 
| 123 136 | 
             
              # https://github.com/ffi/ffi/wiki/Types
         | 
| 124 137 |  | 
| @@ -183,6 +196,20 @@ module Puppet::Util::Windows::APITypes | |
| 183 196 | 
             
              FFI.typedef :uchar, :byte
         | 
| 184 197 | 
             
              FFI.typedef :uint16, :wchar
         | 
| 185 198 |  | 
| 199 | 
            +
              # Definitions for data types used in LSA structures and functions
         | 
| 200 | 
            +
              # https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/
         | 
| 201 | 
            +
              # https://docs.microsoft.com/sr-latn-rs/windows/win32/secmgmt/management-data-types
         | 
| 202 | 
            +
              FFI.typedef :pointer, :pwstr
         | 
| 203 | 
            +
              FFI.typedef :pointer, :pulong
         | 
| 204 | 
            +
              FFI.typedef :pointer, :lsa_handle
         | 
| 205 | 
            +
              FFI.typedef :pointer, :plsa_handle
         | 
| 206 | 
            +
              FFI.typedef :pointer, :psid
         | 
| 207 | 
            +
              FFI.typedef :pointer, :pvoid
         | 
| 208 | 
            +
              FFI.typedef :pointer, :plsa_unicode_string
         | 
| 209 | 
            +
              FFI.typedef :pointer, :plsa_object_attributes
         | 
| 210 | 
            +
              FFI.typedef :uint32,  :ntstatus
         | 
| 211 | 
            +
              FFI.typedef :dword,   :access_mask
         | 
| 212 | 
            +
             | 
| 186 213 | 
             
              module ::FFI::WIN32
         | 
| 187 214 | 
             
                extend ::FFI::Library
         | 
| 188 215 |  |