chef 18.4.12 → 18.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/chef.gemspec +6 -6
  4. data/lib/chef/application/client.rb +12 -0
  5. data/lib/chef/client.rb +10 -16
  6. data/lib/chef/compliance/runner.rb +10 -0
  7. data/lib/chef/cookbook/chefignore.rb +4 -1
  8. data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
  9. data/lib/chef/cookbook/synchronizer.rb +7 -1
  10. data/lib/chef/cookbook_manifest.rb +2 -2
  11. data/lib/chef/file_access_control/unix.rb +9 -9
  12. data/lib/chef/file_cache.rb +17 -2
  13. data/lib/chef/file_content_management/deploy/target_io.rb +29 -0
  14. data/lib/chef/file_content_management/deploy.rb +4 -1
  15. data/lib/chef/formatters/doc.rb +1 -1
  16. data/lib/chef/mixin/file_class.rb +3 -1
  17. data/lib/chef/mixin/get_source_from_package.rb +1 -1
  18. data/lib/chef/mixin/openssl_helper.rb +1 -1
  19. data/lib/chef/node/attribute.rb +3 -11
  20. data/lib/chef/node/immutable_collections.rb +15 -8
  21. data/lib/chef/node/mixin/state_tracking.rb +6 -3
  22. data/lib/chef/policy_builder/policyfile.rb +8 -0
  23. data/lib/chef/provider/.gitkeep +0 -0
  24. data/lib/chef/provider/cookbook_file.rb +1 -1
  25. data/lib/chef/provider/cron.rb +1 -1
  26. data/lib/chef/provider/directory.rb +15 -15
  27. data/lib/chef/provider/file.rb +42 -29
  28. data/lib/chef/provider/git.rb +8 -8
  29. data/lib/chef/provider/group/aix.rb +1 -1
  30. data/lib/chef/provider/group/dscl.rb +1 -1
  31. data/lib/chef/provider/group/gpasswd.rb +2 -2
  32. data/lib/chef/provider/group/groupadd.rb +1 -1
  33. data/lib/chef/provider/group/groupmod.rb +2 -2
  34. data/lib/chef/provider/group/pw.rb +2 -2
  35. data/lib/chef/provider/group/solaris.rb +2 -2
  36. data/lib/chef/provider/group/usermod.rb +2 -2
  37. data/lib/chef/provider/group.rb +1 -1
  38. data/lib/chef/provider/http_request.rb +2 -3
  39. data/lib/chef/provider/ifconfig/aix.rb +1 -1
  40. data/lib/chef/provider/ifconfig/debian.rb +3 -3
  41. data/lib/chef/provider/ifconfig/redhat.rb +1 -1
  42. data/lib/chef/provider/ifconfig.rb +1 -1
  43. data/lib/chef/provider/link.rb +10 -10
  44. data/lib/chef/provider/mount/aix.rb +4 -4
  45. data/lib/chef/provider/mount/linux.rb +4 -4
  46. data/lib/chef/provider/mount/mount.rb +11 -11
  47. data/lib/chef/provider/package/apt.rb +2 -11
  48. data/lib/chef/provider/package/bff.rb +3 -3
  49. data/lib/chef/provider/package/chocolatey.rb +54 -24
  50. data/lib/chef/provider/package/dpkg.rb +3 -3
  51. data/lib/chef/provider/package/freebsd/base.rb +1 -1
  52. data/lib/chef/provider/package/habitat.rb +5 -3
  53. data/lib/chef/provider/package/ips.rb +2 -2
  54. data/lib/chef/provider/package/openbsd.rb +3 -2
  55. data/lib/chef/provider/package/pacman.rb +4 -4
  56. data/lib/chef/provider/package/paludis.rb +2 -2
  57. data/lib/chef/provider/package/portage.rb +1 -1
  58. data/lib/chef/provider/package/powershell.rb +1 -0
  59. data/lib/chef/provider/package/rpm.rb +2 -2
  60. data/lib/chef/provider/package/smartos.rb +2 -2
  61. data/lib/chef/provider/package/snap.rb +2 -1
  62. data/lib/chef/provider/package/snap_tm.rb +79 -0
  63. data/lib/chef/provider/package/solaris.rb +4 -4
  64. data/lib/chef/provider/package/zypper.rb +4 -5
  65. data/lib/chef/provider/package.rb +1 -1
  66. data/lib/chef/provider/remote_directory.rb +5 -5
  67. data/lib/chef/provider/remote_file/http.rb +2 -3
  68. data/lib/chef/provider/remote_file.rb +1 -1
  69. data/lib/chef/provider/route.rb +9 -9
  70. data/lib/chef/provider/service/aix.rb +1 -1
  71. data/lib/chef/provider/service/aixinit.rb +4 -4
  72. data/lib/chef/provider/service/arch.rb +6 -6
  73. data/lib/chef/provider/service/debian.rb +5 -5
  74. data/lib/chef/provider/service/freebsd.rb +7 -7
  75. data/lib/chef/provider/service/gentoo.rb +5 -5
  76. data/lib/chef/provider/service/init.rb +2 -2
  77. data/lib/chef/provider/service/insserv.rb +2 -2
  78. data/lib/chef/provider/service/invokercd.rb +1 -1
  79. data/lib/chef/provider/service/openbsd.rb +7 -7
  80. data/lib/chef/provider/service/redhat.rb +3 -3
  81. data/lib/chef/provider/service/solaris.rb +2 -2
  82. data/lib/chef/provider/service/systemd.rb +2 -2
  83. data/lib/chef/provider/service/upstart.rb +2 -2
  84. data/lib/chef/provider/service/windows.rb +0 -1
  85. data/lib/chef/provider/subversion.rb +8 -8
  86. data/lib/chef/provider/systemd_unit.rb +3 -3
  87. data/lib/chef/provider/template.rb +1 -1
  88. data/lib/chef/provider/user/aix.rb +3 -3
  89. data/lib/chef/provider/user/linux.rb +7 -2
  90. data/lib/chef/provider/user/pw.rb +3 -3
  91. data/lib/chef/provider/user/solaris.rb +7 -7
  92. data/lib/chef/provider/user.rb +7 -8
  93. data/lib/chef/provider/yum_repository.rb +1 -3
  94. data/lib/chef/provider/zypper_repository.rb +1 -1
  95. data/lib/chef/providers.rb +1 -0
  96. data/lib/chef/resource/.gitkeep +0 -0
  97. data/lib/chef/resource/alternatives.rb +2 -2
  98. data/lib/chef/resource/apt_preference.rb +1 -1
  99. data/lib/chef/resource/apt_repository.rb +7 -9
  100. data/lib/chef/resource/apt_update.rb +3 -3
  101. data/lib/chef/resource/bff_package.rb +1 -1
  102. data/lib/chef/resource/chef_client_config.rb +3 -2
  103. data/lib/chef/resource/chef_client_systemd_timer.rb +5 -0
  104. data/lib/chef/resource/chef_gem.rb +1 -1
  105. data/lib/chef/resource/chef_sleep.rb +1 -1
  106. data/lib/chef/resource/cookbook_file.rb +1 -1
  107. data/lib/chef/resource/cron/cron.rb +1 -1
  108. data/lib/chef/resource/cron/cron_d.rb +1 -1
  109. data/lib/chef/resource/cron_access.rb +1 -1
  110. data/lib/chef/resource/directory.rb +1 -1
  111. data/lib/chef/resource/dpkg_package.rb +1 -1
  112. data/lib/chef/resource/execute.rb +8 -6
  113. data/lib/chef/resource/file/verification/json.rb +1 -1
  114. data/lib/chef/resource/file/verification/systemd_unit.rb +1 -1
  115. data/lib/chef/resource/file/verification/yaml.rb +1 -1
  116. data/lib/chef/resource/file.rb +1 -1
  117. data/lib/chef/resource/freebsd_package.rb +2 -2
  118. data/lib/chef/resource/group.rb +1 -1
  119. data/lib/chef/resource/habitat/habitat_package.rb +1 -1
  120. data/lib/chef/resource/habitat/habitat_sup.rb +9 -9
  121. data/lib/chef/resource/habitat/habitat_sup_systemd.rb +2 -2
  122. data/lib/chef/resource/habitat_install.rb +5 -4
  123. data/lib/chef/resource/hostname.rb +11 -10
  124. data/lib/chef/resource/http_request.rb +1 -1
  125. data/lib/chef/resource/ifconfig.rb +1 -1
  126. data/lib/chef/resource/inspec_input.rb +3 -1
  127. data/lib/chef/resource/inspec_waiver.rb +1 -1
  128. data/lib/chef/resource/inspec_waiver_file_entry.rb +1 -1
  129. data/lib/chef/resource/ips_package.rb +2 -2
  130. data/lib/chef/resource/kernel_module.rb +2 -2
  131. data/lib/chef/resource/link.rb +1 -1
  132. data/lib/chef/resource/locale.rb +2 -2
  133. data/lib/chef/resource/mount.rb +1 -1
  134. data/lib/chef/resource/notify_group.rb +1 -1
  135. data/lib/chef/resource/ohai.rb +1 -1
  136. data/lib/chef/resource/ohai_hint.rb +1 -1
  137. data/lib/chef/resource/openbsd_package.rb +2 -2
  138. data/lib/chef/resource/package.rb +1 -1
  139. data/lib/chef/resource/pacman_package.rb +1 -1
  140. data/lib/chef/resource/paludis_package.rb +1 -1
  141. data/lib/chef/resource/portage_package.rb +1 -1
  142. data/lib/chef/resource/powershell_package.rb +4 -0
  143. data/lib/chef/resource/reboot.rb +1 -1
  144. data/lib/chef/resource/remote_directory.rb +1 -1
  145. data/lib/chef/resource/remote_file.rb +1 -1
  146. data/lib/chef/resource/rhsm_errata.rb +1 -1
  147. data/lib/chef/resource/rhsm_errata_level.rb +1 -1
  148. data/lib/chef/resource/rhsm_register.rb +1 -1
  149. data/lib/chef/resource/rhsm_repo.rb +3 -4
  150. data/lib/chef/resource/rhsm_subscription.rb +8 -9
  151. data/lib/chef/resource/route.rb +1 -1
  152. data/lib/chef/resource/rpm_package.rb +1 -1
  153. data/lib/chef/resource/scm/git.rb +1 -1
  154. data/lib/chef/resource/scm/subversion.rb +1 -1
  155. data/lib/chef/resource/selinux/common_helpers.rb +1 -1
  156. data/lib/chef/resource/selinux_boolean.rb +1 -1
  157. data/lib/chef/resource/selinux_fcontext.rb +3 -3
  158. data/lib/chef/resource/selinux_install.rb +1 -1
  159. data/lib/chef/resource/selinux_login.rb +1 -1
  160. data/lib/chef/resource/selinux_module.rb +5 -5
  161. data/lib/chef/resource/selinux_permissive.rb +2 -2
  162. data/lib/chef/resource/selinux_port.rb +2 -2
  163. data/lib/chef/resource/selinux_state.rb +2 -2
  164. data/lib/chef/resource/selinux_user.rb +1 -1
  165. data/lib/chef/resource/smartos_package.rb +2 -2
  166. data/lib/chef/resource/snap_package.rb +24 -1
  167. data/lib/chef/resource/solaris_package.rb +1 -1
  168. data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
  169. data/lib/chef/resource/sudo.rb +5 -5
  170. data/lib/chef/resource/support/client.erb +1 -1
  171. data/lib/chef/resource/swap_file.rb +6 -6
  172. data/lib/chef/resource/sysctl.rb +6 -5
  173. data/lib/chef/resource/systemd_unit.rb +1 -1
  174. data/lib/chef/resource/template.rb +1 -1
  175. data/lib/chef/resource/timezone.rb +5 -5
  176. data/lib/chef/resource/user/aix_user.rb +2 -2
  177. data/lib/chef/resource/user/linux_user.rb +2 -2
  178. data/lib/chef/resource/user/pw_user.rb +2 -2
  179. data/lib/chef/resource/user/solaris_user.rb +2 -2
  180. data/lib/chef/resource/user_ulimit.rb +1 -1
  181. data/lib/chef/resource/yum_repository.rb +1 -1
  182. data/lib/chef/resource/zypper_package.rb +2 -2
  183. data/lib/chef/resource/zypper_repository.rb +2 -2
  184. data/lib/chef/run_lock.rb +3 -0
  185. data/lib/chef/scan_access_control.rb +6 -6
  186. data/lib/chef/target_io/dir.rb +12 -0
  187. data/lib/chef/target_io/etc.rb +16 -0
  188. data/lib/chef/target_io/file.rb +12 -0
  189. data/lib/chef/target_io/fileutils.rb +12 -0
  190. data/lib/chef/target_io/http.rb +22 -0
  191. data/lib/chef/target_io/io.rb +12 -0
  192. data/lib/chef/target_io/shadow.rb +44 -0
  193. data/lib/chef/target_io/train/dir.rb +69 -0
  194. data/lib/chef/target_io/train/etc.rb +112 -0
  195. data/lib/chef/target_io/train/file.rb +219 -0
  196. data/lib/chef/target_io/train/fileutils.rb +220 -0
  197. data/lib/chef/target_io/train/http.rb +117 -0
  198. data/lib/chef/target_io/train/io.rb +13 -0
  199. data/lib/chef/target_io/train/shadow.rb +52 -0
  200. data/lib/chef/target_io/train_compat.rb +7 -0
  201. data/lib/chef/target_io.rb +9 -0
  202. data/lib/chef/util/backup.rb +1 -1
  203. data/lib/chef/util/diff.rb +14 -1
  204. data/lib/chef/util/file_edit.rb +4 -4
  205. data/lib/chef/version.rb +1 -1
  206. data/lib/chef.rb +2 -0
  207. data/spec/functional/resource/remote_file_spec.rb +1 -1
  208. data/spec/integration/client/fips_spec.rb +11 -2
  209. data/spec/integration/client/open_ssl_spec.rb +20 -0
  210. data/spec/spec_helper.rb +3 -1
  211. data/spec/support/platform_helpers.rb +20 -7
  212. data/spec/unit/client_spec.rb +0 -16
  213. data/spec/unit/file_cache_spec.rb +64 -0
  214. data/spec/unit/mixin/openssl_helper_spec.rb +6 -1
  215. data/spec/unit/provider/apt_repository_spec.rb +1 -1
  216. data/spec/unit/provider/package/chocolatey_spec.rb +17 -12
  217. data/spec/unit/provider/package/windows_spec.rb +5 -5
  218. data/spec/unit/provider/package/zypper_spec.rb +0 -10
  219. data/spec/unit/provider/route_spec.rb +6 -4
  220. data/spec/unit/resource/rhsm_repo_spec.rb +1 -0
  221. data/spec/unit/resource/rhsm_subscription_spec.rb +2 -0
  222. metadata +29 -8
