chef 10.34.6 → 11.0.0.beta.0

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 (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. data/spec/unit/webui_user_spec.rb +0 -238
@@ -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.
@@ -19,7 +19,7 @@
19
19
  require 'chef/mixin/convert_to_class_name'
20
20
  require 'chef/mixin/language'
21
21
 
22
- module Shef
22
+ module Shell
23
23
  class ModelWrapper
24
24
 
25
25
  include Chef::Mixin::ConvertToClassName
@@ -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.
@@ -16,8 +16,8 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- module Shef
20
- class ShefREST < Chef::REST
19
+ module Shell
20
+ class ShellREST < Chef::REST
21
21
 
22
22
  alias :get :get_rest
23
23
  alias :put :put_rest
@@ -29,8 +29,8 @@ require 'chef/formatters/base'
29
29
  require 'chef/formatters/doc'
30
30
  require 'chef/formatters/minimal'
31
31
 
32
- module Shef
33
- class ShefSession
32
+ module Shell
33
+ class ShellSession
34
34
  include Singleton
35
35
 
36
36
  def self.session_type(type=nil)
@@ -55,11 +55,11 @@ module Shef
55
55
  rebuild_node
56
56
  @node = client.node
57
57
  shorten_node_inspect
58
- Shef::Extensions.extend_context_node(@node)
58
+ Shell::Extensions.extend_context_node(@node)
59
59
  rebuild_context
60
60
  node.consume_attributes(node_attributes) if node_attributes
61
61
  @recipe = Chef::Recipe.new(nil, nil, run_context)
62
- Shef::Extensions.extend_context_recipe(@recipe)
62
+ Shell::Extensions.extend_context_recipe(@recipe)
63
63
  @node_built = true
64
64
  end
65
65
  end
@@ -86,7 +86,7 @@ module Shef
86
86
  end
87
87
 
88
88
  def save_node
89
- raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run shef in client mode?"
89
+ raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run chef-shell in client mode?"
90
90
  end
91
91
 
92
92
  def rebuild_context
@@ -137,7 +137,7 @@ module Shef
137
137
 
138
138
  end
139
139
 
140
- class StandAloneSession < ShefSession
140
+ class StandAloneSession < ShellSession
141
141
 
142
142
  session_type :standalone
143
143
 
@@ -151,7 +151,7 @@ module Shef
151
151
 
152
152
  def rebuild_node
153
153
  Chef::Config[:solo] = true
154
- @client = Chef::Client.new(nil, Chef::Config[:shell_config])
154
+ @client = Chef::Client.new
155
155
  @client.run_ohai
156
156
  @client.load_node
157
157
  @client.build_node
@@ -159,7 +159,7 @@ module Shef
159
159
 
160
160
  end
161
161
 
162
- class SoloSession < ShefSession
162
+ class SoloSession < ShellSession
163
163
 
164
164
  session_type :solo
165
165
 
@@ -170,8 +170,10 @@ module Shef
170
170
  def rebuild_context
171
171
  @run_status = Chef::RunStatus.new(@node, @events)
172
172
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, Chef::Config[:cookbook_path]) }
173
- cookbook_collection = Chef::CookbookCollection.new(Chef::CookbookLoader.new(Chef::Config[:cookbook_path]))
174
- @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
173
+ cl = Chef::CookbookLoader.new(Chef::Config[:cookbook_path])
174
+ cl.load_cookbooks
175
+ cookbook_collection = Chef::CookbookCollection.new(cl)
176
+ @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
175
177
  @run_context.load(Chef::RunList::RunListExpansionFromDisk.new("_default", []))
176
178
  @run_status.run_context = run_context
177
179
  end
@@ -181,7 +183,7 @@ module Shef
181
183
  def rebuild_node
182
184
  # Tell the client we're chef solo so it won't try to contact the server
183
185
  Chef::Config[:solo] = true
184
- @client = Chef::Client.new(nil, Chef::Config[:shell_config])
186
+ @client = Chef::Client.new
185
187
  @client.run_ohai
