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
@@ -33,8 +33,8 @@ describe Puppet::Util::RubyGems::Source do
|
|
33
33
|
describe '::Gems18Source' do
|
34
34
|
before(:each) { allow(described_class).to receive(:source).and_return(Puppet::Util::RubyGems::Gems18Source) }
|
35
35
|
|
36
|
-
it "#directories returns the lib subdirs of Gem::Specification.
|
37
|
-
expect(Gem::Specification).to receive(:
|
36
|
+
it "#directories returns the lib subdirs of Gem::Specification.stubs" do
|
37
|
+
expect(Gem::Specification).to receive(:stubs).and_return([fake_gem])
|
38
38
|
|
39
39
|
expect(described_class.new.directories).to eq([gem_lib])
|
40
40
|
end
|
@@ -3,26 +3,29 @@ require 'spec_helper'
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'puppet/util/selinux'
|
5
5
|
|
6
|
-
unless defined?(Selinux)
|
7
|
-
module Selinux
|
8
|
-
def self.is_selinux_enabled
|
9
|
-
false
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
6
|
describe Puppet::Util::SELinux do
|
15
7
|
include Puppet::Util::SELinux
|
16
8
|
|
9
|
+
let(:selinux) { double('selinux', is_selinux_enabled: false) }
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
stub_const('Selinux', selinux)
|
13
|
+
end
|
14
|
+
|
17
15
|
describe "selinux_support?" do
|
18
|
-
it "should return
|
16
|
+
it "should return true if this system has SELinux enabled" do
|
19
17
|
expect(Selinux).to receive(:is_selinux_enabled).and_return(1)
|
20
|
-
expect(selinux_support?).to
|
18
|
+
expect(selinux_support?).to eq(true)
|
21
19
|
end
|
22
20
|
|
23
|
-
it "should return
|
21
|
+
it "should return false if this system has SELinux disabled" do
|
24
22
|
expect(Selinux).to receive(:is_selinux_enabled).and_return(0)
|
25
|
-
expect(selinux_support?).to
|
23
|
+
expect(selinux_support?).to eq(false)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return false if this system lacks SELinux" do
|
27
|
+
hide_const('Selinux')
|
28
|
+
expect(selinux_support?).to eq(false)
|
26
29
|
end
|
27
30
|
|
28
31
|
it "should return nil if /proc/mounts does not exist" do
|
@@ -111,15 +114,19 @@ describe Puppet::Util::SELinux do
|
|
111
114
|
end
|
112
115
|
|
113
116
|
it "should return a context" do
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
+
without_partial_double_verification do
|
118
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
119
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return([0, "user_u:role_r:type_t:s0"])
|
120
|
+
expect(get_selinux_current_context("/foo")).to eq("user_u:role_r:type_t:s0")
|
121
|
+
end
|
117
122
|
end
|
118
123
|
|
119
124
|
it "should return nil if lgetfilecon fails" do
|
120
|
-
|
121
|
-
|
122
|
-
|
125
|
+
without_partial_double_verification do
|
126
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
127
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return(-1)
|
128
|
+
expect(get_selinux_current_context("/foo")).to be_nil
|
129
|
+
end
|
123
130
|
end
|
124
131
|
end
|
125
132
|
|
@@ -130,47 +137,102 @@ describe Puppet::Util::SELinux do
|
|
130
137
|
end
|
131
138
|
|
132
139
|
it "should return a context if a default context exists" do
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
+
without_partial_double_verification do
|
141
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
142
|
+
fstat = double('File::Stat', :mode => 0)
|
143
|
+
expect(Puppet::FileSystem).to receive(:lstat).with('/foo').and_return(fstat)
|
144
|
+
expect(self).to receive(:find_fs).with("/foo").and_return("ext3")
|
145
|
+
expect(Selinux).to receive(:matchpathcon).with("/foo", 0).and_return([0, "user_u:role_r:type_t:s0"])
|
146
|
+
|
147
|
+
expect(get_selinux_default_context("/foo")).to eq("user_u:role_r:type_t:s0")
|
148
|
+
end
|
140
149
|
end
|
141
150
|
|
142
151
|
it "handles permission denied errors by issuing a warning" do
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
152
|
+
without_partial_double_verification do
|
153
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
154
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
155
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 0).and_return(-1)
|
156
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::EACCES, "/root/chuj")
|
147
157
|
|
148
|
-
|
158
|
+
expect(get_selinux_default_context("/root/chuj")).to be_nil
|
159
|
+
end
|
149
160
|
end
|
150
161
|
|
151
|
-
it "handles no such file or directory errors by issuing a warning" do
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
162
|
+
it "backward compatibly handles no such file or directory errors by issuing a warning when resource_ensure not set" do
|
163
|
+
without_partial_double_verification do
|
164
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
165
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
166
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 0).and_return(-1)
|
167
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::ENOENT, "/root/chuj")
|
156
168
|
|
157
|
-
|
169
|
+
expect(get_selinux_default_context("/root/chuj")).to be_nil
|
170
|
+
end
|
158
171
|
end
|
159
172
|
|
160
|
-
it "should
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
173
|
+
it "should determine mode based on resource ensure when set to file" do
|
174
|
+
without_partial_double_verification do
|
175
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
176
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
177
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 32768).and_return(-1)
|
178
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::ENOENT, "/root/chuj")
|
166
179
|
|
167
|
-
|
180
|
+
expect(get_selinux_default_context("/root/chuj", :present)).to be_nil
|
181
|
+
expect(get_selinux_default_context("/root/chuj", :file)).to be_nil
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should determine mode based on resource ensure when set to dir" do
|
186
|
+
without_partial_double_verification do
|
187
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
188
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
189
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 16384).and_return(-1)
|
190
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::ENOENT, "/root/chuj")
|
191
|
+
|
192
|
+
expect(get_selinux_default_context("/root/chuj", :directory)).to be_nil
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should determine mode based on resource ensure when set to link" do
|
197
|
+
without_partial_double_verification do
|
198
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
199
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
200
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 40960).and_return(-1)
|
201
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::ENOENT, "/root/chuj")
|
202
|
+
|
203
|
+
expect(get_selinux_default_context("/root/chuj", :link)).to be_nil
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should determine mode based on resource ensure when set to unknown" do
|
208
|
+
without_partial_double_verification do
|
209
|
+
allow(self).to receive(:selinux_support?).and_return(true)
|
210
|
+
allow(self).to receive(:selinux_label_support?).and_return(true)
|
211
|
+
allow(Selinux).to receive(:matchpathcon).with("/root/chuj", 0).and_return(-1)
|
212
|
+
allow(self).to receive(:file_lstat).with("/root/chuj").and_raise(Errno::ENOENT, "/root/chuj")
|
213
|
+
|
214
|
+
expect(get_selinux_default_context("/root/chuj", "unknown")).to be_nil
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should return nil if matchpathcon returns failure" do
|
219
|
+
without_partial_double_verification do
|
220
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
221
|
+
fstat = double('File::Stat', :mode => 0)
|
222
|
+
expect(Puppet::FileSystem).to receive(:lstat).with('/foo').and_return(fstat)
|
223
|
+
expect(self).to receive(:find_fs).with("/foo").and_return("ext3")
|
224
|
+
expect(Selinux).to receive(:matchpathcon).with("/foo", 0).and_return(-1)
|
225
|
+
|
226
|
+
expect(get_selinux_default_context("/foo")).to be_nil
|
227
|
+
end
|
168
228
|
end
|
169
229
|
|
170
230
|
it "should return nil if selinux_label_support returns false" do
|
171
|
-
|
172
|
-
|
173
|
-
|
231
|
+
without_partial_double_verification do
|
232
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
233
|
+
expect(self).to receive(:find_fs).with("/foo").and_return("nfs")
|
234
|
+
expect(get_selinux_default_context("/foo")).to be_nil
|
235
|
+
end
|
174
236
|
end
|
175
237
|
end
|
176
238
|
|
@@ -261,37 +323,47 @@ describe Puppet::Util::SELinux do
|
|
261
323
|
end
|
262
324
|
|
263
325
|
it "should use lsetfilecon to set a context" do
|
264
|
-
|
265
|
-
|
266
|
-
|
326
|
+
without_partial_double_verification do
|
327
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
328
|
+
expect(Selinux).to receive(:lsetfilecon).with("/foo", "user_u:role_r:type_t:s0").and_return(0)
|
329
|
+
expect(set_selinux_context("/foo", "user_u:role_r:type_t:s0")).to be_truthy
|
330
|
+
end
|
267
331
|
end
|
268
332
|
|
269
333
|
it "should use lsetfilecon to set user_u user context" do
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
334
|
+
without_partial_double_verification do
|
335
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
336
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return([0, "foo:role_r:type_t:s0"])
|
337
|
+
expect(Selinux).to receive(:lsetfilecon).with("/foo", "user_u:role_r:type_t:s0").and_return(0)
|
338
|
+
expect(set_selinux_context("/foo", "user_u", :seluser)).to be_truthy
|
339
|
+
end
|
274
340
|
end
|
275
341
|
|
276
342
|
it "should use lsetfilecon to set role_r role context" do
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
343
|
+
without_partial_double_verification do
|
344
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
345
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return([0, "user_u:foo:type_t:s0"])
|
346
|
+
expect(Selinux).to receive(:lsetfilecon).with("/foo", "user_u:role_r:type_t:s0").and_return(0)
|
347
|
+
expect(set_selinux_context("/foo", "role_r", :selrole)).to be_truthy
|
348
|
+
end
|
281
349
|
end
|
282
350
|
|
283
351
|
it "should use lsetfilecon to set type_t type context" do
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
352
|
+
without_partial_double_verification do
|
353
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
354
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return([0, "user_u:role_r:foo:s0"])
|
355
|
+
expect(Selinux).to receive(:lsetfilecon).with("/foo", "user_u:role_r:type_t:s0").and_return(0)
|
356
|
+
expect(set_selinux_context("/foo", "type_t", :seltype)).to be_truthy
|
357
|
+
end
|
288
358
|
end
|
289
359
|
|
290
360
|
it "should use lsetfilecon to set s0:c3,c5 range context" do
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
361
|
+
without_partial_double_verification do
|
362
|
+
expect(self).to receive(:selinux_support?).and_return(true)
|
363
|
+
expect(Selinux).to receive(:lgetfilecon).with("/foo").and_return([0, "user_u:role_r:type_t:s0"])
|
364
|
+
expect(Selinux).to receive(:lsetfilecon).with("/foo", "user_u:role_r:type_t:s0:c3,c5").and_return(0)
|
365
|
+
expect(set_selinux_context("/foo", "s0:c3,c5", :selrange)).to be_truthy
|
366
|
+
end
|
295
367
|
end
|
296
368
|
end
|
297
369
|
|
@@ -302,21 +374,44 @@ describe Puppet::Util::SELinux do
|
|
302
374
|
end
|
303
375
|
|
304
376
|
it "should return nil if no default context exists" do
|
305
|
-
expect(self).to receive(:get_selinux_default_context).with("/foo").and_return(nil)
|
377
|
+
expect(self).to receive(:get_selinux_default_context).with("/foo", nil).and_return(nil)
|
306
378
|
expect(set_selinux_default_context("/foo")).to be_nil
|
307
379
|
end
|
308
380
|
|
309
381
|
it "should do nothing and return nil if the current context matches the default context" do
|
310
|
-
expect(self).to receive(:get_selinux_default_context).with("/foo").and_return("user_u:role_r:type_t")
|
382
|
+
expect(self).to receive(:get_selinux_default_context).with("/foo", nil).and_return("user_u:role_r:type_t")
|
311
383
|
expect(self).to receive(:get_selinux_current_context).with("/foo").and_return("user_u:role_r:type_t")
|
312
384
|
expect(set_selinux_default_context("/foo")).to be_nil
|
313
385
|
end
|
314
386
|
|
315
387
|
it "should set and return the default context if current and default do not match" do
|
316
|
-
expect(self).to receive(:get_selinux_default_context).with("/foo").and_return("user_u:role_r:type_t")
|
388
|
+
expect(self).to receive(:get_selinux_default_context).with("/foo", nil).and_return("user_u:role_r:type_t")
|
317
389
|
expect(self).to receive(:get_selinux_current_context).with("/foo").and_return("olduser_u:role_r:type_t")
|
318
390
|
expect(self).to receive(:set_selinux_context).with("/foo", "user_u:role_r:type_t").and_return(true)
|
319
391
|
expect(set_selinux_default_context("/foo")).to eq("user_u:role_r:type_t")
|
320
392
|
end
|
321
393
|
end
|
394
|
+
|
395
|
+
describe "get_create_mode" do
|
396
|
+
it "should return 0 if the resource is absent" do
|
397
|
+
expect(get_create_mode(:absent)).to eq(0)
|
398
|
+
end
|
399
|
+
|
400
|
+
it "should return mode with file type set to S_IFREG when resource is file" do
|
401
|
+
expect(get_create_mode(:present)).to eq(32768)
|
402
|
+
expect(get_create_mode(:file)).to eq(32768)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should return mode with file type set to S_IFDIR when resource is dir" do
|
406
|
+
expect(get_create_mode(:directory)).to eq(16384)
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should return mode with file type set to S_IFLNK when resource is link" do
|
410
|
+
expect(get_create_mode(:link)).to eq(40960)
|
411
|
+
end
|
412
|
+
|
413
|
+
it "should return 0 for everything else" do
|
414
|
+
expect(get_create_mode("unknown")).to eq(0)
|
415
|
+
end
|
416
|
+
end
|
322
417
|
end
|
@@ -143,9 +143,11 @@ describe Puppet::Util::Storage do
|
|
143
143
|
end
|
144
144
|
|
145
145
|
it "should raise an error if the state file does not contain valid YAML and cannot be renamed" do
|
146
|
+
allow(File).to receive(:rename).and_call_original
|
147
|
+
|
146
148
|
write_state_file('{ invalid')
|
147
149
|
|
148
|
-
expect(File).to receive(:rename).and_raise(SystemCallError)
|
150
|
+
expect(File).to receive(:rename).with(@state_file, "#{@state_file}.bad").and_raise(SystemCallError)
|
149
151
|
|
150
152
|
expect { Puppet::Util::Storage.load }.to raise_error(Puppet::Error, /Could not rename/)
|
151
153
|
end
|
@@ -14,12 +14,14 @@ describe Puppet::Util::SUIDManager do
|
|
14
14
|
pwent = double('pwent', :name => 'fred', :uid => 42, :gid => 42)
|
15
15
|
allow(Etc).to receive(:getpwuid).with(42).and_return(pwent)
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
unless Puppet::Util::Platform.windows?
|
18
|
+
[:euid, :egid, :uid, :gid, :groups].each do |id|
|
19
|
+
allow(Process).to receive("#{id}=") {|value| xids[id] = value}
|
20
|
+
end
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
describe "#initgroups" do
|
24
|
+
describe "#initgroups", unless: Puppet::Util::Platform.windows? do
|
23
25
|
it "should use the primary group of the user as the 'basegid'" do
|
24
26
|
expect(Process).to receive(:initgroups).with('fred', 42)
|
25
27
|
described_class.initgroups(42)
|
@@ -27,7 +29,7 @@ describe Puppet::Util::SUIDManager do
|
|
27
29
|
end
|
28
30
|
|
29
31
|
describe "#uid" do
|
30
|
-
it "should allow setting euid/egid" do
|
32
|
+
it "should allow setting euid/egid", unless: Puppet::Util::Platform.windows? do
|
31
33
|
Puppet::Util::SUIDManager.egid = user[:gid]
|
32
34
|
Puppet::Util::SUIDManager.euid = user[:uid]
|
33
35
|
|
@@ -37,8 +39,7 @@ describe Puppet::Util::SUIDManager do
|
|
37
39
|
end
|
38
40
|
|
39
41
|
describe "#asuser" do
|
40
|
-
it "should not get or set euid/egid when not root" do
|
41
|
-
allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
|
42
|
+
it "should not get or set euid/egid when not root", unless: Puppet::Util::Platform.windows? do
|
42
43
|
allow(Process).to receive(:uid).and_return(1)
|
43
44
|
|
44
45
|
allow(Process).to receive(:egid).and_return(51)
|
@@ -49,13 +50,12 @@ describe Puppet::Util::SUIDManager do
|
|
49
50
|
expect(xids).to be_empty
|
50
51
|
end
|
51
52
|
|
52
|
-
context "when root and not
|
53
|
+
context "when root and not Windows" do
|
53
54
|
before :each do
|
54
55
|
allow(Process).to receive(:uid).and_return(0)
|
55
|
-
allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
|
56
56
|
end
|
57
57
|
|
58
|
-
it "should set euid/egid" do
|
58
|
+
it "should set euid/egid", unless: Puppet::Util::Platform.windows? do
|
59
59
|
allow(Process).to receive(:egid).and_return(51, 51, user[:gid])
|
60
60
|
allow(Process).to receive(:euid).and_return(50, 50, user[:uid])
|
61
61
|
|
@@ -79,29 +79,23 @@ describe Puppet::Util::SUIDManager do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should just yield if user and group are nil" do
|
82
|
-
|
83
|
-
Puppet::Util::SUIDManager.asuser(nil, nil) { yielded = true }
|
84
|
-
expect(yielded).to be_truthy
|
82
|
+
expect { |b| Puppet::Util::SUIDManager.asuser(nil, nil, &b) }.to yield_control
|
85
83
|
expect(xids).to eq({})
|
86
84
|
end
|
87
85
|
|
88
|
-
it "should just change group if only group is given" do
|
89
|
-
|
90
|
-
Puppet::Util::SUIDManager.asuser(nil, 42) { yielded = true }
|
91
|
-
expect(yielded).to be_truthy
|
86
|
+
it "should just change group if only group is given", unless: Puppet::Util::Platform.windows? do
|
87
|
+
expect { |b| Puppet::Util::SUIDManager.asuser(nil, 42, &b) }.to yield_control
|
92
88
|
expect(xids).to eq({ :egid => 42 })
|
93
89
|
end
|
94
90
|
|
95
|
-
it "should change gid to the primary group of uid by default" do
|
91
|
+
it "should change gid to the primary group of uid by default", unless: Puppet::Util::Platform.windows? do
|
96
92
|
allow(Process).to receive(:initgroups)
|
97
93
|
|
98
|
-
|
99
|
-
Puppet::Util::SUIDManager.asuser(42) { yielded = true }
|
100
|
-
expect(yielded).to be_truthy
|
94
|
+
expect { |b| Puppet::Util::SUIDManager.asuser(42, nil, &b) }.to yield_control
|
101
95
|
expect(xids).to eq({ :euid => 42, :egid => 42 })
|
102
96
|
end
|
103
97
|
|
104
|
-
it "should change both uid and gid if given" do
|
98
|
+
it "should change both uid and gid if given", unless: Puppet::Util::Platform.windows? do
|
105
99
|
# I don't like the sequence, but it is the only way to assert on the
|
106
100
|
# internal behaviour in a reliable fashion, given we need multiple
|
107
101
|
# sequenced calls to the same methods. --daniel 2012-02-05
|
@@ -110,21 +104,23 @@ describe Puppet::Util::SUIDManager do
|
|
110
104
|
expect(Puppet::Util::SUIDManager).to receive(:change_group).with(Puppet::Util::SUIDManager.egid, false).ordered()
|
111
105
|
expect(Puppet::Util::SUIDManager).to receive(:change_user).with(Puppet::Util::SUIDManager.euid, false).ordered()
|
112
106
|
|
113
|
-
|
114
|
-
Puppet::Util::SUIDManager.asuser(42, 43) { yielded = true }
|
115
|
-
expect(yielded).to be_truthy
|
107
|
+
expect { |b| Puppet::Util::SUIDManager.asuser(42, 43, &b) }.to yield_control
|
116
108
|
end
|
117
109
|
end
|
118
110
|
|
119
|
-
it "should
|
120
|
-
Puppet::Util::SUIDManager.asuser(
|
121
|
-
|
122
|
-
expect(xids).to be_empty
|
111
|
+
it "should just yield on Windows", if: Puppet::Util::Platform.windows? do
|
112
|
+
expect { |b| Puppet::Util::SUIDManager.asuser(1, 2, &b) }.to yield_control
|
123
113
|
end
|
124
114
|
end
|
125
115
|
|
126
116
|
describe "#change_group" do
|
127
|
-
|
117
|
+
it "raises on Windows", if: Puppet::Util::Platform.windows? do
|
118
|
+
expect {
|
119
|
+
Puppet::Util::SUIDManager.change_group(42, true)
|
120
|
+
}.to raise_error(NotImplementedError, /change_privilege\(\) function is unimplemented/)
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "when changing permanently", unless: Puppet::Util::Platform.windows? do
|
128
124
|
it "should change_privilege" do
|
129
125
|
expect(Process::GID).to receive(:change_privilege) do |gid|
|
130
126
|
Process.gid = gid
|
@@ -150,7 +146,7 @@ describe Puppet::Util::SUIDManager do
|
|
150
146
|
end
|
151
147
|
end
|
152
148
|
|
153
|
-
describe "when changing temporarily" do
|
149
|
+
describe "when changing temporarily", unless: Puppet::Util::Platform.windows? do
|
154
150
|
it "should change only egid" do
|
155
151
|
Puppet::Util::SUIDManager.change_group(42, false)
|
156
152
|
|
@@ -161,7 +157,13 @@ describe Puppet::Util::SUIDManager do
|
|
161
157
|
end
|
162
158
|
|
163
159
|
describe "#change_user" do
|
164
|
-
|
160
|
+
it "raises on Windows", if: Puppet::Util::Platform.windows? do
|
161
|
+
expect {
|
162
|
+
Puppet::Util::SUIDManager.change_user(42, true)
|
163
|
+
}.to raise_error(NotImplementedError, /initgroups\(\) function is unimplemented/)
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "when changing permanently", unless: Puppet::Util::Platform.windows? do
|
165
167
|
it "should change_privilege" do
|
166
168
|
expect(Process::UID).to receive(:change_privilege) do |uid|
|
167
169
|
Process.uid = uid
|
@@ -191,7 +193,7 @@ describe Puppet::Util::SUIDManager do
|
|
191
193
|
end
|
192
194
|
end
|
193
195
|
|
194
|
-
describe "when changing temporarily" do
|
196
|
+
describe "when changing temporarily", unless: Puppet::Util::Platform.windows? do
|
195
197
|
it "should change only euid and groups" do
|
196
198
|
allow(Puppet::Util::SUIDManager).to receive(:initgroups).and_return([])
|
197
199
|
Puppet::Util::SUIDManager.change_user(42, false)
|
@@ -221,12 +223,7 @@ describe Puppet::Util::SUIDManager do
|
|
221
223
|
end
|
222
224
|
|
223
225
|
describe "#root?" do
|
224
|
-
describe "on POSIX systems" do
|
225
|
-
before :each do
|
226
|
-
allow(Puppet.features).to receive(:posix?).and_return(true)
|
227
|
-
allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
|
228
|
-
end
|
229
|
-
|
226
|
+
describe "on POSIX systems", unless: Puppet::Util::Platform.windows? do
|
230
227
|
it "should be root if uid is 0" do
|
231
228
|
allow(Process).to receive(:uid).and_return(0)
|
232
229
|
|
@@ -240,7 +237,7 @@ describe Puppet::Util::SUIDManager do
|
|
240
237
|
end
|
241
238
|
end
|
242
239
|
|
243
|
-
describe "on
|
240
|
+
describe "on Windows", :if => Puppet::Util::Platform.windows? do
|
244
241
|
it "should be root if user is privileged" do
|
245
242
|
allow(Puppet::Util::Windows::User).to receive(:admin?).and_return(true)
|
246
243
|
|
@@ -261,13 +258,19 @@ describe 'Puppet::Util::SUIDManager#groups=' do
|
|
261
258
|
Puppet::Util::SUIDManager
|
262
259
|
end
|
263
260
|
|
264
|
-
it "
|
261
|
+
it "raises on Windows", if: Puppet::Util::Platform.windows? do
|
262
|
+
expect {
|
263
|
+
subject.groups = []
|
264
|
+
}.to raise_error(NotImplementedError, /groups=\(\) function is unimplemented/)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "(#3419) should rescue Errno::EINVAL on OS X", unless: Puppet::Util::Platform.windows? do
|
265
268
|
expect(Process).to receive(:groups=).and_raise(Errno::EINVAL, 'blew up')
|
266
269
|
expect(subject).to receive(:osx_maj_ver).and_return('10.7').twice
|
267
270
|
subject.groups = ['list', 'of', 'groups']
|
268
271
|
end
|
269
272
|
|
270
|
-
it "(#3419) should fail if an Errno::EINVAL is raised NOT on OS X" do
|
273
|
+
it "(#3419) should fail if an Errno::EINVAL is raised NOT on OS X", unless: Puppet::Util::Platform.windows? do
|
271
274
|
expect(Process).to receive(:groups=).and_raise(Errno::EINVAL, 'blew up')
|
272
275
|
expect(subject).to receive(:osx_maj_ver).and_return(false)
|
273
276
|
expect { subject.groups = ['list', 'of', 'groups'] }.to raise_error(Errno::EINVAL)
|