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

Sign up to get free protection for your applications and to get access to all the features.
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
+