chef 11.4.4 → 11.6.0.hotfix.1

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 (504) hide show
  1. data/README.md +1 -1
  2. data/Rakefile +18 -1
  3. data/bin/chef-service-manager +37 -0
  4. data/distro/common/html/chef-client.8.html +4 -4
  5. data/distro/common/html/chef-expander.8.html +4 -4
  6. data/distro/common/html/chef-expanderctl.8.html +4 -4
  7. data/distro/common/html/chef-server-webui.8.html +4 -4
  8. data/distro/common/html/chef-server.8.html +4 -4
  9. data/distro/common/html/chef-shell.1.html +4 -4
  10. data/distro/common/html/chef-solo.8.html +12 -18
  11. data/distro/common/html/chef-solr.8.html +4 -4
  12. data/distro/common/html/knife-bootstrap.1.html +4 -4
  13. data/distro/common/html/knife-client.1.html +4 -4
  14. data/distro/common/html/knife-configure.1.html +4 -4
  15. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  16. data/distro/common/html/knife-cookbook.1.html +7 -10
  17. data/distro/common/html/knife-data-bag.1.html +7 -10
  18. data/distro/common/html/knife-environment.1.html +6 -8
  19. data/distro/common/html/knife-exec.1.html +4 -4
  20. data/distro/common/html/knife-index.1.html +4 -4
  21. data/distro/common/html/knife-node.1.html +4 -4
  22. data/distro/common/html/knife-role.1.html +4 -4
  23. data/distro/common/html/knife-search.1.html +4 -4
  24. data/distro/common/html/knife-ssh.1.html +4 -4
  25. data/distro/common/html/knife-status.1.html +4 -4
  26. data/distro/common/html/knife-tag.1.html +4 -4
  27. data/distro/common/html/knife.1.html +4 -4
  28. data/distro/common/man/man1/chef-shell.1 +1 -1
  29. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  30. data/distro/common/man/man1/knife-client.1 +1 -1
  31. data/distro/common/man/man1/knife-configure.1 +1 -1
  32. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  33. data/distro/common/man/man1/knife-cookbook.1 +2 -15
  34. data/distro/common/man/man1/knife-data-bag.1 +2 -15
  35. data/distro/common/man/man1/knife-environment.1 +2 -12
  36. data/distro/common/man/man1/knife-exec.1 +1 -1
  37. data/distro/common/man/man1/knife-index.1 +1 -1
  38. data/distro/common/man/man1/knife-node.1 +1 -1
  39. data/distro/common/man/man1/knife-role.1 +1 -1
  40. data/distro/common/man/man1/knife-search.1 +1 -1
  41. data/distro/common/man/man1/knife-ssh.1 +1 -1
  42. data/distro/common/man/man1/knife-status.1 +1 -1
  43. data/distro/common/man/man1/knife-tag.1 +1 -1
  44. data/distro/common/man/man1/knife.1 +1 -1
  45. data/distro/common/man/man8/chef-client.8 +1 -1
  46. data/distro/common/man/man8/chef-expander.8 +1 -1
  47. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  48. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  49. data/distro/common/man/man8/chef-server.8 +1 -1
  50. data/distro/common/man/man8/chef-solo.8 +4 -36
  51. data/distro/common/man/man8/chef-solr.8 +1 -1
  52. data/distro/debian/etc/init.d/chef-client +4 -2
  53. data/distro/windows/service_manager.rb +2 -146
  54. data/lib/chef.rb +1 -1
  55. data/lib/chef/application.rb +5 -12
  56. data/lib/chef/application/apply.rb +2 -0
  57. data/lib/chef/application/client.rb +12 -12
  58. data/lib/chef/application/knife.rb +2 -2
  59. data/lib/chef/application/solo.rb +4 -5
  60. data/lib/chef/application/windows_service.rb +113 -56
  61. data/lib/chef/application/windows_service_manager.rb +179 -0
  62. data/lib/chef/chef_fs.rb +2 -4
  63. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  64. data/lib/chef/chef_fs/command_line.rb +145 -93
  65. data/lib/chef/chef_fs/config.rb +205 -0
  66. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  67. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  68. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  69. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  70. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  71. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  72. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  73. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  74. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  75. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  76. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  77. data/lib/chef/chef_fs/file_system.rb +195 -127
  78. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  79. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  80. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  81. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  82. data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
  83. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  84. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  85. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  86. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  87. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
  88. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
  89. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
  90. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
  91. data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
  92. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  94. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
  95. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
  96. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
  97. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  98. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  99. data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
  100. data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
  101. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  102. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  103. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  104. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  105. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
  106. data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
  107. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  108. data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
  109. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  110. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  111. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
  112. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
  113. data/lib/chef/chef_fs/knife.rb +68 -29
  114. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  115. data/lib/chef/chef_fs/path_utils.rb +29 -3
  116. data/lib/chef/chef_fs/raw_request.rb +79 -0
  117. data/lib/chef/client.rb +46 -20
  118. data/lib/chef/config.rb +59 -61
  119. data/lib/chef/cookbook/chefignore.rb +2 -1
  120. data/lib/chef/cookbook/synchronizer.rb +8 -6
  121. data/lib/chef/cookbook/syntax_check.rb +17 -2
  122. data/lib/chef/cookbook_uploader.rb +10 -1
  123. data/lib/chef/cookbook_version.rb +0 -109
  124. data/lib/chef/data_bag.rb +15 -6
  125. data/lib/chef/deprecation/mixin/template.rb +49 -0
  126. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  127. data/lib/chef/deprecation/provider/file.rb +197 -0
  128. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  129. data/lib/chef/deprecation/provider/template.rb +63 -0
  130. data/lib/chef/deprecation/warnings.rb +38 -0
  131. data/lib/chef/encrypted_data_bag_item.rb +153 -61
  132. data/lib/chef/environment.rb +34 -3
  133. data/lib/chef/event_dispatch/base.rb +3 -0
  134. data/lib/chef/exceptions.rb +27 -2
  135. data/lib/chef/file_access_control/unix.rb +64 -7
  136. data/lib/chef/file_access_control/windows.rb +22 -11
  137. data/lib/chef/file_content_management/content_base.rb +56 -0
  138. data/lib/chef/file_content_management/deploy.rb +38 -0
  139. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  140. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  141. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  142. data/lib/chef/file_content_management/tempfile.rb +61 -0
  143. data/lib/chef/formatters/doc.rb +1 -1
  144. data/lib/chef/formatters/error_descriptor.rb +5 -4
  145. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  146. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
  147. data/lib/chef/json_compat.rb +3 -0
  148. data/lib/chef/knife.rb +12 -3
  149. data/lib/chef/knife/bootstrap.rb +46 -2
  150. data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
  151. data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
  152. data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
  153. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
  154. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
  155. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
  156. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
  157. data/lib/chef/knife/client_show.rb +2 -5
  158. data/lib/chef/knife/configure.rb +3 -3
  159. data/lib/chef/knife/cookbook_create.rb +6 -5
  160. data/lib/chef/knife/cookbook_download.rb +13 -5
  161. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  162. data/lib/chef/knife/cookbook_test.rb +1 -0
  163. data/lib/chef/knife/cookbook_upload.rb +4 -9
  164. data/lib/chef/knife/core/bootstrap_context.rb +10 -4
  165. data/lib/chef/knife/core/generic_presenter.rb +16 -0
  166. data/lib/chef/knife/core/node_editor.rb +1 -1
  167. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  168. data/lib/chef/knife/core/ui.rb +19 -4
  169. data/lib/chef/knife/delete.rb +76 -9
  170. data/lib/chef/knife/deps.rb +139 -0
  171. data/lib/chef/knife/diff.rb +22 -5
  172. data/lib/chef/knife/download.rb +16 -3
  173. data/lib/chef/knife/edit.rb +76 -0
  174. data/lib/chef/knife/environment_show.rb +2 -7
  175. data/lib/chef/knife/list.rb +91 -47
  176. data/lib/chef/knife/node_run_list_set.rb +66 -0
  177. data/lib/chef/knife/node_show.rb +1 -7
  178. data/lib/chef/knife/raw.rb +20 -64
  179. data/lib/chef/knife/role_show.rb +2 -4
  180. data/lib/chef/knife/search.rb +5 -6
  181. data/lib/chef/knife/show.rb +34 -11
  182. data/lib/chef/knife/ssh.rb +8 -0
  183. data/lib/chef/knife/upload.rb +23 -4
  184. data/lib/chef/knife/user_show.rb +2 -5
  185. data/lib/chef/knife/xargs.rb +265 -0
  186. data/lib/chef/log.rb +2 -2
  187. data/lib/chef/mixin/file_class.rb +0 -9
  188. data/lib/chef/mixin/language_include_recipe.rb +1 -1
  189. data/lib/chef/mixin/params_validate.rb +19 -9
  190. data/lib/chef/mixin/template.rb +126 -36
  191. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  192. data/lib/chef/monkey_patches/file.rb +26 -0
  193. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  194. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  195. data/lib/chef/monologger.rb +93 -0
  196. data/lib/chef/node.rb +4 -0
  197. data/lib/chef/platform.rb +4 -490
  198. data/lib/chef/platform/provider_mapping.rb +529 -0
  199. data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
  200. data/lib/chef/provider.rb +12 -9
  201. data/lib/chef/provider/batch.rb +35 -0
  202. data/lib/chef/provider/cookbook_file.rb +9 -78
  203. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  204. data/lib/chef/provider/deploy.rb +24 -20
  205. data/lib/chef/provider/deploy/revision.rb +27 -0
  206. data/lib/chef/provider/directory.rb +19 -22
  207. data/lib/chef/provider/execute.rb +22 -5
  208. data/lib/chef/provider/file.rb +299 -217
  209. data/lib/chef/provider/file/content.rb +39 -0
  210. data/lib/chef/provider/git.rb +76 -43
  211. data/lib/chef/provider/group/usermod.rb +2 -2
  212. data/lib/chef/provider/ifconfig.rb +25 -35
  213. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  214. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  215. data/lib/chef/provider/link.rb +10 -3
  216. data/lib/chef/provider/mount.rb +1 -1
  217. data/lib/chef/provider/mount/mount.rb +8 -3
  218. data/lib/chef/provider/mount/windows.rb +4 -1
  219. data/lib/chef/provider/package/portage.rb +9 -4
  220. data/lib/chef/provider/package/rubygems.rb +45 -10
  221. data/lib/chef/provider/package/smartos.rb +47 -36
  222. data/lib/chef/provider/package/yum.rb +19 -12
  223. data/lib/chef/provider/package/zypper.rb +45 -55
  224. data/lib/chef/provider/powershell_script.rb +77 -0
  225. data/lib/chef/provider/remote_directory.rb +5 -6
  226. data/lib/chef/provider/remote_file.rb +12 -108
  227. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  228. data/lib/chef/provider/remote_file/content.rb +75 -0
  229. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  230. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  231. data/lib/chef/provider/remote_file/http.rb +124 -0
  232. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  233. data/lib/chef/provider/route.rb +6 -2
  234. data/lib/chef/provider/script.rb +14 -2
  235. data/lib/chef/provider/service/macosx.rb +16 -10
  236. data/lib/chef/provider/service/solaris.rb +6 -5
  237. data/lib/chef/provider/template.rb +16 -78
  238. data/lib/chef/provider/template/content.rb +61 -0
  239. data/lib/chef/provider/user/solaris.rb +90 -0
  240. data/lib/chef/provider/user/useradd.rb +76 -63
  241. data/lib/chef/provider/windows_script.rb +73 -0
  242. data/lib/chef/providers.rb +16 -0
  243. data/lib/chef/resource.rb +23 -2
  244. data/lib/chef/resource/batch.rb +31 -0
  245. data/lib/chef/resource/conditional.rb +4 -0
  246. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  247. data/lib/chef/resource/file.rb +31 -3
  248. data/lib/chef/resource/link.rb +17 -0
  249. data/lib/chef/resource/lwrp_base.rb +1 -1
  250. data/lib/chef/resource/mount.rb +29 -2
  251. data/lib/chef/resource/powershell_script.rb +31 -0
  252. data/lib/chef/resource/remote_file.rb +47 -1
  253. data/lib/chef/resource/route.rb +1 -1
  254. data/lib/chef/resource/template.rb +145 -0
  255. data/lib/chef/resource/windows_script.rb +62 -0
  256. data/lib/chef/resource_collection.rb +45 -11
  257. data/lib/chef/resource_reporter.rb +81 -52
  258. data/lib/chef/resources.rb +2 -0
  259. data/lib/chef/rest.rb +13 -4
  260. data/lib/chef/rest/rest_request.rb +5 -1
  261. data/lib/chef/run_context/cookbook_compiler.rb +3 -3
  262. data/lib/chef/run_list/run_list_expansion.rb +1 -1
  263. data/lib/chef/run_lock.rb +7 -1
  264. data/lib/chef/runner.rb +0 -1
  265. data/lib/chef/scan_access_control.rb +6 -1
  266. data/lib/chef/search/query.rb +2 -2
  267. data/lib/chef/shell/shell_session.rb +2 -2
  268. data/lib/chef/util/backup.rb +84 -0
  269. data/lib/chef/util/diff.rb +145 -0
  270. data/lib/chef/util/file_edit.rb +1 -1
  271. data/lib/chef/util/selinux.rb +100 -0
  272. data/lib/chef/util/windows/net_user.rb +14 -1
  273. data/lib/chef/util/windows/volume.rb +2 -2
  274. data/lib/chef/version.rb +1 -1
  275. data/lib/chef/version/platform.rb +42 -0
  276. data/lib/chef/version_class.rb +1 -1
  277. data/lib/chef/version_constraint.rb +6 -5
  278. data/lib/chef/version_constraint/platform.rb +26 -0
  279. data/lib/chef/win32/api/file.rb +8 -2
  280. data/lib/chef/win32/version.rb +25 -8
  281. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  282. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  283. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  284. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  285. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  286. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  287. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  288. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  289. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  290. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  291. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  292. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  293. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  294. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  295. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  296. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  297. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  298. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  299. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  300. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  301. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  302. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  303. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  304. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  305. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  306. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  307. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  308. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  309. data/spec/data/apt/var/www/apt/db/version +4 -0
  310. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  311. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  312. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  313. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  314. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  315. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  316. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  317. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  318. data/spec/data/bootstrap/secret.erb +9 -0
  319. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  320. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  321. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  322. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  323. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  324. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  325. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  326. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  327. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  328. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  329. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  330. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  331. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  332. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  333. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  334. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  335. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  336. data/spec/data/null_config.rb +1 -0
  337. data/spec/data/partial_one.erb +1 -1
  338. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  339. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  340. data/spec/functional/knife/exec_spec.rb +2 -2
  341. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  342. data/spec/functional/resource/batch_spec.rb +64 -0
  343. data/spec/functional/resource/cookbook_file_spec.rb +2 -3
  344. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  345. data/spec/functional/resource/directory_spec.rb +2 -2
  346. data/spec/functional/resource/file_spec.rb +17 -1
  347. data/spec/functional/resource/git_spec.rb +259 -0
  348. data/spec/functional/resource/link_spec.rb +422 -388
  349. data/spec/functional/resource/package_spec.rb +297 -0
  350. data/spec/functional/resource/powershell_spec.rb +188 -0
  351. data/spec/functional/resource/registry_spec.rb +8 -4
  352. data/spec/functional/resource/remote_directory_spec.rb +2 -2
  353. data/spec/functional/resource/remote_file_spec.rb +97 -29
  354. data/spec/functional/resource/template_spec.rb +173 -17
  355. data/spec/functional/resource/user_spec.rb +547 -0
  356. data/spec/functional/run_lock_spec.rb +5 -0
  357. data/spec/functional/shell_spec.rb +2 -1
  358. data/spec/functional/win32/service_manager_spec.rb +269 -0
  359. data/spec/functional/win32/versions_spec.rb +78 -0
  360. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  361. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  362. data/spec/integration/knife/chefignore_spec.rb +271 -0
  363. data/spec/integration/knife/delete_spec.rb +944 -0
  364. data/spec/integration/knife/deps_spec.rb +648 -0
  365. data/spec/integration/knife/diff_spec.rb +536 -0
  366. data/spec/integration/knife/download_spec.rb +962 -0
  367. data/spec/integration/knife/list_spec.rb +633 -0
  368. data/spec/integration/knife/raw_spec.rb +166 -0
  369. data/spec/integration/knife/redirection_spec.rb +57 -0
  370. data/spec/integration/knife/show_spec.rb +158 -0
  371. data/spec/integration/knife/upload_spec.rb +1060 -0
  372. data/spec/integration/solo/solo_spec.rb +41 -0
  373. data/spec/spec_helper.rb +55 -1
  374. data/spec/support/chef_helpers.rb +32 -0
  375. data/spec/support/platform_helpers.rb +40 -0
  376. data/spec/support/platforms/win32/spec_service.rb +59 -0
  377. data/spec/support/shared/functional/directory_resource.rb +43 -16
  378. data/spec/support/shared/functional/file_resource.rb +661 -20
  379. data/spec/support/shared/functional/securable_resource.rb +109 -8
  380. data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
  381. data/spec/support/shared/integration/integration_helper.rb +166 -0
  382. data/spec/support/shared/integration/knife_support.rb +171 -0
  383. data/spec/support/shared/unit/execute_resource.rb +125 -0
  384. data/spec/support/shared/unit/file_system_support.rb +8 -48
  385. data/spec/support/shared/unit/provider/file.rb +609 -0
  386. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  387. data/spec/support/shared/unit/script_resource.rb +52 -0
  388. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  389. data/spec/tiny_server.rb +13 -11
  390. data/spec/unit/application/client_spec.rb +39 -1
  391. data/spec/unit/application/knife_spec.rb +12 -0
  392. data/spec/unit/application/solo_spec.rb +1 -1
  393. data/spec/unit/application_spec.rb +57 -2
  394. data/spec/unit/chef_fs/diff_spec.rb +30 -31
  395. data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
  396. data/spec/unit/chef_fs/file_system_spec.rb +2 -3
  397. data/spec/unit/client_spec.rb +20 -1
  398. data/spec/unit/config_spec.rb +70 -52
  399. data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
  400. data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
  401. data/spec/unit/cookbook_loader_spec.rb +3 -2
  402. data/spec/unit/daemon_spec.rb +7 -7
  403. data/spec/unit/data_bag_spec.rb +7 -0
  404. data/spec/unit/deprecation_spec.rb +86 -0
  405. data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
  406. data/spec/unit/environment_spec.rb +98 -0
  407. data/spec/unit/exceptions_spec.rb +6 -1
  408. data/spec/unit/file_access_control_spec.rb +21 -1
  409. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  410. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  411. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  412. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  413. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
  414. data/spec/unit/knife/bootstrap_spec.rb +128 -29
  415. data/spec/unit/knife/configure_spec.rb +42 -26
  416. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  417. data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
  418. data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
  419. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  420. data/spec/unit/knife/core/ui_spec.rb +41 -0
  421. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  422. data/spec/unit/knife_spec.rb +21 -0
  423. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
  424. data/spec/unit/mixin/params_validate_spec.rb +35 -0
  425. data/spec/unit/mixin/template_spec.rb +69 -57
  426. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  427. data/spec/unit/node_spec.rb +7 -0
  428. data/spec/unit/platform_spec.rb +15 -1
  429. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  430. data/spec/unit/provider/cookbook_file_spec.rb +26 -183
  431. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  432. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  433. data/spec/unit/provider/deploy_spec.rb +2 -2
  434. data/spec/unit/provider/directory_spec.rb +23 -23
  435. data/spec/unit/provider/execute_spec.rb +27 -1
  436. data/spec/unit/provider/file/content_spec.rb +101 -0
  437. data/spec/unit/provider/file_spec.rb +25 -484
  438. data/spec/unit/provider/git_spec.rb +224 -28
  439. data/spec/unit/provider/group/usermod_spec.rb +3 -1
  440. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  441. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  442. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  443. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  444. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  445. data/spec/unit/provider/mount_spec.rb +16 -6
  446. data/spec/unit/provider/package/portage_spec.rb +44 -0
  447. data/spec/unit/provider/package/rubygems_spec.rb +44 -1
  448. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  449. data/spec/unit/provider/package/yum_spec.rb +36 -39
  450. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  451. data/spec/unit/provider/package_spec.rb +0 -4
  452. data/spec/unit/provider/powershell_spec.rb +38 -0
  453. data/spec/unit/provider/remote_directory_spec.rb +0 -4
  454. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  455. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  456. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  457. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  458. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  459. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  460. data/spec/unit/provider/remote_file_spec.rb +33 -295
  461. data/spec/unit/provider/route_spec.rb +25 -9
  462. data/spec/unit/provider/service/macosx_spec.rb +176 -152
  463. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  464. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  465. data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
  466. data/spec/unit/provider/service_spec.rb +3 -3
  467. data/spec/unit/provider/template/content_spec.rb +78 -0
  468. data/spec/unit/provider/template_spec.rb +52 -184
  469. data/spec/unit/provider/user/solaris_spec.rb +80 -0
  470. data/spec/unit/provider/user/useradd_spec.rb +12 -358
  471. data/spec/unit/resource/batch_spec.rb +48 -0
  472. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  473. data/spec/unit/resource/execute_spec.rb +3 -101
  474. data/spec/unit/resource/file_spec.rb +0 -5
  475. data/spec/unit/resource/group_spec.rb +9 -0
  476. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  477. data/spec/unit/resource/link_spec.rb +1 -0
  478. data/spec/unit/resource/mount_spec.rb +37 -0
  479. data/spec/unit/resource/powershell_spec.rb +48 -0
  480. data/spec/unit/resource/remote_file_spec.rb +44 -4
  481. data/spec/unit/resource/route_spec.rb +1 -1
  482. data/spec/unit/resource/script_spec.rb +13 -36
  483. data/spec/unit/resource/template_spec.rb +111 -8
  484. data/spec/unit/resource/user_spec.rb +7 -0
  485. data/spec/unit/resource_collection_spec.rb +61 -32
  486. data/spec/unit/resource_reporter_spec.rb +115 -102
  487. data/spec/unit/resource_spec.rb +170 -1
  488. data/spec/unit/rest/auth_credentials_spec.rb +2 -2
  489. data/spec/unit/rest_spec.rb +6 -2
  490. data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
  491. data/spec/unit/runner_spec.rb +1 -1
  492. data/spec/unit/scan_access_control_spec.rb +4 -2
  493. data/spec/unit/shell/shell_session_spec.rb +15 -2
  494. data/spec/unit/util/backup_spec.rb +149 -0
  495. data/spec/unit/util/diff_spec.rb +596 -0
  496. data/spec/unit/util/selinux_spec.rb +172 -0
  497. data/spec/unit/version/platform_spec.rb +61 -0
  498. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  499. data/spec/unit/version_constraint_spec.rb +5 -0
  500. metadata +233 -10
  501. data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
  502. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
  503. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
  504. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