@@ -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
- current_resource.checksum(checksum(current_resource.path))
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
- new_resource.final_checksum = checksum(new_resource.path)
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."
@@ -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 Aix < Chef::Provider::Group::Groupadd
25
- provides :group, platform: "aix"
25
+ provides :group, platform: "aix", target_mode: true
26
26
 
27
27
  def required_binaries
28
28
  [ "/usr/bin/mkgroup",
@@ -21,7 +21,7 @@ class Chef
21
21
  class Group
22
22
  class Dscl < Chef::Provider::Group
23
23
 
24
- provides :group, os: "darwin"
24
+ provides :group, os: "darwin", target_mode: true
25
25
 
26
26
  def dscl(*args)
27
27
  argdup = args.dup
@@ -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
@@ -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 ||= Chef::HTTP::Simple.new(new_resource.url)
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)
@@ -31,7 +31,7 @@ class Chef
31
31
  # device 'eth1'
32
32
  # end
33
33
  class Ifconfig < Chef::Provider
34
- provides :ifconfig
34
+ provides :ifconfig, target_mode: true
35
35
 
36
36
  attr_accessor :config_template
37
37
  attr_accessor :config_path
@@ -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
@@ -21,7 +21,7 @@ class Chef
21
21
  class Provider
22
22
  class Mount
