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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -0,0 +1,61 @@
1
+ #--
2
+ # Author:: Andrea Campi (<andrea.campi@zephirworks.com>)
3
+ # Copyright:: Copyright (c) 2012 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
+ class Chef
20
+ class Provider
21
+
22
+ class TemplateFinder
23
+
24
+ def initialize(run_context, cookbook_name, node)
25
+ @run_context = run_context
26
+ @cookbook_name = cookbook_name
27
+ @node = node
28
+ end
29
+
30
+ def find(template_name, options = {})
31
+ template_name = template_source_name(template_name, options)
32
+
33
+ if options[:local]
34
+ return template_name
35
+ end
36
+
37
+ cookbook_name = find_cookbook_name(options)
38
+ cookbook = @run_context.cookbook_collection[cookbook_name]
39
+
40
+ cookbook.preferred_filename_on_disk_location(@node, :templates, template_name)
41
+ end
42
+
43
+ protected
44
+ def template_source_name(name, options)
45
+ if options[:source]
46
+ options[:source]
47
+ else
48
+ name
49
+ end
50
+ end
51
+
52
+ def find_cookbook_name(options)
53
+ if options[:cookbook]
54
+ options[:cookbook]
55
+ else
56
+ @cookbook_name
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -18,7 +18,6 @@
18
18
 
19
19
  require 'chef/provider'
20
20
  require 'chef/mixin/command'
21
- require 'chef/resource/user'
22
21
  require 'etc'
23
22
 
24
23
  class Chef
@@ -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,288 +17,246 @@
17
17
  #
18
18
 
19
19
  require 'chef/mixin/shell_out'
20
- require 'mixlib/shellout'
21
20
  require 'chef/provider/user'
22
21
  require 'openssl'
23
- require 'plist'
24
22
 
25
23
  class Chef
26
24
  class Provider
27
25
  class User
28
- include Chef::Mixin::ShellOut
29
-
30
- #
31
- # The most tricky bit of this provider is the way it deals with user passwords.
32
- # Mac OS X has different password shadow calculations based on the version.
33
- # < 10.7 => password shadow calculation format SALTED-SHA1
34
- # => stored in: /var/db/shadow/hash/#{guid}
35
- # => shadow binary length 68 bytes
36
- # => First 4 bytes salt / Next 64 bytes shadow value
37
- # = 10.7 => password shadow calculation format SALTED-SHA512
38
- # => stored in: /var/db/dslocal/nodes/Default/users/#{name}.plist
39
- # => shadow binary length 68 bytes
40
- # => First 4 bytes salt / Next 64 bytes shadow value
41
- # > 10.7 => password shadow calculation format SALTED-SHA512-PBKDF2
42
- # => stored in: /var/db/dslocal/nodes/Default/users/#{name}.plist
43
- # => shadow binary length 128 bytes
44
- # => Salt / Iterations are stored seperately in the same file
45
- #
46
- # This provider only supports Mac OSX versions 10.7 and above
47
26
  class Dscl < Chef::Provider::User
27
+ include Chef::Mixin::ShellOut
28
+
29
+ NFS_HOME_DIRECTORY = %r{^NFSHomeDirectory: (.*)$}
30
+ AUTHENTICATION_AUTHORITY = %r{^AuthenticationAuthority: (.*)$}
31
+
32
+ def dscl(*args)
33
+ shell_out("dscl . -#{args.join(' ')}")
34
+ end
48
35
 
49
- def define_resource_requirements
50
- super
51
-
52
- requirements.assert(:all_actions) do |a|
53
- a.assertion { mac_osx_version_less_than_10_7? == false }
54
- a.failure_message(Chef::Exceptions::User, "Chef::Provider::User::Dscl only supports Mac OS X versions 10.7 and above.")
55
- end
56
-
57
- requirements.assert(:all_actions) do |a|
58
- a.assertion { ::File.exists?("/usr/bin/dscl") }
59
- a.failure_message(Chef::Exceptions::User, "Cannot find binary '/usr/bin/dscl' on the system for #{@new_resource}!")
60
- end
36
+ def safe_dscl(*args)
37
+ result = dscl(*args)
38
+ return "" if ( args.first =~ /^delete/ ) && ( result.exitstatus != 0 )
39
+ raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") unless result.exitstatus == 0
40
+ raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") if result.stdout =~ /No such key: /
41
+ return result.stdout
42
+ end
61
43
 