@@ -24,12 +24,18 @@ class Chef
24
24
  class Macosx < Chef::Provider::Service::Simple
25
25
  include Chef::Mixin::ShellOut
26
26
 
27
- PLIST_DIRS = %w{~/Library/LaunchAgents
28
- /Library/LaunchAgents
27
+ def self.gather_plist_dirs
28
+ locations = %w{/Library/LaunchAgents
29
29
  /Library/LaunchDaemons
30
30
  /System/Library/LaunchAgents
31
31
  /System/Library/LaunchDaemons }
32
32
 
33
+ locations << "#{ENV['HOME']}/Library/LaunchAgents" if ENV['HOME']
34
+ locations
35
+ end
36
+
37
+ PLIST_DIRS = gather_plist_dirs
38
+
33
39
  def load_current_resource
34
40
  @current_resource = Chef::Resource::Service.new(@new_resource.name)
35
41
  @current_resource.service_name(@new_resource.service_name)
@@ -42,28 +48,28 @@ class Chef
42
48
 
43
49
  def define_resource_requirements
44
50
  #super
45
- requirements.assert(:enable) do |a|
51
+ requirements.assert(:enable) do |a|
46
52
  a.failure_message Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :enable"
47
53
  end
48
54
 
49
- requirements.assert(:disable) do |a|
55
+ requirements.assert(:disable) do |a|
50
56
  a.failure_message Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :disable"
51
57
  end
52
58
 
53
- requirements.assert(:reload) do |a|
59
+ requirements.assert(:reload) do |a|
54
60
  a.failure_message Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :reload"
55
61
  end
56
62
 
57
- requirements.assert(:all_actions) do |a|
58
- a.assertion { @plist_size < 2 }
63
+ requirements.assert(:all_actions) do |a|
64
+ a.assertion { @plist_size < 2 }
59
65
  a.failure_message Chef::Exceptions::Service, "Several plist files match service name. Please use full service name."
60
66
  end
61
67
 
62
- requirements.assert(:all_actions) do |a|
63
- a.assertion { @plist_size > 0 }
68
+ requirements.assert(:all_actions) do |a|
69
+ a.assertion { @plist_size > 0 }
64
70
  # No failrue here in original code - so we also will not
65
71
  # fail. Instead warn that the service is potentially missing
66
- a.whyrun "Assuming that the service would have been previously installed and is currently disabled." do
72
+ a.whyrun "Assuming that the service would have been previously installed and is currently disabled." do
67
73
  @current_resource.enabled(false)
68
74
  @current_resource.running(false)
69
75
  end
@@ -16,6 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require 'chef/mixin/shell_out'
19
20
  require 'chef/provider/service'
20
21
  require 'chef/mixin/command'
21
22
 
@@ -23,6 +24,7 @@ class Chef
23
24
  class Provider
24
25
  class Service
25
26
  class Solaris < Chef::Provider::Service
27
+ include Chef::Mixin::ShellOut
26
28
 
27
29
  def initialize(new_resource, run_context=nil)
28
30
  super
@@ -42,23 +44,22 @@ class Chef
42
44
  end
43
45
 
44
46
  def enable_service
45
- run_command(:command => "#{default_init_command} enable #{@new_resource.service_name}")
46
- return service_status.enabled
47
+ shell_out!("#{default_init_command} enable -s #{@new_resource.service_name}")
47
48
  end
48
49
 
49
50
  def disable_service
50
- run_command(:command => "#{default_init_command} disable #{@new_resource.service_name}")
51
- return service_status.enabled
51
+ shell_out!("#{default_init_command} disable -s #{@new_resource.service_name}")
52
52
  end
53
53
 
54
54
  alias_method :stop_service, :disable_service
55
55
  alias_method :start_service, :enable_service
56
56
 
57
57
  def reload_service
58
- run_command(:command => "#{default_init_command} refresh #{@new_resource.service_name}")
58
+ shell_out!("#{default_init_command} refresh #{@new_resource.service_name}")
59
59
  end
60
60
 
61
61
  def restart_service
62
+ ## svcadm restart doesn't supports sync(-s) option
62
63
  disable_service
63
64
  return enable_service
64
65
  end
@@ -19,18 +19,22 @@
19
19
 
20
20
  require 'chef/provider/template_finder'
21
21
  require 'chef/provider/file'
22
- require 'chef/mixin/template'
23
- require 'chef/mixin/checksum'
24
- require 'chef/file_access_control'
22
+ require 'chef/deprecation/provider/template'
23
+ require 'chef/deprecation/warnings'
24
+
25
25
 
26
26
  class Chef
27
27
  class Provider
28
-
29
28
  class Template < Chef::Provider::File
30
29
 
31
- include Chef::Mixin::EnforceOwnershipAndPermissions
32
- include Chef::Mixin::Checksum
33
- include Chef::Mixin::Template
30
+ extend Chef::Deprecation::Warnings
31
+ include Chef::Deprecation::Provider::Template
32
+ add_deprecation_warnings_for(Chef::Deprecation::Provider::Template.instance_methods)
33
+
34
+ def initialize(new_resource, run_context)
35
+ @content_class = Chef::Provider::Template::Content
36
+ super
37
+ end
34
38
 
35
39
  def load_current_resource
36
40
  @current_resource = Chef::Resource::Template.new(@new_resource.name)
@@ -40,81 +44,15 @@ class Chef
40
44
  def define_resource_requirements
41
45
  super
42
46
 
43
- requirements.assert(:create, :create_if_missing) do |a|
44
- a.assertion { ::File::exist?(template_location) }
45
- a.failure_message "Template source #{template_location} could not be found."
46
- a.whyrun "Template source #{template_location} does not exist. Assuming it would have been created."
47
+ requirements.assert(:create, :create_if_missing) do |a|
48
+ a.assertion { ::File::exists?(content.template_location) }
49
+ a.failure_message "Template source #{content.template_location} could not be found."
50
+ a.whyrun "Template source #{content.template_location} does not exist. Assuming it would have been created."
47
51
  a.block_action!
48
52
  end
49
53
  end
50
54
 
51
- def action_create
52
- render_with_context(template_location) do |rendered_template|
53
- rendered(rendered_template)
54
- if file_already_exists? && content_matches?
55
- Chef::Log.debug("#{@new_resource} content has not changed.")
56
- set_all_access_controls
57
- update_new_file_state(@new_resource.path)
58
- else
59
- description = []
60
- action_message = if file_already_exists?
61
- "update #{@current_resource} from #{short_cksum(@current_resource.checksum)} to #{short_cksum(@new_resource.checksum)}"
62
- else
63
- "create #{@new_resource}"
64
- end
65
- description << action_message
66
- description << diff_current(rendered_template.path)
67
- converge_by(description) do
68
- backup
69
- FileUtils.cp(rendered_template.path, @new_resource.path)
70
- Chef::Log.info("#{@new_resource} updated content")
71
- access_controls.set_all!
72
- update_new_file_state(@new_resource.path)
73
- end
74
- end
75
- end
76
- end
77
-
78
- def template_finder
79
- @template_finder ||= begin
80
- TemplateFinder.new(run_context, cookbook_name, node)
81
- end
82
- end
83
-
84
- def template_location
85
- @template_file_cache_location ||= begin
86
- template_finder.find(@new_resource.source, :local => @new_resource.local, :cookbook => @new_resource.cookbook)
87
- end
88
- end
89
-
90
- def resource_cookbook
91
- @new_resource.cookbook || @new_resource.cookbook_name
92
- end
93
-
94
- def rendered(rendered_template)
95
- @new_resource.checksum(checksum(rendered_template.path))
96
- Chef::Log.debug("Current content's checksum: #{@current_resource.checksum}")
97
- Chef::Log.debug("Rendered content's checksum: #{@new_resource.checksum}")
98
- end
99
-
100
- def content_matches?
101
- @current_resource.checksum == @new_resource.checksum
102
- end
103
-
104
- private
105
-
106
- def file_already_exists?
107
- ::File.exist?(@new_resource.path)
108
- end
109
-
110
- def render_with_context(template_location, &block)
111
- context = {}
112
- context.merge!(@new_resource.variables)
113
- context[:node] = node
114
- context[:template_finder] = template_finder
115
- render_template(IO.read(template_location), context, &block)
116
- end
117
-
118
55
  end
119
56
  end
120
57
  end
58
+
@@ -0,0 +1,61 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/mixin/template'
20
+ require 'chef/file_content_management/content_base'
21
+
22
+ class Chef
23
+ class Provider
24
+ class Template
25
+
26
+ class Content < Chef::FileContentManagement::ContentBase
27
+
28
+ include Chef::Mixin::Template
29
+
30
+ def template_location
31
+ @template_file_cache_location ||= begin
32
+ template_finder.find(@new_resource.source, :local => @new_resource.local, :cookbook => @new_resource.cookbook)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def file_for_provider
39
+ context = TemplateContext.new(@new_resource.variables)
40
+ context[:node] = @run_context.node
41
+ context[:template_finder] = template_finder
42
+ context._extend_modules(@new_resource.helper_modules)
43
+ output = context.render_template(template_location)
44
+
45
+ tempfile = Tempfile.open("chef-rendered-template")
46
+ tempfile.binmode
47
+ tempfile.write(output)
48
+ tempfile.close
49
+ tempfile
50
+ end
51
+
52
+ def template_finder
53
+ @template_finder ||= begin
54
+ TemplateFinder.new(run_context, @new_resource.cookbook_name, @run_context.node)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,90 @@
1
+ #
2
+ # Author:: Stephen Nelson-Smith (<sns@opscode.com>)
3
+ # Author:: Jon Ramsey (<jonathon.ramsey@gmail.com>)
4
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ class Chef
20
+ class Provider
21
+ class User
22
+ class Solaris < Chef::Provider::User::Useradd
23
+ UNIVERSAL_OPTIONS = [[:comment, "-c"], [:gid, "-g"], [:shell, "-s"], [:uid, "-u"]]
24
+
25
+ attr_writer :password_file
26
+
27
+ def initialize(new_resource, run_context)
28
+ @password_file = "/etc/shadow"
29
+ super
30
+ end
31
+
32
+ def create_user
33
+ super
34
+ manage_password
35
+ end
36
+
37
+ def manage_user
38
+ manage_password
39
+ super
40
+ end
41
+
42
+ private
43
+
44
+ def manage_password
45
+ if @current_resource.password != @new_resource.password && @new_resource.password
46
+ Chef::Log.debug("#{@new_resource} setting password to #{@new_resource.password}")
47
+ write_shadow_file
48
+ end
49
+ end
50
+
51
+ def write_shadow_file
52
+ buffer = Tempfile.new("shadow", "/etc")
53
+ ::File.open(@password_file) do |shadow_file|
54
+ shadow_file.each do |entry|
55
+ user = entry.split(":").first
56
+ if user == @new_resource.username
57
+ buffer.write(updated_password(entry))
58
+ else
59
+ buffer.write(entry)
60
+ end
61
+ end
62
+ end
63
+ buffer.close
64
+
65
+ # FIXME: mostly duplicates code with file provider deploying a file
66
+ mode = ::File.stat(@password_file).mode & 07777
67
+ uid = ::File.stat(@password_file).uid
68
+ gid = ::File.stat(@password_file).gid
69
+
70
+ FileUtils.chown uid, gid, buffer.path
71
+ FileUtils.chmod mode, buffer.path
72
+
73
+ FileUtils.mv buffer.path, @password_file
74
+ end
75
+
76
+ def updated_password(entry)
77
+ fields = entry.split(":")
78
+ fields[1] = @new_resource.password
79
+ fields[2] = days_since_epoch
80
+ fields.join(":")
81
+ end
82
+
83
+ def days_since_epoch
84
+ (Time.now.to_i / 86400).floor
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,111 +17,124 @@
17
17
  #
18
18
 
19
19
  require 'pathname'
20
+ require 'chef/mixin/shell_out'
20
21
  require 'chef/provider/user'
21
22
 
22
23
  class Chef
23
24
  class Provider
24
- class User
25
+ class User
25
26
  class Useradd < Chef::Provider::User
27
+
28
+ include Chef::Mixin::ShellOut
29
+
26
30
  UNIVERSAL_OPTIONS = [[:comment, "-c"], [:gid, "-g"], [:password, "-p"], [:shell, "-s"], [:uid, "-u"]]
27
31
 
28
32
  def create_user
29
33
  command = compile_command("useradd") do |useradd|
30
- useradd << universal_options
31
- useradd << useradd_options
34
+ useradd.concat(universal_options)
35
+ useradd.concat(useradd_options)
32
36
  end
33
- run_command(:command => command)
37
+ shell_out!(*command)
34
38
  end
35
-
39
+
36
40
  def manage_user
37
- command = compile_command("usermod") do |u|
38
- u << universal_options
41
+ if universal_options != ""
42
+ command = compile_command("usermod") do |u|
43
+ u.concat(universal_options)
44
+ end
45
+ shell_out!(*command)
39
46
  end
40
- run_command(:command => command)
41
47
  end
42
-
48
+
43
49
  def remove_user
44
- command = "userdel"
45
- command << " -r" if managing_home_dir?
46
- command << " #{@new_resource.username}"
47
- run_command(:command => command)
50
+ command = [ "userdel" ]
51
+ command << "-r" if managing_home_dir?
52
+ command << new_resource.username
53
+ shell_out!(*command)
48
54
  end
49
-
55
+
50
56
  def check_lock
51
- status = popen4("passwd -S #{@new_resource.username}") do |pid, stdin, stdout, stderr|
52
- status_line = stdout.gets.split(' ')
53
- case status_line[1]
54
- when /^P/
55
- @locked = false
56
- when /^N/
57
- @locked = false
58
- when /^L/
59
- @locked = true
60
- end
57
+ # we can get an exit code of 1 even when it's successful on
58
+ # rhel/centos (redhat bug 578534). See additional error checks below.
59
+ passwd_s = shell_out!("passwd", "-S", new_resource.username, :returns => [0,1])
60
+ status_line = passwd_s.stdout.split(' ')
61
+ case status_line[1]
62
+ when /^P/
63
+ @locked = false
64
+ when /^N/
65
+ @locked = false
66
+ when /^L/
67
+ @locked = true
61
68
  end
62
69
 
63
- unless status.exitstatus == 0
70
+ unless passwd_s.exitstatus == 0
64
71
  raise_lock_error = false
65
- # we can get an exit code of 1 even when it's successful on rhel/centos (redhat bug 578534)
66
- if status.exitstatus == 1 && ['redhat', 'centos'].include?(node[:platform])
67
- passwd_version_status = popen4('rpm -q passwd') do |pid, stdin, stdout, stderr|
68
- passwd_version = stdout.gets.chomp
72
+ if ['redhat', 'centos'].include?(node[:platform])
73
+ passwd_version_check = shell_out!('rpm -q passwd')
74
+ passwd_version = passwd_version_check.stdout.chomp
69
75
 
70
- unless passwd_version == 'passwd-0.73-1'
71
- raise_lock_error = true
72
- end
76
+ unless passwd_version == 'passwd-0.73-1'
77
+ raise_lock_error = true
73
78
  end
74
79
  else
75
80
  raise_lock_error = true
76
81
  end
77
82
 
78
- raise Chef::Exceptions::User, "Cannot determine if #{@new_resource} is locked!" if raise_lock_error
83
+ raise Chef::Exceptions::User, "Cannot determine if #{new_resource} is locked!" if raise_lock_error
79
84
  end
80
85
 
81
86
  @locked
82
87
  end
83
-
88
+
84
89
  def lock_user
85
- run_command(:command => "usermod -L #{@new_resource.username}")
90
+ shell_out!("usermod", "-L", new_resource.username)
86
91
  end
87
-
92
+
88
93
  def unlock_user
89
- run_command(:command => "usermod -U #{@new_resource.username}")
94
+ shell_out!("usermod", "-U", new_resource.username)
90
95
  end
91
96
 
92
97
  def compile_command(base_command)
98
+ base_command = Array(base_command)
93
99
  yield base_command
94
- base_command << " #{@new_resource.username}"
100
+ base_command << new_resource.username
95
101
  base_command
96
102
  end
97
-
103
+
98
104
  def universal_options
99
- opts = ''
100
-
101
- UNIVERSAL_OPTIONS.each do |field, option|
102
- if @current_resource.send(field) != @new_resource.send(field)
103
- if @new_resource.send(field)
104
- Chef::Log.debug("#{@new_resource} setting #{field} to #{@new_resource.send(field)}")
105
- opts << " #{option} '#{@new_resource.send(field)}'"
105
+ @universal_options ||=
106
+ begin
107
+ opts = []
108
+ # magic allows UNIVERSAL_OPTIONS to be overridden in a subclass
109
+ self.class::UNIVERSAL_OPTIONS.each do |field, option|
110
+ update_options(field, option, opts)
111
+ end
112
+ if updating_home?
113
+ if managing_home_dir?
114
+ Chef::Log.debug("#{new_resource} managing the users home directory")
115
+ opts << "-d" << new_resource.home << "-m"
116
+ else
117
+ Chef::Log.debug("#{new_resource} setting home to #{new_resource.home}")
118
+ opts << "-d" << new_resource.home
119
+ end
106
120
  end
121
+ opts << "-o" if new_resource.non_unique || new_resource.supports[:non_unique]
122
+ opts
107
123
  end
108
- end
109
- if updating_home?
110
- if managing_home_dir?
111
- Chef::Log.debug("#{@new_resource} managing the users home directory")
112
- opts << " -m -d '#{@new_resource.home}'"
113
- else
114
- Chef::Log.debug("#{@new_resource} setting home to #{@new_resource.home}")
115
- opts << " -d '#{@new_resource.home}'"
124
+ end
125
+
126
+ def update_options(field, option, opts)
127
+ if @current_resource.send(field) != new_resource.send(field)
128
+ if new_resource.send(field)
129
+ Chef::Log.debug("#{new_resource} setting #{field} to #{new_resource.send(field)}")
130
+ opts << option << new_resource.send(field).to_s
116
131
  end
117
132
  end
118
- opts << " -o" if @new_resource.non_unique || @new_resource.supports[:non_unique]
119
- opts
120
133
  end
121
134
 
122
135
  def useradd_options
123
- opts = ''
124
- opts << " -r" if @new_resource.system
136
+ opts = []
137
+ opts << "-r" if new_resource.system
125
138
  opts
126
139
  end
127
140
 
@@ -130,12 +143,12 @@ class Chef
130
143
  # Pathname#cleanpath does a better job than ::File::expand_path (on both unix and windows)
131
144
  # ::File.expand_path("///tmp") == ::File.expand_path("/tmp") => false
132
145
  # ::File.expand_path("\\tmp") => "C:/tmp"
133
- return true if @current_resource.home.nil? && @new_resource.home
134
- @new_resource.home and Pathname.new(@current_resource.home).cleanpath != Pathname.new(@new_resource.home).cleanpath
146
+ return true if @current_resource.home.nil? && new_resource.home
147
+ new_resource.home and Pathname.new(@current_resource.home).cleanpath != Pathname.new(new_resource.home).cleanpath
135
148
  end
136
149
 
137
150
  def managing_home_dir?
138
- @new_resource.manage_home || @new_resource.supports[:manage_home]
151
+ new_resource.manage_home || new_resource.supports[:manage_home]
139
152
  end
140
153
 
141
154
  end