puppet 6.14.0-x64-mingw32 → 6.19.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/CODEOWNERS +2 -7
- data/Gemfile +4 -2
- data/Gemfile.lock +36 -34
- data/README.md +3 -4
- data/Rakefile +4 -12
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +33 -9
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/agent/locker.rb +0 -7
- data/lib/puppet/application/agent.rb +25 -9
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/ssl.rb +3 -3
- data/lib/puppet/configurer.rb +68 -24
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/confine.rb +2 -2
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +141 -41
- data/lib/puppet/environments.rb +55 -15
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/config.rb +46 -16
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/node.rb +3 -3
- data/lib/puppet/face/node/clean.rb +2 -2
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/face/status.rb +1 -1
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_bucket/dipper.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +17 -13
- data/lib/puppet/file_system/uniquefile.rb +12 -16
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/new.rb +8 -3
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/http.rb +3 -0
- data/lib/puppet/http/client.rb +215 -60
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +43 -7
- data/lib/puppet/http/resolver.rb +43 -3
- data/lib/puppet/http/resolver/server_list.rb +66 -24
- data/lib/puppet/http/resolver/settings.rb +21 -1
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +82 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +70 -2
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +214 -12
- data/lib/puppet/http/service/file_server.rb +106 -5
- data/lib/puppet/http/service/puppetserver.rb +39 -0
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +60 -8
- data/lib/puppet/indirector.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/facts/yaml.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 +1 -1
- data/lib/puppet/indirector/file_metadata/http.rb +28 -8
- data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/request.rb +5 -5
- data/lib/puppet/indirector/rest.rb +7 -1
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/indirector/yaml.rb +1 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/connection_adapter.rb +184 -0
- data/lib/puppet/network/http/nocache_pool.rb +1 -0
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +22 -5
- data/lib/puppet/node/facts.rb +17 -0
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +30 -31
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
- data/lib/puppet/parser/compiler.rb +43 -33
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +18 -9
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +24 -15
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- data/lib/puppet/pops/validation/checker4_0.rb +29 -15
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +98 -1
- data/lib/puppet/provider/package/aptitude.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +61 -14
- data/lib/puppet/provider/package/dpkg.rb +1 -1
- data/lib/puppet/provider/package/gem.rb +45 -9
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip2.rb +17 -0
- data/lib/puppet/provider/package/pip3.rb +0 -2
- 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 +2 -2
- data/lib/puppet/provider/package/puppet_gem.rb +11 -2
- data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +101 -20
- data/lib/puppet/provider/package/zypper.rb +62 -1
- data/lib/puppet/provider/service/systemd.rb +22 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +16 -5
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/reports/http.rb +15 -9
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/rest/route.rb +2 -2
- data/lib/puppet/runtime.rb +25 -2
- data/lib/puppet/settings.rb +20 -6
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- data/lib/puppet/ssl/state_machine.rb +79 -37
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +19 -14
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +14 -10
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +21 -8
- data/lib/puppet/type/file.rb +40 -15
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +35 -13
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/package.rb +41 -3
- data/lib/puppet/type/service.rb +59 -8
- data/lib/puppet/type/user.rb +19 -29
- data/lib/puppet/util.rb +41 -3
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +13 -25
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/connection.rb +8 -8
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +1 -10
- 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 +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/run_mode.rb +5 -1
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/api_types.rb +60 -33
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +5 -4
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/windows/user.rb +242 -8
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +627 -507
- data/man/man5/puppet.conf.5 +93 -20
- data/man/man8/puppet-agent.8 +7 -4
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +6 -6
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +4 -4
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +2 -2
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/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-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -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/puppetserver_gem/gem-list-local-packages +30 -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/integration/application/agent_spec.rb +479 -0
- data/spec/integration/application/apply_spec.rb +279 -150
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +239 -0
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +123 -0
- data/spec/integration/configurer_spec.rb +14 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/defaults_spec.rb +27 -3
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/http/client_spec.rb +39 -40
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/network/http_pool_spec.rb +84 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/adsi_spec.rb +8 -3
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +47 -5
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +16 -7
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +127 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +12 -9
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/doc_spec.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +41 -10
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/application_spec.rb +9 -4
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +4 -4
- data/spec/unit/configurer_spec.rb +87 -38
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +107 -32
- data/spec/unit/face/config_spec.rb +59 -1
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/node_spec.rb +2 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +29 -0
- data/spec/unit/file_system_spec.rb +11 -2
- data/spec/unit/http/client_spec.rb +173 -59
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +44 -5
- data/spec/unit/http/response_spec.rb +6 -0
- data/spec/unit/http/service/ca_spec.rb +27 -5
- data/spec/unit/http/service/compiler_spec.rb +186 -9
- data/spec/unit/http/service/file_server_spec.rb +37 -6
- data/spec/unit/http/service/puppetserver_spec.rb +82 -0
- data/spec/unit/http/service/report_spec.rb +5 -4
- data/spec/unit/http/service_spec.rb +3 -4
- data/spec/unit/http/session_spec.rb +48 -12
- data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
- data/spec/unit/indirector/catalog/json_spec.rb +1 -1
- data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
- data/spec/unit/indirector/facts/rest_spec.rb +1 -1
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
- data/spec/unit/indirector/json_spec.rb +8 -8
- data/spec/unit/indirector/msgpack_spec.rb +8 -8
- data/spec/unit/indirector/node/rest_spec.rb +1 -1
- data/spec/unit/indirector/request_spec.rb +5 -5
- data/spec/unit/indirector/rest_spec.rb +14 -1
- data/spec/unit/indirector/status/rest_spec.rb +1 -1
- data/spec/unit/indirector/yaml_spec.rb +7 -7
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
- data/spec/unit/network/http/connection_spec.rb +552 -190
- data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
- data/spec/unit/network/http/pool_spec.rb +3 -3
- 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 +33 -0
- data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- data/spec/unit/provider/exec_spec.rb +4 -3
- data/spec/unit/provider/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 +107 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
- data/spec/unit/provider/package/dpkg_spec.rb +22 -7
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/openbsd_spec.rb +2 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip2_spec.rb +36 -0
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- 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 +5 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +274 -1
- data/spec/unit/provider/package/zypper_spec.rb +98 -0
- data/spec/unit/provider/service/base_spec.rb +2 -4
- data/spec/unit/provider/service/bsd_spec.rb +5 -1
- data/spec/unit/provider/service/daemontools_spec.rb +1 -1
- data/spec/unit/provider/service/debian_spec.rb +3 -5
- data/spec/unit/provider/service/freebsd_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +4 -5
- data/spec/unit/provider/service/init_spec.rb +46 -5
- data/spec/unit/provider/service/launchd_spec.rb +5 -6
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openrc_spec.rb +4 -5
- data/spec/unit/provider/service/openwrt_spec.rb +2 -1
- data/spec/unit/provider/service/redhat_spec.rb +10 -1
- data/spec/unit/provider/service/runit_spec.rb +2 -1
- data/spec/unit/provider/service/smf_spec.rb +1 -1
- data/spec/unit/provider/service/src_spec.rb +3 -5
- data/spec/unit/provider/service/systemd_spec.rb +95 -18
- data/spec/unit/provider/service/upstart_spec.rb +4 -5
- data/spec/unit/provider/service/windows_spec.rb +50 -14
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +30 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
- data/spec/unit/puppet_pal_2pec.rb +11 -0
- data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
- data/spec/unit/puppet_spec.rb +33 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/resource_spec.rb +3 -3
- data/spec/unit/rest/route_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +44 -22
- 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 +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +90 -14
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/transaction/report_spec.rb +7 -1
- data/spec/unit/type/file/source_spec.rb +4 -4
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/filebucket_spec.rb +1 -1
- data/spec/unit/type/service_spec.rb +218 -8
- data/spec/unit/type/user_spec.rb +32 -3
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/command_line_spec.rb +11 -6
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/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 +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/run_mode_spec.rb +6 -6
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +5 -35
- metadata +90 -51
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/faces/plugin_spec.rb +0 -63
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -64
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/integration/test/test_helper_spec.rb +0 -31
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
@@ -0,0 +1,180 @@
|
|
1
|
+
unless Puppet::Util::Platform.jruby_fips?
|
2
|
+
require 'rubygems/commands/list_command'
|
3
|
+
end
|
4
|
+
require 'stringio'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
# Ruby gems support.
|
8
|
+
Puppet::Type.type(:package).provide :puppetserver_gem, :parent => :gem do
|
9
|
+
desc "Puppet Server Ruby Gem support. If a URL is passed via `source`, then
|
10
|
+
that URL is appended to the list of remote gem repositories which by default
|
11
|
+
contains rubygems.org; To ensure that only the specified source is used also
|
12
|
+
pass `--clear-sources` in via `install_options`; if a source is present but
|
13
|
+
is not a valid URL, it will be interpreted as the path to a local gem file.
|
14
|
+
If source is not present at all, the gem will be installed from the default
|
15
|
+
gem repositories."
|
16
|
+
|
17
|
+
has_feature :versionable, :install_options, :uninstall_options
|
18
|
+
|
19
|
+
confine :feature => :hocon
|
20
|
+
# see SERVER-2578
|
21
|
+
confine :fips_enabled => false
|
22
|
+
|
23
|
+
# Define the default provider package command name, as the parent 'gem' provider is targetable.
|
24
|
+
# Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
|
25
|
+
|
26
|
+
def self.provider_command
|
27
|
+
command(:puppetservercmd)
|
28
|
+
end
|
29
|
+
|
30
|
+
# The gem command uses HOME to locate a gemrc file.
|
31
|
+
# CommandDefiner in provider.rb will set failonfail, combine, and environment.
|
32
|
+
|
33
|
+
has_command(:puppetservercmd, '/opt/puppetlabs/bin/puppetserver') do
|
34
|
+
environment(HOME: ENV['HOME'])
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.gemlist(options)
|
38
|
+
command_options = ['gem', 'list']
|
39
|
+
|
40
|
+
if options[:local]
|
41
|
+
command_options << '--local'
|
42
|
+
else
|
43
|
+
command_options << '--remote'
|
44
|
+
end
|
45
|
+
|
46
|
+
if options[:source]
|
47
|
+
command_options << '--source' << options[:source]
|
48
|
+
end
|
49
|
+
|
50
|
+
if options[:justme]
|
51
|
+
gem_regex = '\A' + options[:justme] + '\z'
|
52
|
+
command_options << gem_regex
|
53
|
+
end
|
54
|
+
|
55
|
+
if options[:local]
|
56
|
+
list = execute_rubygems_list_command(gem_regex)
|
57
|
+
else
|
58
|
+
begin
|
59
|
+
list = puppetservercmd(command_options)
|
60
|
+
rescue Puppet::ExecutionFailure => detail
|
61
|
+
raise Puppet::Error, _("Could not list gems: %{detail}") % { detail: detail }, detail.backtrace
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# When `/tmp` is mounted `noexec`, `puppetserver gem list` will output:
|
66
|
+
# *** LOCAL GEMS ***
|
67
|
+
# causing gemsplit to output:
|
68
|
+
# Warning: Could not match *** LOCAL GEMS ***
|
69
|
+
gem_list = list
|
70
|
+
.lines
|
71
|
+
.select { |x| x =~ /^(\S+)\s+\((.+)\)/ }
|
72
|
+
.map { |set| gemsplit(set) }
|
73
|
+
|
74
|
+
if options[:justme]
|
75
|
+
return gem_list.shift
|
76
|
+
else
|
77
|
+
return gem_list
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def install(useversion = true)
|
82
|
+
command_options = ['gem', 'install']
|
83
|
+
command_options += install_options if resource[:install_options]
|
84
|
+
|
85
|
+
command_options << '-v' << resource[:ensure] if (!resource[:ensure].is_a? Symbol) && useversion
|
86
|
+
|
87
|
+
command_options << '--no-document'
|
88
|
+
|
89
|
+
if resource[:source]
|
90
|
+
begin
|
91
|
+
uri = URI.parse(resource[:source])
|
92
|
+
rescue => detail
|
93
|
+
self.fail Puppet::Error, _("Invalid source '%{uri}': %{detail}") % { uri: uri, detail: detail }, detail
|
94
|
+
end
|
95
|
+
|
96
|
+
case uri.scheme
|
97
|
+
when nil
|
98
|
+
# no URI scheme => interpret the source as a local file
|
99
|
+
command_options << resource[:source]
|
100
|
+
when /file/i
|
101
|
+
command_options << uri.path
|
102
|
+
when 'puppet'
|
103
|
+
# we don't support puppet:// URLs (yet)
|
104
|
+
raise Puppet::Error.new(_('puppet:// URLs are not supported as gem sources'))
|
105
|
+
else
|
106
|
+
# interpret it as a gem repository
|
107
|
+
command_options << '--source' << "#{resource[:source]}" << resource[:name]
|
108
|
+
end
|
109
|
+
else
|
110
|
+
command_options << resource[:name]
|
111
|
+
end
|
112
|
+
|
113
|
+
output = puppetservercmd(command_options)
|
114
|
+
# Apparently, some gem versions don't exit non-0 on failure.
|
115
|
+
self.fail _("Could not install: %{output}") % { output: output.chomp } if output.include?('ERROR')
|
116
|
+
end
|
117
|
+
|
118
|
+
def uninstall
|
119
|
+
command_options = ['gem', 'uninstall']
|
120
|
+
command_options << '--executables' << '--all' << resource[:name]
|
121
|
+
command_options += uninstall_options if resource[:uninstall_options]
|
122
|
+
|
123
|
+
output = puppetservercmd(command_options)
|
124
|
+
# Apparently, some gem versions don't exit non-0 on failure.
|
125
|
+
self.fail _("Could not uninstall: %{output}") % { output: output.chomp } if output.include?('ERROR')
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
# The puppetserver gem cli command is very slow, since it starts a JVM.
|
131
|
+
#
|
132
|
+
# Instead, for the list subcommand (which is executed with every puppet run),
|
133
|
+
# use the rubygems library from puppet ruby: setting GEM_HOME and GEM_PATH
|
134
|
+
# to the default values, or the values in the puppetserver configuration file.
|
135
|
+
#
|
136
|
+
# The rubygems library cannot access java platform gems,
|
137
|
+
# for example: json (1.8.3 java)
|
138
|
+
# but java platform gems should not be managed by this (or any) provider.
|
139
|
+
|
140
|
+
def self.execute_rubygems_list_command(gem_regex)
|
141
|
+
puppetserver_default_gem_home = '/opt/puppetlabs/server/data/puppetserver/jruby-gems'
|
142
|
+
puppetserver_default_vendored_jruby_gems = '/opt/puppetlabs/server/data/puppetserver/vendored-jruby-gems'
|
143
|
+
puppet_default_vendor_gems = '/opt/puppetlabs/puppet/lib/ruby/vendor_gems'
|
144
|
+
puppetserver_default_gem_path = [puppetserver_default_gem_home, puppetserver_default_vendored_jruby_gems, puppet_default_vendor_gems].join(':')
|
145
|
+
|
146
|
+
pe_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/conf.d/pe-puppet-server.conf'
|
147
|
+
os_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/puppetserver.conf'
|
148
|
+
puppetserver_conf_file = Facter.value(:pe_server_version) ? pe_puppetserver_conf_file : os_puppetserver_conf_file
|
149
|
+
puppetserver_conf = Hocon.load(puppetserver_conf_file)
|
150
|
+
|
151
|
+
gem_env = {}
|
152
|
+
if puppetserver_conf.empty? || puppetserver_conf.key?('jruby-puppet') == false
|
153
|
+
gem_env['GEM_HOME'] = puppetserver_default_gem_home
|
154
|
+
gem_env['GEM_PATH'] = puppetserver_default_gem_path
|
155
|
+
else
|
156
|
+
gem_env['GEM_HOME'] = puppetserver_conf['jruby-puppet'].key?('gem-home') ? puppetserver_conf['jruby-puppet']['gem-home'] : puppetserver_default_gem_home
|
157
|
+
gem_env['GEM_PATH'] = puppetserver_conf['jruby-puppet'].key?('gem-path') ? puppetserver_conf['jruby-puppet']['gem-path'].join(':') : puppetserver_default_gem_path
|
158
|
+
end
|
159
|
+
gem_env['GEM_SPEC_CACHE'] = "/tmp/#{$$}"
|
160
|
+
Gem.paths = gem_env
|
161
|
+
|
162
|
+
sio_inn = StringIO.new
|
163
|
+
sio_out = StringIO.new
|
164
|
+
sio_err = StringIO.new
|
165
|
+
stream_ui = Gem::StreamUI.new(sio_inn, sio_out, sio_err, false)
|
166
|
+
gem_list_cmd = Gem::Commands::ListCommand.new
|
167
|
+
gem_list_cmd.options[:domain] = :local
|
168
|
+
gem_list_cmd.options[:args] = [gem_regex] if gem_regex
|
169
|
+
gem_list_cmd.ui = stream_ui
|
170
|
+
gem_list_cmd.execute
|
171
|
+
|
172
|
+
# There is no method exclude default gems from the local gem list,
|
173
|
+
# for example: psych (default: 2.2.2)
|
174
|
+
# but default gems should not be managed by this (or any) provider.
|
175
|
+
gem_list = sio_out.string.lines.reject { |gem| gem =~ / \(default\: / }
|
176
|
+
gem_list.join("\n")
|
177
|
+
ensure
|
178
|
+
Gem.clear_paths
|
179
|
+
end
|
180
|
+
end
|
@@ -1,13 +1,17 @@
|
|
1
1
|
require 'puppet/provider/package'
|
2
|
+
require 'puppet/util/rpm_compare'
|
2
3
|
|
3
4
|
# RPM packaging. Should work anywhere that has rpm installed.
|
4
5
|
Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Provider::Package do
|
6
|
+
# provides Rpm parsing and comparison
|
7
|
+
include Puppet::Util::RpmCompare
|
8
|
+
|
5
9
|
desc "RPM packaging support; should work anywhere with a working `rpm`
|
6
10
|
binary.
|
7
11
|
|
8
12
|
This provider supports the `install_options` and `uninstall_options`
|
9
13
|
attributes, which allow command-line flags to be passed to rpm.
|
10
|
-
These options should be specified as an array where each element is either a string or a hash."
|
14
|
+
These options should be specified as an array where each element is either a string or a hash."
|
11
15
|
|
12
16
|
has_feature :versionable
|
13
17
|
has_feature :install_options
|
@@ -23,31 +27,6 @@ These options should be specified as an array where each element is either a str
|
|
23
27
|
self::NEVRA_FIELDS = [:name, :epoch, :version, :release, :arch]
|
24
28
|
self::MULTIVERSION_SEPARATOR = "; "
|
25
29
|
|
26
|
-
ARCH_LIST = [
|
27
|
-
'noarch',
|
28
|
-
'i386',
|
29
|
-
'i686',
|
30
|
-
'ppc',
|
31
|
-
'ppc64',
|
32
|
-
'armv3l',
|
33
|
-
'armv4b',
|
34
|
-
'armv4l',
|
35
|
-
'armv4tl',
|
36
|
-
'armv5tel',
|
37
|
-
'armv5tejl',
|
38
|
-
'armv6l',
|
39
|
-
'armv7l',
|
40
|
-
'm68kmint',
|
41
|
-
's390',
|
42
|
-
's390x',
|
43
|
-
'ia64',
|
44
|
-
'x86_64',
|
45
|
-
'sh3',
|
46
|
-
'sh4',
|
47
|
-
]
|
48
|
-
|
49
|
-
ARCH_REGEX = Regexp.new(ARCH_LIST.join('|\.'))
|
50
|
-
|
51
30
|
commands :rpm => "rpm"
|
52
31
|
|
53
32
|
if command('rpm')
|
@@ -204,200 +183,14 @@ These options should be specified as an array where each element is either a str
|
|
204
183
|
join_options(resource[:uninstall_options])
|
205
184
|
end
|
206
185
|
|
207
|
-
# This is an attempt at implementing RPM's
|
208
|
-
# lib/rpmvercmp.c rpmvercmp(a, b) in Ruby.
|
209
|
-
#
|
210
|
-
# Some of the things in here look REALLY
|
211
|
-
# UGLY and/or arbitrary. Our goal is to
|
212
|
-
# match how RPM compares versions, quirks
|
213
|
-
# and all.
|
214
|
-
#
|
215
|
-
# I've kept a lot of C-like string processing
|
216
|
-
# in an effort to keep this as identical to RPM
|
217
|
-
# as possible.
|
218
|
-
#
|
219
|
-
# returns 1 if str1 is newer than str2,
|
220
|
-
# 0 if they are identical
|
221
|
-
# -1 if str1 is older than str2
|
222
|
-
def rpmvercmp(str1, str2)
|
223
|
-
return 0 if str1 == str2
|
224
|
-
|
225
|
-
front_strip_re = /^[^A-Za-z0-9~]+/
|
226
|
-
|
227
|
-
while str1.length > 0 or str2.length > 0
|
228
|
-
# trim anything that's in front_strip_re and != '~' off the beginning of each string
|
229
|
-
str1 = str1.gsub(front_strip_re, '')
|
230
|
-
str2 = str2.gsub(front_strip_re, '')
|
231
|
-
|
232
|
-
# "handle the tilde separator, it sorts before everything else"
|
233
|
-
if str1 =~ /^~/ && str2 =~ /^~/
|
234
|
-
# if they both have ~, strip it
|
235
|
-
str1 = str1[1..-1]
|
236
|
-
str2 = str2[1..-1]
|
237
|
-
next
|
238
|
-
elsif str1 =~ /^~/
|
239
|
-
return -1
|
240
|
-
elsif str2 =~ /^~/
|
241
|
-
return 1
|
242
|
-
end
|
243
|
-
|
244
|
-
break if str1.length == 0 or str2.length == 0
|
245
|
-
|
246
|
-
# "grab first completely alpha or completely numeric segment"
|
247
|
-
isnum = false
|
248
|
-
# if the first char of str1 is a digit, grab the chunk of continuous digits from each string
|
249
|
-
if str1 =~ /^[0-9]+/
|
250
|
-
if str1 =~ /^[0-9]+/
|
251
|
-
segment1 = $~.to_s
|
252
|
-
str1 = $~.post_match
|
253
|
-
else
|
254
|
-
segment1 = ''
|
255
|
-
end
|
256
|
-
if str2 =~ /^[0-9]+/
|
257
|
-
segment2 = $~.to_s
|
258
|
-
str2 = $~.post_match
|
259
|
-
else
|
260
|
-
segment2 = ''
|
261
|
-
end
|
262
|
-
isnum = true
|
263
|
-
# else grab the chunk of continuous alphas from each string (which may be '')
|
264
|
-
else
|
265
|
-
if str1 =~ /^[A-Za-z]+/
|
266
|
-
segment1 = $~.to_s
|
267
|
-
str1 = $~.post_match
|
268
|
-
else
|
269
|
-
segment1 = ''
|
270
|
-
end
|
271
|
-
if str2 =~ /^[A-Za-z]+/
|
272
|
-
segment2 = $~.to_s
|
273
|
-
str2 = $~.post_match
|
274
|
-
else
|
275
|
-
segment2 = ''
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
# if the segments we just grabbed from the strings are different types (i.e. one numeric one alpha),
|
280
|
-
# where alpha also includes ''; "numeric segments are always newer than alpha segments"
|
281
|
-
if segment2.length == 0
|
282
|
-
return 1 if isnum
|
283
|
-
return -1
|
284
|
-
end
|
285
|
-
|
286
|
-
if isnum
|
287
|
-
# "throw away any leading zeros - it's a number, right?"
|
288
|
-
segment1 = segment1.gsub(/^0+/, '')
|
289
|
-
segment2 = segment2.gsub(/^0+/, '')
|
290
|
-
# "whichever number has more digits wins"
|
291
|
-
return 1 if segment1.length > segment2.length
|
292
|
-
return -1 if segment1.length < segment2.length
|
293
|
-
end
|
294
|
-
|
295
|
-
# "strcmp will return which one is greater - even if the two segments are alpha
|
296
|
-
# or if they are numeric. don't return if they are equal because there might
|
297
|
-
# be more segments to compare"
|
298
|
-
rc = segment1 <=> segment2
|
299
|
-
return rc if rc != 0
|
300
|
-
end #end while loop
|
301
|
-
|
302
|
-
# if we haven't returned anything yet, "whichever version still has characters left over wins"
|
303
|
-
if str1.length > str2.length
|
304
|
-
return 1
|
305
|
-
elsif str1.length < str2.length
|
306
|
-
return -1
|
307
|
-
else
|
308
|
-
return 0
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
186
|
def insync?(is)
|
313
187
|
return false if [:purged, :absent].include?(is)
|
314
188
|
return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
|
315
189
|
|
316
190
|
should = resource[:ensure]
|
317
191
|
is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
|
318
|
-
0 ==
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
# parse a rpm "version" specification
|
323
|
-
# this re-implements rpm's
|
324
|
-
# rpmUtils.miscutils.stringToVersion() in ruby
|
325
|
-
def rpm_parse_evr(s)
|
326
|
-
ei = s.index(':')
|
327
|
-
if ei
|
328
|
-
e = s[0,ei]
|
329
|
-
s = s[ei+1,s.length]
|
330
|
-
else
|
331
|
-
e = nil
|
332
|
-
end
|
333
|
-
begin
|
334
|
-
e = String(Integer(e))
|
335
|
-
rescue
|
336
|
-
# If there are non-digits in the epoch field, default to nil
|
337
|
-
e = nil
|
338
|
-
end
|
339
|
-
ri = s.index('-')
|
340
|
-
if ri
|
341
|
-
v = s[0,ri]
|
342
|
-
r = s[ri+1,s.length]
|
343
|
-
arch = r.scan(ARCH_REGEX)[0]
|
344
|
-
if arch
|
345
|
-
a = arch.delete('.')
|
346
|
-
r.gsub!(ARCH_REGEX, '')
|
347
|
-
end
|
348
|
-
else
|
349
|
-
v = s
|
350
|
-
r = nil
|
351
|
-
end
|
352
|
-
return { :epoch => e, :version => v, :release => r, :arch => a }
|
353
|
-
end
|
354
|
-
|
355
|
-
# how rpm compares two package versions:
|
356
|
-
# rpmUtils.miscutils.compareEVR(), which massages data types and then calls
|
357
|
-
# rpm.labelCompare(), found in rpm.git/python/header-py.c, which
|
358
|
-
# sets epoch to 0 if null, then compares epoch, then ver, then rel
|
359
|
-
# using compare_values() and returns the first non-0 result, else 0.
|
360
|
-
# This function combines the logic of compareEVR() and labelCompare().
|
361
|
-
#
|
362
|
-
# "version_should" can be v, v-r, or e:v-r.
|
363
|
-
# "version_is" will always be at least v-r, can be e:v-r
|
364
|
-
def rpm_compareEVR(should_hash, is_hash)
|
365
|
-
# pass on to rpm labelCompare
|
366
|
-
|
367
|
-
if !should_hash[:epoch].nil?
|
368
|
-
rc = compare_values(should_hash[:epoch], is_hash[:epoch])
|
369
|
-
return rc unless rc == 0
|
370
|
-
end
|
371
|
-
|
372
|
-
rc = compare_values(should_hash[:version], is_hash[:version])
|
373
|
-
return rc unless rc == 0
|
374
|
-
|
375
|
-
# here is our special case, PUP-1244.
|
376
|
-
# if should_hash[:release] is nil (not specified by the user),
|
377
|
-
# and comparisons up to here are equal, return equal. We need to
|
378
|
-
# evaluate to whatever level of detail the user specified, so we
|
379
|
-
# don't end up upgrading or *downgrading* when not intended.
|
380
|
-
#
|
381
|
-
# This should NOT be triggered if we're trying to ensure latest.
|
382
|
-
return 0 if should_hash[:release].nil?
|
383
|
-
|
384
|
-
rc = compare_values(should_hash[:release], is_hash[:release])
|
385
|
-
|
386
|
-
return rc
|
387
|
-
end
|
388
|
-
|
389
|
-
# this method is a native implementation of the
|
390
|
-
# compare_values function in rpm's python bindings,
|
391
|
-
# found in python/header-py.c, as used by rpm.
|
392
|
-
def compare_values(s1, s2)
|
393
|
-
if s1.nil? && s2.nil?
|
394
|
-
return 0
|
395
|
-
elsif ( not s1.nil? ) && s2.nil?
|
396
|
-
return 1
|
397
|
-
elsif s1.nil? && (not s2.nil?)
|
398
|
-
return -1
|
192
|
+
0 == rpm_compareEVR(should, version)
|
399
193
|
end
|
400
|
-
return rpmvercmp(s1, s2)
|
401
194
|
end
|
402
195
|
|
403
196
|
private
|
@@ -1,4 +1,11 @@
|
|
1
|
+
require 'puppet/util/package/version/range'
|
2
|
+
require 'puppet/util/package/version/rpm'
|
3
|
+
require 'puppet/util/rpm_compare'
|
4
|
+
|
1
5
|
Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
|
6
|
+
# provides Rpm parsing and comparison
|
7
|
+
include Puppet::Util::RpmCompare
|
8
|
+
|
2
9
|
desc "Support via `yum`.
|
3
10
|
|
4
11
|
Using this provider's `uninstallable` feature will not remove dependent packages. To
|
@@ -10,6 +17,9 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
|
|
10
17
|
|
11
18
|
has_feature :install_options, :versionable, :virtual_packages, :install_only
|
12
19
|
|
20
|
+
RPM_VERSION = Puppet::Util::Package::Version::Rpm
|
21
|
+
RPM_VERSION_RANGE = Puppet::Util::Package::Version::Range
|
22
|
+
|
13
23
|
commands :cmd => "yum", :rpm => "rpm"
|
14
24
|
|
15
25
|
if command('rpm')
|
@@ -25,6 +35,36 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
|
|
25
35
|
defaultfor :operatingsystem => :amazon
|
26
36
|
defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
27
37
|
|
38
|
+
def insync?(is)
|
39
|
+
return false if [:purged, :absent].include?(is)
|
40
|
+
return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
|
41
|
+
|
42
|
+
should = @resource[:ensure]
|
43
|
+
if should.is_a?(String)
|
44
|
+
begin
|
45
|
+
should_version = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
|
46
|
+
|
47
|
+
if should_version.is_a?(RPM_VERSION_RANGE::Eq)
|
48
|
+
return super
|
49
|
+
end
|
50
|
+
rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
|
51
|
+
Puppet.debug("Cannot parse #{should} as a RPM version range")
|
52
|
+
return super
|
53
|
+
end
|
54
|
+
|
55
|
+
is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
|
56
|
+
begin
|
57
|
+
is_version = RPM_VERSION.parse(version)
|
58
|
+
should_version.include?(is_version)
|
59
|
+
rescue RPM_VERSION::ValidationFailure
|
60
|
+
Puppet.debug("Cannot parse #{is} as a RPM version")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
VERSION_REGEX = /^(?:(\d+):)?(\S+)-(\S+)$/
|
67
|
+
|
28
68
|
def self.prefetch(packages)
|
29
69
|
raise Puppet::Error, _("The yum provider can only be used as root") if Process.euid != 0
|
30
70
|
super
|
@@ -86,23 +126,24 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
86
126
|
end
|
87
127
|
|
88
128
|
def self.parse_updates(str)
|
89
|
-
# Strip off all content
|
90
|
-
body = str.partition(
|
129
|
+
# Strip off all content that contains Obsoleting, Security: or Update
|
130
|
+
body = str.partition(/^(Obsoleting|Security:|Update)/).first
|
91
131
|
|
92
132
|
updates = Hash.new { |h, k| h[k] = [] }
|
93
|
-
body.split.each_slice(3) do |tuple|
|
94
|
-
break if tuple[0] =~ /^(Obsoleting|Security:|Update)/
|
95
|
-
break unless tuple[1] =~ /^(?:(\d+):)?(\S+)-(\S+)$/
|
96
|
-
hash = update_to_hash(*tuple[0..1])
|
97
|
-
# Create entries for both the package name without a version and a
|
98
|
-
# version since yum considers those as mostly interchangeable.
|
99
|
-
short_name = hash[:name]
|
100
|
-
long_name = "#{hash[:name]}.#{hash[:arch]}"
|
101
|
-
|
102
|
-
updates[short_name] << hash
|
103
|
-
updates[long_name] << hash
|
104
|
-
end
|
105
133
|
|
134
|
+
body.split(/^\s*\n/).each do |line|
|
135
|
+
line.split.each_slice(3) do |tuple|
|
136
|
+
next unless tuple[0].include?('.') && tuple[1] =~ VERSION_REGEX
|
137
|
+
|
138
|
+
hash = update_to_hash(*tuple[0..1])
|
139
|
+
# Create entries for both the package name without a version and a
|
140
|
+
# version since yum considers those as mostly interchangeable.
|
141
|
+
short_name = hash[:name]
|
142
|
+
long_name = "#{hash[:name]}.#{hash[:arch]}"
|
143
|
+
updates[short_name] << hash
|
144
|
+
updates[long_name] << hash
|
145
|
+
end
|
146
|
+
end
|
106
147
|
updates
|
107
148
|
end
|
108
149
|
|
@@ -117,7 +158,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
117
158
|
raise _("Failed to parse package name and architecture from '%{pkgname}'") % { pkgname: pkgname }
|
118
159
|
end
|
119
160
|
|
120
|
-
match = pkgversion.match(
|
161
|
+
match = pkgversion.match(VERSION_REGEX)
|
121
162
|
epoch = match[1] || '0'
|
122
163
|
version = match[2]
|
123
164
|
release = match[3]
|
@@ -151,6 +192,44 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
151
192
|
'update'
|
152
193
|
end
|
153
194
|
|
195
|
+
def best_version(should)
|
196
|
+
if should.is_a?(String)
|
197
|
+
begin
|
198
|
+
should_range = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
|
199
|
+
if should_range.is_a?(RPM_VERSION_RANGE::Eq)
|
200
|
+
return should
|
201
|
+
end
|
202
|
+
rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
|
203
|
+
Puppet.debug("Cannot parse #{should} as a RPM version range")
|
204
|
+
return should
|
205
|
+
end
|
206
|
+
sorted_versions = SortedSet.new
|
207
|
+
available_versions(@resource[:name]).each do |version|
|
208
|
+
begin
|
209
|
+
rpm_version = RPM_VERSION.parse(version)
|
210
|
+
sorted_versions << rpm_version if should_range.include?(rpm_version)
|
211
|
+
rescue RPM_VERSION::ValidationFailure
|
212
|
+
Puppet.debug("Cannot parse #{version} as a RPM version")
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
version = sorted_versions.entries.last
|
217
|
+
|
218
|
+
if version
|
219
|
+
version = version.to_s.sub(/^\d+:/, '')
|
220
|
+
return version
|
221
|
+
end
|
222
|
+
|
223
|
+
Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
|
224
|
+
should
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def available_versions(package_name)
|
229
|
+
output = execute("yum list #{package_name} --showduplicates | sed -e '1,/Available Packages/ d' | awk '{print $2}'")
|
230
|
+
output.split("\n")
|
231
|
+
end
|
232
|
+
|
154
233
|
def install
|
155
234
|
wanted = @resource[:name]
|
156
235
|
error_level = self.class.error_level
|
@@ -195,10 +274,11 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
195
274
|
self.debug "Installing directly from #{wanted}"
|
196
275
|
else
|
197
276
|
# No explicit source was specified, so add the package version
|
277
|
+
should = best_version(should)
|
198
278
|
wanted += "-#{should}"
|
199
|
-
if wanted.scan(ARCH_REGEX)
|
279
|
+
if wanted.scan(self.class::ARCH_REGEX)
|
200
280
|
self.debug "Detected Arch argument in package! - Moving arch to end of version string"
|
201
|
-
wanted.gsub!(/(.+)(#{ARCH_REGEX})(.+)/,'\1\3\2')
|
281
|
+
wanted.gsub!(/(.+)(#{self.class::ARCH_REGEX})(.+)/,'\1\3\2')
|
202
282
|
end
|
203
283
|
end
|
204
284
|
current_package = self.query
|
@@ -206,10 +286,10 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
206
286
|
if @resource[:install_only]
|
207
287
|
self.debug "Updating package #{@resource[:name]} from version #{current_package[:ensure]} to #{should} as install_only packages are never downgraded"
|
208
288
|
operation = update_command
|
209
|
-
elsif rpm_compareEVR(
|
289
|
+
elsif rpm_compareEVR(should, current_package[:ensure]) < 0
|
210
290
|
self.debug "Downgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
|
211
291
|
operation = :downgrade
|
212
|
-
elsif rpm_compareEVR(
|
292
|
+
elsif rpm_compareEVR(should, current_package[:ensure]) > 0
|
213
293
|
self.debug "Upgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
|
214
294
|
operation = update_command
|
215
295
|
end
|
@@ -222,7 +302,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
222
302
|
command = [command(:cmd)] + no_debug + ["-e", error_level, "-y", install_options, operation, wanted].compact
|
223
303
|
output = execute(command)
|
224
304
|
|
225
|
-
if output =~ /^No package #{wanted} available\.$/
|
305
|
+
if output.to_s =~ /^No package #{wanted} available\.$/
|
226
306
|
raise Puppet::Error, _("Could not find package %{wanted}") % { wanted: wanted }
|
227
307
|
end
|
228
308
|
|
@@ -248,6 +328,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
248
328
|
return "#{upd[:epoch]}:#{upd[:version]}-#{upd[:release]}"
|
249
329
|
else
|
250
330
|
# Yum didn't find updates, pretend the current version is the latest
|
331
|
+
self.debug "Yum didn't find updates, current version (#{properties[:ensure]}) is the latest"
|
251
332
|
version = properties[:ensure]
|
252
333
|
raise Puppet::DevError, _("Tried to get latest on a missing package") if version == :absent || version == :purged
|
253
334
|
return version
|