chef 18.4.2 → 18.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|