puppet 5.5.17-universal-darwin → 5.5.22-universal-darwin
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 +1 -1
- data/Gemfile +4 -5
- data/Gemfile.lock +59 -55
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +54 -8
- data/install.rb +6 -6
- data/lib/puppet.rb +5 -2
- data/lib/puppet/agent.rb +5 -13
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/agent.rb +3 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +13 -0
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/configurer.rb +106 -31
- data/lib/puppet/configurer/downloader.rb +33 -16
- data/lib/puppet/daemon.rb +1 -1
- data/lib/puppet/defaults.rb +86 -40
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -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_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/inline_epp.rb +5 -5
- 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/step.rb +1 -1
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +6 -5
- data/lib/puppet/indirector/catalog/compiler.rb +8 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +6 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/connection.rb +14 -12
- data/lib/puppet/network/http/pool.rb +7 -1
- data/lib/puppet/network/http/rack/rest.rb +2 -2
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +11 -3
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- 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 +3 -0
- data/lib/puppet/parser/functions.rb +14 -10
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -48
- 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_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/type_calculator.rb +24 -0
- data/lib/puppet/pops/types/types.rb +3 -3
- 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/property.rb +1 -1
- data/lib/puppet/property/ensure.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.rb +6 -2
- data/lib/puppet/provider/group/groupadd.rb +19 -19
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mount.rb +1 -1
- data/lib/puppet/provider/mount/parsed.rb +8 -8
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +14 -3
- data/lib/puppet/provider/package/dnfmodule.rb +141 -0
- data/lib/puppet/provider/package/dpkg.rb +16 -18
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/openbsd.rb +14 -2
- data/lib/puppet/provider/package/pip.rb +37 -10
- 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 +4 -4
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/rpm.rb +6 -6
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +28 -20
- data/lib/puppet/provider/package/zypper.rb +1 -0
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
- data/lib/puppet/provider/selmodule/semodule.rb +43 -26
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +31 -13
- data/lib/puppet/provider/user/directoryservice.rb +31 -6
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +39 -20
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/certificate_authority.rb +6 -5
- data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +2 -2
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/test/test_helper.rb +20 -12
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +8 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +14 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/interface.rb +1 -1
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +97 -8
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +2 -8
- data/lib/puppet/type/user.rb +5 -9
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +3 -12
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/monkey_patches.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +1 -1
- data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- data/lib/puppet/util/pidlock.rb +12 -6
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/adsi.rb +60 -30
- data/lib/puppet/util/windows/api_types.rb +45 -32
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +16 -15
- data/lib/puppet/util/windows/registry.rb +17 -15
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet_pal.rb +2 -2
- data/locales/puppet.pot +362 -318
- data/man/man5/puppet.conf.5 +39 -9
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.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 +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 +16 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- 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-master.8 +1 -1
- data/man/man8/puppet-module.8 +1 -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-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -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/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/configurer_spec.rb +66 -0
- data/spec/integration/data_binding_spec.rb +1 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/faces/plugin_spec.rb +29 -47
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +34 -26
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer_spec.rb +430 -415
- data/spec/unit/daemon_spec.rb +0 -1
- 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_system/uniquefile_spec.rb +11 -0
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +43 -1
- data/spec/unit/network/http/pool_spec.rb +32 -0
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/group/groupadd_spec.rb +30 -1
- 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 +13 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
- data/spec/unit/provider/package/dpkg_spec.rb +35 -7
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pip_spec.rb +93 -22
- data/spec/unit/provider/package/pkg_spec.rb +13 -1
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +36 -0
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/yum_spec.rb +90 -0
- data/spec/unit/provider/package/zypper_spec.rb +13 -0
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/selmodule_spec.rb +118 -47
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +109 -36
- 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/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +81 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +3 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/ssl/host_spec.rb +2 -0
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +19 -13
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +97 -0
- data/spec/unit/util/log/destinations_spec.rb +2 -26
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/pidlock_spec.rb +67 -40
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/windows/adsi_spec.rb +55 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/manpages.rake +1 -0
- metadata +16 -7
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/locales/ja/puppet.po +0 -12114
- data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -196,6 +196,17 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
|
|
196
196
|
}
|
197
197
|
end
|
198
198
|
|
199
|
+
let (:dsimport_preamble) do
|
200
|
+
'0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 2 dsAttrTypeStandard:RecordName base64:dsAttrTypeNative:ShadowHashData'
|
201
|
+
end
|
202
|
+
|
203
|
+
let (:dsimport_contents) do
|
204
|
+
<<-DSIMPORT
|
205
|
+
#{dsimport_preamble}
|
206
|
+
#{username}:#{Base64.strict_encode64(sha512_embedded_bplist)}
|
207
|
+
DSIMPORT
|
208
|
+
end
|
209
|
+
|
199
210
|
# The below represents output of 'dscl -plist . readall /Users' converted to
|
200
211
|
# a native Ruby hash if only one user were installed on the system.
|
201
212
|
# This lets us check the behavior of all the methods necessary to return a
|
@@ -960,6 +971,24 @@ end
|
|
960
971
|
end
|
961
972
|
end
|
962
973
|
|
974
|
+
describe '#set_shadow_hash_data' do
|
975
|
+
let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
|
976
|
+
|
977
|
+
it 'should flush the plist data to disk on OS X < 10.15' do
|
978
|
+
allow(provider.class).to receive(:get_os_version).and_return('10.12')
|
979
|
+
|
980
|
+
expect(provider).to receive(:write_users_plist_to_disk)
|
981
|
+
provider.set_shadow_hash_data(users_plist, pbkdf2_embedded_plist)
|
982
|
+
end
|
983
|
+
|
984
|
+
it 'should flush the plist data a temporary file on OS X >= 10.15' do
|
985
|
+
allow(provider.class).to receive(:get_os_version).and_return('10.15')
|
986
|
+
|
987
|
+
expect(provider).to receive(:write_and_import_shadow_hash_data)
|
988
|
+
provider.set_shadow_hash_data(users_plist, pbkdf2_embedded_plist)
|
989
|
+
end
|
990
|
+
end
|
991
|
+
|
963
992
|
describe '#set_salted_pbkdf2' do
|
964
993
|
let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
|
965
994
|
let(:entropy_shadow_hash_data) do
|
@@ -1011,6 +1040,18 @@ end
|
|
1011
1040
|
end
|
1012
1041
|
end
|
1013
1042
|
|
1043
|
+
describe '#write_and_import_shadow_hash_data' do
|
1044
|
+
it 'should save the passed plist to a temporary file and import it' do
|
1045
|
+
tmpfile = double('tempfile', :path => "/tmp/dsimport_#{username}", :flush => nil)
|
1046
|
+
allow(Tempfile).to receive(:create).and_yield(tmpfile)
|
1047
|
+
allow(provider).to receive(:dscl).with('.', 'delete', user_path, 'ShadowHashData')
|
1048
|
+
|
1049
|
+
expect(tmpfile).to receive(:write).with(dsimport_contents)
|
1050
|
+
expect(provider).to receive(:dsimport).with(tmpfile.path, '/Local/Default', 'M')
|
1051
|
+
provider.write_and_import_shadow_hash_data(sha512_embedded_bplist)
|
1052
|
+
end
|
1053
|
+
end
|
1054
|
+
|
1014
1055
|
describe '#merge_attribute_with_dscl' do
|
1015
1056
|
it 'should raise an error if a dscl command raises an error' do
|
1016
1057
|
expect(provider).to receive(:dscl).with('.', '-merge', user_path, 'GeneratedUID', 'GUID').and_raise(Puppet::ExecutionFailure, 'boom')
|
@@ -56,14 +56,14 @@ describe Puppet::Type.type(:user).provider(:hpuxuseradd), :unless => Puppet.feat
|
|
56
56
|
it "should add modprpw to modifycmd if Trusted System" do
|
57
57
|
allow(resource).to receive(:allowdupe?).and_return(true)
|
58
58
|
expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('uid=0')
|
59
|
-
expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser', '
|
59
|
+
expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser', ';', '/usr/lbin/modprpw', '-v', '-l', 'testuser'], hash_including(custom_environment: {}))
|
60
60
|
provider.uid = 1000
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should not add modprpw if not Trusted System" do
|
64
64
|
allow(resource).to receive(:allowdupe?).and_return(true)
|
65
65
|
expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('System is not trusted')
|
66
|
-
expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser'
|
66
|
+
expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser'], hash_including(custom_environment: {}))
|
67
67
|
provider.uid = 1000
|
68
68
|
end
|
69
69
|
end
|
@@ -45,6 +45,7 @@ describe Puppet::Type.type(:user).provider(:openbsd) do
|
|
45
45
|
describe "#addcmd" do
|
46
46
|
it "should return an array with the full command and expiry as MM/DD/YY" do
|
47
47
|
allow(Facter).to receive(:value).with(:osfamily).and_return('OpenBSD')
|
48
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
|
48
49
|
resource[:expiry] = "1997-06-01"
|
49
50
|
expect(provider.addcmd).to eq(['/usr/sbin/useradd', '-e', 'June 01 1997', 'myuser'])
|
50
51
|
end
|
@@ -72,20 +72,24 @@ describe Puppet::Type.type(:user).provider(:useradd) do
|
|
72
72
|
provider.create
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
75
|
+
context "when setting groups" do
|
76
|
+
it "uses -G to set groups" do
|
77
|
+
allow(Facter).to receive(:value).with(:osfamily).and_return('Solaris')
|
78
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
|
79
|
+
resource[:ensure] = :present
|
80
|
+
resource[:groups] = ['group1', 'group2']
|
81
|
+
expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', 'myuser'], kind_of(Hash))
|
82
|
+
provider.create
|
83
|
+
end
|
82
84
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
it "uses -G to set groups with -M on supported systems" do
|
86
|
+
allow(Facter).to receive(:value).with(:osfamily).and_return('RedHat')
|
87
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
|
88
|
+
resource[:ensure] = :present
|
89
|
+
resource[:groups] = ['group1', 'group2']
|
90
|
+
expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', '-M', 'myuser'], kind_of(Hash))
|
91
|
+
provider.create
|
92
|
+
end
|
89
93
|
end
|
90
94
|
|
91
95
|
it "should add -o when allowdupe is enabled and the user is being created" do
|
@@ -315,6 +319,65 @@ describe Puppet::Type.type(:user).provider(:useradd) do
|
|
315
319
|
expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', '', 'myuser'], hash_including(custom_environment: {}))
|
316
320
|
provider.expiry = :absent
|
317
321
|
end
|
322
|
+
|
323
|
+
it "should use -e with -1 when the expiry property is removed on SLES11" do
|
324
|
+
allow(Facter).to receive(:value).with(:operatingsystem).and_return('SLES')
|
325
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return('11')
|
326
|
+
resource[:expiry] = :absent
|
327
|
+
expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', -1, 'myuser'], hash_including(custom_environment: {}))
|
328
|
+
provider.expiry = :absent
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
describe "#comment" do
|
333
|
+
before { described_class.has_feature :libuser }
|
334
|
+
|
335
|
+
let(:content) { "myuser:x:x:x:local comment:x:x" }
|
336
|
+
|
337
|
+
it "should return the local comment string when forcelocal is true" do
|
338
|
+
resource[:forcelocal] = true
|
339
|
+
allow(File).to receive(:read).with('/etc/passwd').and_return(content)
|
340
|
+
expect(provider.comment).to eq('local comment')
|
341
|
+
end
|
342
|
+
|
343
|
+
it "should fall back to nameservice comment string when forcelocal is false" do
|
344
|
+
resource[:forcelocal] = false
|
345
|
+
allow(provider).to receive(:get).with(:comment).and_return('remote comment')
|
346
|
+
expect(provider).not_to receive(:localcomment)
|
347
|
+
expect(provider.comment).to eq('remote comment')
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
describe "#finduser" do
|
352
|
+
before { allow(File).to receive(:read).with('/etc/passwd').and_return(content) }
|
353
|
+
|
354
|
+
let(:content) { "sample_account:sample_password:sample_uid:sample_gid:sample_gecos:sample_directory:sample_shell" }
|
355
|
+
let(:output) do
|
356
|
+
{
|
357
|
+
account: 'sample_account',
|
358
|
+
password: 'sample_password',
|
359
|
+
uid: 'sample_uid',
|
360
|
+
gid: 'sample_gid',
|
361
|
+
gecos: 'sample_gecos',
|
362
|
+
directory: 'sample_directory',
|
363
|
+
shell: 'sample_shell',
|
364
|
+
}
|
365
|
+
end
|
366
|
+
|
367
|
+
[:account, :password, :uid, :gid, :gecos, :directory, :shell].each do |key|
|
368
|
+
it "finds an user by #{key} when asked" do
|
369
|
+
expect(provider.finduser(key, "sample_#{key}")).to eq(output)
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
it "returns false when specified key/value pair is not found" do
|
374
|
+
expect(provider.finduser(:account, 'invalid_account')).to eq(false)
|
375
|
+
end
|
376
|
+
|
377
|
+
it "reads the user file only once per resource" do
|
378
|
+
expect(File).to receive(:read).with('/etc/passwd').once
|
379
|
+
5.times { provider.finduser(:account, 'sample_account') }
|
380
|
+
end
|
318
381
|
end
|
319
382
|
|
320
383
|
describe "#check_allow_dup" do
|
@@ -370,15 +433,17 @@ describe Puppet::Type.type(:user).provider(:useradd) do
|
|
370
433
|
provider.delete
|
371
434
|
end
|
372
435
|
|
373
|
-
it "should use -M flag if home is not managed
|
436
|
+
it "should use -M flag if home is not managed on a supported system" do
|
374
437
|
allow(Facter).to receive(:value).with(:osfamily).and_return("RedHat")
|
438
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
|
375
439
|
resource[:managehome] = :false
|
376
440
|
expect(provider).to receive(:execute).with(include('-M'), kind_of(Hash))
|
377
441
|
provider.create
|
378
442
|
end
|
379
443
|
|
380
|
-
it "should not use -M flag if home is not managed
|
381
|
-
allow(Facter).to receive(:value).with(:osfamily).and_return("
|
444
|
+
it "should not use -M flag if home is not managed on an unsupported system" do
|
445
|
+
allow(Facter).to receive(:value).with(:osfamily).and_return("Suse")
|
446
|
+
allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return("11")
|
382
447
|
resource[:managehome] = :false
|
383
448
|
expect(provider).to receive(:execute).with(excluding('-M'), kind_of(Hash))
|
384
449
|
provider.create
|
@@ -78,9 +78,9 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
|
|
78
78
|
let(:group3) { double(:account => 'group3', :domain => '.', :sid => 'group3sid') }
|
79
79
|
|
80
80
|
before :each do
|
81
|
-
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group1').and_return(group1)
|
82
|
-
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group2').and_return(group2)
|
83
|
-
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group3').and_return(group3)
|
81
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group1', any_args).and_return(group1)
|
82
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group2', any_args).and_return(group2)
|
83
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group3', any_args).and_return(group3)
|
84
84
|
end
|
85
85
|
|
86
86
|
it "should return true for same lists of members" do
|
@@ -714,6 +714,9 @@ describe 'Puppet Pal' do
|
|
714
714
|
|
715
715
|
context 'facts are supported such that' do
|
716
716
|
it 'they are obtained if they are not given' do
|
717
|
+
facts = Puppet::Node::Facts.new(Puppet[:certname], 'puppetversion' => Puppet.version)
|
718
|
+
Puppet::Node::Facts.indirection.save(facts)
|
719
|
+
|
717
720
|
testing_env_dir # creates the structure
|
718
721
|
result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath ) do |ctx|
|
719
722
|
ctx.with_script_compiler {|c| c.evaluate_string("$facts =~ Hash and $facts[puppetversion] == '#{Puppet.version}'") }
|
@@ -876,9 +876,8 @@ describe Puppet::SSL::CertificateAuthority do
|
|
876
876
|
@ca.verify("me")
|
877
877
|
end
|
878
878
|
|
879
|
-
it "should set the store purpose to OpenSSL::X509::
|
880
|
-
|
881
|
-
expect(@store).to receive(:add_file).with(cacert)
|
879
|
+
it "should set the store purpose to OpenSSL::X509::PURPOSE_ANY" do
|
880
|
+
expect(@store).to receive(:purpose=).with OpenSSL::X509::PURPOSE_ANY
|
882
881
|
|
883
882
|
@ca.verify("me")
|
884
883
|
end
|
@@ -138,6 +138,13 @@ describe Puppet::SSL::Certificate do
|
|
138
138
|
expect(cert.custom_extensions).to include('oid' => '1.3.6.1.4.1.34380.1.2.1', 'value' => 'x509 :(')
|
139
139
|
end
|
140
140
|
|
141
|
+
it "returns extensions under the ppAuthCertExt" do
|
142
|
+
exts = {'pp_auth_role' => 'taketwo'}
|
143
|
+
cert = build_cert(:extension_requests => exts)
|
144
|
+
sign_wrapped_cert(cert)
|
145
|
+
expect(cert.custom_extensions).to include('oid' => 'pp_auth_role', 'value' => 'taketwo')
|
146
|
+
end
|
147
|
+
|
141
148
|
it "doesn't return standard extensions" do
|
142
149
|
cert = build_cert(:dns_alt_names => 'foo')
|
143
150
|
expect(cert.custom_extensions).to be_empty
|
data/spec/unit/ssl/host_spec.rb
CHANGED
@@ -158,6 +158,7 @@ describe Puppet::SSL::Host do
|
|
158
158
|
|
159
159
|
it "should not include defaults if we can't resolve our fqdn" do
|
160
160
|
allow(Puppet::SSL::CertificateAuthority).to receive(:ca?).and_return(true)
|
161
|
+
allow(Facter).to receive(:value).and_call_original
|
161
162
|
allow(Facter).to receive(:value).with(:fqdn).and_return(nil)
|
162
163
|
|
163
164
|
expect(@cr).to receive(:generate).with(@key, {})
|
@@ -167,6 +168,7 @@ describe Puppet::SSL::Host do
|
|
167
168
|
|
168
169
|
it "should provide defaults if we're bootstrapping the local master" do
|
169
170
|
allow(Puppet::SSL::CertificateAuthority).to receive(:ca?).and_return(true)
|
171
|
+
allow(Facter).to receive(:value).and_call_original
|
170
172
|
allow(Facter).to receive(:value).with(:fqdn).and_return('web.foo.com')
|
171
173
|
allow(Facter).to receive(:value).with(:domain).and_return('foo.com')
|
172
174
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TestHelper" do
|
4
|
+
context "#after_each_test" do
|
5
|
+
it "restores the original environment" do
|
6
|
+
varname = 'test_helper_spec-test_variable'
|
7
|
+
Puppet::Util.set_env(varname, "\u16A0")
|
8
|
+
|
9
|
+
expect(Puppet::Util.get_env(varname)).to eq("\u16A0")
|
10
|
+
|
11
|
+
# Prematurely trigger the after_each_test method
|
12
|
+
Puppet::Test::TestHelper.after_each_test
|
13
|
+
|
14
|
+
expect(Puppet::Util::get_env(varname)).to be_nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/spec/unit/type/exec_spec.rb
CHANGED
@@ -150,16 +150,13 @@ RSpec.describe Puppet::Type.type(:exec) do
|
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
|
-
it "should redact the command on failure" do
|
153
|
+
it "should redact the sensitive command on failure" do
|
154
154
|
output = "output1\noutput2\n"
|
155
155
|
expect { exec_tester('false', 1, :output => output, :logoutput => :on_failure, :sensitive_parameters => [:command]).refresh }.
|
156
156
|
to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
|
157
157
|
|
158
|
-
|
159
|
-
|
160
|
-
expect(log.level).to eq(:err)
|
161
|
-
expect(log.message).to eq(line)
|
162
|
-
end
|
158
|
+
expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
|
159
|
+
expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
|
163
160
|
end
|
164
161
|
|
165
162
|
it "should log the output on failure when returns is specified as an array" do
|
@@ -177,7 +174,7 @@ RSpec.describe Puppet::Type.type(:exec) do
|
|
177
174
|
end
|
178
175
|
end
|
179
176
|
|
180
|
-
it "should redact the command on failure when returns is specified as an array" do
|
177
|
+
it "should redact the sensitive command on failure when returns is specified as an array" do
|
181
178
|
output = "output1\noutput2\n"
|
182
179
|
|
183
180
|
expect {
|
@@ -185,11 +182,8 @@ RSpec.describe Puppet::Type.type(:exec) do
|
|
185
182
|
:logoutput => :on_failure, :sensitive_parameters => [:command]).refresh
|
186
183
|
}.to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
|
187
184
|
|
188
|
-
|
189
|
-
|
190
|
-
expect(log.level).to eq(:err)
|
191
|
-
expect(log.message).to eq(line)
|
192
|
-
end
|
185
|
+
expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
|
186
|
+
expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
|
193
187
|
end
|
194
188
|
|
195
189
|
it "shouldn't log the output on success" do
|
@@ -200,15 +200,21 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
|
|
200
200
|
end
|
201
201
|
|
202
202
|
it "prints the diff" do
|
203
|
-
expect(content).to receive(:diff).and_return("my diff")
|
204
|
-
expect(content).to receive(:debug).with("\nmy diff")
|
203
|
+
expect(content).to receive(:diff).and_return("my diff")
|
204
|
+
expect(content).to receive(:debug).with("\nmy diff")
|
205
|
+
expect(content).not_to be_safe_insync("other content")
|
206
|
+
end
|
207
|
+
|
208
|
+
it "prints binary file notice if diff is not valid encoding" do
|
209
|
+
expect(content).to receive(:diff).and_return("\xc7\xd1\xfc\x84")
|
210
|
+
expect(content).to receive(:debug).with(/\nBinary files #{filename} and .* differ/)
|
205
211
|
expect(content).not_to be_safe_insync("other content")
|
206
212
|
end
|
207
213
|
|
208
214
|
it "redacts the diff when the property is sensitive" do
|
209
215
|
content.sensitive = true
|
210
216
|
expect(content).not_to receive(:diff)
|
211
|
-
expect(content).to receive(:debug).with("[diff redacted]")
|
217
|
+
expect(content).to receive(:debug).with("[diff redacted]")
|
212
218
|
expect(content).not_to be_safe_insync("other content")
|
213
219
|
end
|
214
220
|
end
|
data/spec/unit/type/file_spec.rb
CHANGED
@@ -477,6 +477,9 @@ describe Puppet::Type.type(:file) do
|
|
477
477
|
end
|
478
478
|
|
479
479
|
describe "#recurse" do
|
480
|
+
let(:name) { 'bar' }
|
481
|
+
let(:child) { double('puppet_type_file') }
|
482
|
+
|
480
483
|
before do
|
481
484
|
file[:recurse] = true
|
482
485
|
@metadata = Puppet::FileServing::Metadata
|
@@ -485,8 +488,9 @@ describe Puppet::Type.type(:file) do
|
|
485
488
|
describe "and a source is set" do
|
486
489
|
it "should pass the already-discovered resources to recurse_remote" do
|
487
490
|
file[:source] = File.expand_path(__FILE__)
|
488
|
-
allow(
|
489
|
-
|
491
|
+
allow(child).to receive(:[]).with(:path).and_return(name)
|
492
|
+
allow(file).to receive(:recurse_local).and_return(name => child)
|
493
|
+
expect(file).to receive(:recurse_remote).with(name => child).and_return([])
|
490
494
|
file.recurse
|
491
495
|
end
|
492
496
|
end
|
@@ -494,8 +498,9 @@ describe Puppet::Type.type(:file) do
|
|
494
498
|
describe "and a target is set" do
|
495
499
|
it "should use recurse_link" do
|
496
500
|
file[:target] = File.expand_path(__FILE__)
|
497
|
-
allow(
|
498
|
-
|
501
|
+
allow(child).to receive(:[]).with(:path).and_return(name)
|
502
|
+
allow(file).to receive(:recurse_local).and_return(name => child)
|
503
|
+
expect(file).to receive(:recurse_link).with(name => child).and_return([])
|
499
504
|
file.recurse
|
500
505
|
end
|
501
506
|
end
|
@@ -30,6 +30,10 @@ describe Puppet::Type.type(:package) do
|
|
30
30
|
expect(Puppet::Type.type(:package).provider_feature(:versionable)).not_to be_nil
|
31
31
|
end
|
32
32
|
|
33
|
+
it "should have a :supports_flavors feature" do
|
34
|
+
expect(Puppet::Type.type(:package).provider_feature(:supports_flavors)).not_to be_nil
|
35
|
+
end
|
36
|
+
|
33
37
|
it "should have a :package_settings feature that requires :package_settings_insync?, :package_settings and :package_settings=" do
|
34
38
|
expect(Puppet::Type.type(:package).provider_feature(:package_settings).methods).to eq([:package_settings_insync?, :package_settings, :package_settings=])
|
35
39
|
end
|
@@ -53,6 +57,10 @@ describe Puppet::Type.type(:package) do
|
|
53
57
|
it "should have a package_settings property" do
|
54
58
|
expect(Puppet::Type.type(:package).attrtype(:package_settings)).to eq(:property)
|
55
59
|
end
|
60
|
+
|
61
|
+
it "should have a flavor property" do
|
62
|
+
expect(Puppet::Type.type(:package).attrtype(:flavor)).to eq(:property)
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
66
|
describe "when validating attribute values" do
|
@@ -24,12 +24,10 @@ describe Puppet::Type.type(:selboolean), "when validating values" do
|
|
24
24
|
allow(@provider_class).to receive(:new).and_return(@provider)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
it "should support :off as a value to :value" do
|
32
|
-
Puppet::Type.type(:selboolean).new(:name => "yay", :value => :off)
|
27
|
+
[:on, :off, :true, :false, true, false].each do |val|
|
28
|
+
it "should support #{val.inspect} as a value to :value" do
|
29
|
+
Puppet::Type.type(:selboolean).new(:name => "yay", :value => val)
|
30
|
+
end
|
33
31
|
end
|
34
32
|
|
35
33
|
it "should support :true as a value to :persistent" do
|
@@ -234,20 +234,21 @@ describe Puppet::Type.type(:service), "when changing the host" do
|
|
234
234
|
@service.property(:enable).sync
|
235
235
|
end
|
236
236
|
|
237
|
-
it "should
|
237
|
+
it "should let superclass implementation resolve insyncness when provider does not respond to the 'enabled_insync?' method" do
|
238
238
|
allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
|
239
|
-
|
240
|
-
@service
|
241
|
-
|
239
|
+
@service[:enable] = true
|
240
|
+
allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?).and_return(false)
|
241
|
+
|
242
242
|
expect(@service.property(:enable).insync?(:true)).to eq(true)
|
243
243
|
end
|
244
244
|
|
245
|
-
it "should
|
245
|
+
it "insyncness should be resolved by provider instead of superclass implementation when provider responds to the 'enabled_insync?' method" do
|
246
246
|
allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
|
247
|
-
expect(@service.provider).to receive(:cached_enabled?).and_return('true')
|
248
247
|
@service[:enable] = true
|
249
|
-
|
250
|
-
|
248
|
+
allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?).and_return(true)
|
249
|
+
allow(@service.provider).to receive(:enabled_insync?).and_return(false)
|
250
|
+
|
251
|
+
expect(@service.property(:enable).insync?(:true)).to eq(false)
|
251
252
|
end
|
252
253
|
|
253
254
|
it "should sync the service's enable state when changing the state of :ensure if :enable is being managed" do
|