puppet 4.3.2-x64-mingw32 → 4.4.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +6 -6
- data/LICENSE +1 -1
- data/README.md +8 -9
- data/conf/auth.conf +2 -2
- data/ext/README.environment +1 -1
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppetmaster.README.debian +11 -9
- data/ext/emacs/puppet-mode.el +1 -1
- data/ext/envpuppet +2 -2
- data/ext/ips/puppetagent.xml +1 -1
- data/ext/ips/puppetmaster.xml +1 -1
- data/ext/project_data.yaml +8 -0
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/puppet.spec.erb +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet.xml +1 -1
- data/ext/suse/puppet.spec +2 -2
- data/ext/upload_facts.rb +1 -1
- data/ext/windows/puppet_interactive.bat +6 -0
- data/ext/windows/puppet_shell.bat +9 -0
- data/ext/windows/run_puppet_interactive.bat +9 -0
- data/ext/yaml_nodes.rb +1 -1
- data/install.rb +30 -20
- data/lib/puppet/agent.rb +1 -1
- data/lib/puppet/application/agent.rb +4 -2
- data/lib/puppet/application/apply.rb +7 -4
- data/lib/puppet/application/cert.rb +1 -1
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/filebucket.rb +1 -1
- data/lib/puppet/application/inspect.rb +1 -1
- data/lib/puppet/application/lookup.rb +4 -4
- data/lib/puppet/application/master.rb +2 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/configurer.rb +100 -22
- data/lib/puppet/data_providers/hiera_config.rb +28 -3
- data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
- data/lib/puppet/data_providers/hiera_support.rb +1 -1
- data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +65 -19
- data/lib/puppet/environments.rb +3 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/epp.rb +1 -1
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +18 -2
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system.rb +2 -2
- data/lib/puppet/file_system/file_impl.rb +2 -2
- data/lib/puppet/file_system/memory_impl.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/functions.rb +45 -6
- data/lib/puppet/functions/assert_type.rb +9 -9
- data/lib/puppet/functions/each.rb +5 -13
- data/lib/puppet/functions/filter.rb +5 -14
- data/lib/puppet/functions/map.rb +6 -14
- data/lib/puppet/functions/reduce.rb +5 -13
- data/lib/puppet/functions/reverse_each.rb +82 -0
- data/lib/puppet/functions/scanf.rb +15 -18
- data/lib/puppet/functions/slice.rb +22 -36
- data/lib/puppet/functions/split.rb +2 -2
- data/lib/puppet/functions/step.rb +88 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- data/lib/puppet/indirector/file_content/http.rb +15 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -0
- data/lib/puppet/indirector/generic_http.rb +16 -0
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/node/ldap.rb +1 -1
- data/lib/puppet/indirector/rest.rb +2 -1
- data/lib/puppet/info_service/class_information_service.rb +13 -12
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/module.rb +3 -0
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/node.rb +1 -1
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +3 -3
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
- data/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/lib/puppet/parser/functions/map.rb +1 -1
- data/lib/puppet/parser/functions/scanf.rb +15 -26
- data/lib/puppet/parser/functions/slice.rb +17 -24
- data/lib/puppet/parser/functions/split.rb +1 -1
- data/lib/puppet/parser/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +38 -13
- data/lib/puppet/pops/binder/binder.rb +21 -17
- data/lib/puppet/pops/binder/binder_issues.rb +8 -6
- data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
- data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
- data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +53 -48
- data/lib/puppet/pops/binder/key_factory.rb +10 -6
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
- data/lib/puppet/pops/evaluator/closure.rb +84 -68
- data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +34 -11
- data/lib/puppet/pops/loader/base_loader.rb +1 -1
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +15 -0
- data/lib/puppet/pops/loader/module_loaders.rb +17 -13
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
- data/lib/puppet/pops/loaders.rb +51 -9
- data/lib/puppet/pops/lookup.rb +14 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +26 -2
- data/lib/puppet/pops/model/model.rb +8 -8
- data/lib/puppet/pops/model/model_label_provider.rb +13 -7
- data/lib/puppet/pops/model/model_meta.rb +17 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
- data/lib/puppet/pops/parser/egrammar.ra +38 -14
- data/lib/puppet/pops/parser/eparser.rb +1353 -1276
- data/lib/puppet/pops/parser/epp_support.rb +11 -7
- data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +26 -19
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +21 -0
- data/lib/puppet/pops/parser/parser_support.rb +19 -16
- data/lib/puppet/pops/parser/slurp_support.rb +11 -7
- data/lib/puppet/pops/types/class_loader.rb +23 -19
- data/lib/puppet/pops/types/enumeration.rb +9 -26
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/recursion_guard.rb +82 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +10 -9
- data/lib/puppet/pops/types/type_calculator.rb +138 -381
- data/lib/puppet/pops/types/type_factory.rb +91 -57
- data/lib/puppet/pops/types/type_formatter.rb +334 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
- data/lib/puppet/pops/types/type_parser.rb +159 -112
- data/lib/puppet/pops/types/types.rb +2057 -1247
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops/validation/checker4_0.rb +83 -55
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +5 -8
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -2
- data/lib/puppet/provider/package/pkgng.rb +13 -4
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +2 -2
- data/lib/puppet/provider/service/launchd.rb +6 -18
- data/lib/puppet/provider/service/systemd.rb +9 -2
- data/lib/puppet/provider/sshkey/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/resource.rb +15 -12
- data/lib/puppet/resource/capability_finder.rb +20 -13
- data/lib/puppet/resource/catalog.rb +60 -3
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/resource/type.rb +28 -38
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +4 -4
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -4
- data/lib/puppet/transaction.rb +15 -2
- data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file.rb +91 -39
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +26 -111
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +17 -14
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +103 -18
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/package.rb +6 -0
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/user.rb +19 -17
- data/lib/puppet/type/yumrepo.rb +20 -0
- data/lib/puppet/util.rb +109 -22
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/execution.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +72 -0
- data/lib/puppet/util/log.rb +2 -0
- data/lib/puppet/util/logging.rb +43 -1
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +10 -2
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
- data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
- data/lib/puppet/util/plist.rb +130 -0
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/run_mode.rb +2 -2
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +4 -4
- data/lib/puppet/util/windows/api_types.rb +24 -18
- data/lib/puppet/util/windows/com.rb +3 -3
- data/lib/puppet/util/windows/error.rb +1 -1
- data/lib/puppet/util/windows/file.rb +8 -8
- data/lib/puppet/util/windows/principal.rb +23 -14
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +1 -1
- data/lib/puppet/util/windows/root_certs.rb +5 -5
- data/lib/puppet/util/windows/security.rb +33 -35
- data/lib/puppet/util/windows/security_descriptor.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +42 -4
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +12 -12
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-ca.8 +2 -2
- data/man/man8/puppet-catalog.8 +2 -2
- data/man/man8/puppet-cert.8 +2 -2
- data/man/man8/puppet-certificate.8 +2 -2
- data/man/man8/puppet-certificate_request.8 +2 -2
- data/man/man8/puppet-certificate_revocation_list.8 +2 -2
- data/man/man8/puppet-config.8 +3 -3
- 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 +2 -2
- data/man/man8/puppet-facts.8 +2 -2
- data/man/man8/puppet-file.8 +2 -2
- data/man/man8/puppet-filebucket.8 +2 -2
- data/man/man8/puppet-help.8 +2 -2
- data/man/man8/puppet-inspect.8 +2 -2
- data/man/man8/puppet-key.8 +2 -2
- data/man/man8/puppet-man.8 +2 -2
- data/man/man8/puppet-master.8 +2 -2
- data/man/man8/puppet-module.8 +9 -9
- data/man/man8/puppet-node.8 +2 -2
- data/man/man8/puppet-parser.8 +2 -2
- data/man/man8/puppet-plugin.8 +2 -2
- data/man/man8/puppet-report.8 +2 -2
- data/man/man8/puppet-resource.8 +2 -2
- data/man/man8/puppet-resource_type.8 +2 -2
- data/man/man8/puppet-status.8 +3 -3
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
- data/spec/integration/defaults_spec.rb +14 -2
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
- data/spec/integration/parser/undef_param_spec.rb +8 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +28 -0
- data/spec/integration/transaction/report_spec.rb +16 -0
- data/spec/integration/transaction_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +194 -4
- data/spec/integration/type/package_spec.rb +5 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/principal_spec.rb +90 -4
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/integration/util/windows/security_spec.rb +6 -6
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/puppet_spec/compiler.rb +17 -0
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/shared_behaviours/iterative_functions.rb +1 -1
- data/spec/shared_contexts/types_setup.rb +96 -0
- data/spec/unit/agent_spec.rb +1 -0
- data/spec/unit/application/agent_spec.rb +10 -0
- data/spec/unit/application/apply_spec.rb +9 -0
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
- data/spec/unit/defaults_spec.rb +15 -0
- data/spec/unit/environments_spec.rb +24 -4
- data/spec/unit/face/parser_spec.rb +43 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +50 -0
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system_spec.rb +26 -0
- data/spec/unit/functions/assert_type_spec.rb +36 -2
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +11 -3
- data/spec/unit/functions/lookup_spec.rb +58 -13
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +61 -5
- data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
- data/spec/unit/indirector/indirection_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +94 -32
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +1 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/node_spec.rb +1 -1
- data/spec/unit/parser/compiler_spec.rb +16 -0
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parser_spec.rb +10 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
- data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
- data/spec/unit/pops/types/type_parser_spec.rb +58 -13
- data/spec/unit/pops/types/types_spec.rb +241 -0
- data/spec/unit/pops/validator/validator_spec.rb +100 -43
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/dnf_spec.rb +16 -0
- data/spec/unit/provider/package/pip3_spec.rb +60 -42
- data/spec/unit/provider/package/pip_spec.rb +47 -34
- data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
- data/spec/unit/provider/package/pkgng_spec.rb +4 -2
- data/spec/unit/provider/package/yum_spec.rb +11 -0
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/launchd_spec.rb +17 -35
- data/spec/unit/provider/service/systemd_spec.rb +7 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/resource/capability_finder_spec.rb +28 -15
- data/spec/unit/resource/catalog_spec.rb +33 -1
- data/spec/unit/resource/type_spec.rb +149 -7
- data/spec/unit/resource_spec.rb +96 -57
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/transaction/report_spec.rb +27 -0
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +5 -0
- data/spec/unit/type/file/checksum_spec.rb +6 -0
- data/spec/unit/type/file/checksum_value_spec.rb +286 -0
- data/spec/unit/type/file/content_spec.rb +12 -193
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +2 -2
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +1 -1
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +114 -26
- data/lib/puppet/vendor/load_plist.rb +0 -1
- data/lib/puppet/vendor/plist/CHANGELOG +0 -82
- data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
- data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/plist/README +0 -36
- data/lib/puppet/vendor/plist/Rakefile +0 -144
- data/lib/puppet/vendor/plist/docs/USAGE +0 -104
- data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
- data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
- data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
- data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
- data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
- data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
- data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
- data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
- data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
- data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
- data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
- data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
- data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
- data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
- data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -1,84 +1,86 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
|
4
|
+
if Puppet.features.telnet?
|
5
|
+
require 'puppet/util/network_device/transport/telnet'
|
5
6
|
|
6
|
-
describe Puppet::Util::NetworkDevice::Transport::Telnet do
|
7
|
+
describe Puppet::Util::NetworkDevice::Transport::Telnet do
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
it "should not handle login through the transport" do
|
14
|
-
expect(@transport).not_to be_handles_login
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should not open any files" do
|
18
|
-
File.expects(:open).never
|
19
|
-
@transport.host = "localhost"
|
20
|
-
@transport.port = 23
|
21
|
-
|
22
|
-
@transport.connect
|
23
|
-
end
|
9
|
+
before(:each) do
|
10
|
+
TCPSocket.stubs(:open).returns stub_everything('tcp')
|
11
|
+
@transport = Puppet::Util::NetworkDevice::Transport::Telnet.new()
|
12
|
+
end
|
24
13
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@transport.port = 23
|
14
|
+
it "should not handle login through the transport" do
|
15
|
+
expect(@transport).not_to be_handles_login
|
16
|
+
end
|
29
17
|
|
30
|
-
|
31
|
-
|
18
|
+
it "should not open any files" do
|
19
|
+
File.expects(:open).never
|
20
|
+
@transport.host = "localhost"
|
21
|
+
@transport.port = 23
|
32
22
|
|
33
|
-
|
34
|
-
|
35
|
-
Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
|
36
|
-
@transport.host = "localhost"
|
37
|
-
@transport.port = 23
|
23
|
+
@transport.connect
|
24
|
+
end
|
38
25
|
|
39
|
-
|
40
|
-
|
26
|
+
it "should connect to the given host and port" do
|
27
|
+
Net::Telnet.expects(:new).with { |args| args["Host"] == "localhost" && args["Port"] == 23 }.returns stub_everything
|
28
|
+
@transport.host = "localhost"
|
29
|
+
@transport.port = 23
|
41
30
|
|
42
|
-
describe "when connected" do
|
43
|
-
before(:each) do
|
44
|
-
@telnet = stub_everything 'telnet'
|
45
|
-
Net::Telnet.stubs(:new).returns(@telnet)
|
46
31
|
@transport.connect
|
47
32
|
end
|
48
33
|
|
49
|
-
it "should
|
50
|
-
@
|
51
|
-
|
34
|
+
it "should connect and specify the default prompt" do
|
35
|
+
@transport.default_prompt = "prompt"
|
36
|
+
Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
|
37
|
+
@transport.host = "localhost"
|
38
|
+
@transport.port = 23
|
39
|
+
|
40
|
+
@transport.connect
|
52
41
|
end
|
53
42
|
|
54
|
-
describe "when
|
55
|
-
|
56
|
-
@telnet
|
57
|
-
|
43
|
+
describe "when connected" do
|
44
|
+
before(:each) do
|
45
|
+
@telnet = stub_everything 'telnet'
|
46
|
+
Net::Telnet.stubs(:new).returns(@telnet)
|
47
|
+
@transport.connect
|
58
48
|
end
|
59
49
|
|
60
|
-
it "should
|
61
|
-
@telnet.expects(:
|
62
|
-
|
50
|
+
it "should send line to the telnet session" do
|
51
|
+
@telnet.expects(:puts).with("line")
|
52
|
+
@transport.send("line")
|
63
53
|
end
|
64
54
|
|
65
|
-
|
66
|
-
|
67
|
-
|
55
|
+
describe "when expecting output" do
|
56
|
+
it "should waitfor output on the telnet session" do
|
57
|
+
@telnet.expects(:waitfor).with(/regex/)
|
58
|
+
@transport.expect(/regex/)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should return telnet session output" do
|
62
|
+
@telnet.expects(:waitfor).returns("output")
|
63
|
+
expect(@transport.expect(/regex/)).to eq("output")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should yield telnet session output to the given block" do
|
67
|
+
@telnet.expects(:waitfor).yields("output")
|
68
|
+
@transport.expect(/regex/) { |out| expect(out).to eq("output") }
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
|
-
end
|
71
72
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
73
|
+
describe "when closing" do
|
74
|
+
before(:each) do
|
75
|
+
@telnet = stub_everything 'telnet'
|
76
|
+
Net::Telnet.stubs(:new).returns(@telnet)
|
77
|
+
@transport.connect
|
78
|
+
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
80
|
+
it "should close the telnet session" do
|
81
|
+
@telnet.expects(:close)
|
82
|
+
@transport.close
|
83
|
+
end
|
82
84
|
end
|
83
85
|
end
|
84
86
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/util/plist' if Puppet.features.cfpropertylist?
|
3
|
+
require 'puppet_spec/files'
|
4
|
+
|
5
|
+
module Puppet::Util::Plist; end
|
6
|
+
|
7
|
+
describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
|
8
|
+
include PuppetSpec::Files
|
9
|
+
|
10
|
+
let(:valid_xml_plist) do
|
11
|
+
'<?xml version="1.0" encoding="UTF-8"?>
|
12
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
13
|
+
<plist version="1.0">
|
14
|
+
<dict>
|
15
|
+
<key>LastUsedPrinters</key>
|
16
|
+
<array>
|
17
|
+
<dict>
|
18
|
+
<key>Network</key>
|
19
|
+
<string>10.85.132.1</string>
|
20
|
+
<key>PrinterID</key>
|
21
|
+
<string>baskerville_corp_puppetlabs_net</string>
|
22
|
+
</dict>
|
23
|
+
<dict>
|
24
|
+
<key>Network</key>
|
25
|
+
<string>10.14.96.1</string>
|
26
|
+
<key>PrinterID</key>
|
27
|
+
<string>Statler</string>
|
28
|
+
</dict>
|
29
|
+
</array>
|
30
|
+
</dict>
|
31
|
+
</plist>'
|
32
|
+
end
|
33
|
+
let(:invalid_xml_plist) do
|
34
|
+
'<?xml version="1.0" encoding="UTF-8"?>
|
35
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
36
|
+
<plist version="1.0">
|
37
|
+
<dict>
|
38
|
+
<key>LastUsedPrinters</key>
|
39
|
+
<array>
|
40
|
+
<dict>
|
41
|
+
<!-- this comment is --terrible -->
|
42
|
+
<key>Network</key>
|
43
|
+
<string>10.85.132.1</string>
|
44
|
+
<key>PrinterID</key>
|
45
|
+
<string>baskerville_corp_puppetlabs_net</string>
|
46
|
+
</dict>
|
47
|
+
<dict>
|
48
|
+
<key>Network</key>
|
49
|
+
<string>10.14.96.1</string>
|
50
|
+
<key>PrinterID</key>
|
51
|
+
<string>Statler</string>
|
52
|
+
</dict>
|
53
|
+
</array>
|
54
|
+
</dict>
|
55
|
+
</plist>'
|
56
|
+
end
|
57
|
+
let(:valid_xml_plist_hash) { {"LastUsedPrinters"=>[{"Network"=>"10.85.132.1", "PrinterID"=>"baskerville_corp_puppetlabs_net"}, {"Network"=>"10.14.96.1", "PrinterID"=>"Statler"}]} }
|
58
|
+
let(:plist_path) { file_containing('sample.plist', valid_xml_plist) }
|
59
|
+
let(:binary_plist_magic_number) { 'bplist00' }
|
60
|
+
let(:bad_xml_doctype) { '<!DOCTYPE plist PUBLIC -//Apple Computer' }
|
61
|
+
let(:good_xml_doctype) { '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' }
|
62
|
+
|
63
|
+
describe "#read_plist_file" do
|
64
|
+
it "calls #convert_cfpropertylist_to_native_types on a plist object when a valid binary plist is read" do
|
65
|
+
subject.stubs(:read_file_with_offset).with(plist_path, 8).returns(binary_plist_magic_number)
|
66
|
+
subject.stubs(:new_cfpropertylist).with({:file => plist_path}).returns('plist_object')
|
67
|
+
subject.expects(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
|
68
|
+
expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
|
69
|
+
end
|
70
|
+
it "returns a valid hash when a valid XML plist is read" do
|
71
|
+
subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
|
72
|
+
subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(valid_xml_plist)
|
73
|
+
expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
|
74
|
+
end
|
75
|
+
it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
|
76
|
+
subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
|
77
|
+
subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(bad_xml_doctype)
|
78
|
+
subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
|
79
|
+
subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
|
80
|
+
Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
|
81
|
+
expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
|
82
|
+
end
|
83
|
+
it "attempts to read pure xml using plutil when reading an improperly formatted service plist" do
|
84
|
+
subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
|
85
|
+
subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(invalid_xml_plist)
|
86
|
+
Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
|
87
|
+
Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
|
88
|
+
Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
|
89
|
+
{:failonfail => true, :combine => true}).returns(valid_xml_plist)
|
90
|
+
expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#parse_plist" do
|
95
|
+
it "returns a valid hash when a valid XML plist is provided" do
|
96
|
+
expect(subject.parse_plist(valid_xml_plist)).to eq(valid_xml_plist_hash)
|
97
|
+
end
|
98
|
+
it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
|
99
|
+
subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
|
100
|
+
subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
|
101
|
+
Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
|
102
|
+
subject.parse_plist(bad_xml_doctype, plist_path)
|
103
|
+
end
|
104
|
+
it "raises a debug message with malformed plist" do
|
105
|
+
subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
|
106
|
+
Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
|
107
|
+
subject.parse_plist("<plist><dict><key>Foo</key>")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -20,7 +20,7 @@ describe Puppet::Util::ResourceTemplate do
|
|
20
20
|
describe "when evaluating" do
|
21
21
|
before do
|
22
22
|
Puppet::FileSystem.stubs(:exist?).returns true
|
23
|
-
|
23
|
+
Puppet::FileSystem.stubs(:read).returns "eh"
|
24
24
|
|
25
25
|
@template = stub 'template', :result => nil
|
26
26
|
ERB.stubs(:new).returns @template
|
@@ -38,7 +38,7 @@ describe Puppet::Util::ResourceTemplate do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should create a template instance with the contents of the file" do
|
41
|
-
|
41
|
+
Puppet::FileSystem.expects(:read).with("/my/template", :encoding => 'utf-8').returns "yay"
|
42
42
|
ERB.expects(:new).with("yay", 0, "-").returns(@template)
|
43
43
|
|
44
44
|
@wrapper.stubs :set_resource_variables
|
@@ -261,6 +261,30 @@ describe Puppet::Util::RunMode do
|
|
261
261
|
end
|
262
262
|
end
|
263
263
|
end
|
264
|
+
|
265
|
+
describe "#without_env internal helper with UTF8 characters" do
|
266
|
+
let(:varname) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
|
267
|
+
let(:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
|
268
|
+
|
269
|
+
before do
|
270
|
+
Puppet::Util::Windows::Process.set_environment_variable(varname, rune_utf8)
|
271
|
+
end
|
272
|
+
|
273
|
+
it "removes environment variables within the block with UTF8 name" do
|
274
|
+
without_env(varname) do
|
275
|
+
expect(ENV[varname]).to be(nil)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
it "restores UTF8 characters in environment variable values" do
|
280
|
+
without_env(varname) do
|
281
|
+
Puppet::Util::Windows::Process.set_environment_variable(varname, 'bad value')
|
282
|
+
end
|
283
|
+
|
284
|
+
envhash = Puppet::Util::Windows::Process.get_environment_strings
|
285
|
+
expect(envhash[varname]).to eq(rune_utf8)
|
286
|
+
end
|
287
|
+
end
|
264
288
|
end
|
265
289
|
|
266
290
|
def as_root
|
@@ -274,11 +298,11 @@ describe Puppet::Util::RunMode do
|
|
274
298
|
end
|
275
299
|
|
276
300
|
def without_env(name, &block)
|
277
|
-
saved =
|
278
|
-
|
301
|
+
saved = Puppet::Util.get_env(name)
|
302
|
+
Puppet::Util.set_env(name, nil)
|
279
303
|
yield
|
280
304
|
ensure
|
281
|
-
|
305
|
+
Puppet::Util.set_env(name, saved)
|
282
306
|
end
|
283
307
|
|
284
308
|
def without_home(&block)
|
@@ -108,14 +108,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
|
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should be able to confirm the existence of a user with a well-known SID" do
|
111
|
-
system_user =
|
111
|
+
system_user = Puppet::Util::Windows::SID::LocalSystem
|
112
112
|
# ensure that the underlying OS is queried here
|
113
113
|
Puppet::Util::Windows::ADSI.unstub(:connect)
|
114
114
|
expect(Puppet::Util::Windows::ADSI::User.exists?(system_user)).to be_truthy
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should return false with a well-known Group SID" do
|
118
|
-
group =
|
118
|
+
group = Puppet::Util::Windows::SID::BuiltinAdministrators
|
119
119
|
# ensure that the underlying OS is queried here
|
120
120
|
Puppet::Util::Windows::ADSI.unstub(:connect)
|
121
121
|
expect(Puppet::Util::Windows::ADSI::User.exists?(group)).to be_falsey
|
@@ -446,14 +446,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
|
|
446
446
|
|
447
447
|
it "should be able to confirm the existence of a group with a well-known SID" do
|
448
448
|
|
449
|
-
service_group =
|
449
|
+
service_group = Puppet::Util::Windows::SID::Service
|
450
450
|
# ensure that the underlying OS is queried here
|
451
451
|
Puppet::Util::Windows::ADSI.unstub(:connect)
|
452
452
|
expect(Puppet::Util::Windows::ADSI::Group.exists?(service_group)).to be_truthy
|
453
453
|
end
|
454
454
|
|
455
455
|
it "will return true with a well-known User SID, as there is no way to resolve it with a WinNT:// style moniker" do
|
456
|
-
user =
|
456
|
+
user = Puppet::Util::Windows::SID::NtLocal
|
457
457
|
# ensure that the underlying OS is queried here
|
458
458
|
Puppet::Util::Windows::ADSI.unstub(:connect)
|
459
459
|
expect(Puppet::Util::Windows::ADSI::Group.exists?(user)).to be_truthy
|
@@ -25,4 +25,46 @@ describe "FFI::MemoryPointer", :if => Puppet.features.microsoft_windows? do
|
|
25
25
|
expect(read_string.encoding).to eq(Encoding::UTF_8)
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
context "read_arbitrary_wide_string_up_to" do
|
30
|
+
let (:string) { "foo_bar" }
|
31
|
+
let (:single_null_string) { string + "\x00" }
|
32
|
+
let (:double_null_string) { string + "\x00\x00" }
|
33
|
+
|
34
|
+
it "should read a short single null terminated string" do
|
35
|
+
read_string = nil
|
36
|
+
FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
|
37
|
+
read_string = ptr.read_arbitrary_wide_string_up_to()
|
38
|
+
end
|
39
|
+
|
40
|
+
expect(read_string).to eq(string)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should read a short double null terminated string" do
|
44
|
+
read_string = nil
|
45
|
+
FFI::MemoryPointer.from_string_to_wide_string(double_null_string) do |ptr|
|
46
|
+
read_string = ptr.read_arbitrary_wide_string_up_to(512, :double_null)
|
47
|
+
end
|
48
|
+
|
49
|
+
expect(read_string).to eq(string)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return a string of max_length characters when specified" do
|
53
|
+
read_string = nil
|
54
|
+
FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
|
55
|
+
read_string = ptr.read_arbitrary_wide_string_up_to(3)
|
56
|
+
end
|
57
|
+
|
58
|
+
expect(read_string).to eq(string[0..2])
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should return wide strings in UTF-8" do
|
62
|
+
read_string = nil
|
63
|
+
FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
|
64
|
+
read_string = ptr.read_arbitrary_wide_string_up_to()
|
65
|
+
end
|
66
|
+
|
67
|
+
expect(read_string.encoding).to eq(Encoding::UTF_8)
|
68
|
+
end
|
69
|
+
end
|
28
70
|
end
|
@@ -4,9 +4,9 @@ require 'spec_helper'
|
|
4
4
|
require 'puppet/util/windows'
|
5
5
|
|
6
6
|
describe "Puppet::Util::Windows::SecurityDescriptor", :if => Puppet.features.microsoft_windows? do
|
7
|
-
let(:system_sid) {
|
8
|
-
let(:admins_sid) {
|
9
|
-
let(:group_sid) {
|
7
|
+
let(:system_sid) { Puppet::Util::Windows::SID::LocalSystem }
|
8
|
+
let(:admins_sid) { Puppet::Util::Windows::SID::BuiltinAdministrators }
|
9
|
+
let(:group_sid) { Puppet::Util::Windows::SID::Nobody }
|
10
10
|
let(:new_sid) { 'S-1-5-32-500-1-2-3' }
|
11
11
|
|
12
12
|
def empty_dacl
|
@@ -7,7 +7,7 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
|
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:subject) { Puppet::Util::Windows::SID }
|
10
|
-
let(:sid) {
|
10
|
+
let(:sid) { Puppet::Util::Windows::SID::LocalSystem }
|
11
11
|
let(:invalid_sid) { 'bogus' }
|
12
12
|
let(:unknown_sid) { 'S-0-0-0' }
|
13
13
|
let(:unknown_name) { 'chewbacca' }
|
data/spec/unit/util_spec.rb
CHANGED
@@ -24,13 +24,15 @@ describe Puppet::Util do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
describe "#withenv" do
|
27
|
+
let(:mode) { Puppet.features.microsoft_windows? ? :windows : :posix }
|
28
|
+
|
27
29
|
before :each do
|
28
30
|
@original_path = ENV["PATH"]
|
29
31
|
@new_env = {:PATH => "/some/bogus/path"}
|
30
32
|
end
|
31
33
|
|
32
34
|
it "should change environment variables within the block then reset environment variables to their original values" do
|
33
|
-
Puppet::Util.withenv @new_env do
|
35
|
+
Puppet::Util.withenv @new_env, mode do
|
34
36
|
expect(ENV["PATH"]).to eq("/some/bogus/path")
|
35
37
|
end
|
36
38
|
expect(ENV["PATH"]).to eq(@original_path)
|
@@ -38,7 +40,7 @@ describe Puppet::Util do
|
|
38
40
|
|
39
41
|
it "should reset environment variables to their original values even if the block fails" do
|
40
42
|
begin
|
41
|
-
Puppet::Util.withenv @new_env do
|
43
|
+
Puppet::Util.withenv @new_env, mode do
|
42
44
|
expect(ENV["PATH"]).to eq("/some/bogus/path")
|
43
45
|
raise "This is a failure"
|
44
46
|
end
|
@@ -50,7 +52,7 @@ describe Puppet::Util do
|
|
50
52
|
it "should reset environment variables even when they are set twice" do
|
51
53
|
# Setting Path & Environment parameters in Exec type can cause weirdness
|
52
54
|
@new_env["PATH"] = "/someother/bogus/path"
|
53
|
-
Puppet::Util.withenv @new_env do
|
55
|
+
Puppet::Util.withenv @new_env, mode do
|
54
56
|
# When assigning duplicate keys, can't guarantee order of evaluation
|
55
57
|
expect(ENV["PATH"]).to match(/\/some.*\/bogus\/path/)
|
56
58
|
end
|
@@ -60,12 +62,119 @@ describe Puppet::Util do
|
|
60
62
|
it "should remove any new environment variables after the block ends" do
|
61
63
|
@new_env[:FOO] = "bar"
|
62
64
|
ENV["FOO"] = nil
|
63
|
-
Puppet::Util.withenv @new_env do
|
65
|
+
Puppet::Util.withenv @new_env, mode do
|
64
66
|
expect(ENV["FOO"]).to eq("bar")
|
65
67
|
end
|
66
68
|
expect(ENV["FOO"]).to eq(nil)
|
67
69
|
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#withenv on POSIX", :unless => Puppet.features.microsoft_windows? do
|
73
|
+
it "should preserve case" do
|
74
|
+
# start with lower case key,
|
75
|
+
env_key = SecureRandom.uuid.downcase
|
76
|
+
|
77
|
+
begin
|
78
|
+
original_value = 'hello'
|
79
|
+
ENV[env_key] = original_value
|
80
|
+
new_value = 'goodbye'
|
81
|
+
|
82
|
+
Puppet::Util.withenv({env_key.upcase => new_value}, :posix) do
|
83
|
+
expect(ENV[env_key]).to eq(original_value)
|
84
|
+
expect(ENV[env_key.upcase]).to eq(new_value)
|
85
|
+
end
|
86
|
+
|
87
|
+
expect(ENV[env_key]).to eq(original_value)
|
88
|
+
expect(ENV[env_key.upcase]).to be_nil
|
89
|
+
ensure
|
90
|
+
ENV.delete(env_key)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#withenv on Windows", :if => Puppet.features.microsoft_windows? do
|
96
|
+
|
97
|
+
let(:process) { Puppet::Util::Windows::Process }
|
98
|
+
|
99
|
+
it "should ignore case" do
|
100
|
+
# start with lower case key, ensuring string is not entirely numeric
|
101
|
+
env_key = SecureRandom.uuid.downcase + 'a'
|
102
|
+
|
103
|
+
begin
|
104
|
+
original_value = 'hello'
|
105
|
+
ENV[env_key] = original_value
|
106
|
+
new_value = 'goodbye'
|
107
|
+
|
108
|
+
Puppet::Util.withenv({env_key.upcase => new_value}, :windows) do
|
109
|
+
expect(ENV[env_key]).to eq(new_value)
|
110
|
+
expect(ENV[env_key.upcase]).to eq(new_value)
|
111
|
+
end
|
112
|
+
|
113
|
+
expect(ENV[env_key]).to eq(original_value)
|
114
|
+
expect(ENV[env_key.upcase]).to eq(original_value)
|
115
|
+
ensure
|
116
|
+
ENV.delete(env_key)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it "works around Ruby bug 8822 (which fails to preserve UTF-8 properly when accessing ENV)" do
|
121
|
+
env_var_name = SecureRandom.uuid
|
122
|
+
utf_8_bytes = [225, 154, 160] # rune ᚠ
|
123
|
+
utf_8_str = env_var_name + utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
|
68
124
|
|
125
|
+
Puppet::Util.withenv({utf_8_str => utf_8_str}, :windows) do
|
126
|
+
# the true Windows environemnt APIs see the variables correctly
|
127
|
+
expect(process.get_environment_strings[utf_8_str]).to eq(utf_8_str)
|
128
|
+
|
129
|
+
# document buggy Ruby behavior here for https://bugs.ruby-lang.org/issues/8822
|
130
|
+
# Ruby retrieves / stores ENV names in the current codepage
|
131
|
+
# when these tests no longer pass, Ruby has fixed its bugs and workarounds can be removed
|
132
|
+
# interestingly we would expect some of these tests to fail when codepage is 65001
|
133
|
+
# but instead the env values are in Encoding::ASCII_8BIT!
|
134
|
+
|
135
|
+
# both a string in UTF-8 and current codepage are deemed valid keys to the hash
|
136
|
+
# which in a sane world shouldn't be true
|
137
|
+
codepage_key = utf_8_str.dup.force_encoding(Encoding.default_external)
|
138
|
+
expect(ENV.key?(codepage_key)).to eq(true)
|
139
|
+
expect(ENV.key?(utf_8_str)).to eq(true)
|
140
|
+
# similarly the value stored at the key is in current codepage and won't match UTF-8 value
|
141
|
+
env_value = ENV[utf_8_str]
|
142
|
+
expect(env_value).to_not eq(utf_8_str)
|
143
|
+
expect(env_value.encoding).to_not eq(Encoding::UTF_8)
|
144
|
+
# but it can be forced back to UTF-8 to make it match.. ugh
|
145
|
+
converted_value = ENV[utf_8_str].dup.force_encoding(Encoding::UTF_8)
|
146
|
+
expect(converted_value).to eq(utf_8_str)
|
147
|
+
end
|
148
|
+
|
149
|
+
# real environment shouldn't have env var anymore
|
150
|
+
expect(process.get_environment_strings[utf_8_str]).to eq(nil)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should preseve existing environment and should not corrupt UTF-8 environment variables" do
|
154
|
+
env_var_name = SecureRandom.uuid
|
155
|
+
utf_8_bytes = [225, 154, 160] # rune ᚠ
|
156
|
+
utf_8_str = env_var_name + utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
|
157
|
+
env_var_name_utf_8 = utf_8_str
|
158
|
+
|
159
|
+
begin
|
160
|
+
# UTF-8 name and value
|
161
|
+
process.set_environment_variable(env_var_name_utf_8, utf_8_str)
|
162
|
+
# ASCII name / UTF-8 value
|
163
|
+
process.set_environment_variable(env_var_name, utf_8_str)
|
164
|
+
|
165
|
+
original_keys = process.get_environment_strings.keys.to_a
|
166
|
+
Puppet::Util.withenv({}, :windows) { }
|
167
|
+
|
168
|
+
env = process.get_environment_strings
|
169
|
+
|
170
|
+
expect(env[env_var_name]).to eq(utf_8_str)
|
171
|
+
expect(env[env_var_name_utf_8]).to eq(utf_8_str)
|
172
|
+
expect(env.keys.to_a).to eq(original_keys)
|
173
|
+
ensure
|
174
|
+
process.set_environment_variable(env_var_name_utf_8, nil)
|
175
|
+
process.set_environment_variable(env_var_name, nil)
|
176
|
+
end
|
177
|
+
end
|
69
178
|
end
|
70
179
|
|
71
180
|
describe "#absolute_path?" do
|
@@ -324,7 +433,8 @@ describe Puppet::Util do
|
|
324
433
|
end
|
325
434
|
|
326
435
|
it "should walk the search PATH returning the first executable" do
|
327
|
-
|
436
|
+
Puppet::Util.stubs(:get_env).with('PATH').returns(File.expand_path('/bin'))
|
437
|
+
Puppet::Util.stubs(:get_env).with('PATHEXT').returns(nil)
|
328
438
|
|
329
439
|
expect(Puppet::Util.which('foo')).to eq(path)
|
330
440
|
end
|
@@ -340,11 +450,11 @@ describe Puppet::Util do
|
|
340
450
|
|
341
451
|
describe "when a file extension is specified" do
|
342
452
|
it "should walk each directory in PATH ignoring PATHEXT" do
|
343
|
-
|
453
|
+
Puppet::Util.stubs(:get_env).with('PATH').returns(%w[/bar /bin].map{|dir| File.expand_path(dir)}.join(File::PATH_SEPARATOR))
|
454
|
+
Puppet::Util.stubs(:get_env).with('PATHEXT').returns('.FOOBAR')
|
344
455
|
|
345
456
|
FileTest.expects(:file?).with(File.join(File.expand_path('/bar'), 'foo.CMD')).returns false
|
346
457
|
|
347
|
-
ENV.expects(:[]).with('PATHEXT').never
|
348
458
|
expect(Puppet::Util.which('foo.CMD')).to eq(path)
|
349
459
|
end
|
350
460
|
end
|
@@ -352,8 +462,8 @@ describe Puppet::Util do
|
|
352
462
|
describe "when a file extension is not specified" do
|
353
463
|
it "should walk each extension in PATHEXT until an executable is found" do
|
354
464
|
bar = File.expand_path('/bar')
|
355
|
-
|
356
|
-
|
465
|
+
Puppet::Util.stubs(:get_env).with('PATH').returns("#{bar}#{File::PATH_SEPARATOR}#{base}")
|
466
|
+
Puppet::Util.stubs(:get_env).with('PATHEXT').returns(".EXE#{File::PATH_SEPARATOR}.CMD")
|
357
467
|
|
358
468
|
exts = sequence('extensions')
|
359
469
|
FileTest.expects(:file?).in_sequence(exts).with(File.join(bar, 'foo.EXE')).returns false
|
@@ -365,8 +475,8 @@ describe Puppet::Util do
|
|
365
475
|
end
|
366
476
|
|
367
477
|
it "should walk the default extension path if the environment variable is not defined" do
|
368
|
-
|
369
|
-
|
478
|
+
Puppet::Util.stubs(:get_env).with('PATH').returns(base)
|
479
|
+
Puppet::Util.stubs(:get_env).with('PATHEXT').returns(nil)
|
370
480
|
|
371
481
|
exts = sequence('extensions')
|
372
482
|
%w[.COM .EXE .BAT].each do |ext|
|
@@ -378,8 +488,8 @@ describe Puppet::Util do
|
|
378
488
|
end
|
379
489
|
|
380
490
|
it "should fall back if no extension matches" do
|
381
|
-
|
382
|
-
|
491
|
+
Puppet::Util.stubs(:get_env).with('PATH').returns(base)
|
492
|
+
Puppet::Util.stubs(:get_env).with('PATHEXT').returns(".EXE")
|
383
493
|
|
384
494
|
FileTest.stubs(:file?).with(File.join(base, 'foo.EXE')).returns false
|
385
495
|
FileTest.stubs(:file?).with(File.join(base, 'foo')).returns true
|