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
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'puppet/util/checksums'
|
2
|
+
require 'puppet/type/file/data_sync'
|
3
|
+
|
4
|
+
module Puppet
|
5
|
+
Puppet::Type.type(:file).newproperty(:checksum_value) do
|
6
|
+
include Puppet::Util::Checksums
|
7
|
+
include Puppet::DataSync
|
8
|
+
|
9
|
+
desc "The checksum of the source contents. Only md5 and sha256 are supported when
|
10
|
+
specifying this parameter. If this parameter is set, source_permissions will be
|
11
|
+
assumed to be false, and ownership and permissions will not be read from source."
|
12
|
+
|
13
|
+
def insync?(is)
|
14
|
+
# If checksum_value and source are specified, manage the file contents.
|
15
|
+
# Otherwise the content property will manage syncing.
|
16
|
+
if resource.parameter(:source).nil?
|
17
|
+
return true
|
18
|
+
end
|
19
|
+
|
20
|
+
checksum_insync?(resource.parameter(:source), is, true) {|_is| super(_is)}
|
21
|
+
end
|
22
|
+
|
23
|
+
def property_matches?(current, desired)
|
24
|
+
return true if super(current, desired)
|
25
|
+
return date_matches?(resource.parameter(:checksum).value, current, desired)
|
26
|
+
end
|
27
|
+
|
28
|
+
def retrieve
|
29
|
+
# If checksum_value and source are specified, manage the file contents.
|
30
|
+
# Otherwise the content property will manage syncing. Don't compute the checksum twice.
|
31
|
+
if resource.parameter(:source).nil?
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
|
35
|
+
result = retrieve_checksum(resource)
|
36
|
+
# If the returned type matches the util/checksums format (prefixed with the type),
|
37
|
+
# strip the checksum type.
|
38
|
+
result = sumdata(result) if checksum?(result)
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
def sync
|
43
|
+
if resource.parameter(:source).nil?
|
44
|
+
devfail "checksum_value#sync should not be called without a source parameter"
|
45
|
+
end
|
46
|
+
|
47
|
+
# insync? only returns false if it expects to manage the file content,
|
48
|
+
# so instruct the resource to write its contents.
|
49
|
+
contents_sync(resource.parameter(:source))
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -1,18 +1,14 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'uri'
|
3
3
|
require 'tempfile'
|
4
|
-
require 'date'
|
5
4
|
|
6
5
|
require 'puppet/util/checksums'
|
7
|
-
require 'puppet/
|
8
|
-
require 'puppet/network/http/api/indirected_routes'
|
9
|
-
require 'puppet/network/http/compression'
|
6
|
+
require 'puppet/type/file/data_sync.rb'
|
10
7
|
|
11
8
|
module Puppet
|
12
9
|
Puppet::Type.type(:file).newproperty(:content) do
|
13
|
-
include Puppet::Util::Diff
|
14
10
|
include Puppet::Util::Checksums
|
15
|
-
include Puppet::
|
11
|
+
include Puppet::DataSync
|
16
12
|
|
17
13
|
attr_reader :actual_content
|
18
14
|
|
@@ -39,8 +35,8 @@ module Puppet
|
|
39
35
|
}
|
40
36
|
|
41
37
|
...but for larger files, this attribute is more useful when combined with the
|
42
|
-
[template](
|
43
|
-
or [file](
|
38
|
+
[template](https://docs.puppetlabs.com/references/latest/function.html#template)
|
39
|
+
or [file](https://docs.puppetlabs.com/references/latest/function.html#file)
|
44
40
|
function.
|
45
41
|
EOT
|
46
42
|
|
@@ -86,53 +82,29 @@ module Puppet
|
|
86
82
|
# Also, fix #872: when content is used, and replace is true, the file
|
87
83
|
# should be insync when it exists
|
88
84
|
def insync?(is)
|
89
|
-
if resource
|
90
|
-
|
91
|
-
|
92
|
-
if resource[:ensure] == :present and resource[:content] and s = resource.stat
|
93
|
-
resource.warning "Ensure set to :present but file type is #{s.ftype} so no content will be synced"
|
94
|
-
end
|
95
|
-
return true
|
85
|
+
if resource[:source] && resource[:checksum_value]
|
86
|
+
# Asserts that nothing has changed since validate ran.
|
87
|
+
devfail "content property should not exist if source and checksum_value are specified"
|
96
88
|
end
|
97
89
|
|
98
|
-
|
99
|
-
|
100
|
-
result = super
|
101
|
-
|
102
|
-
if ! result and Puppet[:show_diff] and resource.show_diff?
|
103
|
-
write_temporarily do |path|
|
104
|
-
send @resource[:loglevel], "\n" + diff(@resource[:path], path)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
result
|
90
|
+
contents_prop = resource.parameter(:source) || self
|
91
|
+
checksum_insync?(contents_prop, is, !resource[:content].nil?) {|_is| super(_is)}
|
108
92
|
end
|
109
93
|
|
110
94
|
def property_matches?(current, desired)
|
111
|
-
|
112
|
-
# The inherited equality is always accepted, so use it if valid.
|
113
|
-
time_types = [:mtime, :ctime]
|
95
|
+
# If checksum_value is specified, it overrides comparing the content field.
|
114
96
|
checksum_type = resource.parameter(:checksum).value
|
115
|
-
|
116
|
-
|
117
|
-
begin
|
118
|
-
raise if !time_types.include?(sumtype(current).to_sym) || !time_types.include?(sumtype(desired).to_sym)
|
119
|
-
DateTime.parse(sumdata(current)) >= DateTime.parse(sumdata(desired))
|
120
|
-
rescue => detail
|
121
|
-
self.fail Puppet::Error, "Resource with checksum_type #{checksum_type} didn't contain a date in #{current} or #{desired}", detail.backtrace
|
97
|
+
if checksum_value = resource.parameter(:checksum_value)
|
98
|
+
desired = "{#{checksum_type}}#{checksum_value.value}"
|
122
99
|
end
|
100
|
+
|
101
|
+
# The inherited equality is always accepted, so use it if valid.
|
102
|
+
return true if super(current, desired)
|
103
|
+
return date_matches?(checksum_type, current, desired)
|
123
104
|
end
|
124
105
|
|
125
106
|
def retrieve
|
126
|
-
|
127
|
-
ftype = stat.ftype
|
128
|
-
# Don't even try to manage the content on directories or links
|
129
|
-
return nil if ["directory","link"].include?(ftype)
|
130
|
-
|
131
|
-
begin
|
132
|
-
resource.parameter(:checksum).sum_file(resource[:path])
|
133
|
-
rescue => detail
|
134
|
-
raise Puppet::Error, "Could not read #{ftype} #{@resource.title}: #{detail}", detail.backtrace
|
135
|
-
end
|
107
|
+
retrieve_checksum(resource)
|
136
108
|
end
|
137
109
|
|
138
110
|
# Make sure we're also managing the checksum property.
|
@@ -146,93 +118,36 @@ module Puppet
|
|
146
118
|
|
147
119
|
# Just write our content out to disk.
|
148
120
|
def sync
|
149
|
-
|
150
|
-
|
151
|
-
# We're safe not testing for the 'source' if there's no 'should'
|
152
|
-
# because we wouldn't have gotten this far if there weren't at least
|
153
|
-
# one valid value somewhere.
|
154
|
-
@resource.write(:content)
|
155
|
-
|
156
|
-
return_event
|
157
|
-
end
|
158
|
-
|
159
|
-
def write_temporarily
|
160
|
-
tempfile = Tempfile.new("puppet-file")
|
161
|
-
tempfile.open
|
162
|
-
|
163
|
-
write(tempfile)
|
164
|
-
|
165
|
-
tempfile.close
|
166
|
-
|
167
|
-
yield tempfile.path
|
168
|
-
|
169
|
-
tempfile.delete
|
121
|
+
contents_sync(resource.parameter(:source) || self)
|
170
122
|
end
|
171
123
|
|
172
124
|
def write(file)
|
173
125
|
resource.parameter(:checksum).sum_stream { |sum|
|
174
|
-
each_chunk_from
|
126
|
+
each_chunk_from { |chunk|
|
175
127
|
sum << chunk
|
176
128
|
file.print chunk
|
177
129
|
}
|
178
130
|
}
|
179
131
|
end
|
180
132
|
|
133
|
+
private
|
134
|
+
|
181
135
|
# the content is munged so if it's a checksum source_or_content is nil
|
182
136
|
# unless the checksum indirectly comes from source
|
183
|
-
def each_chunk_from
|
184
|
-
if
|
185
|
-
yield
|
186
|
-
elsif content_is_really_a_checksum? &&
|
137
|
+
def each_chunk_from
|
138
|
+
if actual_content.is_a?(String)
|
139
|
+
yield actual_content
|
140
|
+
elsif content_is_really_a_checksum? && actual_content.nil?
|
187
141
|
yield read_file_from_filebucket
|
188
|
-
elsif
|
142
|
+
elsif actual_content.nil?
|
189
143
|
yield ''
|
190
|
-
elsif Puppet[:default_file_terminus] == :file_server
|
191
|
-
yield source_or_content.content
|
192
|
-
elsif source_or_content.local?
|
193
|
-
chunk_file_from_disk(source_or_content) { |chunk| yield chunk }
|
194
|
-
else
|
195
|
-
chunk_file_from_source(source_or_content) { |chunk| yield chunk }
|
196
144
|
end
|
197
145
|
end
|
198
146
|
|
199
|
-
private
|
200
|
-
|
201
147
|
def content_is_really_a_checksum?
|
202
148
|
checksum?(should)
|
203
149
|
end
|
204
150
|
|
205
|
-
def chunk_file_from_disk(source_or_content)
|
206
|
-
File.open(source_or_content.full_path, "rb") do |src|
|
207
|
-
while chunk = src.read(8192)
|
208
|
-
yield chunk
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
def get_from_source(source_or_content, &block)
|
214
|
-
source = source_or_content.metadata.source
|
215
|
-
request = Puppet::Indirector::Request.new(:file_content, :find, source, nil, :environment => resource.catalog.environment_instance)
|
216
|
-
|
217
|
-
request.do_request(:fileserver) do |req|
|
218
|
-
connection = Puppet::Network::HttpPool.http_instance(req.server, req.port)
|
219
|
-
connection.request_get(Puppet::Network::HTTP::API::IndirectedRoutes.request_to_uri(req), add_accept_encoding({"Accept" => "binary"}), &block)
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
|
224
|
-
def chunk_file_from_source(source_or_content)
|
225
|
-
get_from_source(source_or_content) do |response|
|
226
|
-
case response.code
|
227
|
-
when /^2/; uncompress(response) { |uncompressor| response.read_body { |chunk| yield uncompressor.uncompress(chunk) } }
|
228
|
-
else
|
229
|
-
# Raise the http error if we didn't get a 'success' of some kind.
|
230
|
-
message = "Error #{response.code} on SERVER: #{(response.body||'').empty? ? response.message : uncompress_body(response)}"
|
231
|
-
raise Net::HTTPError.new(message, response)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
151
|
def read_file_from_filebucket
|
237
152
|
raise "Could not get filebucket from file" unless dipper = resource.bucket
|
238
153
|
sum = should.sub(/\{\w+\}/, '')
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'puppet/util/checksums'
|
2
|
+
require 'puppet/util/diff'
|
3
|
+
require 'date'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
module Puppet
|
7
|
+
module DataSync
|
8
|
+
include Puppet::Util::Checksums
|
9
|
+
include Puppet::Util::Diff
|
10
|
+
|
11
|
+
def write_temporarily(param)
|
12
|
+
tempfile = Tempfile.new("puppet-file")
|
13
|
+
tempfile.open
|
14
|
+
|
15
|
+
param.write(tempfile)
|
16
|
+
|
17
|
+
tempfile.close
|
18
|
+
|
19
|
+
yield tempfile.path
|
20
|
+
ensure
|
21
|
+
tempfile.delete if tempfile
|
22
|
+
end
|
23
|
+
|
24
|
+
def checksum_insync?(param, is, has_contents, &block)
|
25
|
+
resource = param.resource
|
26
|
+
if resource.should_be_file?
|
27
|
+
return false if is == :absent
|
28
|
+
else
|
29
|
+
if resource[:ensure] == :present && has_contents && (s = resource.stat)
|
30
|
+
resource.warning "Ensure set to :present but file type is #{s.ftype} so no content will be synced"
|
31
|
+
end
|
32
|
+
return true
|
33
|
+
end
|
34
|
+
|
35
|
+
return true if ! resource.replace?
|
36
|
+
|
37
|
+
result = yield(is)
|
38
|
+
|
39
|
+
if !result && Puppet[:show_diff] && resource.show_diff?
|
40
|
+
write_temporarily(param) do |path|
|
41
|
+
send resource[:loglevel], "\n" + diff(resource[:path], path)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
result
|
45
|
+
end
|
46
|
+
|
47
|
+
def date_matches?(checksum_type, current, desired)
|
48
|
+
time_types = [:mtime, :ctime]
|
49
|
+
return false if !time_types.include?(checksum_type)
|
50
|
+
return false unless current && desired
|
51
|
+
|
52
|
+
begin
|
53
|
+
if checksum?(current) || checksum?(desired)
|
54
|
+
raise if !time_types.include?(sumtype(current).to_sym) || !time_types.include?(sumtype(desired).to_sym)
|
55
|
+
current = sumdata(current)
|
56
|
+
desired = sumdata(desired)
|
57
|
+
end
|
58
|
+
DateTime.parse(current) >= DateTime.parse(desired)
|
59
|
+
rescue => detail
|
60
|
+
self.fail Puppet::Error, "Resource with checksum_type #{checksum_type} didn't contain a date in #{current} or #{desired}", detail.backtrace
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def retrieve_checksum(resource)
|
65
|
+
return :absent unless stat = resource.stat
|
66
|
+
ftype = stat.ftype
|
67
|
+
# Don't even try to manage the content on directories or links
|
68
|
+
return nil if ["directory","link"].include?(ftype)
|
69
|
+
|
70
|
+
begin
|
71
|
+
resource.parameter(:checksum).sum_file(resource[:path])
|
72
|
+
rescue => detail
|
73
|
+
raise Puppet::Error, "Could not read #{ftype} #{resource.title}: #{detail}", detail.backtrace
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def contents_sync(param)
|
78
|
+
return_event = param.resource.stat ? :file_changed : :file_created
|
79
|
+
resource.write(param)
|
80
|
+
return_event
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
@@ -9,22 +9,21 @@ module Puppet
|
|
9
9
|
Whether the file should exist, and if so what kind of file it should be.
|
10
10
|
Possible values are `present`, `absent`, `file`, `directory`, and `link`.
|
11
11
|
|
12
|
-
* `present`
|
12
|
+
* `present` accepts any form of file existence, and creates a
|
13
13
|
normal file if the file is missing. (The file will have no content
|
14
14
|
unless the `content` or `source` attribute is used.)
|
15
|
-
* `absent`
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
also set the `target` attribute. Symlinks are supported on all Posix
|
15
|
+
* `absent` ensures the file doesn't exist, and deletes it if necessary.
|
16
|
+
* `file` ensures it's a normal file, and enables use of the `content` or
|
17
|
+
`source` attribute.
|
18
|
+
* `directory` ensures it's a directory, and enables use of the `source`,
|
19
|
+
`recurse`, `recurselimit`, `ignore`, and `purge` attributes.
|
20
|
+
* `link` ensures the file is a symlink, and **requires** that you also
|
21
|
+
set the `target` attribute. Symlinks are supported on all Posix
|
23
22
|
systems and on Windows Vista / 2008 and higher. On Windows, managing
|
24
|
-
symlinks requires
|
23
|
+
symlinks requires Puppet agent's user account to have the "Create
|
25
24
|
Symbolic Links" privilege; this can be configured in the "User Rights
|
26
|
-
Assignment" section in the Windows policy editor. By default,
|
27
|
-
agent runs as the Administrator account, which
|
25
|
+
Assignment" section in the Windows policy editor. By default, Puppet
|
26
|
+
agent runs as the Administrator account, which has this privilege.
|
28
27
|
|
29
28
|
Puppet avoids destroying directories unless the `force` attribute is set
|
30
29
|
to `true`. This means that if a file is currently a directory, setting
|
@@ -47,7 +46,9 @@ module Puppet
|
|
47
46
|
}
|
48
47
|
|
49
48
|
However, we recommend using `link` and `target` explicitly, since this
|
50
|
-
behavior can be harder to read
|
49
|
+
behavior can be harder to read and is
|
50
|
+
[deprecated](https://docs.puppetlabs.com/puppet/4.3/reference/deprecated_language.html)
|
51
|
+
as of Puppet 4.3.0.
|
51
52
|
EOT
|
52
53
|
|
53
54
|
# Most 'ensure' properties have a default, but with files we, um, don't.
|
@@ -63,8 +64,10 @@ module Puppet
|
|
63
64
|
# Make sure we're not managing the content some other way
|
64
65
|
if property = @resource.property(:content)
|
65
66
|
property.sync
|
67
|
+
elsif property = @resource.property(:checksum_value)
|
68
|
+
property.sync
|
66
69
|
else
|
67
|
-
@resource.write
|
70
|
+
@resource.write
|
68
71
|
@resource.should(:mode)
|
69
72
|
end
|
70
73
|
end
|
@@ -17,7 +17,7 @@
|
|
17
17
|
# command. This allows the user to specify a subset of the three
|
18
18
|
# values while leaving the others alone.
|
19
19
|
#
|
20
|
-
# See
|
20
|
+
# See https://www.nsa.gov/selinux/ for complete docs on SELinux.
|
21
21
|
|
22
22
|
|
23
23
|
module Puppet
|
@@ -1,5 +1,11 @@
|
|
1
1
|
require 'puppet/file_serving/content'
|
2
2
|
require 'puppet/file_serving/metadata'
|
3
|
+
require 'puppet/file_serving/terminus_helper'
|
4
|
+
|
5
|
+
require 'puppet/util/http_proxy'
|
6
|
+
require 'puppet/network/http'
|
7
|
+
require 'puppet/network/http/api/indirected_routes'
|
8
|
+
require 'puppet/network/http/compression'
|
3
9
|
|
4
10
|
module Puppet
|
5
11
|
# Copy files from a local or remote source. This state *only* does any work
|
@@ -8,7 +14,7 @@ module Puppet
|
|
8
14
|
# this state, during retrieval, modifies the appropriate other states
|
9
15
|
# so that things get taken care of appropriately.
|
10
16
|
Puppet::Type.type(:file).newparam(:source) do
|
11
|
-
include Puppet::
|
17
|
+
include Puppet::Network::HTTP::Compression.module
|
12
18
|
|
13
19
|
attr_accessor :source, :local
|
14
20
|
desc <<-'EOT'
|
@@ -21,6 +27,7 @@ module Puppet
|
|
21
27
|
* Fully qualified paths to locally available files (including files on NFS
|
22
28
|
shares or Windows mapped drives).
|
23
29
|
* `file:` URIs, which behave the same as local file paths.
|
30
|
+
* `http:` URIs, which point to files served by common web servers
|
24
31
|
|
25
32
|
The normal form of a `puppet:` URI is:
|
26
33
|
|
@@ -36,6 +43,11 @@ module Puppet
|
|
36
43
|
a source directory contains symlinks, use the `links` attribute to
|
37
44
|
specify whether to recreate links or follow them.
|
38
45
|
|
46
|
+
*HTTP* URIs cannot be used to recursively synchronize whole directory
|
47
|
+
trees. It is also not possible to use `source_permissions` values other
|
48
|
+
than `ignore`. That's because HTTP servers do not transfer any metadata
|
49
|
+
that translates to ownership or permission details.
|
50
|
+
|
39
51
|
Multiple `source` values can be specified as an array, and Puppet will
|
40
52
|
use the first source that exists. This can be used to serve different
|
41
53
|
files to different system types:
|
@@ -65,7 +77,9 @@ module Puppet
|
|
65
77
|
|
66
78
|
self.fail "Cannot use relative URLs '#{source}'" unless uri.absolute?
|
67
79
|
self.fail "Cannot use opaque URLs '#{source}'" unless uri.hierarchical?
|
68
|
-
|
80
|
+
unless %w{file puppet http https}.include?(uri.scheme)
|
81
|
+
self.fail "Cannot use URLs of type '#{uri.scheme}' as source for fileserving"
|
82
|
+
end
|
69
83
|
end
|
70
84
|
end
|
71
85
|
|
@@ -74,7 +88,7 @@ module Puppet
|
|
74
88
|
munge do |sources|
|
75
89
|
sources = [sources] unless sources.is_a?(Array)
|
76
90
|
sources.map do |source|
|
77
|
-
source =
|
91
|
+
source = self.class.normalize(source)
|
78
92
|
|
79
93
|
if Puppet::Util.absolute_path?(source)
|
80
94
|
URI.unescape(Puppet::Util.path_to_uri(source).to_s)
|
@@ -84,6 +98,10 @@ module Puppet
|
|
84
98
|
end
|
85
99
|
end
|
86
100
|
|
101
|
+
def self.normalize(source)
|
102
|
+
source.sub(/[#{SEPARATOR_REGEX}]+$/, '')
|
103
|
+
end
|
104
|
+
|
87
105
|
def change_to_s(currentvalue, newvalue)
|
88
106
|
# newvalue = "{md5}#{@metadata.checksum}"
|
89
107
|
if resource.property(:ensure).retrieve == :absent
|
@@ -123,21 +141,6 @@ module Puppet
|
|
123
141
|
next if metadata_method == :owner and !Puppet.features.root?
|
124
142
|
next if metadata_method == :group and !Puppet.features.root?
|
125
143
|
|
126
|
-
if Puppet.features.microsoft_windows?
|
127
|
-
# Warn on Windows if source permissions are being used and the file resource
|
128
|
-
# does not have mode owner and group all set (which would take precedence).
|
129
|
-
if [:use, :use_when_creating].include?(resource[:source_permissions]) &&
|
130
|
-
(resource[:owner] == nil || resource[:group] == nil || resource[:mode] == nil)
|
131
|
-
|
132
|
-
err_msg = "Copying %s from the source" <<
|
133
|
-
" file on Windows is not supported;" <<
|
134
|
-
" use source_permissions => ignore."
|
135
|
-
self.fail Puppet::Error, err_msg % 'owner/mode/group'
|
136
|
-
end
|
137
|
-
# But never try to copy remote owner/group on Windows
|
138
|
-
next if [:owner, :group].include?(metadata_method) && !local?
|
139
|
-
end
|
140
|
-
|
141
144
|
case resource[:source_permissions]
|
142
145
|
when :ignore
|
143
146
|
next
|
@@ -167,6 +170,11 @@ module Puppet
|
|
167
170
|
# problems in our query.
|
168
171
|
def metadata
|
169
172
|
return @metadata if @metadata
|
173
|
+
|
174
|
+
if @metadata = resource.catalog.metadata[resource.title]
|
175
|
+
return @metadata
|
176
|
+
end
|
177
|
+
|
170
178
|
return nil unless value
|
171
179
|
value.each do |source|
|
172
180
|
begin
|
@@ -214,6 +222,15 @@ module Puppet
|
|
214
222
|
@uri ||= URI.parse(URI.escape(metadata.source))
|
215
223
|
end
|
216
224
|
|
225
|
+
def write(file)
|
226
|
+
resource.parameter(:checksum).sum_stream { |sum|
|
227
|
+
each_chunk_from { |chunk|
|
228
|
+
sum << chunk
|
229
|
+
file.print chunk
|
230
|
+
}
|
231
|
+
}
|
232
|
+
end
|
233
|
+
|
217
234
|
private
|
218
235
|
|
219
236
|
def scheme
|
@@ -227,10 +244,78 @@ module Puppet
|
|
227
244
|
def copy_source_value(metadata_method)
|
228
245
|
param_name = (metadata_method == :checksum) ? :content : metadata_method
|
229
246
|
if resource[param_name].nil? or resource[param_name] == :absent
|
247
|
+
if Puppet.features.microsoft_windows? && [:owner, :group, :mode].include?(metadata_method)
|
248
|
+
devfail "Should not have tried to use source owner/mode/group on Windows"
|
249
|
+
end
|
250
|
+
|
230
251
|
value = metadata.send(metadata_method)
|
231
252
|
# Force the mode value in file resources to be a string containing octal.
|
232
253
|
value = value.to_s(8) if param_name == :mode && value.is_a?(Numeric)
|
233
254
|
resource[param_name] = value
|
255
|
+
|
256
|
+
if (metadata_method == :checksum)
|
257
|
+
# If copying checksum, also copy checksum_type
|
258
|
+
resource[:checksum] = metadata.checksum_type
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def each_chunk_from
|
264
|
+
if Puppet[:default_file_terminus] == :file_server
|
265
|
+
yield content
|
266
|
+
elsif local?
|
267
|
+
chunk_file_from_disk { |chunk| yield chunk }
|
268
|
+
else
|
269
|
+
chunk_file_from_source { |chunk| yield chunk }
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def chunk_file_from_disk
|
274
|
+
File.open(full_path, "rb") do |src|
|
275
|
+
while chunk = src.read(8192)
|
276
|
+
yield chunk
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def get_from_puppet_source(source_uri, content_uri, &block)
|
282
|
+
options = { :environment => resource.catalog.environment_instance }
|
283
|
+
if content_uri
|
284
|
+
options[:code_id] = resource.catalog.code_id
|
285
|
+
request = Puppet::Indirector::Request.new(:static_file_content, :find, content_uri, nil, options)
|
286
|
+
else
|
287
|
+
request = Puppet::Indirector::Request.new(:file_content, :find, source_uri, nil, options)
|
288
|
+
end
|
289
|
+
|
290
|
+
request.do_request(:fileserver) do |req|
|
291
|
+
connection = Puppet::Network::HttpPool.http_instance(req.server, req.port)
|
292
|
+
connection.request_get(Puppet::Network::HTTP::API::IndirectedRoutes.request_to_uri(req), add_accept_encoding({"Accept" => "binary"}), &block)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def get_from_http_source(source_uri, &block)
|
297
|
+
Puppet::Util::HttpProxy.request_with_redirects(URI(source_uri), :get, &block)
|
298
|
+
end
|
299
|
+
|
300
|
+
def get_from_source(&block)
|
301
|
+
source_uri = metadata.source
|
302
|
+
if source_uri =~ /^https?:/
|
303
|
+
get_from_http_source(source_uri, &block)
|
304
|
+
else
|
305
|
+
get_from_puppet_source(source_uri, metadata.content_uri, &block)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
|
310
|
+
def chunk_file_from_source
|
311
|
+
get_from_source do |response|
|
312
|
+
case response.code
|
313
|
+
when /^2/; uncompress(response) { |uncompressor| response.read_body { |chunk| yield uncompressor.uncompress(chunk) } }
|
314
|
+
else
|
315
|
+
# Raise the http error if we didn't get a 'success' of some kind.
|
316
|
+
message = "Error #{response.code} on SERVER: #{(response.body||'').empty? ? response.message : uncompress_body(response)}"
|
317
|
+
raise Net::HTTPError.new(message, response)
|
318
|
+
end
|
234
319
|
end
|
235
320
|
end
|
236
321
|
end
|