186
188
  @client.load_node
187
189
  @client.build_node
@@ -202,8 +204,8 @@ module Shef
202
204
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
203
205
  cookbook_hash = @client.sync_cookbooks
204
206
  cookbook_collection = Chef::CookbookCollection.new(cookbook_hash)
205
- @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
206
- @run_context.load(@node.run_list.expand(@node.chef_environment))
207
+ @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
208
+ @run_context.load(Chef::RunList::RunListExpansionFromAPI.new("_default", []))
207
209
  @run_status.run_context = run_context
208
210
  end
209
211
 
@@ -212,7 +214,7 @@ module Shef
212
214
  def rebuild_node
213
215
  # Make sure the client knows this is not chef solo
214
216
  Chef::Config[:solo] = false
215
- @client = Chef::Client.new(nil, Chef::Config[:shell_config])
217
+ @client = Chef::Client.new
216
218
  @client.run_ohai
217
219
  @client.register
218
220
  @client.load_node
@@ -277,7 +279,7 @@ module Shef
277
279
  puts
278
280
  Chef::Config[:doppelganger] = false
279
281
  @node_built = false
280
- Shef.session
282
+ Shell.session
281
283
  end
282
284
 
283
285
  def rebuild_node
@@ -2,5 +2,12 @@ require 'mixlib/shellout'
2
2
 
3
3
  class Chef
4
4
  class ShellOut < Mixlib::ShellOut
5
+
6
+ def initialize(*args)
7
+ Chef::Log.warn("Chef::ShellOut is deprecated, please use Mixlib::ShellOut")
8
+ called_from = caller[0..3].inject("Called from:\n") {|msg, trace_line| msg << " #{trace_line}\n" }
9
+ Chef::Log.warn(called_from)
10
+ super
11
+ end
5
12
  end
6
13
  end
@@ -63,7 +63,7 @@ class Chef::Util::Windows::NetGroup < Chef::Util::Windows
63
63
  members = 0.chr * (nread * (PTR_SIZE * 3)) #nread * sizeof(LOCALGROUP_MEMBERS_INFO_1)
64
64
  memcpy(members, ptr, members.size)
65
65
 
66
- # 3 pointer fields in LOCALGROUP_MEMBERS_INFO_1, offset 2*PTR_SIZE is lgrmi1_name
66
+ #3 pointer fields in LOCALGROUP_MEMBERS_INFO_1, offset 2*PTR_SIZE is lgrmi1_name
67
67
  nread.times do |i|
68
68
  offset = (i * 3) + 2
69
69
  member = lpwstr_to_s(members, offset)
@@ -92,10 +92,6 @@ class Chef::Util::Windows::NetGroup < Chef::Util::Windows
92
92
  modify_members(members, NetLocalGroupAddMembers)
93
93
  end
94
94
 
95
- def local_delete_members(members)
96
- modify_members(members, NetLocalGroupDelMembers)
97
- end
98
-
99
95
  def local_delete
100
96
  rc = NetLocalGroupDel.call(nil, @name)
101
97
  if rc != NERR_Success
@@ -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,7 +17,7 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '10.34.6'
20
+ VERSION = '11.0.0.beta.0'
21
21
  end
22
22
 
23
23
  # NOTE: the Chef::Version class is defined in version_class.rb
@@ -33,7 +33,6 @@ class Chef
33
33
  safe_attach_function :GetCurrentProcess, [], :HANDLE
34
34
  safe_attach_function :GetProcessHandleCount, [ :HANDLE, :LPDWORD ], :BOOL
35
35
  safe_attach_function :GetProcessId, [ :HANDLE ], :DWORD
36
- safe_attach_function :CloseHandle, [ :HANDLE ], :BOOL
37
36
 
38
37
  end
39
38
  end
@@ -26,10 +26,6 @@ class Chef
26
26
  class Handle
27
27
  extend Chef::ReservedNames::Win32::API::Process
28
28
 