62
- requirements.assert(:all_actions) do |a|
63
- a.assertion { ::File.exists?("/usr/bin/plutil") }
64
- a.failure_message(Chef::Exceptions::User, "Cannot find binary '/usr/bin/plutil' on the system for #{@new_resource}!")
65
- end
44
+ # This is handled in providers/group.rb by Etc.getgrnam()
45
+ # def user_exists?(user)
46
+ # users = safe_dscl("list /Users")
47
+ # !! ( users =~ Regexp.new("\n#{user}\n") )
48
+ # end
66
49
 
67
- requirements.assert(:create, :modify, :manage) do |a|
68
- a.assertion do
69
- if @new_resource.password && mac_osx_version_greater_than_10_7?
70
- # SALTED-SHA512 password shadow hashes are not supported on 10.8 and above.
71
- !salted_sha512?(@new_resource.password)
72
- else
73
- true
74
- end
50
+ # get a free UID greater than 200
51
+ def get_free_uid(search_limit=1000)
52
+ uid = nil; next_uid_guess = 200
53
+ users_uids = safe_dscl("list /Users uid")
54
+ while(next_uid_guess < search_limit + 200)
55
+ if users_uids =~ Regexp.new("#{Regexp.escape(next_uid_guess.to_s)}\n")
56
+ next_uid_guess += 1
57
+ else
58
+ uid = next_uid_guess
59
+ break
75
60
  end
