chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32

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.
Files changed (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -32,6 +32,25 @@ class Chef
32
32
  sorted_releases
33
33
  end
34
34
 
35
+ def action_deploy
36
+ validate_release_history!
37
+ super
38
+ end
39
+
40
+ def cleanup!
41
+ super
42
+
43
+ known_releases = sorted_releases
44
+
45
+ Dir["#{new_resource.deploy_to}/releases/*"].each do |release_dir|
46
+ unless known_releases.include?(release_dir)
47
+ converge_by("Remove unknown release in #{release_dir}") do
48
+ FileUtils.rm_rf(release_dir)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
35
54
  protected
36
55
 
37
56
  def release_created(release)
@@ -57,6 +76,14 @@ class Chef
57
76
  cache
58
77
  end
59
78
 
79
+ def validate_release_history!
80
+ sorted_releases do |release_list|
81
+ release_list.each do |path|
82
+ release_list.delete(path) unless ::File.exist?(path)
83
+ end
84
+ end
85
+ end
86
+
60
87
  def sorted_releases_from_filesystem
61
88
  Dir.glob(new_resource.deploy_to + "/releases/*").sort_by { |d| ::File.ctime(d) }
62
89
  end
@@ -26,6 +26,7 @@ require 'fileutils'
26
26
  class Chef
27
27
  class Provider
28
28
  class Directory < Chef::Provider::File
29
+
29
30
  def whyrun_supported?
30
31
  true
31
32
  end
@@ -33,16 +34,13 @@ class Chef
33
34
  def load_current_resource
34
35
  @current_resource = Chef::Resource::Directory.new(@new_resource.name)
35
36
  @current_resource.path(@new_resource.path)
36
- load_current_resource_attrs
37
- setup_acl
38
-
37
+ if ::File.exists?(@current_resource.path) && @action != :create_if_missing
38
+ load_resource_attributes_from_file(@current_resource)
39
+ end
39
40
  @current_resource
40
41
  end
41
42
 
42
43
  def define_resource_requirements
43
- # this must be evaluated before whyrun messages are printed
44
- access_controls.requires_changes?
45
-
46
44
  requirements.assert(:create) do |a|
47
45
  # Make sure the parent dir exists, or else fail.
48
46
  # for why run, print a message explaining the potential error.
@@ -60,7 +58,7 @@ class Chef
60
58
  # make sure we have write permissions to that directory
61
59
  is_parent_writable = lambda do |base_dir|
62
60
  base_dir = ::File.dirname(base_dir)
63
- if ::File.exist?(base_dir)
61
+ if ::File.exists?(base_dir)
64
62
  ::File.writable?(base_dir)
65
63
  else
66
64
  is_parent_writable.call(base_dir)
@@ -70,7 +68,7 @@ class Chef
70
68
  else
71
69
  # in why run mode & parent directory does not exist no permissions check is required
72
70
  # If not in why run, permissions must be valid and we rely on prior assertion that dir exists
73
- if !whyrun_mode? || ::File.exist?(parent_directory)
71
+ if !whyrun_mode? || ::File.exists?(parent_directory)
74
72
  ::File.writable?(parent_directory)
75
73
  else
76
74
  true
@@ -83,7 +81,7 @@ class Chef
83
81
 
84
82
  requirements.assert(:delete) do |a|
85
83
  a.assertion do
86
- if ::File.exist?(@new_resource.path)
84
+ if ::File.exists?(@new_resource.path)
87
85
  ::File.directory?(@new_resource.path) && ::File.writable?(@new_resource.path)
88
86
  else
89
87
  true
@@ -97,7 +95,7 @@ class Chef
97
95
  end
98
96
 
99
97
  def action_create
100
- unless ::File.exist?(@new_resource.path)
98
+ unless ::File.exists?(@new_resource.path)
101
99
  converge_by("create new directory #{@new_resource.path}") do
102
100
  if @new_resource.recursive == true
103
101
  ::FileUtils.mkdir_p(@new_resource.path)
@@ -107,11 +105,13 @@ class Chef
107
105
  Chef::Log.info("#{@new_resource} created directory #{@new_resource.path}")
108
106
  end
109
107
  end
110
- set_all_access_controls
108
+ do_acl_changes
109
+ do_selinux(true)
110
+ load_resource_attributes_from_file(@new_resource)
111
111
  end
112
112
 
113
113
  def action_delete
114
- if ::File.exist?(@new_resource.path)
114
+ if ::File.exists?(@new_resource.path)
115
115
  converge_by("delete existing directory #{@new_resource.path}") do
116
116
  if @new_resource.recursive == true
117
117
  FileUtils.rm_rf(@new_resource.path)
@@ -123,12 +123,6 @@ class Chef
123
123
  end
124
124
  end
125
125
  end
126
-
127
- private
128
-
129
- def managing_content?
130
- false
131
- end
132
126
  end
133
127
  end
134
128
  end
@@ -37,11 +37,9 @@ class Chef
37
37
  def action_run
38
38
  opts = {}
39
39
 
40
- if sentinel_file = @new_resource.creates
41
- if ::File.exists?(sentinel_file)
42
- Chef::Log.debug("#{@new_resource} sentinel file #{sentinel_file} exists - nothing to do")
43
- return false
44
- end
40
+ if sentinel_file = sentinel_file_if_exists
41
+ Chef::Log.debug("#{@new_resource} sentinel file #{sentinel_file} exists - nothing to do")
42
+ return false
45
43
  end
46
44
 
47
45
  # original implementation did not specify a timeout, but ShellOut
@@ -63,6 +61,25 @@ class Chef
63
61
  Chef::Log.info("#{@new_resource} ran successfully")
64
62
  end
65
63
  end
64
+
65
+ private
66
+
67
+ def sentinel_file_if_exists
68
+ if sentinel_file = @new_resource.creates
69
+ relative = Pathname(sentinel_file).relative?
70
+ cwd = @new_resource.cwd
71
+ if relative && !cwd
72
+ Chef::Log.warn "You have provided relative path for execute#creates (#{sentinel_file}) without execute#cwd (see CHEF-3819)"
73
+ end
74
+
75
+ if ::File.exists?(sentinel_file)
76
+ sentinel_file
77
+ elsif cwd && relative
78
+ sentinel_file = ::File.join(cwd, sentinel_file)
79
+ sentinel_file if ::File.exists?(sentinel_file)
80
+ end
81
+ end
82
+ end
66
83
  end
67
84
  end
68
85
  end
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
3
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008-2013 Opscode, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,105 +20,50 @@
19
20
  require 'chef/config'
20
21
  require 'chef/log'
21
22
  require 'chef/resource/file'
22
- require 'chef/mixin/checksum'
23
23
  require 'chef/provider'
24
24
  require 'etc'
25
25
  require 'fileutils'
26
26
  require 'chef/scan_access_control'
27
+ require 'chef/mixin/checksum'
27
28
  require 'chef/mixin/shell_out'
29
+ require 'chef/mixin/file_class'
30
+ require 'chef/util/backup'
31
+ require 'chef/util/diff'
32
+ require 'chef/deprecation/provider/file'
33
+ require 'chef/deprecation/warnings'
34
+ require 'chef/file_content_management/deploy'
35
+
36
+ # The Tao of File Providers:
37
+ # - the content provider must always return a tempfile that we can delete/mv
38
+ # - do_create_file shall always create the file first and obey umask when perms are not specified
39
+ # - do_contents_changes may assume the destination file exists (simplifies exception checking,
40
+ # and always gives us something to diff against)
41
+ # - do_contents_changes must restore the perms to the dest file and not obliterate them with
42
+ # random tempfile permissions
43
+ # - do_acl_changes may assume perms were not modified between lcr and when it runs (although the
44
+ # file may have been created)
28
45
 
29
46
  class Chef
30
-
31
47
  class Provider
32
48
  class File < Chef::Provider
49
+ include Chef::Mixin::EnforceOwnershipAndPermissions
33
50
  include Chef::Mixin::Checksum
34
51
  include Chef::Mixin::ShellOut
52
+ include Chef::Util::Selinux
53
+ include Chef::Mixin::FileClass
35
54
 
36
- def negative_complement(big)
37
- if big > 1073741823 # Fixnum max
38
- big -= (2**32) # diminished radix wrap to negative
39
- end
40
- big
41
- end
42
-
43
- def octal_mode(mode)
44
- ((mode.respond_to?(:oct) ? mode.oct : mode.to_i) & 007777)
45
- end
46
-
47
- private :negative_complement, :octal_mode
48
-
49
- def diff_current_from_content(new_content)
50
- result = nil
51
- Tempfile.open("chef-diff") do |file|
52
- file.write new_content
53
- file.close
54
- result = diff_current file.path
55
- end
56
- result
57
- end
58
-
59
- def is_binary?(path)
60
- ::File.open(path) do |file|
61
-
62
- buff = file.read(Chef::Config[:diff_filesize_threshold])
63
- buff = "" if buff.nil?
64
- return buff !~ /^[\r[:print:]]*$/
65
- end
66
- end
67
-
68
-
69
- def diff_current(temp_path)
70
- suppress_resource_reporting = false
71
-
72
- return [ "(diff output suppressed by config)" ] if Chef::Config[:diff_disabled]
73
- return [ "(no temp file with new content, diff output suppressed)" ] unless ::File.exists?(temp_path) # should never happen?
55
+ extend Chef::Deprecation::Warnings
56
+ include Chef::Deprecation::Provider::File
57
+ add_deprecation_warnings_for(Chef::Deprecation::Provider::File.instance_methods)
74
58
 
75
- # solaris does not support diff -N, so create tempfile to diff against if we are creating a new file
76
- target_path = if ::File.exists?(@current_resource.path)
77
- @current_resource.path
78
- else
79
- suppress_resource_reporting = true # suppress big diffs going to resource reporting service
80
- tempfile = Tempfile.new('chef-tempfile')
81
- tempfile.path
82
- end
59
+ attr_reader :deployment_strategy
83
60
 
84
- diff_filesize_threshold = Chef::Config[:diff_filesize_threshold]
85
- diff_output_threshold = Chef::Config[:diff_output_threshold]
86
-
87
- if ::File.size(target_path) > diff_filesize_threshold || ::File.size(temp_path) > diff_filesize_threshold
88
- return [ "(file sizes exceed #{diff_filesize_threshold} bytes, diff output suppressed)" ]
89
- end
90
-
91
- # MacOSX(BSD?) diff will *sometimes* happily spit out nasty binary diffs
92
- return [ "(current file is binary, diff output suppressed)"] if is_binary?(target_path)
93
- return [ "(new content is binary, diff output suppressed)"] if is_binary?(temp_path)
94
-
95
- begin
96
- # -u: Unified diff format
97
- result = shell_out("diff -u #{target_path} #{temp_path}" )
98
- rescue Exception => e
99
- # Should *not* receive this, but in some circumstances it seems that
100
- # an exception can be thrown even using shell_out instead of shell_out!
101
- return [ "Could not determine diff. Error: #{e.message}" ]
102
- end
103
-
104
- # diff will set a non-zero return code even when there's
105
- # valid stdout results, if it encounters something unexpected
106
- # So as long as we have output, we'll show it.
107
- if not result.stdout.empty?
108
- if result.stdout.length > diff_output_threshold
109
- [ "(long diff of over #{diff_output_threshold} characters, diff output suppressed)" ]
110
- else
111
- val = result.stdout.split("\n")
112
- val.delete("\")
113
- @new_resource.diff(val.join("\\n")) unless suppress_resource_reporting
114
- val
115
- end
116
- elsif not result.stderr.empty?
117
- [ "Could not determine diff. Error: #{result.stderr}" ]
118
- else
119
- [ "(no diff)" ]
61
+ def initialize(new_resource, run_context)
62
+ @content_class ||= Chef::Provider::File::Content
63
+ if new_resource.respond_to?(:atomic_update)
64
+ @deployment_strategy = Chef::FileContentManagement::Deploy.strategy(new_resource.atomic_update)
120
65
  end
66
+ super
121
67
  end
122
68
 
123
69
  def whyrun_supported?
@@ -125,151 +71,56 @@ class Chef
125
71
  end
126
72
 
127
73
  def load_current_resource
128
- # Every child should be specifying their own constructor, so this
129
- # should only be run in the file case.
74
+ # Let children resources override constructing the @current_resource
130
75
  @current_resource ||= Chef::Resource::File.new(@new_resource.name)
131
- @new_resource.path.gsub!(/\\/, "/") # for Windows
132
76
  @current_resource.path(@new_resource.path)
133
- if !::File.directory?(@new_resource.path)
134
- if ::File.exist?(@new_resource.path)
135
- if managing_content?
136
- @current_resource.checksum(checksum(@new_resource.path))
137
- end
77
+ if ::File.exists?(@current_resource.path) && ::File.file?(::File.realpath(@current_resource.path))
78
+ if @action != :create_if_missing && @current_resource.respond_to?(:checksum)
79
+ @current_resource.checksum(checksum(@current_resource.path))
138
80
  end
81
+ load_resource_attributes_from_file(@current_resource)
139
82
  end
140
- load_current_resource_attrs
141
- setup_acl
142
-
143
83
  @current_resource
144
84
  end
145
85
 
146
- def load_current_resource_attrs
147
- if Chef::Platform.windows?
148
- # TODO: To work around CHEF-3554, add support for Windows
149
- # equivalent, or implicit resource reporting won't work for
150
- # Windows.
151
- return
152
- end
153
-
154
- if ::File.exist?(@new_resource.path)
155
- stat = ::File.stat(@new_resource.path)
156
- @current_resource.owner(stat.uid)
157
- @current_resource.mode(stat.mode & 07777)
158
- @current_resource.group(stat.gid)
159
-
160
- if @new_resource.group.nil?
161
- @new_resource.group(@current_resource.group)
162
- end
163
- if @new_resource.owner.nil?
164
- @new_resource.owner(@current_resource.owner)
165
- end
166
- if @new_resource.mode.nil?
167
- @new_resource.mode(@current_resource.mode)
168
- end
169
- end
170
- end
171
-
172
- def setup_acl
173
- @acl_scanner = ScanAccessControl.new(@new_resource, @current_resource)
174
- @acl_scanner.set_all!
175
- end
176
-
177
86
  def define_resource_requirements
178
- # this must be evaluated before whyrun messages are printed
179
- access_controls.requires_changes?
180
-
87
+ # deep inside FAC we have to assert requirements, so call FACs hook to set that up
88
+ access_controls.define_resource_requirements
89
+ # Make sure the parent directory exists, otherwise fail. For why-run assume it would have been created.
181
90
  requirements.assert(:create, :create_if_missing, :touch) do |a|
182
- # Make sure the parent dir exists, or else fail.
183
- # for why run, print a message explaining the potential error.
184
91
  parent_directory = ::File.dirname(@new_resource.path)
185
-
186
92
  a.assertion { ::File.directory?(parent_directory) }
187
93
  a.failure_message(Chef::Exceptions::EnclosingDirectoryDoesNotExist, "Parent directory #{parent_directory} does not exist.")
188
94
  a.whyrun("Assuming directory #{parent_directory} would have been created")
189
95
  end
190
96
 
191
- # Make sure the file is deletable if it exists. Otherwise, fail.
192
- requirements.assert(:delete) do |a|
193
- a.assertion do
194
- if ::File.exists?(@new_resource.path)
195
- ::File.writable?(@new_resource.path)
196
- else
197
- true
198
- end
97
+ # Make sure the file is deletable if it exists, otherwise fail.
98
+ if ::File.exists?(@new_resource.path)
99
+ requirements.assert(:delete) do |a|
100
+ a.assertion { ::File.writable?(@new_resource.path) }
101
+ a.failure_message(Chef::Exceptions::InsufficientPermissions,"File #{@new_resource.path} exists but is not writable so it cannot be deleted")
199
102
  end
200
- a.failure_message(Chef::Exceptions::InsufficientPermissions,"File #{@new_resource.path} exists but is not writable so it cannot be deleted")
201
103
  end
202
- end
203
-
204
- # Compare the content of a file. Returns true if they are the same, false if they are not.
205
- def compare_content
206
- checksum(@current_resource.path) == new_resource_content_checksum
207
- end
208
104
 
209
- # Set the content of the file, assuming it is not set correctly already.
210
- def set_content
211
- unless compare_content
212
- description = []
213
- description << "update content in file #{@new_resource.path} from #{short_cksum(@current_resource.checksum)} to #{short_cksum(new_resource_content_checksum)}"
214
- description << diff_current_from_content(@new_resource.content)
215
- converge_by(description) do
216
- backup @new_resource.path if ::File.exists?(@new_resource.path)
217
- ::File.open(@new_resource.path, "w") {|f| f.write @new_resource.content }
218
- Chef::Log.info("#{@new_resource} contents updated")
219
- end
105
+ error, reason, whyrun_message = inspect_existing_fs_entry
106
+ requirements.assert(:create) do |a|
107
+ a.assertion { error.nil? }
108
+ a.failure_message(error, reason)
109
+ a.whyrun(whyrun_message)
110
+ # Subsequent attempts to read the fs entry at the path (e.g., for
111
+ # calculating checksums) could blow up, so give up trying to continue
112
+ # why-running.
113
+ a.block_action!
220
114
  end
221
115
  end
222
116
 
223
- # if you are using a tempfile before creating, you must
224
- # override the default with the tempfile, since the
225
- # file at @new_resource.path will not be updated on converge
226
- def update_new_file_state(path=@new_resource.path)
227
- if !::File.directory?(path)
228
- @new_resource.checksum(checksum(path))
229
- end
230
-
231
- if Chef::Platform.windows?
232
- # TODO: To work around CHEF-3554, add support for Windows
233
- # equivalent, or implicit resource reporting won't work for
234
- # Windows.
235
- return
236
- end
237
-
238
- stat = ::File.stat(path)
239
- @new_resource.owner(stat.uid)
240
- @new_resource.mode(stat.mode & 07777)
241
- @new_resource.group(stat.gid)
242
- end
243
-
244
117
  def action_create
245
- if !::File.exists?(@new_resource.path)
246
- description = []
247
- desc = "create new file #{@new_resource.path}"
248
- desc << " with content checksum #{short_cksum(new_resource_content_checksum)}" if new_resource.content
249
- description << desc
250
- description << diff_current_from_content(@new_resource.content)
251
-
252
- converge_by(description) do
253
- Chef::Log.info("entered create")
254
- ::File.open(@new_resource.path, "w+") {|f| f.write @new_resource.content }
255
- access_controls.set_all
256
- Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
257
- update_new_file_state
258
- end
259
- else
260
- set_content unless @new_resource.content.nil?
261
- set_all_access_controls
262
- end
263
- end
264
-
265
- def set_all_access_controls
266
- if access_controls.requires_changes?
267
- converge_by(access_controls.describe_changes) do
268
- access_controls.set_all
269
- #Update file state with new access values
270
- update_new_file_state
271
- end
272
- end
118
+ do_unlink
119
+ do_create_file
120
+ do_contents_changes
121
+ do_acl_changes
122
+ do_selinux
123
+ load_resource_attributes_from_file(@new_resource)
273
124
  end
274
125
 
275
126
  def action_create_if_missing
@@ -283,7 +134,7 @@ class Chef
283
134
  def action_delete
284
135
  if ::File.exists?(@new_resource.path)
285
136
  converge_by("delete file #{@new_resource.path}") do
286
- backup unless ::File.symlink?(@new_resource.path)
137
+ do_backup unless file_class.symlink?(@new_resource.path)
287
138
  ::File.delete(@new_resource.path)
288
139
  Chef::Log.info("#{@new_resource} deleted file at #{@new_resource.path}")
289
140
  end
@@ -299,53 +150,240 @@ class Chef
299
150
  end
300
151
  end
301
152
 
302
- def backup(file=nil)
303
- file ||= @new_resource.path
304
- if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(file)
305
- time = Time.now
306
- savetime = time.strftime("%Y%m%d%H%M%S")
307
- backup_filename = "#{@new_resource.path}.chef-#{savetime}"
308
- backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") #strip drive letter on Windows
309
- # if :file_backup_path is nil, we fallback to the old behavior of
310
- # keeping the backup in the same directory. We also need to to_s it
311
- # so we don't get a type error around implicit to_str conversions.
312
- prefix = Chef::Config[:file_backup_path].to_s
313
- backup_path = ::File.join(prefix, backup_filename)
314
- FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
315
- FileUtils.cp(file, backup_path, :preserve => true)
316
- Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
317
-
318
- # Clean up after the number of backups
319
- slice_number = @new_resource.backup
320
- backup_files = Dir[::File.join(prefix, ".#{@new_resource.path}.chef-*")].sort { |a,b| b <=> a }
321
- if backup_files.length >= @new_resource.backup
322
- remainder = backup_files.slice(slice_number..-1)
323
- remainder.each do |backup_to_delete|
324
- FileUtils.rm(backup_to_delete)
325
- Chef::Log.info("#{@new_resource} removed backup at #{backup_to_delete}")
153
+ # Implementation components *should* follow symlinks when managing access
154
+ # control (e.g., use chmod instead of lchmod even if the path we're
155
+ # managing is a symlink).
156
+ def manage_symlink_access?
157
+ false
158
+ end
159
+
160
+ private
161
+
162
+ # Handles resource requirements for action :create when some fs entry
163
+ # already exists at the destination path. For actions other than create,
164
+ # we don't care what kind of thing is at the destination path because:
165
+ # * for :create_if_missing, we're assuming the user wanted to avoid blowing away the non-file here
166
+ # * for :touch, we can modify perms of whatever is at this path, regardless of its type
167
+ # * for :delete, we can blow away whatever is here, regardless of its type
168
+ #
169
+ # For the action :create case, we need to deal with user-selectable
170
+ # behavior to see if we're in an error condition.
171
+ # * If there's no file at the destination path currently, we're cool to
172
+ # create it.
173
+ # * If the fs entry that currently exists at the destination is a regular
174
+ # file, we're cool to update it with new content.
175
+ # * If the fs entry is a symlink AND the resource has
176
+ # `manage_symlink_source` enabled, we need to verify that the symlink is
177
+ # a valid pointer to a real file. If it is, we can manage content and
178
+ # permissions on the symlink source, otherwise, error.
179
+ # * If `manage_symlink_source` is not enabled, fall through.
180
+ # * If force_unlink is true, action :create will unlink whatever is in the way.
181
+ # * If force_unlink is false, we're in an exceptional situation, so we
182
+ # want to error.
183
+ #
184
+ # Note that this method returns values to be used with requirement
185
+ # assertions, which then decide whether or not to raise or issue a
186
+ # warning for whyrun mode.
187
+ def inspect_existing_fs_entry
188
+ path = @new_resource.path
189
+
190
+ if !l_exist?(path)
191
+ [nil, nil, nil]
192
+ elsif real_file?(path)
193
+ [nil, nil, nil]
194
+ elsif file_class.symlink?(path) && @new_resource.manage_symlink_source
195
+ verify_symlink_sanity(path)
196
+ elsif file_class.symlink?(@new_resource.path) && @new_resource.manage_symlink_source.nil?
197
+ Chef::Log.warn("File #{path} managed by #{@new_resource} is really a symlink. Managing the source file instead.")
198
+ Chef::Log.warn("Disable this warning by setting `manage_symlink_source true` on the resource")
199
+ Chef::Log.warn("In a future Chef release, 'manage_symlink_source' will not be enabled by default")
200
+ verify_symlink_sanity(path)
201
+ elsif @new_resource.force_unlink
202
+ [nil, nil, nil]
203
+ else
204
+ [ Chef::Exceptions::FileTypeMismatch,
205
+ "File #{path} exists, but is a #{file_type_string(@new_resource.path)}, set force_unlink to true to remove",
206
+ "Assuming #{file_type_string(@new_resource.path)} at #{@new_resource.path} would have been removed by a previous resource"
207
+ ]
208
+ end
209
+ end
210
+
211
+ # Returns values suitable for use in a requirements assertion statement
212
+ # when managing symlink source. If we're managing symlink source we can
213
+ # hit 3 error cases:
214
+ # 1. Symlink to nowhere: File.realpath(symlink) -> raise Errno::ENOENT
215
+ # 2. Symlink loop: File.realpath(symlink) -> raise Errno::ELOOP
216
+ # 3. Symlink to not-a-real-file: File.realpath(symlink) -> (directory|blockdev|etc.)
217
+ # If any of the above apply, returns a 3-tuple of Exception class,
218
+ # exception message, whyrun message; otherwise returns a 3-tuple of nil.
219
+ def verify_symlink_sanity(path)
220
+ real_path = ::File.realpath(path)
221
+ if real_file?(real_path)
222
+ [nil, nil, nil]
223
+ else
224
+ [ Chef::Exceptions::FileTypeMismatch,
225
+ "File #{path} exists, but is a symlink to #{real_path} which is a #{file_type_string(real_path)}. " +
226
+ "Disable manage_symlink_source and set force_unlink to remove it.",
227
+ "Assuming symlink #{path} or source file #{real_path} would have been fixed by a previous resource"
228
+ ]
229
+ end
230
+ rescue Errno::ELOOP
231
+ [ Chef::Exceptions::InvalidSymlink,
232
+ "Symlink at #{path} (pointing to #{::File.readlink(path)}) exists but attempting to resolve it creates a loop",
233
+ "Assuming symlink loop would be fixed by a previous resource" ]
234
+ rescue Errno::ENOENT
235
+ [ Chef::Exceptions::InvalidSymlink,
236
+ "Symlink at #{path} (pointing to #{::File.readlink(path)}) exists but attempting to resolve it leads to a nonexistent file",
237
+ "Assuming symlink source would be created by a previous resource" ]
238
+ end
239
+
240
+
241
+ def content
242
+ @content ||= begin
243
+ load_current_resource if @current_resource.nil?
244
+ @content_class.new(@new_resource, @current_resource, @run_context)
245
+ end
246
+ end
247
+
248
+ def file_type_string(path)
249
+ case
250
+ when ::File.blockdev?(path)
251
+ "block device"
252
+ when ::File.chardev?(path)
253
+ "char device"
254
+ when ::File.directory?(path)
255
+ "directory"
256
+ when ::File.pipe?(path)
257
+ "pipe"
258
+ when ::File.socket?(path)
259
+ "socket"
260
+ when file_class.symlink?(path)
261
+ "symlink"
262
+ else
263
+ "unknown filetype"
264
+ end
265
+ end
266
+
267
+ def real_file?(path)
268
+ !file_class.symlink?(path) && ::File.file?(path)
269
+ end
270
+
271
+ # Similar to File.exist?, but also returns true in the case that the
272
+ # named file is a broken symlink.
273
+ def l_exist?(path)
274
+ ::File.exist?(path) || file_class.symlink?(path)
275
+ end
276
+
277
+ def unlink(path)
278
+ # Directories can not be unlinked. Remove them using FileUtils.
279
+ if ::File.directory?(path)
280
+ FileUtils.rm_rf(path)
281
+ else
282
+ ::File.unlink(path)
283
+ end
284
+ end
285
+
286
+ def do_unlink
287
+ @file_unlinked = false
288
+ if @new_resource.force_unlink
289
+ if !real_file?(@new_resource.path)
290
+ # unlink things that aren't normal files
291
+ description = "unlink #{file_type_string(@new_resource.path)} at #{@new_resource.path}"
292
+ converge_by(description) do
293
+ unlink(@new_resource.path)
326
294
  end
295
+ @current_resource.checksum = nil
296
+ @file_unlinked = true
327
297
  end
328
298
  end
329
299
  end
330
300
 
331
- def deploy_tempfile
332
- Tempfile.open(::File.basename(@new_resource.name)) do |tempfile|
333
- yield tempfile
301
+ def file_unlinked?
302
+ @file_unlinked == true
303
+ end
334
304
 
335
- temp_res = Chef::Resource::CookbookFile.new(@new_resource.name)
336
- temp_res.path(tempfile.path)
337
- ac = Chef::FileAccessControl.new(temp_res, @new_resource, self)
338
- ac.set_all!
339
- FileUtils.mv(tempfile.path, @new_resource.path)
305
+ def do_create_file
306
+ @file_created = false
307
+ if !::File.exists?(@new_resource.path) || file_unlinked?
308
+ converge_by("create new file #{@new_resource.path}") do
309
+ deployment_strategy.create(@new_resource.path)
310
+ Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
311
+ end
312
+ @file_created = true
340
313
  end
341
314
  end
342
315
 
343
- private
316
+ # do_contents_changes needs to know if do_create_file created a file or not
317
+ def file_created?
318
+ @file_created == true
319
+ end
344
320
 
345
- def managing_content?
346
- return true if @new_resource.checksum
347
- return true if !@new_resource.content.nil? && @action != :create_if_missing
348
- false
321
+ def do_backup(file = nil)
322
+ Chef::Util::Backup.new(@new_resource, file).backup!
323
+ end
324
+
325
+ def diff
326
+ @diff ||= Chef::Util::Diff.new
327
+ end
328
+
329
+ def update_file_contents
330
+ do_backup unless file_created?
331
+ deployment_strategy.deploy(tempfile.path, ::File.realpath(@new_resource.path))
332
+ Chef::Log.info("#{@new_resource} updated file contents #{@new_resource.path}")
333
+ @new_resource.checksum(checksum(@new_resource.path)) # for reporting
334
+ end
335
+
336
+ def do_contents_changes
337
+ # a nil tempfile is okay, means the resource has no content or no new content
338
+ return if tempfile.nil?
339
+ # but a tempfile that has no path or doesn't exist should not happen
340
+ if tempfile.path.nil? || !::File.exists?(tempfile.path)
341
+ raise "chef-client is confused, trying to deploy a file that has no path or does not exist..."
342
+ end
343
+ # 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
344
+ if ::File.file?(@new_resource.path) && contents_changed?
345
+ diff.diff(@current_resource.path, tempfile.path)
346
+ @new_resource.diff( diff.for_reporting ) unless file_created?
347
+ description = [ "update content in file #{@new_resource.path} from #{short_cksum(@current_resource.checksum)} to #{short_cksum(checksum(tempfile.path))}" ]
348
+ description << diff.for_output
349
+ converge_by(description) do
350
+ update_file_contents
351
+ end
352
+ end
353
+ # unlink necessary to clean up in why-run mode
354
+ tempfile.unlink
355
+ end
356
+
357
+ # This logic ideally will be made into some kind of generic
358
+ # platform-dependent post-converge hook for file-like
359
+ # resources, but for now we only have the single selinux use
360
+ # case.
361
+ def do_selinux(recursive = false)
362
+ if resource_updated? && Chef::Config[:enable_selinux_file_permission_fixup]
363
+ if selinux_enabled?
364
+ converge_by("restore selinux security context") do
365
+ restore_security_context(::File.realpath(@new_resource.path), recursive)
366
+ end
367
+ else
368
+ Chef::Log.debug "selinux utilities can not be found. Skipping selinux permission fixup."
369
+ end
370
+ end
371
+ end
372
+
373
+ def do_acl_changes
374
+ if access_controls.requires_changes?
375
+ converge_by(access_controls.describe_changes) do
376
+ access_controls.set_all
377
+ end
378
+ end
379
+ end
380
+
381
+ def contents_changed?
382
+ checksum(tempfile.path) != @current_resource.checksum
383
+ end
384
+
385
+ def tempfile
386
+ content.tempfile
349
387
  end
350
388
 
351
389
  def short_cksum(checksum)
@@ -353,9 +391,20 @@ class Chef
353
391
  checksum.slice(0,6)
354
392
  end
355
393
 
356
- def new_resource_content_checksum
357
- @new_resource.content && Digest::SHA2.hexdigest(@new_resource.content)
394
+ def load_resource_attributes_from_file(resource)
395
+
396
+ if Chef::Platform.windows?
397
+ # This is a work around for CHEF-3554.
398
+ # OC-6534: is tracking the real fix for this workaround.
399
+ # Add support for Windows equivalent, or implicit resource
400
+ # reporting won't work for Windows.
401
+ return
402
+ end
403
+ acl_scanner = ScanAccessControl.new(@new_resource, resource)
404
+ acl_scanner.set_all!
358
405
  end
406
+
359
407
  end
360
408
  end
361
409
  end
410
+