puppet 6.11.1 → 6.16.0
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/CODEOWNERS +3 -8
- data/CONTRIBUTING.md +7 -13
- data/Gemfile +1 -0
- data/Gemfile.lock +39 -36
- data/README.md +17 -24
- data/ext/build_defaults.yaml +1 -0
- data/ext/project_data.yaml +1 -1
- data/ext/windows/service/daemon.rb +25 -20
- data/lib/puppet.rb +52 -13
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/application/agent.rb +12 -14
- data/lib/puppet/application/describe.rb +7 -5
- data/lib/puppet/application/device.rb +2 -2
- data/lib/puppet/application/filebucket.rb +19 -15
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/application/ssl.rb +4 -4
- data/lib/puppet/concurrent.rb +2 -0
- data/lib/puppet/concurrent/lock.rb +16 -0
- data/lib/puppet/concurrent/synchronized.rb +15 -0
- data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
- data/lib/puppet/configurer.rb +85 -83
- data/lib/puppet/configurer/plugin_handler.rb +10 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +158 -40
- data/lib/puppet/environments.rb +30 -20
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/face/facts.rb +8 -5
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/file_system/memory_file.rb +6 -0
- data/lib/puppet/file_system/memory_impl.rb +13 -0
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/file_system/windows.rb +7 -10
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/forge/errors.rb +2 -2
- data/lib/puppet/forge/repository.rb +31 -86
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/camelcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/find_file.rb +9 -9
- data/lib/puppet/functions/find_template.rb +63 -0
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +7 -0
- data/lib/puppet/http/client.rb +341 -54
- data/lib/puppet/http/errors.rb +2 -0
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +57 -1
- data/lib/puppet/http/resolver/server_list.rb +98 -0
- data/lib/puppet/http/resolver/settings.rb +23 -2
- data/lib/puppet/http/resolver/srv.rb +36 -4
- data/lib/puppet/http/response.rb +68 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +179 -3
- data/lib/puppet/http/service/ca.rb +84 -21
- data/lib/puppet/http/service/compiler.rb +319 -0
- data/lib/puppet/http/service/file_server.rb +206 -0
- data/lib/puppet/http/service/report.rb +66 -0
- data/lib/puppet/http/session.rb +106 -31
- data/lib/puppet/indirector/catalog/compiler.rb +10 -0
- data/lib/puppet/indirector/catalog/rest.rb +34 -0
- data/lib/puppet/indirector/facts/rest.rb +42 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_content/rest.rb +30 -0
- data/lib/puppet/indirector/file_metadata/http.rb +4 -4
- data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +24 -0
- data/lib/puppet/indirector/report/rest.rb +19 -0
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/rest.rb +12 -0
- data/lib/puppet/indirector/status/rest.rb +18 -0
- data/lib/puppet/loaders.rb +6 -0
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +19 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +6 -0
- data/lib/puppet/network/http/connection_adapter.rb +182 -0
- data/lib/puppet/network/http/nocache_pool.rb +2 -0
- data/lib/puppet/network/http/pool.rb +13 -6
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +24 -8
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +9 -29
- data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
- data/lib/puppet/parser/compiler.rb +42 -32
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
- data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/pops/lookup/invocation.rb +10 -3
- data/lib/puppet/pops/model/pn_transformer.rb +5 -9
- data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
- data/lib/puppet/pops/serialization/json_path.rb +3 -3
- data/lib/puppet/pops/time/timespan.rb +3 -5
- data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
- data/lib/puppet/pops/types/string_converter.rb +6 -9
- data/lib/puppet/pops/types/type_calculator.rb +30 -10
- data/lib/puppet/pops/types/type_formatter.rb +9 -11
- data/lib/puppet/pops/types/type_parser.rb +3 -3
- data/lib/puppet/pops/validation/checker4_0.rb +1 -1
- data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
- data/lib/puppet/provider/aix_object.rb +4 -2
- data/lib/puppet/provider/group/aix.rb +1 -0
- data/lib/puppet/provider/group/groupadd.rb +57 -24
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +78 -4
- data/lib/puppet/provider/package/dnfmodule.rb +69 -15
- data/lib/puppet/provider/package/dpkg.rb +14 -7
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/openbsd.rb +13 -1
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkg.rb +18 -5
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/portage.rb +5 -5
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +108 -24
- data/lib/puppet/provider/package/zypper.rb +59 -1
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/service/systemd.rb +23 -5
- data/lib/puppet/provider/user/aix.rb +1 -0
- data/lib/puppet/provider/user/directoryservice.rb +30 -5
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +11 -8
- data/lib/puppet/reports/http.rb +13 -9
- data/lib/puppet/reports/store.rb +1 -1
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/runtime.rb +32 -1
- data/lib/puppet/settings.rb +4 -0
- data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_provider.rb +20 -0
- data/lib/puppet/ssl/state_machine.rb +81 -35
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +7 -1
- data/lib/puppet/transaction.rb +33 -11
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +7 -2
- data/lib/puppet/type/file.rb +13 -0
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/file/source.rb +49 -58
- data/lib/puppet/type/group.rb +5 -4
- data/lib/puppet/type/package.rb +102 -10
- data/lib/puppet/type/service.rb +6 -8
- data/lib/puppet/type/user.rb +6 -30
- data/lib/puppet/util.rb +34 -11
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +4 -18
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +2 -11
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +53 -0
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +36 -10
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/storage.rb +0 -1
- data/lib/puppet/util/windows/adsi.rb +50 -20
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/yaml.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509/cert_provider.rb +9 -5
- data/locales/puppet.pot +640 -521
- data/man/man5/puppet.conf.5 +88 -9
- data/man/man8/puppet-agent.8 +6 -6
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +17 -2
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +2 -2
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/forge/bacula.json +76 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
- 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 +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
- data/spec/integration/application/agent_spec.rb +394 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +73 -0
- data/spec/integration/configurer_spec.rb +26 -7
- data/spec/integration/http/client_spec.rb +154 -0
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +51 -0
- data/spec/integration/network/http_pool_spec.rb +76 -20
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +20 -9
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/spec_helper.rb +6 -2
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +9 -5
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/application/describe_spec.rb +88 -50
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/resource_spec.rb +2 -2
- data/spec/unit/concurrent/lock_spec.rb +29 -0
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
- data/spec/unit/configurer_spec.rb +400 -406
- data/spec/unit/context/trusted_information_spec.rb +17 -0
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +38 -4
- data/spec/unit/environments_spec.rb +65 -28
- data/spec/unit/face/facts_spec.rb +24 -20
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/plugin_spec.rb +12 -10
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/file_system_spec.rb +26 -2
- data/spec/unit/forge/errors_spec.rb +1 -1
- data/spec/unit/forge/forge_spec.rb +12 -54
- data/spec/unit/forge/module_release_spec.rb +19 -6
- data/spec/unit/forge/repository_spec.rb +63 -157
- data/spec/unit/forge_spec.rb +46 -116
- data/spec/unit/functions/find_template_spec.rb +69 -0
- data/spec/unit/functions/lookup_spec.rb +13 -0
- data/spec/unit/http/client_spec.rb +395 -27
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +81 -12
- data/spec/unit/http/response_spec.rb +69 -0
- data/spec/unit/http/service/ca_spec.rb +100 -7
- data/spec/unit/http/service/compiler_spec.rb +627 -0
- data/spec/unit/http/service/file_server_spec.rb +308 -0
- data/spec/unit/http/service/report_spec.rb +118 -0
- data/spec/unit/http/service_spec.rb +117 -4
- data/spec/unit/http/session_spec.rb +237 -19
- data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
- data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
- data/spec/unit/indirector/facts/rest_spec.rb +79 -24
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
- data/spec/unit/indirector/node/rest_spec.rb +57 -2
- data/spec/unit/indirector/report/rest_spec.rb +58 -51
- data/spec/unit/indirector/resource/ral_spec.rb +7 -8
- data/spec/unit/indirector/rest_spec.rb +13 -0
- data/spec/unit/indirector/status/rest_spec.rb +43 -2
- data/spec/unit/network/http/connection_spec.rb +549 -176
- data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
- data/spec/unit/network/http/pool_spec.rb +89 -11
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/node/facts_spec.rb +2 -1
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
- data/spec/unit/pops/validator/validator_spec.rb +7 -2
- data/spec/unit/provider/aix_object_spec.rb +16 -2
- data/spec/unit/provider/group/groupadd_spec.rb +181 -56
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +43 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
- data/spec/unit/provider/package/dpkg_spec.rb +28 -6
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- data/spec/unit/provider/package/pkg_spec.rb +15 -1
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/portage_spec.rb +9 -4
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +292 -0
- data/spec/unit/provider/package/zypper_spec.rb +84 -0
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -0
- data/spec/unit/provider/service/systemd_spec.rb +92 -12
- data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_spec.rb +21 -8
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -26
- data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
- data/spec/unit/puppet_spec.rb +47 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/settings/autosign_setting_spec.rb +1 -1
- data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
- data/spec/unit/ssl/state_machine_spec.rb +99 -13
- data/spec/unit/transaction/persistence_spec.rb +1 -10
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/transaction_spec.rb +45 -1
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file/ensure_spec.rb +1 -2
- data/spec/unit/type/file/source_spec.rb +86 -35
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +1 -2
- data/spec/unit/util/at_fork_spec.rb +3 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +175 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +112 -42
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/storage_spec.rb +1 -8
- data/spec/unit/util/windows/adsi_spec.rb +55 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/x509/cert_provider_spec.rb +24 -4
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +6 -35
- metadata +92 -12
- data/COMMITTERS.md +0 -244
- data/spec/integration/faces/plugin_spec.rb +0 -61
- data/spec/lib/puppet_spec/validators.rb +0 -37
data/lib/puppet/environments.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'puppet/concurrent/synchronized'
|
2
|
+
|
1
3
|
# @api private
|
2
4
|
module Puppet::Environments
|
3
5
|
|
@@ -184,6 +186,13 @@ module Puppet::Environments
|
|
184
186
|
end
|
185
187
|
end
|
186
188
|
|
189
|
+
def self.real_path(dir)
|
190
|
+
if Puppet::FileSystem.symlink?(dir) && Puppet[:versioned_environment_dirs]
|
191
|
+
dir = Puppet::FileSystem.expand_path(Puppet::FileSystem.readlink(dir))
|
192
|
+
end
|
193
|
+
return dir
|
194
|
+
end
|
195
|
+
|
187
196
|
# @!macro loader_search_paths
|
188
197
|
def search_paths
|
189
198
|
["file://#{@environment_dir}"]
|
@@ -191,27 +200,26 @@ module Puppet::Environments
|
|
191
200
|
|
192
201
|
# @!macro loader_list
|
193
202
|
def list
|
194
|
-
|
195
|
-
name = Puppet::FileSystem.basename_string(envdir).intern
|
196
|
-
|
203
|
+
valid_environment_names.collect do |name|
|
197
204
|
create_environment(name)
|
198
205
|
end
|
199
206
|
end
|
200
207
|
|
201
208
|
# @!macro loader_get
|
202
209
|
def get(name)
|
203
|
-
if
|
210
|
+
if validated_directory(File.join(@environment_dir, name.to_s))
|
204
211
|
create_environment(name)
|
205
212
|
end
|
206
213
|
end
|
207
214
|
|
208
215
|
# @!macro loader_get_conf
|
209
216
|
def get_conf(name)
|
210
|
-
envdir = File.join(@environment_dir, name.to_s)
|
211
|
-
if
|
212
|
-
|
217
|
+
envdir = validated_directory(File.join(@environment_dir, name.to_s))
|
218
|
+
if envdir
|
219
|
+
Puppet::Settings::EnvironmentConf.load_from(envdir, @global_module_path)
|
220
|
+
else
|
221
|
+
nil
|
213
222
|
end
|
214
|
-
nil
|
215
223
|
end
|
216
224
|
|
217
225
|
private
|
@@ -228,21 +236,22 @@ module Puppet::Environments
|
|
228
236
|
env
|
229
237
|
end
|
230
238
|
|
231
|
-
def
|
232
|
-
|
233
|
-
Puppet::
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
def valid_directories
|
238
|
-
if Puppet::FileSystem.directory?(@environment_dir)
|
239
|
-
Puppet::FileSystem.children(@environment_dir).select do |child|
|
240
|
-
valid_directory?(child)
|
241
|
-
end
|
239
|
+
def validated_directory(envdir)
|
240
|
+
env_name = Puppet::FileSystem.basename_string(envdir)
|
241
|
+
envdir = Puppet::Environments::Directories.real_path(envdir)
|
242
|
+
if Puppet::FileSystem.directory?(envdir) && Puppet::Node::Environment.valid_name?(env_name)
|
243
|
+
envdir
|
242
244
|
else
|
243
|
-
|
245
|
+
nil
|
244
246
|
end
|
245
247
|
end
|
248
|
+
|
249
|
+
def valid_environment_names
|
250
|
+
return [] unless Puppet::FileSystem.directory?(@environment_dir)
|
251
|
+
Puppet::FileSystem.children(@environment_dir).map do |child|
|
252
|
+
Puppet::FileSystem.basename_string(child).intern if validated_directory(child)
|
253
|
+
end.compact
|
254
|
+
end
|
246
255
|
end
|
247
256
|
|
248
257
|
# Combine together multiple loaders to act as one.
|
@@ -293,6 +302,7 @@ module Puppet::Environments
|
|
293
302
|
|
294
303
|
class Cached
|
295
304
|
include EnvironmentLoader
|
305
|
+
include Puppet::Concurrent::Synchronized
|
296
306
|
|
297
307
|
class DefaultCacheExpirationService
|
298
308
|
def created(env)
|
data/lib/puppet/error.rb
CHANGED
@@ -12,7 +12,7 @@ module Puppet
|
|
12
12
|
# This module implements logging with a filename and line number. Use this
|
13
13
|
# for errors that need to report a location in a non-ruby file that we
|
14
14
|
# parse.
|
15
|
-
attr_accessor :line, :file, :pos
|
15
|
+
attr_accessor :line, :file, :pos, :puppetstack
|
16
16
|
|
17
17
|
# May be called with 3 arguments for message, file, line, and exception, or
|
18
18
|
# 4 args including the position on the line.
|
@@ -22,10 +22,18 @@ module Puppet
|
|
22
22
|
original = pos
|
23
23
|
pos = nil
|
24
24
|
end
|
25
|
+
|
25
26
|
super(message, original)
|
27
|
+
|
26
28
|
@file = file unless (file.is_a?(String) && file.empty?)
|
27
29
|
@line = line
|
28
30
|
@pos = pos
|
31
|
+
|
32
|
+
if original && original.respond_to?(:puppetstack)
|
33
|
+
@puppetstack = original.puppetstack
|
34
|
+
else
|
35
|
+
@puppetstack = Puppet::Pops::PuppetStack.stacktrace()
|
36
|
+
end
|
29
37
|
end
|
30
38
|
|
31
39
|
def to_s
|
data/lib/puppet/face/facts.rb
CHANGED
@@ -75,13 +75,16 @@ Puppet::Indirector::Face.define(:facts, '0.0.1') do
|
|
75
75
|
facts.name = Puppet[:node_name_value]
|
76
76
|
end
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
client = Puppet.runtime[:http]
|
79
|
+
session = client.create_session
|
80
|
+
puppet = session.route_to(:puppet)
|
81
|
+
|
82
|
+
Puppet.notice(_("Uploading facts for '%{node}' to '%{server}'") % {
|
81
83
|
node: Puppet[:node_name_value],
|
82
|
-
server:
|
84
|
+
server: puppet.url.hostname})
|
83
85
|
|
84
|
-
|
86
|
+
puppet.put_facts(Puppet[:node_name_value], facts: facts, environment: Puppet.lookup(:current_environment).name.to_s)
|
87
|
+
nil
|
85
88
|
end
|
86
89
|
end
|
87
90
|
end
|
data/lib/puppet/face/help.rb
CHANGED
@@ -24,12 +24,19 @@ Puppet::Face.define(:help, '0.0.1') do
|
|
24
24
|
summary _("The version of the subcommand for which to show help.")
|
25
25
|
end
|
26
26
|
|
27
|
+
option "--ronn" do
|
28
|
+
summary _("Whether to render the help text in ronn format.")
|
29
|
+
default_to { false }
|
30
|
+
end
|
31
|
+
|
27
32
|
default
|
28
33
|
when_invoked do |*args|
|
29
34
|
options = args.pop
|
30
35
|
|
31
|
-
|
32
|
-
|
36
|
+
unless options[:ronn]
|
37
|
+
if default_case?(args) || help_for_help?(args)
|
38
|
+
return erb('global.erb').result(binding)
|
39
|
+
end
|
33
40
|
end
|
34
41
|
|
35
42
|
if args.length > 2
|
@@ -54,9 +61,20 @@ Puppet::Face.define(:help, '0.0.1') do
|
|
54
61
|
if actionname
|
55
62
|
raise ArgumentError, _("The legacy subcommand '%{sub_command}' does not support supplying an action") % { sub_command: facename }
|
56
63
|
end
|
64
|
+
# legacy apps already emit ronn output
|
57
65
|
return render_application_help(facename)
|
58
66
|
else
|
59
|
-
|
67
|
+
if options[:ronn]
|
68
|
+
# Calling `puppet help <app> --ronn` normally calls this action with
|
69
|
+
# <app> as the first argument in the `args` array. However, if <app>
|
70
|
+
# happens to match the name of an action, like `puppet help help
|
71
|
+
# --ronn`, then face_base "eats" the argument and `args` will be
|
72
|
+
# empty. Rather than force users to type `puppet help help help
|
73
|
+
# --ronn`, default the facename to `:help`
|
74
|
+
render_face_man(facename || :help)
|
75
|
+
else
|
76
|
+
render_face_help(facename, actionname, version)
|
77
|
+
end
|
60
78
|
end
|
61
79
|
end
|
62
80
|
end
|
@@ -69,6 +87,14 @@ Puppet::Face.define(:help, '0.0.1') do
|
|
69
87
|
args.length == 1 && args.first == 'help'
|
70
88
|
end
|
71
89
|
|
90
|
+
def render_face_man(facename)
|
91
|
+
# set 'face' as it's used in the erb processing.
|
92
|
+
face = Puppet::Face[facename.to_sym, :current]
|
93
|
+
# avoid unused variable warning
|
94
|
+
_face = face
|
95
|
+
erb('man.erb').result(binding)
|
96
|
+
end
|
97
|
+
|
72
98
|
def render_application_help(applicationname)
|
73
99
|
return Puppet::Application[applicationname].help
|
74
100
|
rescue StandardError, LoadError => detail
|
@@ -5,6 +5,8 @@ Puppet::Face.define(:module, '1.0.0') do
|
|
5
5
|
action(:search) do
|
6
6
|
summary _("Search the Puppet Forge for a module.")
|
7
7
|
description <<-EOT
|
8
|
+
This action has been deprecated. Please use the Puppet Forge to search for modules.
|
9
|
+
|
8
10
|
Searches a repository for modules whose names, descriptions, or keywords
|
9
11
|
match the provided search term.
|
10
12
|
EOT
|
@@ -22,6 +24,7 @@ Puppet::Face.define(:module, '1.0.0') do
|
|
22
24
|
arguments _("<search_term>")
|
23
25
|
|
24
26
|
when_invoked do |term, options|
|
27
|
+
Puppet.deprecation_warning(_("This action has been deprecated. Please use the Puppet Forge to search for modules."))
|
25
28
|
Puppet::ModuleTool.set_option_defaults options
|
26
29
|
Puppet::ModuleTool::Applications::Searcher.new(term, Puppet::Forge.new(options[:module_repository] || Puppet[:module_repository]), options).run
|
27
30
|
end
|
@@ -94,5 +97,7 @@ Puppet::Face.define(:module, '1.0.0') do
|
|
94
97
|
highlight[format % [ name.sub('/', '-'), desc, "@#{author}", [keywords].flatten.join(' ') ]]
|
95
98
|
end.join
|
96
99
|
end
|
100
|
+
|
101
|
+
deprecate
|
97
102
|
end
|
98
103
|
end
|
data/lib/puppet/face/plugin.rb
CHANGED
@@ -41,10 +41,10 @@ Puppet::Face.define(:plugin, '0.0.1') do
|
|
41
41
|
when_invoked do |options|
|
42
42
|
remote_environment_for_plugins = Puppet::Node::Environment.remote(Puppet[:environment])
|
43
43
|
|
44
|
-
pool = Puppet
|
44
|
+
pool = Puppet.runtime[:http].pool
|
45
45
|
Puppet.override(:http_pool => pool) do
|
46
46
|
begin
|
47
|
-
handler = Puppet::Configurer::PluginHandler.new
|
47
|
+
handler = Puppet::Configurer::PluginHandler.new
|
48
48
|
handler.download_plugins(remote_environment_for_plugins)
|
49
49
|
ensure
|
50
50
|
pool.close
|
@@ -18,7 +18,7 @@ class Puppet::FileServing::HttpMetadata < Puppet::FileServing::Metadata
|
|
18
18
|
checksum = http_response['content-md5']
|
19
19
|
if checksum
|
20
20
|
# convert base64 digest to hex
|
21
|
-
checksum = checksum.unpack("
|
21
|
+
checksum = checksum.unpack("m").first.unpack("H*").first
|
22
22
|
@checksums[:md5] = "{md5}#{checksum}"
|
23
23
|
end
|
24
24
|
|
@@ -80,7 +80,7 @@ class Puppet::FileSystem::FileImpl
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def read(path, opts = {})
|
83
|
-
path.read(opts)
|
83
|
+
path.read(**opts)
|
84
84
|
end
|
85
85
|
|
86
86
|
def read_preserve_line_endings(path)
|
@@ -156,12 +156,14 @@ class Puppet::FileSystem::FileImpl
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def replace_file(path, mode = nil)
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
159
|
+
begin
|
160
|
+
stat = Puppet::FileSystem.lstat(path)
|
161
|
+
gid = stat.gid
|
162
|
+
uid = stat.uid
|
163
|
+
mode ||= stat.mode & 07777
|
164
|
+
rescue Errno::ENOENT
|
165
|
+
mode ||= 0640
|
166
|
+
end
|
165
167
|
|
166
168
|
tempfile = Puppet::FileSystem::Uniquefile.new(Puppet::FileSystem.basename_string(path), Puppet::FileSystem.dir_string(path))
|
167
169
|
begin
|
@@ -173,8 +175,10 @@ class Puppet::FileSystem::FileImpl
|
|
173
175
|
tempfile.close
|
174
176
|
end
|
175
177
|
|
176
|
-
|
177
|
-
|
178
|
+
tempfile_path = tempfile.path
|
179
|
+
FileUtils.chown(uid, gid, tempfile_path) if uid && gid
|
180
|
+
chmod(mode, tempfile_path)
|
181
|
+
File.rename(tempfile_path, Puppet::FileSystem.path_string(path))
|
178
182
|
ensure
|
179
183
|
tempfile.close!
|
180
184
|
end
|
@@ -23,6 +23,10 @@ class Puppet::FileSystem::MemoryFile
|
|
23
23
|
:children => children)
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.a_symlink(target_path, source_path)
|
27
|
+
new(target_path, :exist? => true, :symlink? => true, :source_path => source_path)
|
28
|
+
end
|
29
|
+
|
26
30
|
def initialize(path, properties)
|
27
31
|
@path = path
|
28
32
|
@properties = properties
|
@@ -34,6 +38,8 @@ class Puppet::FileSystem::MemoryFile
|
|
34
38
|
def directory?; @properties[:directory?]; end
|
35
39
|
def exist?; @properties[:exist?]; end
|
36
40
|
def executable?; @properties[:executable?]; end
|
41
|
+
def symlink?; @properties[:symlink?]; end
|
42
|
+
def source_path; @properties[:source_path]; end
|
37
43
|
|
38
44
|
def each_line(&block)
|
39
45
|
handle.each_line(&block)
|
@@ -23,6 +23,19 @@ class Puppet::FileSystem::MemoryImpl
|
|
23
23
|
path.executable?
|
24
24
|
end
|
25
25
|
|
26
|
+
def symlink?(path)
|
27
|
+
path.symlink?
|
28
|
+
end
|
29
|
+
|
30
|
+
def readlink(path)
|
31
|
+
path = path.path
|
32
|
+
link = find(path)
|
33
|
+
return Puppet::FileSystem::MemoryFile.a_missing_file(path) unless link
|
34
|
+
source = link.source_path
|
35
|
+
return Puppet::FileSystem::MemoryFile.a_missing_file(link) unless source
|
36
|
+
find(source) || Puppet::FileSystem::MemoryFile.a_missing_file(source)
|
37
|
+
end
|
38
|
+
|
26
39
|
def children(path)
|
27
40
|
path.children
|
28
41
|
end
|
@@ -176,6 +176,10 @@ class Puppet::FileSystem::Uniquefile < DelegateClass(File)
|
|
176
176
|
lock = tmpname + '.lock'
|
177
177
|
mkdir(lock)
|
178
178
|
yield
|
179
|
+
rescue Errno::ENOENT => e
|
180
|
+
ex = Errno::ENOENT.new("A directory component in #{lock} does not exist or is a dangling symbolic link")
|
181
|
+
ex.set_backtrace(e.backtrace)
|
182
|
+
raise ex
|
179
183
|
ensure
|
180
184
|
rmdir(lock) if Puppet::FileSystem.exist?(lock)
|
181
185
|
end
|
@@ -117,6 +117,7 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
|
|
117
117
|
end
|
118
118
|
|
119
119
|
# https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499-
|
120
|
+
FILE_NOT_FOUND = 2
|
120
121
|
ACCESS_DENIED = 5
|
121
122
|
SHARING_VIOLATION = 32
|
122
123
|
LOCK_VIOLATION = 33
|
@@ -132,12 +133,12 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
|
|
132
133
|
dacl = secure_dacl(current_sid)
|
133
134
|
dacl.allow(Puppet::Util::Windows::SID::BuiltinUsers, FILE_READ)
|
134
135
|
dacl
|
135
|
-
when 0640, 0600
|
136
|
+
when 0660, 0640, 0600, 0440
|
136
137
|
secure_dacl(current_sid)
|
137
138
|
when nil
|
138
139
|
get_dacl_from_file(path) || secure_dacl(current_sid)
|
139
140
|
else
|
140
|
-
raise ArgumentError, "Only modes 0644, 0640 and
|
141
|
+
raise ArgumentError, "#{mode} is invalid: Only modes 0644, 0640, 0660, and 0440 are allowed"
|
141
142
|
end
|
142
143
|
|
143
144
|
|
@@ -180,9 +181,9 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
|
|
180
181
|
def secure_dacl(current_sid)
|
181
182
|
dacl = Puppet::Util::Windows::AccessControlList.new
|
182
183
|
[
|
183
|
-
|
184
|
-
|
185
|
-
|
184
|
+
Puppet::Util::Windows::SID::LocalSystem,
|
185
|
+
Puppet::Util::Windows::SID::BuiltinAdministrators,
|
186
|
+
current_sid
|
186
187
|
].uniq.map do |sid|
|
187
188
|
dacl.allow(sid, FULL_CONTROL)
|
188
189
|
end
|
@@ -193,11 +194,7 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
|
|
193
194
|
sd = Puppet::Util::Windows::Security.get_security_descriptor(Puppet::FileSystem.path_string(path))
|
194
195
|
sd.dacl
|
195
196
|
rescue Puppet::Util::Windows::Error => e
|
196
|
-
|
197
|
-
nil
|
198
|
-
else
|
199
|
-
raise e
|
200
|
-
end
|
197
|
+
raise e unless e.code == FILE_NOT_FOUND
|
201
198
|
end
|
202
199
|
|
203
200
|
def raise_if_symlinks_unsupported
|
data/lib/puppet/forge.rb
CHANGED
@@ -65,7 +65,7 @@ class Puppet::Forge < SemanticPuppet::Dependency::Source
|
|
65
65
|
# make_http_request URI encodes parameters
|
66
66
|
response = make_http_request(uri)
|
67
67
|
|
68
|
-
if response.code ==
|
68
|
+
if response.code == 200
|
69
69
|
result = Puppet::Util::Json.load(response.body)
|
70
70
|
uri = decode_uri(result['pagination']['next'])
|
71
71
|
matches.concat result['results']
|
@@ -102,7 +102,7 @@ class Puppet::Forge < SemanticPuppet::Dependency::Source
|
|
102
102
|
# make_http_request URI encodes parameters
|
103
103
|
response = make_http_request(uri)
|
104
104
|
|
105
|
-
if response.code ==
|
105
|
+
if response.code == 200
|
106
106
|
response = Puppet::Util::Json.load(response.body)
|
107
107
|
else
|
108
108
|
raise ResponseError.new(:uri => URI.parse(@host).merge(uri), :response => response)
|
@@ -207,7 +207,7 @@ class Puppet::Forge < SemanticPuppet::Dependency::Source
|
|
207
207
|
def download(uri, destination)
|
208
208
|
response = @source.make_http_request(uri, destination)
|
209
209
|
destination.flush and destination.close
|
210
|
-
unless response.code ==
|
210
|
+
unless response.code == 200
|
211
211
|
raise Puppet::Forge::Errors::ResponseError.new(:uri => uri, :response => response)
|
212
212
|
end
|
213
213
|
end
|
data/lib/puppet/forge/errors.rb
CHANGED
@@ -74,12 +74,12 @@ module Puppet::Forge::Errors
|
|
74
74
|
# @option options [String] :uri The URI that failed
|
75
75
|
# @option options [String] :input The user's input (e.g. module name)
|
76
76
|
# @option options [String] :message Error from the API response (optional)
|
77
|
-
# @option options [
|
77
|
+
# @option options [Puppet::HTTP::Response] :response The original HTTP response
|
78
78
|
def initialize(options)
|
79
79
|
@uri = options[:uri]
|
80
80
|
@message = options[:message]
|
81
81
|
response = options[:response]
|
82
|
-
@response = "#{response.code} #{response.
|
82
|
+
@response = "#{response.code} #{response.reason.strip}"
|
83
83
|
|
84
84
|
begin
|
85
85
|
body = Puppet::Util::Json.load(response.body)
|
@@ -15,24 +15,6 @@ class Puppet::Forge
|
|
15
15
|
|
16
16
|
attr_reader :uri, :cache
|
17
17
|
|
18
|
-
# List of Net::HTTP exceptions to catch
|
19
|
-
NET_HTTP_EXCEPTIONS = [
|
20
|
-
EOFError,
|
21
|
-
Errno::ECONNABORTED,
|
22
|
-
Errno::ECONNREFUSED,
|
23
|
-
Errno::ECONNRESET,
|
24
|
-
Errno::EINVAL,
|
25
|
-
Errno::ETIMEDOUT,
|
26
|
-
Net::HTTPBadResponse,
|
27
|
-
Net::HTTPHeaderSyntaxError,
|
28
|
-
Net::ProtocolError,
|
29
|
-
SocketError,
|
30
|
-
]
|
31
|
-
|
32
|
-
if Puppet.features.zlib?
|
33
|
-
NET_HTTP_EXCEPTIONS << Zlib::GzipFile::Error
|
34
|
-
end
|
35
|
-
|
36
18
|
# Instantiate a new repository instance rooted at the +url+.
|
37
19
|
# The library will report +for_agent+ in the User-Agent to the repository.
|
38
20
|
def initialize(host, for_agent)
|
@@ -40,13 +22,41 @@ class Puppet::Forge
|
|
40
22
|
@agent = for_agent
|
41
23
|
@cache = Cache.new(self)
|
42
24
|
@uri = URI.parse(host)
|
25
|
+
|
26
|
+
ssl_provider = Puppet::SSL::SSLProvider.new
|
27
|
+
@ssl_context = ssl_provider.create_system_context(cacerts: [])
|
43
28
|
end
|
44
29
|
|
45
30
|
# Return a Net::HTTPResponse read for this +path+.
|
46
31
|
def make_http_request(path, io = nil)
|
47
|
-
|
48
|
-
|
49
|
-
|
32
|
+
raise ArgumentError, "Path must start with forward slash" unless path.start_with?('/')
|
33
|
+
begin
|
34
|
+
str = @uri.to_s
|
35
|
+
str.chomp!('/')
|
36
|
+
str += Puppet::Util.uri_encode(path)
|
37
|
+
uri = URI(str)
|
38
|
+
|
39
|
+
headers = { "User-Agent" => user_agent }
|
40
|
+
basic_auth = nil
|
41
|
+
|
42
|
+
if forge_authorization
|
43
|
+
headers["Authorization"] = forge_authorization
|
44
|
+
elsif @uri.user && @uri.password
|
45
|
+
basic_auth = {
|
46
|
+
user: @uri.user,
|
47
|
+
password: @uri.password
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
http = Puppet.runtime[:http]
|
52
|
+
response = http.get(uri, headers: headers, options: {basic_auth: basic_auth, ssl_context: @ssl_context})
|
53
|
+
io.write(response.body) if io.respond_to?(:write)
|
54
|
+
response
|
55
|
+
rescue Puppet::SSL::CertVerifyError => e
|
56
|
+
raise SSLVerifyError.new(:uri => @uri.to_s, :original => e.cause)
|
57
|
+
rescue => e
|
58
|
+
raise CommunicationError.new(:uri => @uri.to_s, :original => e)
|
59
|
+
end
|
50
60
|
end
|
51
61
|
|
52
62
|
def forge_authorization
|
@@ -57,71 +67,6 @@ class Puppet::Forge
|
|
57
67
|
end
|
58
68
|
end
|
59
69
|
|
60
|
-
# responsible for properly encoding a URI
|
61
|
-
def get_request_object(path)
|
62
|
-
headers = {
|
63
|
-
"User-Agent" => user_agent,
|
64
|
-
}
|
65
|
-
|
66
|
-
if Puppet.features.zlib?
|
67
|
-
headers = headers.merge({
|
68
|
-
"Accept-Encoding" => Puppet::Network::HTTP::Compression::ACCEPT_ENCODING
|
69
|
-
})
|
70
|
-
end
|
71
|
-
|
72
|
-
if forge_authorization
|
73
|
-
headers = headers.merge({"Authorization" => forge_authorization})
|
74
|
-
end
|
75
|
-
|
76
|
-
request = Net::HTTP::Get.new(Puppet::Util.uri_encode(path), headers)
|
77
|
-
|
78
|
-
unless @uri.user.nil? || @uri.password.nil? || forge_authorization
|
79
|
-
request.basic_auth(@uri.user, @uri.password)
|
80
|
-
end
|
81
|
-
|
82
|
-
return request
|
83
|
-
end
|
84
|
-
|
85
|
-
# Return a Net::HTTPResponse read from this HTTPRequest +request+.
|
86
|
-
#
|
87
|
-
# @param request [Net::HTTPRequest] request to make
|
88
|
-
# @return [Net::HTTPResponse] response from request
|
89
|
-
# @raise [Puppet::Forge::Errors::CommunicationError] if there is a network
|
90
|
-
# related error
|
91
|
-
# @raise [Puppet::Forge::Errors::SSLVerifyError] if there is a problem
|
92
|
-
# verifying the remote SSL certificate
|
93
|
-
def read_response(request, io = nil)
|
94
|
-
http_object = Puppet::Util::HttpProxy.get_http_object(uri)
|
95
|
-
|
96
|
-
http_object.start do |http|
|
97
|
-
response = http.request(request)
|
98
|
-
|
99
|
-
if Puppet.features.zlib?
|
100
|
-
if response && response.key?("content-encoding")
|
101
|
-
case response["content-encoding"]
|
102
|
-
when "gzip"
|
103
|
-
response.body = Zlib::GzipReader.new(StringIO.new(response.read_body), :encoding => "ASCII-8BIT").read
|
104
|
-
response.delete("content-encoding")
|
105
|
-
when "deflate"
|
106
|
-
response.body = Zlib::Inflate.inflate(response.read_body)
|
107
|
-
response.delete("content-encoding")
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
io.write(response.body) if io.respond_to? :write
|
113
|
-
response
|
114
|
-
end
|
115
|
-
rescue *NET_HTTP_EXCEPTIONS => e
|
116
|
-
raise CommunicationError.new(:uri => @uri.to_s, :original => e)
|
117
|
-
rescue OpenSSL::SSL::SSLError => e
|
118
|
-
if e.message =~ /certificate verify failed/
|
119
|
-
raise SSLVerifyError.new(:uri => @uri.to_s, :original => e)
|
120
|
-
else
|
121
|
-
raise e
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
70
|
# Return the local file name containing the data downloaded from the
|
126
71
|
# repository at +release+ (e.g. "myuser-mymodule").
|
127
72
|
def retrieve(release)
|