76
- a.failure_message(Chef::Exceptions::User, "SALTED-SHA512 passwords are not supported on Mac 10.8 and above. \
77
- If you want to set the user password using shadow info make sure you specify a SALTED-SHA512-PBKDF2 shadow hash \
78
- in 'password', with the associated 'salt' and 'iterations'.")
79
61
  end
62
+ return uid || raise("uid not found. Exhausted. Searched #{search_limit} times")
63
+ end
80
64
 
81
- requirements.assert(:create, :modify, :manage) do |a|
82
- a.assertion do
83
- if @new_resource.password && mac_osx_version_greater_than_10_7? && salted_sha512_pbkdf2?(@new_resource.password)
84
- # salt and iterations should be specified when
85
- # SALTED-SHA512-PBKDF2 password shadow hash is given
86
- !@new_resource.salt.nil? && !@new_resource.iterations.nil?
87
- else
88
- true
89
- end
90
- end
91
- a.failure_message(Chef::Exceptions::User, "SALTED-SHA512-PBKDF2 shadow hash is given without associated \
92
- 'salt' and 'iterations'. Please specify 'salt' and 'iterations' in order to set the user password using shadow hash.")
65
+ def uid_used?(uid)
66
+ return false unless uid
67
+ users_uids = safe_dscl("list /Users uid")
68
+ !! ( users_uids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n") )
69
+ end
70
+
71
+ def set_uid
72
+ @new_resource.uid(get_free_uid) if (@new_resource.uid.nil? || @new_resource.uid == '')
73
+ if uid_used?(@new_resource.uid)
74
+ raise(Chef::Exceptions::RequestedUIDUnavailable, "uid #{@new_resource.uid} is already in use")
93
75
  end
76
+ safe_dscl("create /Users/#{@new_resource.username} UniqueID #{@new_resource.uid}")
77
+ end
94
78
 
95
- requirements.assert(:create, :modify, :manage) do |a|
96
- a.assertion do
97
- if @new_resource.password && !mac_osx_version_greater_than_10_7?
98
- # On 10.7 SALTED-SHA512-PBKDF2 is not supported
99
- !salted_sha512_pbkdf2?(@new_resource.password)
100
- else
101
- true
102
- end
79
+ def modify_home
80
+ return safe_dscl("delete /Users/#{@new_resource.username} NFSHomeDirectory") if (@new_resource.home.nil? || @new_resource.home.empty?)
81
+ if @new_resource.supports[:manage_home]
82
+ validate_home_dir_specification!
83
+
84
+ if (@current_resource.home == @new_resource.home) && !new_home_exists?
85
+ ditto_home
86
+ elsif !current_home_exists? && !new_home_exists?
87
+ ditto_home
88
+ elsif current_home_exists?
89
+ move_home
103
90
  end
104
- a.failure_message(Chef::Exceptions::User, "SALTED-SHA512-PBKDF2 shadow hashes are not supported on \
105
- Mac OS X version 10.7. Please specify a SALTED-SHA512 shadow hash in 'password' attribute to set the \
106
- user password using shadow hash.")
107
91
  end
108
-
92
+ safe_dscl("create /Users/#{@new_resource.username} NFSHomeDirectory '#{@new_resource.home}'")
109
93
  end
110
94
 
111
- def load_current_resource
112
- @current_resource = Chef::Resource::User.new(@new_resource.username)
113
- @current_resource.username(@new_resource.username)
95
+ def osx_shadow_hash?(string)
96
+ return !! ( string =~ /^[[:xdigit:]]{1240}$/ )
97
+ end
114
98
 
115
- @user_info = read_user_info
116
- if @user_info
117
- @current_resource.uid(dscl_get(@user_info, :uid))
118
- @current_resource.gid(dscl_get(@user_info, :gid))
119
- @current_resource.home(dscl_get(@user_info, :home))
120
- @current_resource.shell(dscl_get(@user_info, :shell))
121
- @current_resource.comment(dscl_get(@user_info, :comment))
122
- @authentication_authority = dscl_get(@user_info, :auth_authority)
99
+ def osx_salted_sha1?(string)
100
+ return !! ( string =~ /^[[:xdigit:]]{48}$/ )
101
+ end
123
102
 
124
- if @new_resource.password && dscl_get(@user_info, :password) == "********"
125
- # A password is set. Let's get the password information from shadow file
126
- shadow_hash_binary = dscl_get(@user_info, :shadow_hash)
103
+ def guid
104
+ safe_dscl("read /Users/#{@new_resource.username} GeneratedUID").gsub(/GeneratedUID: /,"").strip
105
+ end
127
106
 
128
- # Calling shell_out directly since we want to give an input stream
129
- shadow_hash_xml = convert_binary_plist_to_xml(shadow_hash_binary.string)
130
- shadow_hash = Plist::parse_xml(shadow_hash_xml)
107
+ def shadow_hash_set?
108
+ user_data = safe_dscl("read /Users/#{@new_resource.username}")
109
+ if user_data =~ /AuthenticationAuthority: / && user_data =~ /ShadowHash/
110
+ true
111
+ else
112
+ false
113
+ end
114
+ end
131
115
 
132
- if shadow_hash["SALTED-SHA512"]
133
- # Convert the shadow value from Base64 encoding to hex before consuming them
134
- @password_shadow_conversion_algorithm = "SALTED-SHA512"
135
- @current_resource.password(shadow_hash["SALTED-SHA512"].string.unpack('H*').first)
136
- elsif shadow_hash["SALTED-SHA512-PBKDF2"]
137
- @password_shadow_conversion_algorithm = "SALTED-SHA512-PBKDF2"
138
- # Convert the entropy from Base64 encoding to hex before consuming them
139
- @current_resource.password(shadow_hash["SALTED-SHA512-PBKDF2"]["entropy"].string.unpack('H*').first)
140
- @current_resource.iterations(shadow_hash["SALTED-SHA512-PBKDF2"]["iterations"])
141
- # Convert the salt from Base64 encoding to hex before consuming them
142
- @current_resource.salt(shadow_hash["SALTED-SHA512-PBKDF2"]["salt"].string.unpack('H*').first)
116
+ def modify_password
117
+ if @new_resource.password
118
+ shadow_hash = nil
119
+
120
+ Chef::Log.debug("#{new_resource} updating password")
121
+ if osx_shadow_hash?(@new_resource.password)
122
+ shadow_hash = @new_resource.password.upcase
123
+ else
124
+ if osx_salted_sha1?(@new_resource.password)
125
+ salted_sha1 = @new_resource.password.upcase
143
126
  else
144
- raise(Chef::Exceptions::User,"Unknown shadow_hash format: #{shadow_hash.keys.join(' ')}")
127
+ hex_salt = ""
128
+ OpenSSL::Random.random_bytes(10).each_byte { |b| hex_salt << b.to_i.to_s(16) }
129
+ hex_salt = hex_salt.slice(0...8)
130
+ salt = [hex_salt].pack("H*")
131
+ sha1 = ::OpenSSL::Digest::SHA1.hexdigest(salt+@new_resource.password)
132
+ salted_sha1 = (hex_salt+sha1).upcase
145
133
  end
134
+ shadow_hash = String.new("00000000"*155)
135
+ shadow_hash[168] = salted_sha1
136
+ end
137
+
138
+ ::File.open("/var/db/shadow/hash/#{guid}",'w',0600) do |output|
139
+ output.puts shadow_hash
140
+ end
141
+
142
+ unless shadow_hash_set?
143
+ safe_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';ShadowHash;'")
146
144
  end
147
-
148
- convert_group_name if @new_resource.gid
149
- else
150
- @user_exists = false
151
- Chef::Log.debug("#{@new_resource} user does not exist")
152
145
  end
153
-
154
- @current_resource
155
146
  end
156
147
 
157
- #
158
- # Provider Actions
159
- #
148
+ def load_current_resource
149
+ super
150
+ raise Chef::Exceptions::User, "Could not find binary /usr/bin/dscl for #{@new_resource}" unless ::File.exists?("/usr/bin/dscl")
151
+ end
160
152
 
161
153
  def create_user
162
154
  dscl_create_user
163
- # set_password modifies the plist file of the user directly. So update
164
- # the password first before making any modifications to the user.
165
- set_password
166
155
  dscl_create_comment
167
- dscl_set_uid
156
+ set_uid
168
157
  dscl_set_gid
169
- dscl_set_home
158
+ modify_home
170
159
  dscl_set_shell
160
+ modify_password
171
161
  end
172
-
162
+
173
163
  def manage_user
174
- # set_password modifies the plist file of the user directly. So update
175
- # the password first before making any modifications to the user.
176
- set_password if diverged_password?
177
164
  dscl_create_user if diverged?(:username)
178
165
  dscl_create_comment if diverged?(:comment)
179
- dscl_set_uid if diverged?(:uid)
166
+ set_uid if diverged?(:uid)
180
167
  dscl_set_gid if diverged?(:gid)
181
- dscl_set_home if diverged?(:home)
168
+ modify_home if diverged?(:home)
182
169
  dscl_set_shell if diverged?(:shell)
170
+ modify_password if diverged?(:password)
183
171
  end
184
-
185
- #
186
- # Action Helpers
187
- #
188
-
189
- #
190
- # Create a user using dscl
191
- #
172
+
192
173
  def dscl_create_user
193
- run_dscl("create /Users/#{@new_resource.username}")
174
+ safe_dscl("create /Users/#{@new_resource.username}")
194
175
  end
195
-
196
- #
197
- # Saves the specified Chef user `comment` into RealName attribute
198
- # of Mac user.
199
- #
176
+
200
177
  def dscl_create_comment
201
- run_dscl("create /Users/#{@new_resource.username} RealName '#{@new_resource.comment}'")
202
- end
203
-
204
- #
205
- # Sets the user id for the user using dscl.
206
- # If a `uid` is not specified, it finds the next available one starting
207
- # from 200 if `system` is set, 500 otherwise.
208
- #
209
- def dscl_set_uid
210
- @new_resource.uid(get_free_uid) if (@new_resource.uid.nil? || @new_resource.uid == '')
211
-
212
- if uid_used?(@new_resource.uid)
213
- raise(Chef::Exceptions::RequestedUIDUnavailable, "uid #{@new_resource.uid} is already in use")
214
- end
215
-
216
- run_dscl("create /Users/#{@new_resource.username} UniqueID #{@new_resource.uid}")
178
+ safe_dscl("create /Users/#{@new_resource.username} RealName '#{@new_resource.comment}'")
217
179
  end
218
-
219
- #
220
- # Find the next available uid on the system. starting with 200 if `system` is set,
221
- # 500 otherwise.
222
- #
223
- def get_free_uid(search_limit=1000)
224
- uid = nil
225
- base_uid = @new_resource.system ? 200 : 500
226
- next_uid_guess = base_uid
227
- users_uids = run_dscl("list /Users uid")
228
- while(next_uid_guess < search_limit + base_uid)
229
- if users_uids =~ Regexp.new("#{Regexp.escape(next_uid_guess.to_s)}\n")
230
- next_uid_guess += 1
231
- else
232
- uid = next_uid_guess
233
- break
234
- end
235
- end
236
- return uid || raise("uid not found. Exhausted. Searched #{search_limit} times")
237
- end
238
-
239
- #
240
- # Returns true if uid is in use by a different account, false otherwise.
241
- #
242
- def uid_used?(uid)
243
- return false unless uid
244
- users_uids = run_dscl("list /Users uid")
245
- !! ( users_uids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n") )
246
- end
247
-
248
- #
249
- # Sets the group id for the user using dscl. Fails if a group doesn't
250
- # exist on the system with given group id.
251
- #
180
+
252
181
  def dscl_set_gid
253
182
  unless @new_resource.gid && @new_resource.gid.to_s.match(/^\d+$/)
254
183
  begin
255
- possible_gid = run_dscl("read /Groups/#{@new_resource.gid} PrimaryGroupID").split(" ").last
184
+ possible_gid = safe_dscl("read /Groups/#{@new_resource.gid} PrimaryGroupID").split(" ").last
256
185
  rescue Chef::Exceptions::DsclCommandFailed => e
257
186
  raise Chef::Exceptions::GroupIDNotFound.new("Group not found for #{@new_resource.gid} when creating user #{@new_resource.username}")
258
187
  end
259
188
  @new_resource.gid(possible_gid) if possible_gid && possible_gid.match(/^\d+$/)
260
189
  end
261
- run_dscl("create /Users/#{@new_resource.username} PrimaryGroupID '#{@new_resource.gid}'")
190
+ safe_dscl("create /Users/#{@new_resource.username} PrimaryGroupID '#{@new_resource.gid}'")
262
191
  end
263
-
264
- #
265
- # Sets the home directory for the user. If `:manage_home` is set home
266
- # directory is managed (moved / created) for the user.
267
- #
268
- def dscl_set_home
269
- if @new_resource.home.nil? || @new_resource.home.empty?
270
- run_dscl("delete /Users/#{@new_resource.username} NFSHomeDirectory")
271
- return
192
+
193
+ def dscl_set_shell
194
+ if @new_resource.password || ::File.exists?("#{@new_resource.shell}")
195
+ safe_dscl("create /Users/#{@new_resource.username} UserShell '#{@new_resource.shell}'")
196
+ else
197
+ safe_dscl("create /Users/#{@new_resource.username} UserShell '/usr/bin/false'")
272
198
  end
273
-
199
+ end
200
+
201
+ def remove_user
274
202
  if @new_resource.supports[:manage_home]
275
- validate_home_dir_specification!
276
-
277
- if (@current_resource.home == @new_resource.home) && !new_home_exists?
278
- ditto_home
279
- elsif !current_home_exists? && !new_home_exists?
280
- ditto_home
281
- elsif current_home_exists?
282
- move_home
203
+ user_info = safe_dscl("read /Users/#{@new_resource.username}")
204
+ if nfs_home_match = user_info.match(NFS_HOME_DIRECTORY)
205
+ #nfs_home = safe_dscl("read /Users/#{@new_resource.username} NFSHomeDirectory")
206
+ #nfs_home.gsub!(/NFSHomeDirectory: /,"").gsub!(/\n$/,"")
207
+ nfs_home = nfs_home_match[1]
208
+ FileUtils.rm_rf(nfs_home)
283
209
  end
284
210
  end
285
- run_dscl("create /Users/#{@new_resource.username} NFSHomeDirectory '#{@new_resource.home}'")
211
+ # remove the user from its groups
212
+ groups = []
213
+ Etc.group do |group|
214
+ groups << group.name if group.mem.include?(@new_resource.username)
215
+ end
216
+ groups.each do |group_name|
217
+ safe_dscl("delete /Groups/#{group_name} GroupMembership '#{@new_resource.username}'")
218
+ end
219
+ # remove user account
220
+ safe_dscl("delete /Users/#{@new_resource.username}")
221
+ end
222
+
223
+ def locked?
224
+ user_info = safe_dscl("read /Users/#{@new_resource.username}")
225
+ if auth_authority_md = AUTHENTICATION_AUTHORITY.match(user_info)
226
+ !!(auth_authority_md[1] =~ /DisabledUser/ )
227
+ else
228
+ false
229
+ end
230
+ end
231
+
232
+ def check_lock
233
+ return @locked = locked?
286
234
  end
287
235
 
236
+ def lock_user
237
+ safe_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';DisabledUser;'")
238
+ end
239
+
240
+ def unlock_user
241
+ auth_info = safe_dscl("read /Users/#{@new_resource.username} AuthenticationAuthority")
242
+ auth_string = auth_info.gsub(/AuthenticationAuthority: /,"").gsub(/;DisabledUser;/,"").strip#.gsub!(/[; ]*$/,"")
243
+ safe_dscl("create /Users/#{@new_resource.username} AuthenticationAuthority '#{auth_string}'")
244
+ end
245
+
288
246
  def validate_home_dir_specification!
289
247
  unless @new_resource.home =~ /^\//
290
- raise(Chef::Exceptions::InvalidHomeDirectory,"invalid path spec for User: '#{@new_resource.username}', home directory: '#{@new_resource.home}'")
248
+ raise(Chef::Exceptions::InvalidHomeDirectory,"invalid path spec for User: '#{@new_resource.username}', home directory: '#{@new_resource.home}'")
291
249
  end
292
250
  end
293
-
251
+
294
252
  def current_home_exists?
295
253
  ::File.exist?("#{@current_resource.home}")
296
254
  end
297
-
255
+
298
256
  def new_home_exists?
299
- ::File.exist?("#{@new_resource.home}")
257
+ ::File.exist?("#{@new_resource.home}")
300
258
  end
301
-
259
+
302
260
  def ditto_home
303
261
  skel = "/System/Library/User Template/English.lproj"
304
262
  raise(Chef::Exceptions::User,"can't find skel at: #{skel}") unless ::File.exists?(skel)
@@ -308,7 +266,7 @@ user password using shadow hash.")
308
266
 
309
267
  def move_home
310
268
  Chef::Log.debug("#{@new_resource} moving #{self} home from #{@current_resource.home} to #{@new_resource.home}")
311
-
269
+
312
270
  src = @current_resource.home
313
271
  FileUtils.mkdir_p(@new_resource.home)
314
272
  files = ::Dir.glob("#{src}/*", ::File::FNM_DOTMATCH) - ["#{src}/.","#{src}/.."]
@@ -316,365 +274,14 @@ user password using shadow hash.")
316
274
  ::FileUtils.rmdir(src)
317
275
  ::FileUtils.chown_R(@new_resource.username,@new_resource.gid.to_s,@new_resource.home)
318
276
  end
319
-
320
- #
321
- # Sets the shell for the user using dscl.
322
- #
323
- def dscl_set_shell
324
- if @new_resource.shell || ::File.exists?("#{@new_resource.shell}")
325
- run_dscl("create /Users/#{@new_resource.username} UserShell '#{@new_resource.shell}'")
326
- else
327
- run_dscl("create /Users/#{@new_resource.username} UserShell '/usr/bin/false'")
328
- end
329
- end
330
-
331
- #
332
- # Sets the password for the user based on given password parameters.
333
- # Chef supports specifying plain-text passwords and password shadow
334
- # hash data.
335
- #
336
- def set_password
337
- # Return if there is no password to set
338
- return if @new_resource.password.nil?
339
-
340
- shadow_info = prepare_password_shadow_info
341
-
342
- # Shadow info is saved as binary plist. Convert the info to binary plist.
343
- shadow_info_binary = StringIO.new
344
- command = Mixlib::ShellOut.new("plutil -convert binary1 -o - -",
345
- :input => shadow_info.to_plist, :live_stream => shadow_info_binary)
346
- command.run_command
347
-
348
- if @user_info.nil?
349
- # User is just created. read_user_info() will read the fresh information
350
- # for the user with a cache flush. However with experimentation we've seen
351
- # that dscl cache is not immediately updated after the creation of the user
352
- # This is odd and needs to be investigated further.
353
- sleep 3
354
- @user_info = read_user_info
355
- end
356
-
357
- # Replace the shadow info in user's plist
358
- dscl_set(@user_info, :shadow_hash, shadow_info_binary)
359
- save_user_info(@user_info)
360
- end
361
-
362
- #
363
- # Prepares the password shadow info based on the platform version.
364
- #
365
- def prepare_password_shadow_info
366
- shadow_info = { }
367
- entropy = nil
368
- salt = nil
369
- iterations = nil
370
-
371
- if mac_osx_version_10_7?
372
- hash_value = if salted_sha512?(@new_resource.password)
373
- @new_resource.password
374
- else
375
- # Create a random 4 byte salt
376
- salt = OpenSSL::Random.random_bytes(4)
377
- encoded_password = OpenSSL::Digest::SHA512.hexdigest(salt + @new_resource.password)
378
- hash_value = salt.unpack('H*').first + encoded_password
379
- end
380
-
381
- shadow_info["SALTED-SHA512"] = StringIO.new
382
- shadow_info["SALTED-SHA512"].string = convert_to_binary(hash_value)
383
- shadow_info
384
- else
385
- if salted_sha512_pbkdf2?(@new_resource.password)
386
- entropy = convert_to_binary(@new_resource.password)
387
- salt = convert_to_binary(@new_resource.salt)
388
- iterations = @new_resource.iterations
389
- else
390
- salt = OpenSSL::Random.random_bytes(32)
391
- iterations = @new_resource.iterations # Use the default if not specified by the user
392
-
393
- entropy = OpenSSL::PKCS5::pbkdf2_hmac(
394
- @new_resource.password,
395
- salt,
396
- iterations,
397
- 128,
398
- OpenSSL::Digest::SHA512.new
399
- )
400
- end
401
-
402
- pbkdf_info = { }
403
- pbkdf_info["entropy"] = StringIO.new
404
- pbkdf_info["entropy"].string = entropy
405
- pbkdf_info["salt"] = StringIO.new
406
- pbkdf_info["salt"].string = salt
407
- pbkdf_info["iterations"] = iterations
408
-
409
- shadow_info["SALTED-SHA512-PBKDF2"] = pbkdf_info
410
- end
411
-
412
- shadow_info
413
- end
414
-
415
- #
416
- # Removes the user from the system after removing user from his groups
417
- # and deleting home directory if needed.
418
- #
419
- def remove_user
420
- if @new_resource.supports[:manage_home]
421
- # Remove home directory
422
- FileUtils.rm_rf(@current_resource.home)
423
- end
424
-
425
- # Remove the user from its groups
426
- run_dscl("list /Groups").each_line do |group|
427
- if member_of_group?(group.chomp)
428
- run_dscl("delete /Groups/#{group.chomp} GroupMembership '#{@new_resource.username}'")
429
- end
430
- end
431
-
432
- # Remove user account
433
- run_dscl("delete /Users/#{@new_resource.username}")
434
- end
435
-
436
- #
437
- # Locks the user.
438
- #
439
- def lock_user
440
- run_dscl("append /Users/#{@new_resource.username} AuthenticationAuthority ';DisabledUser;'")
441
- end
442
-
443
- #
444
- # Unlocks the user
445
- #
446
- def unlock_user
447
- auth_string = @authentication_authority.gsub(/AuthenticationAuthority: /,"").gsub(/;DisabledUser;/,"").strip
448
- run_dscl("create /Users/#{@new_resource.username} AuthenticationAuthority '#{auth_string}'")
449
- end
450
-
451
- #
452
- # Returns true if the user is locked, false otherwise.
453
- #
454
- def locked?
455
- if @authentication_authority
456
- !!(@authentication_authority =~ /DisabledUser/ )
457
- else
458
- false
459
- end
460
- end
461
-
462
- #
463
- # This is the interface base User provider requires to provide idempotency.
464
- #
465
- def check_lock
466
- return @locked = locked?
467
- end
468
-
469
- #
470
- # Helper functions
471
- #
472
-
473
- #
474
- # Returns true if the system state and desired state is different for
475
- # given attribute.
476
- #
277
+
477
278
  def diverged?(parameter)
478
279
  parameter_updated?(parameter) && (not @new_resource.send(parameter).nil?)
479
280
  end
480
-
281
+
481
282
  def parameter_updated?(parameter)
482
283
  not (@new_resource.send(parameter) == @current_resource.send(parameter))
483
284
  end
484
-
485
- #
486
- # We need a special check function for password since we support both
487
- # plain text and shadow hash data.
488
- #
489
- # Checks if password needs update based on platform version and the
490
- # type of the password specified.
491
- #
492
- def diverged_password?
493
- return false if @new_resource.password.nil?
494
-
495
- # Dscl provider supports both plain text passwords and shadow hashes.
496
- if mac_osx_version_10_7?
497
- if salted_sha512?(@new_resource.password)
498
- diverged?(:password)
499
- else
500
- !salted_sha512_password_match?
501
- end
502
- else
503
- # When a system is upgraded to a version 10.7+ shadow hashes of the users
504
- # will be updated when the user logs in. So it's possible that we will have
505
- # SALTED-SHA512 password in the current_resource. In that case we will force
506
- # password to be updated.
507
- return true if salted_sha512?(@current_resource.password)
508
-
509
- if salted_sha512_pbkdf2?(@new_resource.password)
510
- diverged?(:password) || diverged?(:salt) || diverged?(:iterations)
511
- else
512
- !salted_sha512_pbkdf2_password_match?
513
- end
514
- end
515
- end
516
-
517
- #
518
- # Returns true if user is member of the specified group, false otherwise.
519
- #
520
- def member_of_group?(group_name)
521
- membership_info = ""
522
- begin
523
- membership_info = run_dscl("read /Groups/#{group_name}")
524
- rescue Chef::Exceptions::DsclCommandFailed
525
- # Raised if the group doesn't contain any members
526
- end
527
- # Output is something like:
528
- # GroupMembership: root admin etc
529
- members = membership_info.split(" ")
530
- members.shift # Get rid of GroupMembership: string
531
- members.include?(@new_resource.username)
532
- end
533
-
534
- #
535
- # DSCL Helper functions
536
- #
537
-
538
- # A simple map of Chef's terms to DSCL's terms.
539
- DSCL_PROPERTY_MAP = {
540
- :uid => "generateduid",
541
- :gid => "gid",
542
- :home => "home",
543
- :shell => "shell",
544
- :comment => "realname",
545
- :password => "passwd",
546
- :auth_authority => "authentication_authority",
547
- :shadow_hash => "ShadowHashData"
548
- }.freeze
549
-
550
- # Directory where the user plist files are stored for versions 10.7 and above
551
- USER_PLIST_DIRECTORY = "/var/db/dslocal/nodes/Default/users".freeze
552
-
553
- #
554
- # Reads the user plist and returns a hash keyed with DSCL properties specified
555
- # in DSCL_PROPERTY_MAP. Return nil if the user is not found.
556
- #
557
- def read_user_info
558
- user_info = nil
559
-
560
- # We flush the cache here in order to make sure that we read fresh information
561
- # for the user.
562
- shell_out("dscacheutil '-flushcache'")
563
-
564
- begin
565
- user_plist_file = "#{USER_PLIST_DIRECTORY}/#{@new_resource.username}.plist"
566
- user_plist_info = run_plutil("convert xml1 -o - #{user_plist_file}")
567
- user_info = Plist::parse_xml(user_plist_info)
568
- rescue Chef::Exceptions::PlistUtilCommandFailed
569
- end
570
-
571
- user_info
572
- end
573
-
574
- #
575
- # Saves the given hash keyed with DSCL properties specified
576
- # in DSCL_PROPERTY_MAP to the disk.
577
- #
578
- def save_user_info(user_info)
579
- user_plist_file = "#{USER_PLIST_DIRECTORY}/#{@new_resource.username}.plist"
580
- Plist::Emit.save_plist(user_info, user_plist_file)
581
- run_plutil("convert binary1 #{user_plist_file}")
582
- end
583
-
584
- #
585
- # Sets a value in user information hash using Chef attributes as keys.
586
- #
587
- def dscl_set(user_hash, key, value)
588
- raise "Unknown dscl key #{key}" unless DSCL_PROPERTY_MAP.keys.include?(key)
589
- user_hash[DSCL_PROPERTY_MAP[key]] = [ value ]
590
- user_hash
591
- end
592
-
593
- #
594
- # Gets a value from user information hash using Chef attributes as keys.
595
- #
596
- def dscl_get(user_hash, key)
597
- raise "Unknown dscl key #{key}" unless DSCL_PROPERTY_MAP.keys.include?(key)
598
- # DSCL values are set as arrays
599
- value = user_hash[DSCL_PROPERTY_MAP[key]]
600
- value.nil? ? value : value.first
601
- end
602
-
603
- #
604
- # System Helpets
605
- #
606
-
607
- def mac_osx_version
608
- # This provider will only be invoked on node[:platform] == "mac_os_x"
609
- # We do not check or assert that here.
610
- node[:platform_version]
611
- end
612
-
613
- def mac_osx_version_10_7?
614
- mac_osx_version.start_with?("10.7.")
615
- end
616
-
617
- def mac_osx_version_less_than_10_7?
618
- versions = mac_osx_version.split(".")
619
- # Make integer comparison in order not to report 10.10 less than 10.7
620
- (versions[0].to_i <= 10 && versions[1].to_i < 7)
621
- end
622
-
623
- def mac_osx_version_greater_than_10_7?
624
- versions = mac_osx_version.split(".")
625
- # Make integer comparison in order not to report 10.10 less than 10.7
626
- (versions[0].to_i >= 10 && versions[1].to_i > 7)
627
- end
628
-
629
- def run_dscl(*args)
630
- result = shell_out("dscl . -#{args.join(' ')}")
631
- return "" if ( args.first =~ /^delete/ ) && ( result.exitstatus != 0 )
632
- raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") unless result.exitstatus == 0
633
- raise(Chef::Exceptions::DsclCommandFailed,"dscl error: #{result.inspect}") if result.stdout =~ /No such key: /
634
- result.stdout
635
- end
636
-
637
- def run_plutil(*args)
638
- result = shell_out("plutil -#{args.join(' ')}")
639
- raise(Chef::Exceptions::PlistUtilCommandFailed,"plutil error: #{result.inspect}") unless result.exitstatus == 0
640
- result.stdout
641
- end
642
-
643
- def convert_binary_plist_to_xml(binary_plist_string)
644
- Mixlib::ShellOut.new("plutil -convert xml1 -o - -", :input => binary_plist_string).run_command.stdout
645
- end
646
-
647
- def convert_to_binary(string)
648
- string.unpack('a2'*(string.size/2)).collect { |i| i.hex.chr }.join
649
- end
650
-
651
- def salted_sha512?(string)
652
- !!(string =~ /^[[:xdigit:]]{136}$/)
653
- end
654
-
655
- def salted_sha512_password_match?
656
- # Salt is included in the first 4 bytes of shadow data
657
- salt = @current_resource.password.slice(0,8)
658
- shadow = OpenSSL::Digest::SHA512.hexdigest(convert_to_binary(salt) + @new_resource.password)
659
- @current_resource.password == salt + shadow
660
- end
661
-
662
- def salted_sha512_pbkdf2?(string)
663
- !!(string =~ /^[[:xdigit:]]{256}$/)
664
- end
665
-
666
- def salted_sha512_pbkdf2_password_match?
667
- salt = convert_to_binary(@current_resource.salt)
668
-
669
- OpenSSL::PKCS5::pbkdf2_hmac(
670
- @new_resource.password,
671
- salt,
672
- @current_resource.iterations,
673
- 128,
674
- OpenSSL::Digest::SHA512.new
675
- ).unpack('H*').first == @current_resource.password
676
- end
677
-
678
285
  end
679
286
  end
680
287
  end