puppet 6.19.1-x64-mingw32 → 6.23.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 -16
- data/Gemfile +3 -1
- data/Gemfile.lock +51 -40
- data/ext/osx/puppet.plist +2 -0
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +12 -4
- data/lib/puppet/application/apply.rb +4 -2
- data/lib/puppet/application/device.rb +2 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/resource.rb +2 -1
- data/lib/puppet/application/script.rb +2 -0
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/configurer/downloader.rb +2 -1
- data/lib/puppet/defaults.rb +51 -23
- data/lib/puppet/environments.rb +54 -55
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +158 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/file_serving/fileset.rb +14 -2
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/functions/all.rb +1 -1
- data/lib/puppet/functions/camelcase.rb +1 -1
- data/lib/puppet/functions/capitalize.rb +2 -2
- data/lib/puppet/functions/downcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/get.rb +5 -5
- data/lib/puppet/functions/group_by.rb +13 -5
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/lest.rb +1 -1
- data/lib/puppet/functions/new.rb +100 -100
- data/lib/puppet/functions/partition.rb +12 -4
- data/lib/puppet/functions/require.rb +5 -5
- data/lib/puppet/functions/sort.rb +3 -3
- data/lib/puppet/functions/tree_each.rb +7 -9
- data/lib/puppet/functions/type.rb +4 -4
- data/lib/puppet/functions/upcase.rb +2 -2
- data/lib/puppet/http/resolver/server_list.rb +15 -4
- data/lib/puppet/http/service/compiler.rb +69 -0
- data/lib/puppet/http/service/file_server.rb +2 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +69 -1
- data/lib/puppet/network/http/factory.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
- data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
- data/lib/puppet/property/list.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/package/apt.rb +34 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- data/lib/puppet/provider/package/dnfmodule.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +11 -6
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +14 -4
- data/lib/puppet/provider/service/windows.rb +38 -0
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/directoryservice.rb +25 -12
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +7 -6
- data/lib/puppet/settings.rb +33 -28
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
- data/lib/puppet/type/file.rb +19 -1
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/type/service.rb +18 -38
- data/lib/puppet/type/tidy.rb +21 -2
- data/lib/puppet/type/user.rb +38 -20
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +81 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/selinux.rb +30 -4
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +372 -288
- data/man/man5/puppet.conf.5 +282 -254
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- 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 +90 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- 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-module.8 +1 -1
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- data/man/man8/puppet-ssl.8 +5 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
- data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
- data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
- data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
- data/spec/fixtures/ssl/ca.pem +57 -35
- data/spec/fixtures/ssl/crl.pem +28 -18
- data/spec/fixtures/ssl/ec-key.pem +11 -11
- data/spec/fixtures/ssl/ec.pem +33 -24
- data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
- data/spec/fixtures/ssl/encrypted-key.pem +108 -58
- data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
- data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
- data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
- data/spec/fixtures/ssl/intermediate.pem +57 -36
- data/spec/fixtures/ssl/pluto-key.pem +107 -57
- data/spec/fixtures/ssl/pluto.pem +52 -30
- data/spec/fixtures/ssl/request-key.pem +107 -57
- data/spec/fixtures/ssl/request.pem +47 -26
- data/spec/fixtures/ssl/revoked-key.pem +107 -57
- data/spec/fixtures/ssl/revoked.pem +52 -30
- data/spec/fixtures/ssl/signed-key.pem +107 -57
- data/spec/fixtures/ssl/signed.pem +52 -30
- data/spec/fixtures/ssl/tampered-cert.pem +52 -30
- data/spec/fixtures/ssl/tampered-csr.pem +47 -26
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
- data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
- data/spec/fixtures/ssl/unknown-ca.pem +55 -33
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +160 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/application/resource_spec.rb +30 -0
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +21 -1
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -10
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +12 -5
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +7 -3
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +482 -3
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/configurer/downloader_spec.rb +6 -0
- data/spec/unit/configurer_spec.rb +23 -0
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +36 -1
- data/spec/unit/environments_spec.rb +221 -68
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/fileset_spec.rb +60 -0
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/gettext/config_spec.rb +12 -0
- data/spec/unit/http/service/compiler_spec.rb +172 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/catalog/compiler_spec.rb +14 -10
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +95 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/formats_spec.rb +41 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +28 -23
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
- data/spec/unit/provider/package/nim_spec.rb +42 -0
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openwrt_spec.rb +3 -1
- data/spec/unit/provider/service/systemd_spec.rb +53 -8
- data/spec/unit/provider/service/windows_spec.rb +202 -0
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +67 -35
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +71 -3
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/catalog_spec.rb +1 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +419 -242
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/ssl/state_machine_spec.rb +19 -5
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -9
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +18 -11
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +3 -5
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +60 -189
- data/spec/unit/type/tidy_spec.rb +17 -8
- data/spec/unit/type/user_spec.rb +45 -0
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +163 -68
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- data/spec/unit/util_spec.rb +13 -6
- data/tasks/generate_cert_fixtures.rake +2 -2
- metadata +33 -16
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
data/spec/unit/type/tidy_spec.rb
CHANGED
@@ -191,22 +191,31 @@ describe tidy do
|
|
191
191
|
describe "and recursion is used" do
|
192
192
|
before do
|
193
193
|
@tidy[:recurse] = true
|
194
|
-
allow_any_instance_of(Puppet::FileServing::Fileset).to receive(:stat).and_return(double("stat"))
|
195
194
|
@fileset = Puppet::FileServing::Fileset.new(@basepath)
|
196
195
|
allow(Puppet::FileServing::Fileset).to receive(:new).and_return(@fileset)
|
197
196
|
end
|
198
197
|
|
199
|
-
it "should use a Fileset for infinite recursion" do
|
200
|
-
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true).and_return(@fileset)
|
198
|
+
it "should use a Fileset with default max_files for infinite recursion" do
|
199
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :max_files=>0).and_return(@fileset)
|
201
200
|
expect(@fileset).to receive(:files).and_return(%w{. one two})
|
202
201
|
allow(@tidy).to receive(:tidy?).and_return(false)
|
203
202
|
|
204
203
|
@tidy.generate
|
205
204
|
end
|
206
205
|
|
207
|
-
it "should use a Fileset for limited recursion" do
|
206
|
+
it "should use a Fileset with default max_files for limited recursion" do
|
208
207
|
@tidy[:recurse] = 42
|
209
|
-
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :recurselimit => 42).and_return(@fileset)
|
208
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :recurselimit => 42, :max_files=>0).and_return(@fileset)
|
209
|
+
expect(@fileset).to receive(:files).and_return(%w{. one two})
|
210
|
+
allow(@tidy).to receive(:tidy?).and_return(false)
|
211
|
+
|
212
|
+
@tidy.generate
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should use a Fileset with max_files for limited recursion" do
|
216
|
+
@tidy[:recurse] = 42
|
217
|
+
@tidy[:max_files] = 9876
|
218
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :recurselimit => 42, :max_files=>9876).and_return(@fileset)
|
210
219
|
expect(@fileset).to receive(:files).and_return(%w{. one two})
|
211
220
|
allow(@tidy).to receive(:tidy?).and_return(false)
|
212
221
|
|
@@ -412,7 +421,7 @@ describe tidy do
|
|
412
421
|
@tidy[:recurse] = true
|
413
422
|
@tidy[:rmdirs] = true
|
414
423
|
fileset = double('fileset')
|
415
|
-
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true).and_return(fileset)
|
424
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :max_files=>0).and_return(fileset)
|
416
425
|
expect(fileset).to receive(:files).and_return(%w{. one two one/subone two/subtwo one/subone/ssone})
|
417
426
|
allow(@tidy).to receive(:tidy?).and_return(true)
|
418
427
|
|
@@ -434,7 +443,7 @@ describe tidy do
|
|
434
443
|
@tidy[:recurse] = true
|
435
444
|
@tidy[:rmdirs] = true
|
436
445
|
fileset = double('fileset')
|
437
|
-
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true).and_return(fileset)
|
446
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :max_files=>0).and_return(fileset)
|
438
447
|
expect(fileset).to receive(:files).and_return(%w{. a a/2 a/1 a/3})
|
439
448
|
allow(@tidy).to receive(:tidy?).and_return(true)
|
440
449
|
|
@@ -447,7 +456,7 @@ describe tidy do
|
|
447
456
|
@tidy[:noop] = true
|
448
457
|
|
449
458
|
fileset = double('fileset')
|
450
|
-
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true).and_return(fileset)
|
459
|
+
expect(Puppet::FileServing::Fileset).to receive(:new).with(@basepath, :recurse => true, :max_files=>0).and_return(fileset)
|
451
460
|
expect(fileset).to receive(:files).and_return(%w{. a a/2 a/1 a/3})
|
452
461
|
allow(@tidy).to receive(:tidy?).and_return(true)
|
453
462
|
|
data/spec/unit/type/user_spec.rb
CHANGED
@@ -174,6 +174,51 @@ describe Puppet::Type.type(:user) do
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
+
describe "when managing the purge_ssh_keys property" do
|
178
|
+
context "with valid input" do
|
179
|
+
it "should support a :true value" do
|
180
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :true) }.to_not raise_error
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should support a :false value" do
|
184
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :false) }.to_not raise_error
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should support a String value" do
|
188
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should support an Array value" do
|
192
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
|
193
|
+
File.expand_path('custom/authorized_keys')]) }.to_not raise_error
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "with faulty input" do
|
198
|
+
it "should raise error for relative path" do
|
199
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
|
200
|
+
/Paths to keyfiles must be absolute/ )
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should raise error for invalid type" do
|
204
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
|
205
|
+
/purge_ssh_keys must be true, false, or an array of file names/ )
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should raise error for array with relative path" do
|
209
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
|
210
|
+
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
211
|
+
/Paths to keyfiles must be absolute/ )
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should raise error for array with invalid type" do
|
215
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
|
216
|
+
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
217
|
+
/Each entry for purge_ssh_keys must be a string/ )
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
177
222
|
describe "when managing the uid property" do
|
178
223
|
it "should convert number-looking strings into actual numbers" do
|
179
224
|
expect(described_class.new(:name => 'foo', :uid => '50')[:uid]).to eq(50)
|
data/spec/unit/type_spec.rb
CHANGED
@@ -912,8 +912,8 @@ describe Puppet::Type, :unless => Puppet::Util::Platform.windows? do
|
|
912
912
|
|
913
913
|
it "should always retrieve the ensure value by default" do
|
914
914
|
@ensurable_resource = Puppet::Type.type(:file).new(:name => "/not/existent", :mode => "0644")
|
915
|
-
|
916
|
-
|
915
|
+
# the ensure property is lazily metaprogrammed...
|
916
|
+
allow_any_instance_of(Puppet::Type::File::Ensure).to receive(:retrieve).and_return(:absent)
|
917
917
|
@ensurable_resource.retrieve_resource
|
918
918
|
end
|
919
919
|
|
@@ -50,8 +50,8 @@ describe 'Puppet::Util::AtFork' do
|
|
50
50
|
const_set(:TYPE_VOID, nil)
|
51
51
|
const_set(:TYPE_INT, nil)
|
52
52
|
const_set(:DLError, Class.new(StandardError))
|
53
|
-
const_set(:Handle, Class.new)
|
54
|
-
const_set(:Function, Class.new)
|
53
|
+
const_set(:Handle, Class.new { def initialize(library = nil, flags = 0); end })
|
54
|
+
const_set(:Function, Class.new { def initialize(ptr, args, ret_type, abi = 0); end })
|
55
55
|
end)
|
56
56
|
end
|
57
57
|
end
|
@@ -157,7 +157,7 @@ describe Puppet::Util::Autoload do
|
|
157
157
|
end
|
158
158
|
|
159
159
|
it "should load the first file in the searchpath" do
|
160
|
-
allow(@autoload).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
|
160
|
+
allow(@autoload.class).to receive(:search_directories).and_return([make_absolute("/a"), make_absolute("/b")])
|
161
161
|
allow(FileTest).to receive(:directory?).and_return(true)
|
162
162
|
allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
|
163
163
|
expect(Kernel).to receive(:load).with(make_absolute("/a/tmp/myfile.rb"), any_args)
|
@@ -298,6 +298,10 @@ describe Puppet::Util::Autoload do
|
|
298
298
|
it "should convert c:\ to c:/" do
|
299
299
|
expect(Puppet::Util::Autoload.cleanpath('c:\\')).to eq('c:/')
|
300
300
|
end
|
301
|
+
|
302
|
+
it "should convert all backslashes to forward slashes" do
|
303
|
+
expect(Puppet::Util::Autoload.cleanpath('c:\projects\ruby\bug\test.rb')).to eq('c:/projects/ruby/bug/test.rb')
|
304
|
+
end
|
301
305
|
end
|
302
306
|
end
|
303
307
|
|
@@ -119,8 +119,7 @@ describe Puppet::Util::Backups do
|
|
119
119
|
file = Puppet::Type.type(:file).new(:name => path, :backup => 'foo', :recurse => true)
|
120
120
|
|
121
121
|
expect(bucket).not_to receive(:backup)
|
122
|
-
|
123
|
-
allow(Puppet::FileSystem).to receive(:new).with(path).and_return(stub_file)
|
122
|
+
allow(Puppet::FileSystem).to receive(:stat).with(path).and_return(double('stat', :ftype => 'directory'))
|
124
123
|
expect(Find).not_to receive(:find)
|
125
124
|
|
126
125
|
file.perform_backup
|
@@ -639,6 +639,8 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
|
|
639
639
|
|
640
640
|
describe "#execute (debug logging)" do
|
641
641
|
before :each do
|
642
|
+
Puppet[:log_level] = 'debug'
|
643
|
+
|
642
644
|
stub_process_wait(0)
|
643
645
|
|
644
646
|
if Puppet::Util::Platform.windows?
|
@@ -649,47 +651,47 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
|
|
649
651
|
end
|
650
652
|
|
651
653
|
it "should log if no uid or gid specified" do
|
652
|
-
expect(Puppet
|
654
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing: 'echo hello'")
|
653
655
|
Puppet::Util::Execution.execute('echo hello')
|
654
656
|
end
|
655
657
|
|
656
658
|
it "should log numeric uid if specified" do
|
657
|
-
expect(Puppet
|
659
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100: 'echo hello'")
|
658
660
|
Puppet::Util::Execution.execute('echo hello', {:uid => 100})
|
659
661
|
end
|
660
662
|
|
661
663
|
it "should log numeric gid if specified" do
|
662
|
-
expect(Puppet
|
664
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=500: 'echo hello'")
|
663
665
|
Puppet::Util::Execution.execute('echo hello', {:gid => 500})
|
664
666
|
end
|
665
667
|
|
666
668
|
it "should log numeric uid and gid if specified" do
|
667
|
-
expect(Puppet
|
669
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=500: 'echo hello'")
|
668
670
|
Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 500})
|
669
671
|
end
|
670
672
|
|
671
673
|
it "should log string uid if specified" do
|
672
|
-
expect(Puppet
|
674
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser: 'echo hello'")
|
673
675
|
Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser'})
|
674
676
|
end
|
675
677
|
|
676
678
|
it "should log string gid if specified" do
|
677
|
-
expect(Puppet
|
679
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with gid=mygroup: 'echo hello'")
|
678
680
|
Puppet::Util::Execution.execute('echo hello', {:gid => 'mygroup'})
|
679
681
|
end
|
680
682
|
|
681
683
|
it "should log string uid and gid if specified" do
|
682
|
-
expect(Puppet
|
684
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=myuser gid=mygroup: 'echo hello'")
|
683
685
|
Puppet::Util::Execution.execute('echo hello', {:uid => 'myuser', :gid => 'mygroup'})
|
684
686
|
end
|
685
687
|
|
686
688
|
it "should log numeric uid and string gid if specified" do
|
687
|
-
expect(Puppet
|
689
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing with uid=100 gid=mygroup: 'echo hello'")
|
688
690
|
Puppet::Util::Execution.execute('echo hello', {:uid => 100, :gid => 'mygroup'})
|
689
691
|
end
|
690
692
|
|
691
693
|
it 'should redact commands in debug output when passed sensitive option' do
|
692
|
-
expect(Puppet
|
694
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing: '[redacted]'")
|
693
695
|
Puppet::Util::Execution.execute('echo hello', {:sensitive => true})
|
694
696
|
end
|
695
697
|
end
|
@@ -903,14 +905,16 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
|
|
903
905
|
end
|
904
906
|
|
905
907
|
it "should print meaningful debug message for string argument" do
|
906
|
-
|
908
|
+
Puppet[:log_level] = 'debug'
|
909
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
|
907
910
|
expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
|
908
911
|
expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
|
909
912
|
Puppet::Util::Execution.execpipe('echo hello')
|
910
913
|
end
|
911
914
|
|
912
915
|
it "should print meaningful debug message for array argument" do
|
913
|
-
|
916
|
+
Puppet[:log_level] = 'debug'
|
917
|
+
expect(Puppet).to receive(:send_log).with(:debug, "Executing 'echo hello'")
|
914
918
|
expect(Puppet::Util::Execution).to receive(:open).with('| echo hello 2>&1').and_return('hello')
|
915
919
|
expect(Puppet::Util::Execution).to receive(:exitstatus).and_return(0)
|
916
920
|
Puppet::Util::Execution.execpipe(['echo','hello'])
|
@@ -443,13 +443,9 @@ describe Puppet::Util::IniConfig::FileCollection do
|
|
443
443
|
end
|
444
444
|
|
445
445
|
it "yields every section from every file" do
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
subject.each_section do |sect|
|
451
|
-
sect.touch
|
452
|
-
end
|
446
|
+
expect { |b|
|
447
|
+
subject.each_section(&b)
|
448
|
+
}.to yield_successive_args(sect_a1, sect_a2, sect_b1, sect_b2)
|
453
449
|
end
|
454
450
|
end
|
455
451
|
|
@@ -460,13 +456,9 @@ describe Puppet::Util::IniConfig::FileCollection do
|
|
460
456
|
end
|
461
457
|
|
462
458
|
it "yields the path to every file in the collection" do
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
end
|
467
|
-
|
468
|
-
expect(seen).to include(path_a)
|
469
|
-
expect(seen).to include(path_b)
|
459
|
+
expect { |b|
|
460
|
+
subject.each_file(&b)
|
461
|
+
}.to yield_successive_args(path_a, path_b)
|
470
462
|
end
|
471
463
|
end
|
472
464
|
|
data/spec/unit/util/log_spec.rb
CHANGED
@@ -111,16 +111,20 @@ describe Puppet::Util::Log do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should fall back to :eventlog" do
|
114
|
-
|
115
|
-
|
114
|
+
without_partial_double_verification do
|
115
|
+
allow(Puppet.features).to receive(:syslog?).and_return(false)
|
116
|
+
allow(Puppet.features).to receive(:eventlog?).and_return(true)
|
117
|
+
end
|
116
118
|
expect(Puppet::Util::Log).to receive(:newdestination).with(:eventlog)
|
117
119
|
|
118
120
|
Puppet::Util::Log.setup_default
|
119
121
|
end
|
120
122
|
|
121
123
|
it "should fall back to :file" do
|
122
|
-
|
123
|
-
|
124
|
+
without_partial_double_verification do
|
125
|
+
allow(Puppet.features).to receive(:syslog?).and_return(false)
|
126
|
+
allow(Puppet.features).to receive(:eventlog?).and_return(false)
|
127
|
+
end
|
124
128
|
expect(Puppet::Util::Log).to receive(:newdestination).with(Puppet[:puppetdlog])
|
125
129
|
|
126
130
|
Puppet::Util::Log.setup_default
|
@@ -224,9 +228,6 @@ describe Puppet::Util::Log do
|
|
224
228
|
describe Puppet::Util::Log::DestEventlog, :if => Puppet.features.eventlog? do
|
225
229
|
before :each do
|
226
230
|
allow(Puppet::Util::Windows::EventLog).to receive(:open).and_return(double('mylog', :close => nil))
|
227
|
-
allow(Puppet::Util::Windows::EventLog).to receive(:report_event)
|
228
|
-
allow(Puppet::Util::Windows::EventLog).to receive(:close)
|
229
|
-
allow(Puppet.features).to receive(:eventlog?).and_return(true)
|
230
231
|
end
|
231
232
|
|
232
233
|
it "should restrict its suitability to Windows" do
|
@@ -552,7 +552,7 @@ original
|
|
552
552
|
|
553
553
|
describe 'does support debugging' do
|
554
554
|
before :each do
|
555
|
-
allow(Facter).to receive(:respond_to?).with(:debugging).and_return(true)
|
555
|
+
allow(Facter).to receive(:respond_to?).with(:debugging, any_args).and_return(true)
|
556
556
|
end
|
557
557
|
|
558
558
|
it 'enables Facter debugging when debug level' do
|
@@ -568,7 +568,7 @@ original
|
|
568
568
|
|
569
569
|
describe 'does support trace' do
|
570
570
|
before :each do
|
571
|
-
allow(Facter).to receive(:respond_to?).with(:trace).and_return(true)
|
571
|
+
allow(Facter).to receive(:respond_to?).with(:trace, any_args).and_return(true)
|
572
572
|
end
|
573
573
|
|
574
574
|
it 'enables Facter trace when enabled' do
|
@@ -584,7 +584,7 @@ original
|
|
584
584
|
|
585
585
|
describe 'does support on_message' do
|
586
586
|
before :each do
|
587
|
-
allow(Facter).to receive(:respond_to?).with(:on_message).and_return(true)
|
587
|
+
allow(Facter).to receive(:respond_to?).with(:on_message, any_args).and_return(true)
|
588
588
|
end
|
589
589
|
|
590
590
|
def setup(level, message)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
require 'puppet/ffi/posix'
|
3
4
|
require 'puppet/util/posix'
|
4
5
|
|
5
6
|
class PosixTest
|
@@ -11,35 +12,344 @@ describe Puppet::Util::POSIX do
|
|
11
12
|
@posix = PosixTest.new
|
12
13
|
end
|
13
14
|
|
14
|
-
describe '.groups_of' do
|
15
|
+
describe '.groups_of' do
|
16
|
+
let(:mock_user_data) { double(user, :gid => 1000) }
|
17
|
+
|
18
|
+
let(:ngroups_ptr) { double('FFI::MemoryPointer', :address => 0x0001, :size => 4) }
|
19
|
+
let(:groups_ptr) { double('FFI::MemoryPointer', :address => 0x0002, :size => Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS) }
|
20
|
+
|
15
21
|
let(:mock_groups) do
|
16
22
|
[
|
17
|
-
['
|
18
|
-
['
|
19
|
-
['group1', ['user1', 'user2']],
|
20
|
-
['
|
21
|
-
['
|
22
|
-
|
23
|
+
['root', ['root'], 0],
|
24
|
+
['nomembers', [], 5 ],
|
25
|
+
['group1', ['user1', 'user2'], 1001],
|
26
|
+
['group2', ['user2'], 2002],
|
27
|
+
['group1', ['user1', 'user2'], 1001],
|
28
|
+
['group3', ['user1'], 3003],
|
29
|
+
['group4', ['user2'], 4004],
|
30
|
+
['user1', [], 1111],
|
31
|
+
['user2', [], 2222]
|
32
|
+
].map do |(name, members, gid)|
|
23
33
|
group_struct = double("Group #{name}")
|
24
34
|
allow(group_struct).to receive(:name).and_return(name)
|
25
35
|
allow(group_struct).to receive(:mem).and_return(members)
|
36
|
+
allow(group_struct).to receive(:gid).and_return(gid)
|
26
37
|
|
27
38
|
group_struct
|
28
39
|
end
|
29
40
|
end
|
30
41
|
|
42
|
+
def prepare_user_and_groups_env(user, groups)
|
43
|
+
groups_gids = []
|
44
|
+
groups_and_user = []
|
45
|
+
groups_and_user.replace(groups)
|
46
|
+
groups_and_user.push(user)
|
47
|
+
|
48
|
+
groups_and_user.each do |group|
|
49
|
+
mock_group = mock_groups.find { |m| m.name == group }
|
50
|
+
groups_gids.push(mock_group.gid)
|
51
|
+
|
52
|
+
allow(Puppet::Etc).to receive(:getgrgid).with(mock_group.gid).and_return(mock_group)
|
53
|
+
end
|
54
|
+
|
55
|
+
if groups_and_user.size > Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS
|
56
|
+
allow(ngroups_ptr).to receive(:read_int).and_return(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS, groups_and_user.size)
|
57
|
+
else
|
58
|
+
allow(ngroups_ptr).to receive(:read_int).and_return(groups_and_user.size)
|
59
|
+
end
|
60
|
+
|
61
|
+
allow(groups_ptr).to receive(:get_array_of_uint).with(0, groups_and_user.size).and_return(groups_gids)
|
62
|
+
allow(Puppet::Etc).to receive(:getpwnam).with(user).and_return(mock_user_data)
|
63
|
+
end
|
64
|
+
|
31
65
|
before(:each) do
|
32
|
-
|
33
|
-
|
34
|
-
|
66
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'when it uses FFI function getgrouplist' do
|
70
|
+
before(:each) do
|
71
|
+
allow(FFI::MemoryPointer).to receive(:new).with(:int).and_yield(ngroups_ptr)
|
72
|
+
allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_yield(groups_ptr)
|
73
|
+
allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_return(ngroups_ptr)
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'when there are groups' do
|
77
|
+
context 'for user1' do
|
78
|
+
let(:user) { 'user1' }
|
79
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
80
|
+
|
81
|
+
before(:each) do
|
82
|
+
prepare_user_and_groups_env(user, expected_groups)
|
83
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should return the groups for given user" do
|
87
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
91
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
92
|
+
Puppet::Util::POSIX.groups_of(user)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'for user2' do
|
97
|
+
let(:user) { 'user2' }
|
98
|
+
let(:expected_groups) { ['group1', 'group2', 'group4'] }
|
99
|
+
|
100
|
+
before(:each) do
|
101
|
+
prepare_user_and_groups_env(user, expected_groups)
|
102
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
103
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return the groups for given user" do
|
107
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
111
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
112
|
+
Puppet::Util::POSIX.groups_of(user)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'when there are no groups' do
|
118
|
+
let(:user) { 'nomembers' }
|
119
|
+
let(:expected_groups) { [] }
|
120
|
+
|
121
|
+
before(:each) do
|
122
|
+
prepare_user_and_groups_env(user, expected_groups)
|
123
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
124
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should return no groups for given user" do
|
128
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
132
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
133
|
+
Puppet::Util::POSIX.groups_of(user)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'when primary group explicitly contains user' do
|
138
|
+
let(:user) { 'root' }
|
139
|
+
let(:expected_groups) { ['root'] }
|
140
|
+
|
141
|
+
before(:each) do
|
142
|
+
prepare_user_and_groups_env(user, expected_groups)
|
143
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
144
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should return the groups, including primary group, for given user" do
|
148
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
152
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
153
|
+
Puppet::Util::POSIX.groups_of(user)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe 'when primary group does not explicitly contain user' do
|
158
|
+
let(:user) { 'user1' }
|
159
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
160
|
+
|
161
|
+
before(:each) do
|
162
|
+
prepare_user_and_groups_env(user, expected_groups)
|
163
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
164
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should not return primary group for given user" do
|
168
|
+
expect(Puppet::Util::POSIX.groups_of(user)).not_to include(user)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
172
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
173
|
+
Puppet::Util::POSIX.groups_of(user)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'number of groups' do
|
178
|
+
before(:each) do
|
179
|
+
stub_const("Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS", 2)
|
180
|
+
prepare_user_and_groups_env(user, expected_groups)
|
181
|
+
|
182
|
+
allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_yield(groups_ptr)
|
183
|
+
allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS).and_return(ngroups_ptr)
|
184
|
+
end
|
185
|
+
|
186
|
+
describe 'when there are less than maximum expected number of groups' do
|
187
|
+
let(:user) { 'root' }
|
188
|
+
let(:expected_groups) { ['root'] }
|
189
|
+
|
190
|
+
before(:each) do
|
191
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
192
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(1)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should return the groups for given user, after one 'getgrouplist' call" do
|
196
|
+
expect(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).once
|
197
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
201
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
202
|
+
Puppet::Util::POSIX.groups_of(user)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe 'when there are more than maximum expected number of groups' do
|
207
|
+
let(:user) { 'user1' }
|
208
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
209
|
+
|
210
|
+
before(:each) do
|
211
|
+
allow(FFI::MemoryPointer).to receive(:new).with(:uint, Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS * 2).and_yield(groups_ptr)
|
212
|
+
allow(ngroups_ptr).to receive(:write_int).with(Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS * 2).and_return(ngroups_ptr)
|
213
|
+
|
214
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(true)
|
215
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).and_return(-1, 1)
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should return the groups for given user, after two 'getgrouplist' calls" do
|
219
|
+
expect(Puppet::FFI::POSIX::Functions).to receive(:getgrouplist).twice
|
220
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should not print any debug message about falling back to Puppet::Etc.group' do
|
224
|
+
expect(Puppet).not_to receive(:debug).with(/Falling back to Puppet::Etc.group:/)
|
225
|
+
Puppet::Util::POSIX.groups_of(user)
|
226
|
+
end
|
227
|
+
end
|
35
228
|
end
|
36
|
-
allow(Puppet::Etc).to etc_stub
|
37
229
|
end
|
38
230
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
231
|
+
describe 'when it falls back to Puppet::Etc.group method' do
|
232
|
+
before(:each) do
|
233
|
+
etc_stub = receive(:group)
|
234
|
+
mock_groups.each do |mock_group|
|
235
|
+
etc_stub = etc_stub.and_yield(mock_group)
|
236
|
+
end
|
237
|
+
allow(Puppet::Etc).to etc_stub
|
238
|
+
|
239
|
+
allow(Puppet::Etc).to receive(:getpwnam).with(user).and_raise(ArgumentError, "can't find user for #{user}")
|
240
|
+
allow(Puppet).to receive(:debug)
|
241
|
+
|
242
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist, any_args).and_return(false)
|
243
|
+
end
|
244
|
+
|
245
|
+
describe 'when there are groups' do
|
246
|
+
context 'for user1' do
|
247
|
+
let(:user) { 'user1' }
|
248
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
249
|
+
|
250
|
+
it "should return the groups for given user" do
|
251
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'logs a debug message' do
|
255
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
256
|
+
Puppet::Util::POSIX.groups_of(user)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
context 'for user2' do
|
261
|
+
let(:user) { 'user2' }
|
262
|
+
let(:expected_groups) { ['group1', 'group2', 'group4'] }
|
263
|
+
|
264
|
+
it "should return the groups for given user" do
|
265
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'logs a debug message' do
|
269
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
270
|
+
Puppet::Util::POSIX.groups_of(user)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe 'when there are no groups' do
|
276
|
+
let(:user) { 'nomembers' }
|
277
|
+
let(:expected_groups) { [] }
|
278
|
+
|
279
|
+
it "should return no groups for given user" do
|
280
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'logs a debug message' do
|
284
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
285
|
+
Puppet::Util::POSIX.groups_of(user)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
describe 'when primary group explicitly contains user' do
|
290
|
+
let(:user) { 'root' }
|
291
|
+
let(:expected_groups) { ['root'] }
|
292
|
+
|
293
|
+
it "should return the groups, including primary group, for given user" do
|
294
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'logs a debug message' do
|
298
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
299
|
+
Puppet::Util::POSIX.groups_of(user)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
describe 'when primary group does not explicitly contain user' do
|
304
|
+
let(:user) { 'user1' }
|
305
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
306
|
+
|
307
|
+
it "should not return primary group for given user" do
|
308
|
+
expect(Puppet::Util::POSIX.groups_of(user)).not_to include(user)
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'logs a debug message' do
|
312
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
313
|
+
Puppet::Util::POSIX.groups_of(user)
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe "when the 'getgrouplist' method is not available" do
|
318
|
+
let(:user) { 'user1' }
|
319
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
320
|
+
|
321
|
+
before(:each) do
|
322
|
+
allow(Puppet::FFI::POSIX::Functions).to receive(:respond_to?).with(:getgrouplist).and_return(false)
|
323
|
+
end
|
324
|
+
|
325
|
+
it "should return the groups" do
|
326
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
327
|
+
end
|
328
|
+
|
329
|
+
it 'logs a debug message' do
|
330
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: The 'getgrouplist' method is not available")
|
331
|
+
Puppet::Util::POSIX.groups_of(user)
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
|
336
|
+
describe "when ffi is not available on the machine" do
|
337
|
+
let(:user) { 'user1' }
|
338
|
+
let(:expected_groups) { ['group1', 'group3'] }
|
339
|
+
|
340
|
+
before(:each) do
|
341
|
+
allow(Puppet::Util::POSIX).to receive(:require).with('puppet/ffi/posix').and_raise(LoadError, 'cannot load such file -- ffi')
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should return the groups" do
|
345
|
+
expect(Puppet::Util::POSIX.groups_of(user)).to eql(expected_groups)
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'logs a debug message' do
|
349
|
+
expect(Puppet).to receive(:debug).with("Falling back to Puppet::Etc.group: cannot load such file -- ffi")
|
350
|
+
Puppet::Util::POSIX.groups_of(user)
|
351
|
+
end
|
352
|
+
end
|
43
353
|
end
|
44
354
|
end
|
45
355
|
|
@@ -189,6 +499,25 @@ describe Puppet::Util::POSIX do
|
|
189
499
|
expect(@posix.gid("asdf")).to eq(100)
|
190
500
|
end
|
191
501
|
|
502
|
+
it "returns the id without full groups query if multiple groups have the same id" do
|
503
|
+
expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
|
504
|
+
expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return("boo")
|
505
|
+
expect(@posix).to receive(:get_posix_field).with(:group, :gid, "boo").and_return(100)
|
506
|
+
|
507
|
+
expect(@posix).not_to receive(:search_posix_field)
|
508
|
+
expect(@posix.gid("asdf")).to eq(100)
|
509
|
+
end
|
510
|
+
|
511
|
+
it "returns the id with full groups query if name is nil" do
|
512
|
+
expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
|
513
|
+
expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return(nil)
|
514
|
+
expect(@posix).not_to receive(:get_posix_field).with(:group, :gid, nil)
|
515
|
+
|
516
|
+
|
517
|
+
expect(@posix).to receive(:search_posix_field).with(:group, :gid, "asdf").and_return(100)
|
518
|
+
expect(@posix.gid("asdf")).to eq(100)
|
519
|
+
end
|
520
|
+
|
192
521
|
it "should use :search_posix_field if the discovered name does not match the passed-in name" do
|
193
522
|
expect(@posix).to receive(:get_posix_field).with(:group, :gid, "asdf").and_return(100)
|
194
523
|
expect(@posix).to receive(:get_posix_field).with(:group, :name, 100).and_return("boo")
|
@@ -265,6 +594,25 @@ describe Puppet::Util::POSIX do
|
|
265
594
|
expect(@posix.uid("asdf")).to eq(100)
|
266
595
|
end
|
267
596
|
|
597
|
+
it "returns the id without full users query if multiple users have the same id" do
|
598
|
+
expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
|
599
|
+
expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return("boo")
|
600
|
+
expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "boo").and_return(100)
|
601
|
+
|
602
|
+
expect(@posix).not_to receive(:search_posix_field)
|
603
|
+
expect(@posix.uid("asdf")).to eq(100)
|
604
|
+
end
|
605
|
+
|
606
|
+
it "returns the id with full users query if name is nil" do
|
607
|
+
expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
|
608
|
+
expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return(nil)
|
609
|
+
expect(@posix).not_to receive(:get_posix_field).with(:passwd, :uid, nil)
|
610
|
+
|
611
|
+
|
612
|
+
expect(@posix).to receive(:search_posix_field).with(:passwd, :uid, "asdf").and_return(100)
|
613
|
+
expect(@posix.uid("asdf")).to eq(100)
|
614
|
+
end
|
615
|
+
|
268
616
|
it "should use :search_posix_field if the discovered name does not match the passed-in name" do
|
269
617
|
expect(@posix).to receive(:get_posix_field).with(:passwd, :uid, "asdf").and_return(100)
|
270
618
|
expect(@posix).to receive(:get_posix_field).with(:passwd, :name, 100).and_return("boo")
|