23
23
  class Aix < Chef::Provider::Mount::Mount
24
- provides :mount, platform: "aix"
24
+ provides :mount, platform: "aix", target_mode: true
25
25
 
26
26
  # Override for aix specific handling
27
27
  def initialize(new_resource, run_context)
@@ -163,7 +163,7 @@ class Chef
163
163
  # disable, then enable.
164
164
  disable_fs
165
165
  end
166
- ::File.open("/etc/filesystems", "a") do |fstab|
166
+ ::TargetIO::File.open("/etc/filesystems", "a") do |fstab|
167
167
  fstab.puts("\n\n#{@new_resource.mount_point}:")
168
168
  if network_device?
169
169
  device_details = device_fstab.split(":")
@@ -194,7 +194,7 @@ class Chef
194
194
  contents = []
195
195
  if @current_resource.enabled
196
196
  found_device = false
197
- ::File.open("/etc/filesystems", "r").each_line do |line|
197
+ ::TargetIO::File.open("/etc/filesystems", "r").each_line do |line|
198
198
  case line
199
199
  when %r{^/.+:\s*$}
200
200
  if /#{Regexp.escape(@new_resource.mount_point)}+:/.match?(line)
@@ -207,7 +207,7 @@ class Chef
207
207
  contents << line
208
208
  end
209
209
  end
210
- ::File.open("/etc/filesystems", "w") do |fstab|
210
+ ::TargetIO::File.open("/etc/filesystems", "w") do |fstab|
211
211
  contents.each { |line| fstab.puts line }
212
212
  end
213
213
  else
@@ -23,7 +23,7 @@ class Chef
23
23
  class Mount
24
24
  class Linux < Chef::Provider::Mount::Mount
25
25
 
26
- provides :mount, os: "linux"
26
+ provides :mount, os: "linux", target_mode: true
27
27
 
28
28
  # Check to see if the volume is mounted.
29
29
  # "findmnt" outputs the mount points with volume.
@@ -39,8 +39,8 @@ class Chef
39
39
 
40
40
  def mounted?
41
41
  mounted = false
42
- real_mount_point = if ::File.exist? @new_resource.mount_point
43
- ::File.realpath(@new_resource.mount_point)
42
+ real_mount_point = if ::TargetIO::File.exist? @new_resource.mount_point
43
+ ::TargetIO::File.realpath(@new_resource.mount_point)
44
44
  else
45
45
  @new_resource.mount_point
46
46
  end
@@ -83,4 +83,4 @@ class Chef
83
83
  end
84
84
  end
85
85
  end
86
- end
86
+ end