29
- # See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx
30
- # The handle value returned by the GetCurrentProcess function is the pseudo handle (HANDLE)-1 (which is 0xFFFFFFFF)
31
- CURRENT_PROCESS_HANDLE = 4294967295
32
-
33
29
  def initialize(handle)
34
30
  @handle = handle
35
31
  ObjectSpace.define_finalizer(self, Handle.close_handle_finalizer(handle))
@@ -38,10 +34,7 @@ class Chef
38
34
  attr_reader :handle
39
35
 
40
36
  def self.close_handle_finalizer(handle)
41
- # According to http://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx, it is not necessary
42
- # to close the pseudo handle returned by the GetCurrentProcess function. The docs also say that it doesn't hurt to call
43
- # CloseHandle on it. However, doing so from inside of Ruby always seems to produce an invalid handle error.
44
- proc { close_handle(handle) unless handle == CURRENT_PROCESS_HANDLE }
37
+ proc { close_handle(handle) }
45
38
  end
46
39
 
47
40
  def self.close_handle(handle)
@@ -0,0 +1,371 @@
1
+ #
2
+ # Author:: Prajakta Purohit (<prajakta@opscode.com>)
3
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
4
+ #
5
+ # Copyright:: 2012, Opscode, Inc.
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
+ require 'chef/reserved_names'
20
+
21
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
22
+ require 'win32/registry'
23
+ require 'ruby-wmi'
24
+ end
25
+
26
+ class Chef
27
+ class Win32
28
+ class Registry
29
+
30
+ attr_accessor :run_context
31
+ attr_accessor :architecture
32
+
33
+ def initialize(run_context=nil, user_architecture=:machine)
34
+ @run_context = run_context
35
+ self.architecture = user_architecture
36
+ end
37
+
38
+ def architecture=(user_architecture)
39
+ @architecture = user_architecture.to_sym
40
+ assert_architecture!
41
+ end
42
+
43
+ def get_values(key_path)
44
+ hive, key = get_hive_and_key(key_path)
45
+ key_exists!(key_path)
46
+ values = hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
47
+ reg.map { |name, type, data| {:name=>name, :type=>get_name_from_type(type), :data=>data} }
48
+ end
49
+ end
50
+
51
+ def set_value(key_path, value)
52
+ Chef::Log.debug("Updating value #{value[:name]} in registry key #{key_path} with type #{value[:type]} and data #{value[:data]}")
53
+ key_exists!(key_path)
54
+ hive, key = get_hive_and_key(key_path)
55
+ if value_exists?(key_path, value)
56
+ if data_exists?(key_path, value)
57
+ Chef::Log.debug("Value #{value[:name]} in registry key #{key_path} already had those values, not updated")
58
+ return false
59
+ else
60
+ hive.open(key, ::Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | registry_system_architecture) do |reg|
61
+ reg.write(value[:name], get_type_from_name(value[:type]), value[:data])
62
+ end
63
+ Chef::Log.debug("Value #{value[:name]} in registry key #{key_path} updated")
64
+ end
65
+ else
66
+ hive.open(key, ::Win32::Registry::KEY_SET_VALUE | ::Win32::Registry::KEY_QUERY_VALUE | registry_system_architecture) do |reg|
67
+ reg.write(value[:name], get_type_from_name(value[:type]), value[:data])
68
+ end
69
+ Chef::Log.debug("Value #{value[:name]} in registry key #{key_path} created")
70
+ end
71
+ true
72
+ end
73
+
74
+ def delete_value(key_path, value)
75
+ Chef::Log.debug("Deleting value #{value[:name]} from registry key #{key_path}")
76
+ if value_exists?(key_path, value)
77
+ begin
78
+ hive, key = get_hive_and_key(key_path)
79
+ rescue Chef::Exceptions::Win32RegKeyMissing
80
+ return true
81
+ end
82
+ hive.open(key, ::Win32::Registry::KEY_SET_VALUE | registry_system_architecture) do |reg|
83
+ reg.delete_value(value[:name])
84
+ Chef::Log.debug("Deleted value #{value[:name]} from registry key #{key_path}")
85
+ end
86
+ else
87
+ Chef::Log.debug("Value #{value[:name]} in registry key #{key_path} does not exist, not updated")
88
+ end
89
+ true
90
+ end
91
+
92
+ def create_key(key_path, recursive)
93
+ Chef::Log.debug("Creating registry key #{key_path}")
94
+ if keys_missing?(key_path)
95
+ if recursive == true
96
+ Chef::Log.debug("Registry key #{key_path} has missing subkeys, and recursive specified, creating them....")
97
+ create_missing(key_path)
98
+ else
99
+ raise Chef::Exceptions::Win32RegNoRecursive, "Registry key #{key_path} has missing subkeys, and recursive not specified"
100
+ end
101
+ end
102
+ if key_exists?(key_path)
103
+ Chef::Log.debug("Registry key #{key_path} already exists, doing nothing")
104
+ else
105
+ hive, key = get_hive_and_key(key_path)
106
+ hive.create(key, ::Win32::Registry::KEY_WRITE | registry_system_architecture)
107
+ Chef::Log.debug("Registry key #{key_path} created")
108
+ end
109
+ true
110
+ end
111
+
112
+ def delete_key(key_path, recursive)
113
+ Chef::Log.debug("Deleting registry key #{key_path}")
114
+ unless key_exists?(key_path)
115
+ Chef::Log.debug("Registry key #{key_path}, does not exist, not deleting")
116
+ return true
117
+ end
118
+ hive, key = get_hive_and_key(key_path)
119
+ key_parent = key.split("\\")
120
+ key_to_delete = key_parent.pop
121
+ key_parent = key_parent.join("\\")
122
+ if has_subkeys?(key_path)
123
+ if recursive == true
124
+ hive.open(key_parent, ::Win32::Registry::KEY_WRITE | registry_system_architecture) do |reg|
125
+ Chef::Log.debug("Deleting registry key #{key_path} recursively")
126
+ reg.delete_key(key_to_delete,recursive)
127
+ end
128
+ else
129
+ raise Chef::Exceptions::Win32RegNoRecursive, "Registry key #{key_path} has subkeys, and recursive not specified"
130
+ end
131
+ else
132
+ hive.open(key_parent, ::Win32::Registry::KEY_WRITE | registry_system_architecture) do |reg|
133
+ Chef::Log.debug("Deleting registry key #{key_path}")
134
+ reg.delete_key(key_to_delete)
135
+ end
136
+ end
137
+ true
138
+ end
139
+
140
+ def key_exists?(key_path)
141
+ hive, key = get_hive_and_key(key_path)
142
+ begin
143
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |current_key|
144
+ return true
145
+ end
146
+ rescue ::Win32::Registry::Error => e
147
+ return false
148
+ end
149
+ end
150
+
151
+ def key_exists!(key_path)
152
+ unless key_exists?(key_path)
153
+ raise Chef::Exceptions::Win32RegKeyMissing, "Registry key #{key_path} does not exist"
154
+ end
155
+ true
156
+ end
157
+
158
+ def hive_exists?(key_path)
159
+ begin
160
+ hive, key = get_hive_and_key(key_path)
161
+ rescue Chef::Exceptions::Win32RegHiveMissing => e
162
+ return false
163
+ end
164
+ return true
165
+ end
166
+
167
+ def has_subkeys?(key_path)
168
+ key_exists!(key_path)
169
+ hive, key = get_hive_and_key(key_path)
170
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
171
+ reg.each_key{ |key| return true }
172
+ end
173
+ return false
174
+ end
175
+
176
+ def get_subkeys(key_path)
177
+ subkeys = []
178
+ key_exists!(key_path)
179
+ hive, key = get_hive_and_key(key_path)
180
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
181
+ reg.each_key{ |current_key| subkeys << current_key }
182
+ end
183
+ return subkeys
184
+ end
185
+
186
+ # 32-bit chef clients running on 64-bit machines will default to reading the 64-bit registry
187
+ def registry_system_architecture
188
+ applied_arch = ( architecture == :machine ) ? machine_architecture : architecture
189
+ ( applied_arch == :x86_64 ) ? 0x0100 : 0x0200
190
+ end
191
+
192
+ def value_exists?(key_path, value)
193
+ key_exists!(key_path)
194
+ hive, key = get_hive_and_key(key_path)
195
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
196
+ return true if reg.any? {|val| val == value[:name] }
197
+ end
198
+ return false
199
+ end
200
+
201
+ def data_exists?(key_path, value)
202
+ key_exists!(key_path)
203
+ hive, key = get_hive_and_key(key_path)
204
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
205
+ reg.each do |val_name, val_type, val_data|
206
+ if val_name == value[:name] &&
207
+ val_type == get_type_from_name(value[:type]) &&
208
+ val_data == value[:data]
209
+ return true
210
+ end
211
+ end
212
+ end
213
+ return false
214
+ end
215
+
216
+ def value_exists!(key_path, value)
217
+ unless value_exists?(key_path, value)
218
+ raise Chef::Exceptions::Win32RegValueMissing, "Registry key #{key_path} has no value named #{value[:name]}"
219
+ end
220
+ true
221
+ end
222
+
223
+ def data_exists!(key_path, value)
224
+ unless data_exists?(key_path, value)
225
+ raise Chef::Exceptions::Win32RegDataMissing, "Registry key #{key_path} has no value named #{value[:name]}, containing type #{value[:type]} and data #{value[:data]}"
226
+ end
227
+ true
228
+ end
229
+
230
+ def type_matches?(key_path, value)
231
+ value_exists!(key_path, value)
232
+ hive, key = get_hive_and_key(key_path)
233
+ hive.open(key, ::Win32::Registry::KEY_READ | registry_system_architecture) do |reg|
234
+ reg.each do |val_name, val_type|
235
+ if val_name == value[:name]
236
+ type_new = get_type_from_name(value[:type])
237
+ if val_type == type_new
238
+ return true
239
+ end
240
+ end
241
+ end
242
+ end
243
+ return false
244
+ end
245
+
246
+ def type_matches!(key_path, value)
247
+ unless type_matches?(key_path, value)
248
+ raise Chef::Exceptions::Win32RegTypesMismatch, "Registry key #{key_path} has a value #{value[:name]} with a type that is not #{value[:type]}"
249
+ end
250
+ end
251
+
252
+ def get_type_from_name(val_type)
253
+ value = {
254
+ :binary => ::Win32::Registry::REG_BINARY,
255
+ :string => ::Win32::Registry::REG_SZ,
256
+ :multi_string => ::Win32::Registry::REG_MULTI_SZ,
257
+ :expand_string => ::Win32::Registry::REG_EXPAND_SZ,
258
+ :dword => ::Win32::Registry::REG_DWORD,
259
+ :dword_big_endian => ::Win32::Registry::REG_DWORD_BIG_ENDIAN,
260
+ :qword => ::Win32::Registry::REG_QWORD
261
+ }[val_type]
262
+ return value
263
+ end
264
+
265
+ def keys_missing?(key_path)
266
+ missing_key_arr = key_path.split("\\")
267
+ missing_key_arr.pop
268
+ key = missing_key_arr.join("\\")
269
+ !key_exists?(key)
270
+ end
271
+
272
+ def get_type_from_name(val_type)
273
+ _type_name_map[val_type]
274
+ end
275
+
276
+ def get_name_from_type(val_class)
277
+ _name_type_map[val_class]
278
+ end
279
+
280
+ private
281
+
282
+ def node
283
+ run_context && run_context.node
284
+ end
285
+
286
+ def machine_architecture
287
+ node[:kernel][:machine].to_sym
288
+ end
289
+
290
+ def assert_architecture!
291
+ if machine_architecture == :i386 && architecture == :x86_64
292
+ raise Chef::Exceptions::Win32RegArchitectureIncorrect, "cannot access 64-bit registry on a 32-bit windows instance"
293
+ end
294
+ end
295
+
296
+ def get_hive_and_key(path)
297
+ reg_path = path.split("\\")
298
+ hive_name = reg_path.shift
299
+ key = reg_path.join("\\")
300
+
301
+ hive = {
302
+ "HKLM" => ::Win32::Registry::HKEY_LOCAL_MACHINE,
303
+ "HKEY_LOCAL_MACHINE" => ::Win32::Registry::HKEY_LOCAL_MACHINE,
304
+ "HKU" => ::Win32::Registry::HKEY_USERS,
305
+ "HKEY_USERS" => ::Win32::Registry::HKEY_USERS,
306
+ "HKCU" => ::Win32::Registry::HKEY_CURRENT_USER,
307
+ "HKEY_CURRENT_USER" => ::Win32::Registry::HKEY_CURRENT_USER,
308
+ "HKCR" => ::Win32::Registry::HKEY_CLASSES_ROOT,
309
+ "HKEY_CLASSES_ROOT" => ::Win32::Registry::HKEY_CLASSES_ROOT,
310
+ "HKCC" => ::Win32::Registry::HKEY_CURRENT_CONFIG,
311
+ "HKEY_CURRENT_CONFIG" => ::Win32::Registry::HKEY_CURRENT_CONFIG,
312
+ }[hive_name]
313
+
314
+ raise Chef::Exceptions::Win32RegHiveMissing, "Registry Hive #{hive_name} does not exist" unless hive
315
+
316
+ return hive, key
317
+ end
318
+
319
+ def _type_name_map
320
+ {
321
+ :binary => ::Win32::Registry::REG_BINARY,
322
+ :string => ::Win32::Registry::REG_SZ,
323
+ :multi_string => ::Win32::Registry::REG_MULTI_SZ,
324
+ :expand_string => ::Win32::Registry::REG_EXPAND_SZ,
325
+ :dword => ::Win32::Registry::REG_DWORD,
326
+ :dword_big_endian => ::Win32::Registry::REG_DWORD_BIG_ENDIAN,
327
+ :qword => ::Win32::Registry::REG_QWORD
328
+ }
329
+ end
330
+
331
+ def _name_type_map
332
+ @_name_type_map ||= _type_name_map.invert
333
+ end
334
+
335
+ def get_type_from_num(val_type)
336
+ value = {
337
+ 3 => ::Win32::Registry::REG_BINARY,
338
+ 1 => ::Win32::Registry::REG_SZ,
339
+ 7 => ::Win32::Registry::REG_MULTI_SZ,
340
+ 2 => ::Win32::Registry::REG_EXPAND_SZ,
341
+ 4 => ::Win32::Registry::REG_DWORD,
342
+ 5 => ::Win32::Registry::REG_DWORD_BIG_ENDIAN,
343
+ 11 => ::Win32::Registry::REG_QWORD
344
+ }[val_type]
345
+ return value
346
+ end
347
+
348
+ def create_missing(key_path)
349
+ missing_key_arr = key_path.split("\\")
350
+ hivename = missing_key_arr.shift
351
+ missing_key_arr.pop
352
+ existing_key_path = hivename
353
+ hive, key = get_hive_and_key(key_path)
354
+ missing_key_arr.each do |intermediate_key|
355
+ existing_key_path = existing_key_path << "\\" << intermediate_key
356
+ if !key_exists?(existing_key_path)
357
+ Chef::Log.debug("Recursively creating registry key #{existing_key_path}")
358
+ hive.create(get_key(existing_key_path), ::Win32::Registry::KEY_ALL_ACCESS | registry_system_architecture)
359
+ end
360
+ end
361
+ end
362
+
363
+ def get_key(path)
364
+ reg_path = path.split("\\")
365
+ hive_name = reg_path.shift
366
+ key = reg_path.join("\\")
367
+ end
368
+
369
+ end
370
+ end
371
+ end