chef 18.4.2 → 18.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -1
- data/chef.gemspec +7 -7
- data/lib/chef/application/client.rb +12 -0
- data/lib/chef/client.rb +10 -16
- data/lib/chef/compliance/runner.rb +10 -0
- data/lib/chef/cookbook/chefignore.rb +4 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/synchronizer.rb +7 -1
- data/lib/chef/cookbook_manifest.rb +2 -2
- data/lib/chef/file_access_control/unix.rb +9 -9
- data/lib/chef/file_cache.rb +17 -2
- data/lib/chef/file_content_management/deploy/target_io.rb +29 -0
- data/lib/chef/file_content_management/deploy.rb +4 -1
- data/lib/chef/formatters/doc.rb +1 -1
- data/lib/chef/mixin/file_class.rb +3 -1
- data/lib/chef/mixin/get_source_from_package.rb +1 -1
- data/lib/chef/mixin/openssl_helper.rb +1 -1
- data/lib/chef/node/attribute.rb +3 -11
- data/lib/chef/node/immutable_collections.rb +15 -8
- data/lib/chef/node/mixin/state_tracking.rb +6 -3
- data/lib/chef/node.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +8 -0
- data/lib/chef/provider/.gitkeep +0 -0
- data/lib/chef/provider/cookbook_file.rb +1 -1
- data/lib/chef/provider/cron.rb +1 -1
- data/lib/chef/provider/directory.rb +15 -15
- data/lib/chef/provider/file.rb +42 -29
- data/lib/chef/provider/git.rb +8 -8
- data/lib/chef/provider/group/aix.rb +1 -1
- data/lib/chef/provider/group/dscl.rb +1 -1
- data/lib/chef/provider/group/gpasswd.rb +2 -2
- data/lib/chef/provider/group/groupadd.rb +1 -1
- data/lib/chef/provider/group/groupmod.rb +2 -2
- data/lib/chef/provider/group/pw.rb +2 -2
- data/lib/chef/provider/group/solaris.rb +2 -2
- data/lib/chef/provider/group/usermod.rb +2 -2
- data/lib/chef/provider/group.rb +1 -1
- data/lib/chef/provider/http_request.rb +2 -3
- data/lib/chef/provider/ifconfig/aix.rb +1 -1
- data/lib/chef/provider/ifconfig/debian.rb +3 -3
- data/lib/chef/provider/ifconfig/redhat.rb +1 -1
- data/lib/chef/provider/ifconfig.rb +1 -1
- data/lib/chef/provider/link.rb +10 -10
- data/lib/chef/provider/mount/aix.rb +4 -4
- data/lib/chef/provider/mount/linux.rb +4 -4
- data/lib/chef/provider/mount/mount.rb +11 -11
- data/lib/chef/provider/package/apt.rb +2 -11
- data/lib/chef/provider/package/bff.rb +3 -3
- data/lib/chef/provider/package/chocolatey.rb +54 -24
- data/lib/chef/provider/package/dpkg.rb +3 -3
- data/lib/chef/provider/package/freebsd/base.rb +1 -1
- data/lib/chef/provider/package/habitat.rb +5 -3
- data/lib/chef/provider/package/ips.rb +2 -2
- data/lib/chef/provider/package/openbsd.rb +3 -2
- data/lib/chef/provider/package/pacman.rb +4 -4
- data/lib/chef/provider/package/paludis.rb +2 -2
- data/lib/chef/provider/package/portage.rb +1 -1
- data/lib/chef/provider/package/powershell.rb +1 -0
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/package/smartos.rb +2 -2
- data/lib/chef/provider/package/snap.rb +2 -1
- data/lib/chef/provider/package/snap_tm.rb +79 -0
- data/lib/chef/provider/package/solaris.rb +4 -4
- data/lib/chef/provider/package/zypper.rb +4 -5
- data/lib/chef/provider/package.rb +1 -1
- data/lib/chef/provider/remote_directory.rb +5 -5
- data/lib/chef/provider/remote_file/http.rb +2 -3
- data/lib/chef/provider/remote_file.rb +1 -1
- data/lib/chef/provider/route.rb +9 -9
- data/lib/chef/provider/service/aix.rb +1 -1
- data/lib/chef/provider/service/aixinit.rb +4 -4
- data/lib/chef/provider/service/arch.rb +6 -6
- data/lib/chef/provider/service/debian.rb +5 -5
- data/lib/chef/provider/service/freebsd.rb +7 -7
- data/lib/chef/provider/service/gentoo.rb +5 -5
- data/lib/chef/provider/service/init.rb +2 -2
- data/lib/chef/provider/service/insserv.rb +2 -2
- data/lib/chef/provider/service/invokercd.rb +1 -1
- data/lib/chef/provider/service/openbsd.rb +7 -7
- data/lib/chef/provider/service/redhat.rb +3 -3
- data/lib/chef/provider/service/solaris.rb +2 -2
- data/lib/chef/provider/service/systemd.rb +2 -2
- data/lib/chef/provider/service/upstart.rb +2 -2
- data/lib/chef/provider/service/windows.rb +0 -1
- data/lib/chef/provider/subversion.rb +8 -8
- data/lib/chef/provider/systemd_unit.rb +3 -3
- data/lib/chef/provider/template.rb +1 -1
- data/lib/chef/provider/user/aix.rb +3 -3
- data/lib/chef/provider/user/linux.rb +7 -2
- data/lib/chef/provider/user/pw.rb +3 -3
- data/lib/chef/provider/user/solaris.rb +7 -7
- data/lib/chef/provider/user.rb +7 -8
- data/lib/chef/provider/yum_repository.rb +1 -3
- data/lib/chef/provider/zypper_repository.rb +1 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource/.gitkeep +0 -0
- data/lib/chef/resource/alternatives.rb +2 -2
- data/lib/chef/resource/apt_preference.rb +1 -1
- data/lib/chef/resource/apt_repository.rb +7 -9
- data/lib/chef/resource/apt_update.rb +3 -3
- data/lib/chef/resource/bff_package.rb +1 -1
- data/lib/chef/resource/chef_client_config.rb +3 -2
- data/lib/chef/resource/chef_client_systemd_timer.rb +5 -0
- data/lib/chef/resource/chef_gem.rb +1 -1
- data/lib/chef/resource/chef_sleep.rb +1 -1
- data/lib/chef/resource/cookbook_file.rb +1 -1
- data/lib/chef/resource/cron/cron.rb +1 -1
- data/lib/chef/resource/cron/cron_d.rb +1 -1
- data/lib/chef/resource/cron_access.rb +1 -1
- data/lib/chef/resource/directory.rb +1 -1
- data/lib/chef/resource/dpkg_package.rb +1 -1
- data/lib/chef/resource/execute.rb +8 -6
- data/lib/chef/resource/file/verification/json.rb +1 -1
- data/lib/chef/resource/file/verification/systemd_unit.rb +1 -1
- data/lib/chef/resource/file/verification/yaml.rb +1 -1
- data/lib/chef/resource/file.rb +1 -1
- data/lib/chef/resource/freebsd_package.rb +2 -2
- data/lib/chef/resource/group.rb +1 -1
- data/lib/chef/resource/habitat/habitat_package.rb +1 -1
- data/lib/chef/resource/habitat/habitat_sup.rb +9 -9
- data/lib/chef/resource/habitat/habitat_sup_systemd.rb +2 -2
- data/lib/chef/resource/habitat_install.rb +5 -4
- data/lib/chef/resource/hostname.rb +11 -10
- data/lib/chef/resource/http_request.rb +1 -1
- data/lib/chef/resource/ifconfig.rb +1 -1
- data/lib/chef/resource/inspec_input.rb +3 -1
- data/lib/chef/resource/inspec_waiver.rb +1 -1
- data/lib/chef/resource/inspec_waiver_file_entry.rb +1 -1
- data/lib/chef/resource/ips_package.rb +2 -2
- data/lib/chef/resource/kernel_module.rb +2 -2
- data/lib/chef/resource/link.rb +1 -1
- data/lib/chef/resource/locale.rb +2 -2
- data/lib/chef/resource/mount.rb +1 -1
- data/lib/chef/resource/notify_group.rb +1 -1
- data/lib/chef/resource/ohai.rb +1 -1
- data/lib/chef/resource/ohai_hint.rb +1 -1
- data/lib/chef/resource/openbsd_package.rb +2 -2
- data/lib/chef/resource/package.rb +1 -1
- data/lib/chef/resource/pacman_package.rb +1 -1
- data/lib/chef/resource/paludis_package.rb +1 -1
- data/lib/chef/resource/portage_package.rb +1 -1
- data/lib/chef/resource/powershell_package.rb +4 -0
- data/lib/chef/resource/reboot.rb +1 -1
- data/lib/chef/resource/remote_directory.rb +1 -1
- data/lib/chef/resource/remote_file.rb +1 -1
- data/lib/chef/resource/rhsm_errata.rb +1 -1
- data/lib/chef/resource/rhsm_errata_level.rb +1 -1
- data/lib/chef/resource/rhsm_register.rb +1 -1
- data/lib/chef/resource/rhsm_repo.rb +3 -4
- data/lib/chef/resource/rhsm_subscription.rb +8 -9
- data/lib/chef/resource/route.rb +1 -1
- data/lib/chef/resource/rpm_package.rb +1 -1
- data/lib/chef/resource/scm/git.rb +1 -1
- data/lib/chef/resource/scm/subversion.rb +1 -1
- data/lib/chef/resource/selinux/common_helpers.rb +1 -1
- data/lib/chef/resource/selinux_boolean.rb +1 -1
- data/lib/chef/resource/selinux_fcontext.rb +3 -3
- data/lib/chef/resource/selinux_install.rb +1 -1
- data/lib/chef/resource/selinux_login.rb +1 -1
- data/lib/chef/resource/selinux_module.rb +5 -5
- data/lib/chef/resource/selinux_permissive.rb +2 -2
- data/lib/chef/resource/selinux_port.rb +2 -2
- data/lib/chef/resource/selinux_state.rb +2 -2
- data/lib/chef/resource/selinux_user.rb +1 -1
- data/lib/chef/resource/smartos_package.rb +2 -2
- data/lib/chef/resource/snap_package.rb +24 -1
- data/lib/chef/resource/solaris_package.rb +1 -1
- data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
- data/lib/chef/resource/sudo.rb +5 -5
- data/lib/chef/resource/support/client.erb +1 -1
- data/lib/chef/resource/swap_file.rb +6 -6
- data/lib/chef/resource/sysctl.rb +6 -5
- data/lib/chef/resource/systemd_unit.rb +1 -1
- data/lib/chef/resource/template.rb +1 -1
- data/lib/chef/resource/timezone.rb +5 -5
- data/lib/chef/resource/user/aix_user.rb +2 -2
- data/lib/chef/resource/user/linux_user.rb +2 -2
- data/lib/chef/resource/user/pw_user.rb +2 -2
- data/lib/chef/resource/user/solaris_user.rb +2 -2
- data/lib/chef/resource/user_ulimit.rb +1 -1
- data/lib/chef/resource/yum_repository.rb +1 -1
- data/lib/chef/resource/zypper_package.rb +2 -2
- data/lib/chef/resource/zypper_repository.rb +2 -2
- data/lib/chef/run_lock.rb +3 -0
- data/lib/chef/scan_access_control.rb +6 -6
- data/lib/chef/target_io/dir.rb +12 -0
- data/lib/chef/target_io/etc.rb +16 -0
- data/lib/chef/target_io/file.rb +12 -0
- data/lib/chef/target_io/fileutils.rb +12 -0
- data/lib/chef/target_io/http.rb +22 -0
- data/lib/chef/target_io/io.rb +12 -0
- data/lib/chef/target_io/shadow.rb +44 -0
- data/lib/chef/target_io/train/dir.rb +69 -0
- data/lib/chef/target_io/train/etc.rb +112 -0
- data/lib/chef/target_io/train/file.rb +219 -0
- data/lib/chef/target_io/train/fileutils.rb +220 -0
- data/lib/chef/target_io/train/http.rb +117 -0
- data/lib/chef/target_io/train/io.rb +13 -0
- data/lib/chef/target_io/train/shadow.rb +52 -0
- data/lib/chef/target_io/train_compat.rb +7 -0
- data/lib/chef/target_io.rb +9 -0
- data/lib/chef/util/backup.rb +1 -1
- data/lib/chef/util/diff.rb +14 -1
- data/lib/chef/util/file_edit.rb +4 -4
- data/lib/chef/version.rb +1 -1
- data/lib/chef.rb +2 -0
- data/spec/functional/resource/remote_file_spec.rb +1 -1
- data/spec/integration/client/fips_spec.rb +11 -2
- data/spec/integration/client/open_ssl_spec.rb +20 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/support/platform_helpers.rb +20 -7
- data/spec/unit/client_spec.rb +0 -16
- data/spec/unit/file_cache_spec.rb +64 -0
- data/spec/unit/mixin/openssl_helper_spec.rb +6 -1
- data/spec/unit/provider/apt_repository_spec.rb +1 -1
- data/spec/unit/provider/package/chocolatey_spec.rb +17 -12
- data/spec/unit/provider/package/windows_spec.rb +5 -5
- data/spec/unit/provider/package/zypper_spec.rb +0 -10
- data/spec/unit/provider/route_spec.rb +6 -4
- data/spec/unit/resource/rhsm_repo_spec.rb +1 -0
- data/spec/unit/resource/rhsm_subscription_spec.rb +2 -0
- metadata +31 -10
@@ -27,12 +27,12 @@ class Chef
|
|
27
27
|
class Provider
|
28
28
|
class Directory < Chef::Provider::File
|
29
29
|
|
30
|
-
provides :directory
|
30
|
+
provides :directory, target_mode: true
|
31
31
|
|
32
32
|
def load_current_resource
|
33
33
|
@current_resource = Chef::Resource::Directory.new(new_resource.name)
|
34
34
|
current_resource.path(new_resource.path)
|
35
|
-
if ::File.exist?(current_resource.path) && @action != :create_if_missing
|
35
|
+
if ::TargetIO::File.exist?(current_resource.path) && @action != :create_if_missing
|
36
36
|
load_resource_attributes_from_file(current_resource)
|
37
37
|
end
|
38
38
|
current_resource
|
@@ -50,15 +50,15 @@ class Chef
|
|
50
50
|
if new_resource.recursive
|
51
51
|
does_parent_exist = lambda do |base_dir|
|
52
52
|
base_dir = ::File.dirname(base_dir)
|
53
|
-
if ::File.exist?(base_dir)
|
54
|
-
::File.directory?(base_dir)
|
53
|
+
if ::TargetIO::File.exist?(base_dir)
|
54
|
+
::TargetIO::File.directory?(base_dir)
|
55
55
|
else
|
56
56
|
does_parent_exist.call(base_dir)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
does_parent_exist.call(new_resource.path)
|
60
60
|
else
|
61
|
-
::File.directory?(parent_directory)
|
61
|
+
::TargetIO::File.directory?(parent_directory)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
a.failure_message(Chef::Exceptions::EnclosingDirectoryDoesNotExist, "Parent directory #{parent_directory} does not exist, cannot create #{new_resource.path}")
|
@@ -73,7 +73,7 @@ class Chef
|
|
73
73
|
# make sure we have write permissions to that directory
|
74
74
|
is_parent_writable = lambda do |base_dir|
|
75
75
|
base_dir = ::File.dirname(base_dir)
|
76
|
-
if ::File.exist?(base_dir)
|
76
|
+
if ::TargetIO::File.exist?(base_dir)
|
77
77
|
if Chef::FileAccessControl.writable?(base_dir)
|
78
78
|
true
|
79
79
|
elsif Chef::Util::PathHelper.is_sip_path?(base_dir, node)
|
@@ -89,7 +89,7 @@ class Chef
|
|
89
89
|
else
|
90
90
|
# in why run mode & parent directory does not exist no permissions check is required
|
91
91
|
# If not in why run, permissions must be valid and we rely on prior assertion that dir exists
|
92
|
-
if !whyrun_mode? || ::File.exist?(parent_directory)
|
92
|
+
if !whyrun_mode? || ::TargetIO::File.exist?(parent_directory)
|
93
93
|
if Chef::FileAccessControl.writable?(parent_directory)
|
94
94
|
true
|
95
95
|
elsif Chef::Util::PathHelper.is_sip_path?(parent_directory, node)
|
@@ -108,8 +108,8 @@ class Chef
|
|
108
108
|
|
109
109
|
requirements.assert(:delete) do |a|
|
110
110
|
a.assertion do
|
111
|
-
if ::File.exist?(new_resource.path)
|
112
|
-
::File.directory?(new_resource.path) && Chef::FileAccessControl.writable?(new_resource.path)
|
111
|
+
if ::TargetIO::File.exist?(new_resource.path)
|
112
|
+
::TargetIO::File.directory?(new_resource.path) && Chef::FileAccessControl.writable?(new_resource.path)
|
113
113
|
else
|
114
114
|
true
|
115
115
|
end
|
@@ -122,12 +122,12 @@ class Chef
|
|
122
122
|
end
|
123
123
|
|
124
124
|
action :create, description: "Create a directory. If a directory already exists (but does not match), update that directory to match." do
|
125
|
-
unless ::File.exist?(new_resource.path)
|
125
|
+
unless ::TargetIO::File.exist?(new_resource.path)
|
126
126
|
converge_by("create new directory #{new_resource.path}") do
|
127
127
|
if new_resource.recursive == true
|
128
|
-
::FileUtils.mkdir_p(new_resource.path)
|
128
|
+
::TargetIO::FileUtils.mkdir_p(new_resource.path)
|
129
129
|
else
|
130
|
-
::Dir.mkdir(new_resource.path)
|
130
|
+
::TargetIO::Dir.mkdir(new_resource.path)
|
131
131
|
end
|
132
132
|
logger.info("#{new_resource} created directory #{new_resource.path}")
|
133
133
|
end
|
@@ -138,15 +138,15 @@ class Chef
|
|
138
138
|
end
|
139
139
|
|
140
140
|
action :delete, description: "Delete a directory." do
|
141
|
-
if ::File.exist?(new_resource.path)
|
141
|
+
if ::TargetIO::File.exist?(new_resource.path)
|
142
142
|
converge_by("delete existing directory #{new_resource.path}") do
|
143
143
|
if new_resource.recursive == true
|
144
144
|
# we don't use rm_rf here because it masks all errors, including
|
145
145
|
# IO errors or permission errors that would prevent the deletion
|
146
|
-
FileUtils.rm_r(new_resource.path)
|
146
|
+
::TargetIO::FileUtils.rm_r(new_resource.path)
|
147
147
|
logger.info("#{new_resource} deleted #{new_resource.path} recursively")
|
148
148
|
else
|
149
|
-
::Dir.delete(new_resource.path)
|
149
|
+
::TargetIO::Dir.delete(new_resource.path)
|
150
150
|
logger.info("#{new_resource} deleted #{new_resource.path}")
|
151
151
|
end
|
152
152
|
end
|
data/lib/chef/provider/file.rb
CHANGED
@@ -29,6 +29,7 @@ require_relative "../mixin/file_class"
|
|
29
29
|
require_relative "../mixin/enforce_ownership_and_permissions"
|
30
30
|
require_relative "../resource/file/verification/json"
|
31
31
|
require_relative "../resource/file/verification/yaml"
|
32
|
+
require_relative "../target_io"
|
32
33
|
require_relative "../util/backup"
|
33
34
|
require_relative "../util/diff"
|
34
35
|
require_relative "../util/selinux"
|
@@ -53,7 +54,7 @@ class Chef
|
|
53
54
|
include Chef::Util::Selinux
|
54
55
|
include Chef::Mixin::FileClass
|
55
56
|
|
56
|
-
provides :file
|
57
|
+
provides :file, target_mode: true
|
57
58
|
|
58
59
|
attr_reader :deployment_strategy
|
59
60
|
|
@@ -75,7 +76,7 @@ class Chef
|
|
75
76
|
|
76
77
|
# true if there is a non-file thing in the way that we need to unlink first
|
77
78
|
@needs_unlinking =
|
78
|
-
if ::File.exist?(new_resource.path)
|
79
|
+
if ::TargetIO::File.exist?(new_resource.path)
|
79
80
|
if managing_symlink?
|
80
81
|
!symlink_to_real_file?(new_resource.path)
|
81
82
|
else
|
@@ -86,7 +87,7 @@ class Chef
|
|
86
87
|
end
|
87
88
|
|
88
89
|
# true if we are going to be creating a new file
|
89
|
-
@needs_creating = !::File.exist?(new_resource.path) || needs_unlinking?
|
90
|
+
@needs_creating = !::TargetIO::File.exist?(new_resource.path) || needs_unlinking?
|
90
91
|
|
91
92
|
# Let children resources override constructing the current_resource
|
92
93
|
@current_resource ||= Chef::Resource::File.new(new_resource.name)
|
@@ -96,7 +97,11 @@ class Chef
|
|
96
97
|
# we are updating an existing file
|
97
98
|
if managing_content?
|
98
99
|
logger.trace("#{new_resource} checksumming file at #{new_resource.path}.")
|
99
|
-
|
100
|
+
|
101
|
+
resource_to_check = current_resource.path
|
102
|
+
resource_to_check = ::TargetIO::File.open(current_resource.path) if ChefConfig::Config.target_mode?
|
103
|
+
|
104
|
+
current_resource.checksum(checksum(resource_to_check))
|
100
105
|
else
|
101
106
|
# if the file does not exist or is not a file, then the checksum is invalid/pointless
|
102
107
|
current_resource.checksum(nil)
|
@@ -114,15 +119,15 @@ class Chef
|
|
114
119
|
# Make sure the parent directory exists, otherwise fail. For why-run assume it would have been created.
|
115
120
|
requirements.assert(:create, :create_if_missing, :touch) do |a|
|
116
121
|
parent_directory = ::File.dirname(new_resource.path)
|
117
|
-
a.assertion { ::File.directory?(parent_directory) }
|
122
|
+
a.assertion { ::TargetIO::File.directory?(parent_directory) }
|
118
123
|
a.failure_message(Chef::Exceptions::EnclosingDirectoryDoesNotExist, "Parent directory #{parent_directory} does not exist.")
|
119
124
|
a.whyrun("Assuming directory #{parent_directory} would have been created")
|
120
125
|
end
|
121
126
|
|
122
127
|
# Make sure the file is deletable if it exists, otherwise fail.
|
123
|
-
if ::File.exist?(new_resource.path)
|
128
|
+
if ::TargetIO::File.exist?(new_resource.path)
|
124
129
|
requirements.assert(:delete) do |a|
|
125
|
-
a.assertion { ::File.writable?(new_resource.path) }
|
130
|
+
a.assertion { ::TargetIO::File.writable?(new_resource.path) }
|
126
131
|
a.failure_message(Chef::Exceptions::InsufficientPermissions, "File #{new_resource.path} exists but is not writable so it cannot be deleted")
|
127
132
|
end
|
128
133
|
end
|
@@ -151,7 +156,7 @@ class Chef
|
|
151
156
|
end
|
152
157
|
|
153
158
|
action :create_if_missing do
|
154
|
-
unless ::File.exist?(new_resource.path)
|
159
|
+
unless ::TargetIO::File.exist?(new_resource.path)
|
155
160
|
action_create
|
156
161
|
else
|
157
162
|
logger.debug("#{new_resource} exists at #{new_resource.path} taking no action.")
|
@@ -159,10 +164,10 @@ class Chef
|
|
159
164
|
end
|
160
165
|
|
161
166
|
action :delete do
|
162
|
-
if ::File.exist?(new_resource.path)
|
167
|
+
if ::TargetIO::File.exist?(new_resource.path)
|
163
168
|
converge_by("delete file #{new_resource.path}") do
|
164
169
|
do_backup unless file_class.symlink?(new_resource.path)
|
165
|
-
::File.delete(new_resource.path)
|
170
|
+
::TargetIO::File.delete(new_resource.path)
|
166
171
|
logger.info("#{new_resource} deleted file at #{new_resource.path}")
|
167
172
|
end
|
168
173
|
end
|
@@ -172,7 +177,7 @@ class Chef
|
|
172
177
|
action_create
|
173
178
|
converge_by("update utime on file #{new_resource.path}") do
|
174
179
|
time = Time.now
|
175
|
-
::File.utime(time, time, new_resource.path)
|
180
|
+
::TargetIO::File.utime(time, time, new_resource.path)
|
176
181
|
logger.info("#{new_resource} updated atime and mtime to #{time}")
|
177
182
|
end
|
178
183
|
end
|
@@ -254,7 +259,7 @@ class Chef
|
|
254
259
|
# If any of the above apply, returns a 3-tuple of Exception class,
|
255
260
|
# exception message, whyrun message; otherwise returns a 3-tuple of nil.
|
256
261
|
def verify_symlink_sanity(path)
|
257
|
-
real_path = ::File.realpath(path)
|
262
|
+
real_path = ::TargetIO::File.realpath(path)
|
258
263
|
if real_file?(real_path)
|
259
264
|
[nil, nil, nil]
|
260
265
|
else
|
@@ -283,15 +288,15 @@ class Chef
|
|
283
288
|
|
284
289
|
def file_type_string(path)
|
285
290
|
case
|
286
|
-
when ::File.blockdev?(path)
|
291
|
+
when ::TargetIO::File.blockdev?(path)
|
287
292
|
"block device"
|
288
|
-
when ::File.chardev?(path)
|
293
|
+
when ::TargetIO::File.chardev?(path)
|
289
294
|
"char device"
|
290
|
-
when ::File.directory?(path)
|
295
|
+
when ::TargetIO::File.directory?(path)
|
291
296
|
"directory"
|
292
|
-
when ::File.pipe?(path)
|
297
|
+
when ::TargetIO::File.pipe?(path)
|
293
298
|
"pipe"
|
294
|
-
when ::File.socket?(path)
|
299
|
+
when ::TargetIO::File.socket?(path)
|
295
300
|
"socket"
|
296
301
|
when file_class.symlink?(path)
|
297
302
|
"symlink"
|
@@ -301,12 +306,12 @@ class Chef
|
|
301
306
|
end
|
302
307
|
|
303
308
|
def real_file?(path)
|
304
|
-
!file_class.symlink?(path) && ::File.file?(path)
|
309
|
+
!file_class.symlink?(path) && ::TargetIO::File.file?(path)
|
305
310
|
end
|
306
311
|
|
307
312
|
# like real_file? that follows (sane) symlinks
|
308
313
|
def symlink_to_real_file?(path)
|
309
|
-
real_file?(::File.realpath(path))
|
314
|
+
real_file?(::TargetIO::File.realpath(path))
|
310
315
|
rescue Errno::ELOOP, Errno::ENOENT
|
311
316
|
false
|
312
317
|
end
|
@@ -314,15 +319,15 @@ class Chef
|
|
314
319
|
# Similar to File.exist?, but also returns true in the case that the
|
315
320
|
# named file is a broken symlink.
|
316
321
|
def l_exist?(path)
|
317
|
-
::File.exist?(path) || file_class.symlink?(path)
|
322
|
+
::TargetIO::File.exist?(path) || file_class.symlink?(path)
|
318
323
|
end
|
319
324
|
|
320
325
|
def unlink(path)
|
321
326
|
# Directories can not be unlinked. Remove them using FileUtils.
|
322
|
-
if ::File.directory?(path)
|
323
|
-
FileUtils.rm_rf(path)
|
327
|
+
if ::TargetIO::File.directory?(path)
|
328
|
+
TargetIO::FileUtils.rm_rf(path)
|
324
329
|
else
|
325
|
-
::File.unlink(path)
|
330
|
+
::TargetIO::File.unlink(path)
|
326
331
|
end
|
327
332
|
end
|
328
333
|
|
@@ -344,8 +349,8 @@ class Chef
|
|
344
349
|
new_resource.verify.each do |v|
|
345
350
|
unless v.verify(tempfile.path)
|
346
351
|
backupfile = "#{Chef::Config[:file_cache_path]}/failed_validations/#{::File.basename(tempfile.path)}"
|
347
|
-
FileUtils.mkdir_p ::File.dirname(backupfile)
|
348
|
-
FileUtils.cp tempfile.path, backupfile
|
352
|
+
TargetIO::FileUtils.mkdir_p ::File.dirname(backupfile)
|
353
|
+
TargetIO::FileUtils.cp tempfile.path, backupfile
|
349
354
|
raise Chef::Exceptions::ValidationFailed.new "Proposed content for #{new_resource.path} failed verification #{new_resource.sensitive ? "[sensitive]" : "#{v}\n#{v.output}"}\nTemporary file moved to #{backupfile}"
|
350
355
|
end
|
351
356
|
end
|
@@ -374,6 +379,11 @@ class Chef
|
|
374
379
|
end
|
375
380
|
|
376
381
|
def do_backup(file = nil)
|
382
|
+
if ChefConfig::Config.target_mode?
|
383
|
+
Chef::Log.info("#{@new_resource} backup skipped in Target Mode")
|
384
|
+
return
|
385
|
+
end
|
386
|
+
|
377
387
|
Chef::Util::Backup.new(new_resource, file).backup!
|
378
388
|
end
|
379
389
|
|
@@ -383,11 +393,14 @@ class Chef
|
|
383
393
|
|
384
394
|
def update_file_contents
|
385
395
|
do_backup unless needs_creating?
|
386
|
-
deployment_strategy.deploy(tempfile.path, ::File.realpath(new_resource.path).force_encoding(Chef::Config[:ruby_encoding]))
|
396
|
+
deployment_strategy.deploy(tempfile.path, ::TargetIO::File.realpath(new_resource.path).force_encoding(Chef::Config[:ruby_encoding]))
|
387
397
|
logger.info("#{new_resource} updated file contents #{new_resource.path}")
|
388
398
|
if managing_content?
|
389
399
|
# save final checksum for reporting.
|
390
|
-
|
400
|
+
resource_to_check = new_resource.path
|
401
|
+
resource_to_check = ::TargetIO::File.open(resource_to_check) if ChefConfig::Config.target_mode?
|
402
|
+
|
403
|
+
new_resource.final_checksum = checksum(resource_to_check)
|
391
404
|
end
|
392
405
|
end
|
393
406
|
|
@@ -400,7 +413,7 @@ class Chef
|
|
400
413
|
end
|
401
414
|
|
402
415
|
# the file? on the next line suppresses the case in why-run when we have a not-file here that would have otherwise been removed
|
403
|
-
if ::File.file?(new_resource.path) && contents_changed?
|
416
|
+
if ::TargetIO::File.file?(new_resource.path) && contents_changed?
|
404
417
|
description = [ "update content in file #{new_resource.path} from \
|
405
418
|
#{short_cksum(current_resource.checksum)} to #{short_cksum(tempfile_checksum)}" ]
|
406
419
|
|
@@ -432,7 +445,7 @@ class Chef
|
|
432
445
|
if resource_updated? && Chef::Config[:enable_selinux_file_permission_fixup]
|
433
446
|
if selinux_enabled?
|
434
447
|
converge_by("restore selinux security context") do
|
435
|
-
restore_security_context(::File.realpath(new_resource.path), recursive)
|
448
|
+
restore_security_context(::TargetIO::File.realpath(new_resource.path), recursive)
|
436
449
|
end
|
437
450
|
else
|
438
451
|
logger.trace "selinux utilities can not be found. Skipping selinux permission fixup."
|
data/lib/chef/provider/git.rb
CHANGED
@@ -26,7 +26,7 @@ class Chef
|
|
26
26
|
class Git < Chef::Provider
|
27
27
|
|
28
28
|
extend Forwardable
|
29
|
-
provides :git
|
29
|
+
provides :git, target_mode: true
|
30
30
|
|
31
31
|
GIT_VERSION_PATTERN = Regexp.compile("git version (\\d+\\.\\d+.\\d+)")
|
32
32
|
|
@@ -58,7 +58,7 @@ class Chef
|
|
58
58
|
# Parent directory of the target must exist.
|
59
59
|
requirements.assert(:checkout, :sync) do |a|
|
60
60
|
dirname = ::File.dirname(cwd)
|
61
|
-
a.assertion { ::File.directory?(dirname) }
|
61
|
+
a.assertion { ::TargetIO::File.directory?(dirname) }
|
62
62
|
a.whyrun("Directory #{dirname} does not exist, this run will fail unless it has been previously created. Assuming it would have been created.")
|
63
63
|
a.failure_message(Chef::Exceptions::MissingParentDirectory,
|
64
64
|
"Cannot clone #{new_resource} to #{cwd}, the enclosing directory #{dirname} does not exist")
|
@@ -101,7 +101,7 @@ class Chef
|
|
101
101
|
action :export do
|
102
102
|
action_checkout
|
103
103
|
converge_by("complete the export by removing #{cwd}.git after checkout") do
|
104
|
-
FileUtils.rm_rf(::File.join(cwd, ".git"))
|
104
|
+
TargetIO::FileUtils.rm_rf(::File.join(cwd, ".git"))
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -138,16 +138,16 @@ class Chef
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def existing_git_clone?
|
141
|
-
::File.exist?(::File.join(cwd, ".git"))
|
141
|
+
::TargetIO::File.exist?(::File.join(cwd, ".git"))
|
142
142
|
end
|
143
143
|
|
144
144
|
def target_dir_non_existent_or_empty?
|
145
|
-
!::File.exist?(cwd) || Dir.entries(cwd).sort == [".", ".."]
|
145
|
+
!::TargetIO::File.exist?(cwd) || TargetIO::Dir.entries(cwd).sort == [".", ".."]
|
146
146
|
end
|
147
147
|
|
148
148
|
def find_current_revision
|
149
149
|
logger.trace("#{new_resource} finding current git revision")
|
150
|
-
if ::File.exist?(::File.join(cwd, ".git"))
|
150
|
+
if ::TargetIO::File.exist?(::File.join(cwd, ".git"))
|
151
151
|
# 128 is returned when we're not in a git repo. this is fine
|
152
152
|
result = git("rev-parse", "HEAD", cwd: cwd, returns: [0, 128]).stdout.strip
|
153
153
|
end
|
@@ -413,9 +413,9 @@ class Chef
|
|
413
413
|
require "etc" unless defined?(Etc)
|
414
414
|
case user
|
415
415
|
when Integer
|
416
|
-
Etc.getpwuid(user).dir
|
416
|
+
TargetIO::Etc.getpwuid(user).dir
|
417
417
|
else
|
418
|
-
Etc.getpwnam(user.to_s).dir
|
418
|
+
TargetIO::Etc.getpwnam(user.to_s).dir
|
419
419
|
end
|
420
420
|
end
|
421
421
|
end
|
@@ -22,7 +22,7 @@ class Chef
|
|
22
22
|
class Provider
|
23
23
|
class Group
|
24
24
|
class Gpasswd < Chef::Provider::Group::Groupadd
|
25
|
-
provides :group
|
25
|
+
provides :group, target_mode: true
|
26
26
|
|
27
27
|
def load_current_resource
|
28
28
|
super
|
@@ -31,7 +31,7 @@ class Chef
|
|
31
31
|
def define_resource_requirements
|
32
32
|
super
|
33
33
|
requirements.assert(:all_actions) do |a|
|
34
|
-
a.assertion { ::File.exist?("/usr/bin/gpasswd") }
|
34
|
+
a.assertion { ::TargetIO::File.exist?("/usr/bin/gpasswd") }
|
35
35
|
a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/bin/gpasswd for #{new_resource}"
|
36
36
|
# No whyrun alternative: this component should be available in the base install of any given system that uses it
|
37
37
|
end
|
@@ -35,7 +35,7 @@ class Chef
|
|
35
35
|
super
|
36
36
|
required_binaries.each do |required_binary|
|
37
37
|
requirements.assert(:all_actions) do |a|
|
38
|
-
a.assertion { ::File.exist?(required_binary) }
|
38
|
+
a.assertion { ::TargetIO::File.exist?(required_binary) }
|
39
39
|
a.failure_message Chef::Exceptions::Group, "Could not find binary #{required_binary} for #{new_resource}"
|
40
40
|
# No whyrun alternative: this component should be available in the base install of any given system that uses it
|
41
41
|
end
|
@@ -21,12 +21,12 @@ class Chef
|
|
21
21
|
class Group
|
22
22
|
class Groupmod < Chef::Provider::Group
|
23
23
|
|
24
|
-
provides :group, os: "netbsd"
|
24
|
+
provides :group, os: "netbsd", target_mode: true
|
25
25
|
|
26
26
|
def load_current_resource
|
27
27
|
super
|
28
28
|
%w{group user}.each do |binary|
|
29
|
-
raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/#{binary} for #{new_resource}" unless ::File.exist?("/usr/sbin/#{binary}")
|
29
|
+
raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/#{binary} for #{new_resource}" unless ::TargetIO::File.exist?("/usr/sbin/#{binary}")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -20,7 +20,7 @@ class Chef
|
|
20
20
|
class Provider
|
21
21
|
class Group
|
22
22
|
class Pw < Chef::Provider::Group
|
23
|
-
provides :group, platform: "freebsd"
|
23
|
+
provides :group, platform: "freebsd", target_mode: true
|
24
24
|
|
25
25
|
def load_current_resource
|
26
26
|
super
|
@@ -30,7 +30,7 @@ class Chef
|
|
30
30
|
super
|
31
31
|
|
32
32
|
requirements.assert(:all_actions) do |a|
|
33
|
-
a.assertion { ::File.exist?("/usr/sbin/pw") }
|
33
|
+
a.assertion { ::TargetIO::File.exist?("/usr/sbin/pw") }
|
34
34
|
a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/sbin/pw for #{new_resource}"
|
35
35
|
# No whyrun alternative: this component should be available in the base install of any given system that uses it
|
36
36
|
end
|
@@ -25,7 +25,7 @@ class Chef
|
|
25
25
|
|
26
26
|
# this provides line is setup to only catch the solaris2 platform, but
|
27
27
|
# NOT other platforms in the Solaris platform_family. (See usermod provider.)
|
28
|
-
provides :group, platform: "solaris2"
|
28
|
+
provides :group, platform: "solaris2", target_mode: true
|
29
29
|
|
30
30
|
def load_current_resource
|
31
31
|
super
|
@@ -35,7 +35,7 @@ class Chef
|
|
35
35
|
super
|
36
36
|
|
37
37
|
requirements.assert(:all_actions) do |a|
|
38
|
-
a.assertion { ::File.exist?("/usr/sbin/usermod") && ::File.exist?("/usr/sbin/groupmod") }
|
38
|
+
a.assertion { ::TargetIO::File.exist?("/usr/sbin/usermod") && ::TargetIO::File.exist?("/usr/sbin/groupmod") }
|
39
39
|
a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/sbin/usermod or /usr/sbin/groupmod for #{new_resource}"
|
40
40
|
# No whyrun alternative: this component should be available in the base install of any given system that uses it
|
41
41
|
end
|
@@ -23,7 +23,7 @@ class Chef
|
|
23
23
|
class Group
|
24
24
|
class Usermod < Chef::Provider::Group::Groupadd
|
25
25
|
|
26
|
-
provides :group, os: %w{openbsd solaris2}
|
26
|
+
provides :group, os: %w{openbsd solaris2}, target_mode: true
|
27
27
|
|
28
28
|
def load_current_resource
|
29
29
|
super
|
@@ -33,7 +33,7 @@ class Chef
|
|
33
33
|
super
|
34
34
|
|
35
35
|
requirements.assert(:all_actions) do |a|
|
36
|
-
a.assertion { ::File.exist?("/usr/sbin/usermod") }
|
36
|
+
a.assertion { ::TargetIO::File.exist?("/usr/sbin/usermod") }
|
37
37
|
a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/sbin/usermod for #{new_resource}"
|
38
38
|
# No whyrun alternative: this component should be available in the base install of any given system that uses it
|
39
39
|
end
|
data/lib/chef/provider/group.rb
CHANGED
@@ -36,7 +36,7 @@ class Chef
|
|
36
36
|
|
37
37
|
group_info = nil
|
38
38
|
begin
|
39
|
-
group_info = Etc.getgrnam(new_resource.group_name)
|
39
|
+
group_info = TargetIO::Etc.getgrnam(new_resource.group_name)
|
40
40
|
rescue ArgumentError
|
41
41
|
@group_exists = false
|
42
42
|
logger.trace("#{new_resource} group does not exist")
|
@@ -23,12 +23,12 @@ class Chef
|
|
23
23
|
class Provider
|
24
24
|
class HttpRequest < Chef::Provider
|
25
25
|
|
26
|
-
provides :http_request
|
26
|
+
provides :http_request, target_mode: true
|
27
27
|
|
28
28
|
attr_writer :http
|
29
29
|
|
30
30
|
def http
|
31
|
-
@http ||=
|
31
|
+
@http ||= TargetIO::HTTP.new(new_resource.url)
|
32
32
|
end
|
33
33
|
|
34
34
|
def load_current_resource; end
|
@@ -60,7 +60,6 @@ class Chef
|
|
60
60
|
new_resource.headers
|
61
61
|
)
|
62
62
|
logger.info("#{new_resource} GET to #{new_resource.url} successful")
|
63
|
-
logger.trace("#{new_resource} GET request response: #{body}")
|
64
63
|
end
|
65
64
|
end
|
66
65
|
|
@@ -22,7 +22,7 @@ class Chef
|
|
22
22
|
class Provider
|
23
23
|
class Ifconfig
|
24
24
|
class Aix < Chef::Provider::Ifconfig
|
25
|
-
provides :ifconfig, platform: "aix"
|
25
|
+
provides :ifconfig, platform: "aix", target_mode: true
|
26
26
|
|
27
27
|
def load_current_resource
|
28
28
|
@current_resource = Chef::Resource::Ifconfig.new(new_resource.name)
|
@@ -23,7 +23,7 @@ class Chef
|
|
23
23
|
class Provider
|
24
24
|
class Ifconfig
|
25
25
|
class Debian < Chef::Provider::Ifconfig
|
26
|
-
provides :ifconfig, platform_family: %w{debian}
|
26
|
+
provides :ifconfig, platform_family: %w{debian}, target_mode: true
|
27
27
|
|
28
28
|
INTERFACES_FILE = "/etc/network/interfaces".freeze
|
29
29
|
INTERFACES_DOT_D_DIR = "/etc/network/interfaces.d".freeze
|
@@ -81,7 +81,7 @@ iface <%= new_resource.device %> <%= new_resource.family %> static
|
|
81
81
|
|
82
82
|
def enforce_interfaces_dot_d_sanity
|
83
83
|
# on ubuntu 18.04+ there's no interfaces file and it uses interfaces.d by default
|
84
|
-
return if ::File.directory?(INTERFACES_DOT_D_DIR) && !::File.exist?(INTERFACES_FILE)
|
84
|
+
return if ::TargetIO::File.directory?(INTERFACES_DOT_D_DIR) && !::TargetIO::File.exist?(INTERFACES_FILE)
|
85
85
|
|
86
86
|
# create /etc/network/interfaces.d via dir if it's missing
|
87
87
|
directory INTERFACES_DOT_D_DIR
|
@@ -90,7 +90,7 @@ iface <%= new_resource.device %> <%= new_resource.family %> static
|
|
90
90
|
interfaces_dot_d_for_regexp = INTERFACES_DOT_D_DIR.gsub(/\./, "\\.") # escape dots for the regexp
|
91
91
|
regexp = %r{^\s*source\s+#{interfaces_dot_d_for_regexp}/\*\s*$}
|
92
92
|
|
93
|
-
return if ::File.exist?(INTERFACES_FILE) && regexp.match(IO.read(INTERFACES_FILE))
|
93
|
+
return if ::TargetIO::File.exist?(INTERFACES_FILE) && regexp.match(IO.read(INTERFACES_FILE))
|
94
94
|
|
95
95
|
converge_by("modifying #{INTERFACES_FILE} to source #{INTERFACES_DOT_D_DIR}") do
|
96
96
|
conf = Chef::Util::FileEdit.new(INTERFACES_FILE)
|
@@ -22,7 +22,7 @@ class Chef
|
|
22
22
|
class Provider
|
23
23
|
class Ifconfig
|
24
24
|
class Redhat < Chef::Provider::Ifconfig
|
25
|
-
provides :ifconfig, platform_family: "fedora_derived"
|
25
|
+
provides :ifconfig, platform_family: "fedora_derived", target_mode: true
|
26
26
|
|
27
27
|
def initialize(new_resource, run_context)
|
28
28
|
super(new_resource, run_context)
|
data/lib/chef/provider/link.rb
CHANGED
@@ -28,7 +28,7 @@ class Chef
|
|
28
28
|
class Provider
|
29
29
|
class Link < Chef::Provider
|
30
30
|
|
31
|
-
provides :link
|
31
|
+
provides :link, target_mode: true
|
32
32
|
|
33
33
|
include Chef::Mixin::EnforceOwnershipAndPermissions
|
34
34
|
include Chef::Mixin::FileClass
|
@@ -43,8 +43,8 @@ class Chef
|
|
43
43
|
)
|
44
44
|
else
|
45
45
|
current_resource.link_type(:hard)
|
46
|
-
if ::File.exist?(current_resource.target_file)
|
47
|
-
if ::File.exist?(new_resource.to) &&
|
46
|
+
if ::TargetIO::File.exist?(current_resource.target_file)
|
47
|
+
if ::TargetIO::File.exist?(new_resource.to) &&
|
48
48
|
file_class.stat(current_resource.target_file).ino ==
|
49
49
|
file_class.stat(new_resource.to).ino
|
50
50
|
current_resource.to(canonicalize(new_resource.to))
|
@@ -92,14 +92,14 @@ class Chef
|
|
92
92
|
# However if the new symlink will point to a file and the current symlink is pointing at a
|
93
93
|
# directory we want to throw an exception and calling ::File.unlink on the directory symlink
|
94
94
|
# will throw the correct ones.
|
95
|
-
if ChefUtils.windows? && ::File.directory?(new_resource.to) &&
|
96
|
-
::File.directory?(current_resource.target_file)
|
95
|
+
if ChefUtils.windows? && ::TargetIO::File.directory?(new_resource.to) &&
|
96
|
+
::TargetIO::File.directory?(current_resource.target_file)
|
97
97
|
converge_by("unlink existing windows symlink to dir at #{new_resource.target_file}") do
|
98
|
-
::Dir.unlink(new_resource.target_file)
|
98
|
+
::TargetIO::Dir.unlink(new_resource.target_file)
|
99
99
|
end
|
100
100
|
else
|
101
101
|
converge_by("unlink existing symlink to file at #{new_resource.target_file}") do
|
102
|
-
::File.unlink(new_resource.target_file)
|
102
|
+
::TargetIO::File.unlink(new_resource.target_file)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
@@ -134,14 +134,14 @@ class Chef
|
|
134
134
|
|
135
135
|
action :delete do
|
136
136
|
if current_resource.to # Exists
|
137
|
-
if ChefUtils.windows? && ::File.directory?(current_resource.target_file)
|
137
|
+
if ChefUtils.windows? && ::TargetIO::File.directory?(current_resource.target_file)
|
138
138
|
converge_by("delete link to dir at #{new_resource.target_file}") do
|
139
|
-
::Dir.delete(new_resource.target_file)
|
139
|
+
::TargetIO::Dir.delete(new_resource.target_file)
|
140
140
|
logger.info("#{new_resource} deleted")
|
141
141
|
end
|
142
142
|
else
|
143
143
|
converge_by("delete link to file at #{new_resource.target_file}") do
|
144
|
-
::File.delete(new_resource.target_file)
|
144
|
+
::TargetIO::File.delete(new_resource.target_file)
|
145
145
|
logger.info("#{new_resource} deleted")
|
146
146
|
end
|
147
147
|
end
|