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
@@ -25,14 +25,14 @@ require 'chef/version'
25
25
  require 'chef/client'
26
26
  require 'chef/config'
27
27
 
28
- require 'chef/shef/shef_session'
29
- require 'chef/shef/ext'
28
+ require 'chef/shell/shell_session'
29
+ require 'chef/shell/ext'
30
30
  require 'chef/json_compat'
31
31
 
32
- # = Shef
33
- # Shef is Chef in an IRB session. Shef can interact with a Chef server via the
32
+ # = Shell
33
+ # Shell is Chef in an IRB session. Shell can interact with a Chef server via the
34
34
  # REST API, and run and debug recipes interactively.
35
- module Shef
35
+ module Shell
36
36
  LEADERS = Hash.new("")
37
37
  LEADERS[Chef::Recipe] = ":recipe"
38
38
  LEADERS[Chef::Node] = ":attributes"
@@ -44,7 +44,7 @@ module Shef
44
44
  attr_writer :editor
45
45
  end
46
46
 
47
- # Start the irb REPL with shef's customizations
47
+ # Start the irb REPL with chef-shell's customizations
48
48
  def self.start
49
49
  setup_logger
50
50
  # FUGLY HACK: irb gives us no other choice.
@@ -52,7 +52,6 @@ module Shef
52
52
  IRB::ExtendCommandBundle.instance_variable_get(:@ALIASES).delete(irb_help)
53
53
 
54
54
  parse_opts
55
- Chef::Config[:shell_config] = options.config
56
55
 
57
56
  # HACK: this duplicates the functions of IRB.start, but we have to do it
58
57
  # to get access to the main object before irb starts.
@@ -77,12 +76,14 @@ module Shef
77
76
 
78
77
  def self.setup_logger
79
78
  Chef::Config[:log_level] ||= :warn
79
+ # If log_level is auto, change it to warn
80
+ Chef::Config[:log_level] = :warn if Chef::Config[:log_level] == :auto
80
81
  Chef::Log.init(STDERR)
81
82
  Mixlib::Authentication::Log.logger = Ohai::Log.logger = Chef::Log.logger
82
83
  Chef::Log.level = Chef::Config[:log_level] || :warn
83
84
  end
84
85
 
85
- # Shef assumes it's running whenever it is defined
86
+ # Shell assumes it's running whenever it is defined
86
87
  def self.running?
87
88
  true
88
89
  end
@@ -98,7 +99,7 @@ module Shef
98
99
  end
99
100
 
100
101
  def self.configure_irb
101
- irb_conf[:HISTORY_FILE] = "~/.shef_history"
102
+ irb_conf[:HISTORY_FILE] = "~/.chef/chef_shell_history"
102
103
  irb_conf[:SAVE_HISTORY] = 1000
103
104
 
104
105
  irb_conf[:IRB_RC] = lambda do |conf|
@@ -113,7 +114,7 @@ module Shef
113
114
  end
114
115
 
115
116
  def self.leader(main_object)
116
- env_string = Shef.env ? " (#{Shef.env})" : ""
117
+ env_string = Shell.env ? " (#{Shell.env})" : ""
117
118
  LEADERS[main_object.class] + env_string
118
119
  end
119
120
 
@@ -144,7 +145,7 @@ module Shef
144
145
  end
145
146
 
146
147
  def self.greeting
147
- " #{Etc.getlogin}@#{Shef.session.node.fqdn}"
148
+ " #{Etc.getlogin}@#{Shell.session.node.fqdn}"
148
149
  rescue NameError, ArgumentError
149
150
  ""
150
151
  end
@@ -179,10 +180,10 @@ module Shef
179
180
  end
180
181
 
181
182
  def self.client_type
182
- type = Shef::StandAloneSession
183
- type = Shef::SoloSession if Chef::Config[:shef_solo]
184
- type = Shef::ClientSession if Chef::Config[:client]
185
- type = Shef::DoppelGangerSession if Chef::Config[:doppelganger]
183
+ type = Shell::StandAloneSession
184
+ type = Shell::SoloSession if Chef::Config[:shell_solo]
185
+ type = Shell::ClientSession if Chef::Config[:client]
186
+ type = Shell::DoppelGangerSession if Chef::Config[:doppelganger]
186
187
  type
187
188
  end
188
189
 
@@ -203,14 +204,14 @@ module Shef
203
204
  @footer
204
205
  end
205
206
 
206
- banner("shef #{Chef::VERSION}\n\nUsage: shef [NAMED_CONF] (OPTIONS)")
207
+ banner("chef-shell #{Chef::VERSION}\n\nUsage: chef-shell [NAMED_CONF] (OPTIONS)")
207
208
 
208
209
  footer(<<-FOOTER)
209
- When no CONFIG is specified, shef attempts to load a default configuration file:
210
- * If a NAMED_CONF is given, shef will load ~/.chef/NAMED_CONF/shef.rb
211
- * If no NAMED_CONF is given shef will load ~/.chef/shef.rb if it exists
212
- * Shef falls back to loading /etc/chef/client.rb or /etc/chef/solo.rb if -z or
213
- -s options are given and no shef.rb can be found.
210
+ When no CONFIG is specified, chef-shell attempts to load a default configuration file:
211
+ * If a NAMED_CONF is given, chef-shell will load ~/.chef/NAMED_CONF/chef_shell.rb
212
+ * If no NAMED_CONF is given chef-shell will load ~/.chef/chef_shell.rb if it exists
213
+ * chef-shell falls back to loading /etc/chef/client.rb or /etc/chef/solo.rb if -z or
214
+ -s options are given and no chef_shell.rb can be found.
214
215
  FOOTER
215
216
 
216
217
  option :config_file,
@@ -230,26 +231,26 @@ FOOTER
230
231
  :short => "-l LOG_LEVEL",
231
232
  :long => '--log-level LOG_LEVEL',
232
233
  :description => "Set the logging level",
233
- :proc => proc { |level| Chef::Log.level = level.to_sym }
234
+ :proc => proc { |level| Chef::Config.log_level = level.to_sym; Shell.setup_logger }
234
235
 
235
236
  option :standalone,
236
237
  :short => "-a",
237
238
  :long => "--standalone",
238
- :description => "standalone shef session",
239
+ :description => "standalone session",
239
240
  :default => true,
240
241
  :boolean => true
241
242
 
242
- option :shef_solo,
243
+ option :shell_solo,
243
244
  :short => "-s",
244
245
  :long => "--solo",
245
- :description => "chef-solo shef session",
246
+ :description => "chef-solo session",
246
247
  :boolean => true,
247
248
  :proc => proc {Chef::Config[:solo] = true}
248
249
 
249
250
  option :client,
250
251
  :short => "-z",
251
252
  :long => "--client",
252
- :description => "chef-client shef session",
253
+ :description => "chef-client session",
253
254
  :boolean => true
254
255
 
255
256
  option :json_attribs,
@@ -272,12 +273,6 @@ FOOTER
272
273
  :proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
273
274
  :exit => 0
274
275
 
275
- option :override_runlist,
276
- :short => "-o RunlistItem,RunlistItem...",
277
- :long => "--override-runlist RunlistItem,RunlistItem...",
278
- :description => "Replace current run list with specified items",
279
- :proc => lambda { |items| items.split(',').map { |item| Chef::RunList::RunListItem.new(item) }}
280
-
281
276
  def self.print_help
282
277
  instance = new
283
278
  instance.parse_options([])
@@ -298,8 +293,8 @@ FOOTER
298
293
  # We have to nuke ARGV to make sure irb's option parser never sees it.
299
294
  # otherwise, IRB complains about command line switches it doesn't recognize.
300
295
  ARGV.clear
301
- config[:config_file] = config_file_for_shef_mode(environment)
302
- config_msg = config[:config_file] || "none (standalone shef session)"
296
+ config[:config_file] = config_file_for_shell_mode(environment)
297
+ config_msg = config[:config_file] || "none (standalone session)"
303
298
  puts "loading configuration: #{config_msg}"
304
299
  Chef::Config.from_file(config[:config_file]) if !config[:config_file].nil? && File.exists?(config[:config_file]) && File.readable?(config[:config_file])
305
300
  Chef::Config.merge!(config)
@@ -307,19 +302,19 @@ FOOTER
307
302
 
308
303
  private
309
304
 
310
- def config_file_for_shef_mode(environment)
305
+ def config_file_for_shell_mode(environment)
311
306
  if config[:config_file]
312
307
  config[:config_file]
313
308
  elsif environment && ENV['HOME']
314
- Shef.env = environment
315
- config_file_to_try = ::File.join(ENV['HOME'], '.chef', environment, 'shef.rb')
309
+ Shell.env = environment
310
+ config_file_to_try = ::File.join(ENV['HOME'], '.chef', environment, 'chef_shell.rb')
316
311
  unless ::File.exist?(config_file_to_try)
317
- puts "could not find shef config for environment #{environment} at #{config_file_to_try}"
312
+ puts "could not find chef-shell config for environment #{environment} at #{config_file_to_try}"
318
313
  exit 1
319
314
  end
320
315
  config_file_to_try
321
- elsif ENV['HOME'] && ::File.exist?(File.join(ENV['HOME'], '.chef', 'shef.rb'))
322
- File.join(ENV['HOME'], '.chef', 'shef.rb')
316
+ elsif ENV['HOME'] && ::File.exist?(File.join(ENV['HOME'], '.chef', 'chef_shell.rb'))
317
+ File.join(ENV['HOME'], '.chef', 'chef_shell.rb')
323
318
  elsif config[:solo]
324
319
  "/etc/chef/solo.rb"
325
320
  elsif config[:client]
@@ -0,0 +1,593 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'tempfile'
20
+ require 'chef/recipe'
21
+ require 'fileutils'
22
+ require 'chef/dsl/platform_introspection'
23
+ require 'chef/version'
24
+ require 'chef/shell/shell_session'
25
+ require 'chef/shell/model_wrapper'
26
+ require 'chef/shell/shell_rest'
27
+ require 'chef/json_compat'
28
+
29
+ module Shell
30
+ module Extensions
31
+
32
+ Help = Struct.new(:cmd, :desc, :explanation)
33
+
34
+ # Extensions to be included in every 'main' object in chef-shell.
35
+ # These objects are extended with this module.
36
+ module ObjectCoreExtensions
37
+
38
+ def ensure_session_select_defined
39
+ # irb breaks if you prematurely define IRB::JobMangager
40
+ # so these methods need to be defined at the latest possible time.
41
+ unless jobs.respond_to?(:select_session_by_context)
42
+ def jobs.select_session_by_context(&block)
43
+ @jobs.select { |job| block.call(job[1].context.main)}
44
+ end
45
+ end
46
+
47
+ unless jobs.respond_to?(:session_select)
48
+ def jobs.select_shell_session(target_context)
49
+ session = if target_context.kind_of?(Class)
50
+ select_session_by_context { |main| main.kind_of?(target_context) }
51
+ else
52
+ select_session_by_context { |main| main.equal?(target_context) }
53
+ end
54
+ Array(session.first)[1]
55
+ end
56
+ end
57
+ end
58
+
59
+ def find_or_create_session_for(context_obj)
60
+ ensure_session_select_defined
61
+ if subsession = jobs.select_shell_session(context_obj)
62
+ jobs.switch(subsession)
63
+ else
64
+ irb(context_obj)
65
+ end
66
+ end
67
+
68
+ def help_banner
69
+ banner = []
70
+ banner << ""
71
+ banner << "chef-shell Help"
72
+ banner << "".ljust(80, "=")
73
+ banner << "| " + "Command".ljust(25) + "| " + "Description"
74
+ banner << "".ljust(80, "=")
75
+
76
+ self.all_help_descriptions.each do |help_text|
77
+ banner << "| " + help_text.cmd.ljust(25) + "| " + help_text.desc
78
+ end
79
+ banner << "".ljust(80, "=")
80
+ banner << "\n"
81
+ banner << "Use help(:command) to get detailed help with individual commands"
82
+ banner << "\n"
83
+ banner.join("\n")
84
+ end
85
+
86
+ def explain_command(method_name)
87
+ help = self.all_help_descriptions.find { |h| h.cmd.to_s == method_name.to_s }
88
+ if help
89
+ puts ""
90
+ puts "Command: #{method_name}"
91
+ puts "".ljust(80, "=")
92
+ puts help.explanation || help.desc
93
+ puts "".ljust(80, "=")
94
+ puts ""
95
+ else
96
+ puts ""
97
+ puts "command #{method_name} not found or no help available"
98
+ puts ""
99
+ end
100
+ end
101
+
102
+ # helpfully returns +:on+ so we can have sugary syntax like `tracing on'
103
+ def on
104
+ :on
105
+ end
106
+
107
+ # returns +:off+ so you can just do `tracing off'
108
+ def off
109
+ :off
110
+ end
111
+
112
+ def help_descriptions
113
+ @help_descriptions ||= []
114
+ end
115
+
116
+ def all_help_descriptions
117
+ help_descriptions
118
+ end
119
+
120
+ def desc(help_text)
121
+ @desc = help_text
122
+ end
123
+
124
+ def explain(explain_text)
125
+ @explain = explain_text
126
+ end
127
+
128
+ def subcommands(subcommand_help={})
129
+ @subcommand_help = subcommand_help
130
+ end
131
+
132
+ def singleton_method_added(mname)
133
+ if @desc
134
+ help_descriptions << Help.new(mname.to_s, @desc.to_s, @explain)
135
+ @desc, @explain = nil, nil
136
+ end
137
+ if @subcommand_help
138
+ @subcommand_help.each do |subcommand, text|
139
+ help_descriptions << Help.new("#{mname}.#{subcommand}", text.to_s, nil)
140
+ end
141
+ end
142
+ @subcommand_help = {}
143
+ end
144
+
145
+ end
146
+
147
+ module String
148
+ def on_off_to_bool
149
+ case self
150
+ when "on"
151
+ true
152
+ when "off"
153
+ false
154
+ else
155
+ self
156
+ end
157
+ end
158
+ end
159
+
160
+ module Symbol
161
+ def on_off_to_bool
162
+ self.to_s.on_off_to_bool
163
+ end
164
+ end
165
+
166
+ module TrueClass
167
+ def to_on_off_str
168
+ "on"
169
+ end
170
+
171
+ def on_off_to_bool
172
+ self
173
+ end
174
+ end
175
+
176
+ module FalseClass
177
+ def to_on_off_str
178
+ "off"
179
+ end
180
+
181
+ def on_off_to_bool
182
+ self
183
+ end
184
+ end
185
+
186
+ # Methods that have associated help text need to be dynamically added
187
+ # to the main irb objects, so we define them in a proc and later
188
+ # instance_eval the proc in the object.
189
+ ObjectUIExtensions = Proc.new do
190
+ extend Shell::Extensions::ObjectCoreExtensions
191
+
192
+ desc "prints this help message"
193
+ explain(<<-E)
194
+ ## SUMMARY ##
195
+ When called with no argument, +help+ prints a table of all
196
+ chef-shell commands. When called with an argument COMMAND, +help+
197
+ prints a detailed explanation of the command if available, or the
198
+ description if no explanation is available.
199
+ E
200
+ def help(commmand=nil)
201
+ if commmand
202
+ explain_command(commmand)
203
+ else
204
+ puts help_banner
205
+ end
206
+ :ucanhaz_halp
207
+ end
208
+ alias :halp :help
209
+
210
+ desc "prints information about chef"
211
+ def version
212
+ puts "This is the chef-shell.\n" +
213
+ " Chef Version: #{::Chef::VERSION}\n" +
214
+ " http://www.opscode.com/chef\n" +
215
+ " http://wiki.opscode.com/display/chef/Home"
216
+ :ucanhaz_automation
217
+ end
218
+ alias :shell :version
219
+
220
+ desc "switch to recipe mode"
221
+ def recipe_mode
222
+ find_or_create_session_for Shell.session.recipe
223
+ :recipe
224
+ end
225
+
226
+ desc "switch to attributes mode"
227
+ def attributes_mode
228
+ find_or_create_session_for Shell.session.node
229
+ :attributes
230
+ end
231
+
232
+ desc "run chef using the current recipe"
233
+ def run_chef
234
+ Chef::Log.level = :debug
235
+ session = Shell.session
236
+ runrun = Chef::Runner.new(session.run_context).converge
237
+ Chef::Log.level = :info
238
+ runrun
239
+ end
240
+
241
+ desc "returns an object to control a paused chef run"
242
+ subcommands :resume => "resume the chef run",
243
+ :step => "run only the next resource",
244
+ :skip_back => "move back in the run list",
245
+ :skip_forward => "move forward in the run list"
246
+ def chef_run
247
+ Shell.session.resource_collection.iterator
248
+ end
249
+
250
+ desc "resets the current recipe"
251
+ def reset
252
+ Shell.session.reset!
253
+ end
254
+
255
+ desc "assume the identity of another node."
256
+ def become_node(node_name)
257
+ Shell::DoppelGangerSession.instance.assume_identity(node_name)
258
+ :doppelganger
259
+ end
260
+ alias :doppelganger :become_node
261
+
262
+ desc "turns printout of return values on or off"
263
+ def echo(on_or_off)
264
+ conf.echo = on_or_off.on_off_to_bool
265
+ end
266
+
267
+ desc "says if echo is on or off"
268
+ def echo?
269
+ puts "echo is #{conf.echo.to_on_off_str}"
270
+ end
271
+
272
+ desc "turns on or off tracing of execution. *verbose*"
273
+ def tracing(on_or_off)
274
+ conf.use_tracer = on_or_off.on_off_to_bool
275
+ tracing?
276
+ end
277
+ alias :trace :tracing
278
+
279
+ desc "says if tracing is on or off"
280
+ def tracing?
281
+ puts "tracing is #{conf.use_tracer.to_on_off_str}"
282
+ end
283
+ alias :trace? :tracing?
284
+
285
+ desc "simple ls style command"
286
+ def ls(directory)
287
+ Dir.entries(directory)
288
+ end
289
+ end
290
+
291
+ MainContextExtensions = Proc.new do
292
+ desc "returns the current node (i.e., this host)"
293
+ def node
294
+ Shell.session.node
295
+ end
296
+
297
+ desc "pretty print the node's attributes"
298
+ def ohai(key=nil)
299
+ pp(key ? node.attribute[key] : node.attribute)
300
+ end
301
+ end
302
+
303
+ RESTApiExtensions = Proc.new do
304
+ desc "edit an object in your EDITOR"
305
+ explain(<<-E)
306
+ ## SUMMARY ##
307
+ +edit(object)+ allows you to edit any object that can be converted to JSON.
308
+ When finished editing, this method will return the edited object:
309
+
310
+ new_node = edit(existing_node)
311
+
312
+ ## EDITOR SELECTION ##
313
+ chef-shell looks for an editor using the following logic
314
+ 1. Looks for an EDITOR set by Shell.editor = "EDITOR"
315
+ 2. Looks for an EDITOR configured in your chef-shell config file
316
+ 3. Uses the value of the EDITOR environment variable
317
+ E
318
+ def edit(object)
319
+ unless Shell.editor
320
+ puts "Please set your editor with Shell.editor = \"vim|emacs|mate|ed\""
321
+ return :failburger
322
+ end
323
+
324
+ filename = "chef-shell-edit-#{object.class.name}-"
325
+ if object.respond_to?(:name)
326
+ filename += object.name
327
+ elsif object.respond_to?(:id)
328
+ filename += object.id
329
+ end
330
+
331
+ edited_data = Tempfile.open([filename, ".js"]) do |tempfile|
332
+ tempfile.sync = true
333
+ tempfile.puts Chef::JSONCompat.to_json(object)
334
+ system("#{Shell.editor.to_s} #{tempfile.path}")
335
+ tempfile.rewind
336
+ tempfile.read
337
+ end
338
+
339
+ Chef::JSONCompat.from_json(edited_data)
340
+ end
341
+
342
+ desc "Find and edit API clients"
343
+ explain(<<-E)
344
+ ## SUMMARY ##
345
+ +clients+ allows you to query you chef server for information about your api
346
+ clients.
347
+
348
+ ## LIST ALL CLIENTS ##
349
+ To see all clients on the system, use
350
+
351
+ clients.all #=> [<Chef::ApiClient...>, ...]
352
+
353
+ If the output from all is too verbose, or you're only interested in a specific
354
+ value from each of the objects, you can give a code block to +all+:
355
+
356
+ clients.all { |client| client.name } #=> [CLIENT1_NAME, CLIENT2_NAME, ...]
357
+
358
+ ## SHOW ONE CLIENT ##
359
+ To see a specific client, use
360
+
361
+ clients.show(CLIENT_NAME)
362
+
363
+ ## SEARCH FOR CLIENTS ##
364
+ You can also search for clients using +find+ or +search+. You can use the
365
+ familiar string search syntax:
366
+
367
+ clients.search("KEY:VALUE")
368
+
369
+ Just as the +all+ subcommand, the +search+ subcommand can use a code block to
370
+ filter or transform the information returned from the search:
371
+
372
+ clients.search("KEY:VALUE") { |c| c.name }
373
+
374
+ You can also use a Hash based syntax, multiple search conditions will be
375
+ joined with AND.
376
+
377
+ clients.find :KEY => :VALUE, :KEY2 => :VALUE2, ...
378
+
379
+ ## BULK-EDIT CLIENTS ##
380
+ **BE CAREFUL, THIS IS DESTRUCTIVE**
381
+ You can bulk edit API Clients using the +transform+ subcommand, which requires
382
+ a code block. Each client will be saved after the code block is run. If the
383
+ code block returns +nil+ or +false+, that client will be skipped:
384
+
385
+ clients.transform("*:*") do |client|
386
+ if client.name =~ /borat/i
387
+ client.admin(false)
388
+ true
389
+ else
390
+ nil
391
+ end
392
+ end
393
+
394
+ This will strip the admin privileges from any client named after borat.
395
+ E
396
+ subcommands :all => "list all api clients",
397
+ :show => "load an api client by name",
398
+ :search => "search for API clients",
399
+ :transform => "edit all api clients via a code block and save them"
400
+ def clients
401
+ @clients ||= Shell::ModelWrapper.new(Chef::ApiClient, :client)
402
+ end
403
+
404
+ desc "Find and edit cookbooks"
405
+ subcommands :all => "list all cookbooks",
406
+ :show => "load a cookbook by name",
407
+ :transform => "edit all cookbooks via a code block and save them"
408
+ def cookbooks
409
+ @cookbooks ||= Shell::ModelWrapper.new(Chef::CookbookVersion)
410
+ end
411
+
412
+ desc "Find and edit nodes via the API"
413
+ explain(<<-E)
414
+ ## SUMMARY ##
415
+ +nodes+ Allows you to query your chef server for information about your nodes.
416
+
417
+ ## LIST ALL NODES ##
418
+ You can list all nodes using +all+ or +list+
419
+
420
+ nodes.all #=> [<Chef::Node...>, <Chef::Node...>, ...]
421
+
422
+ To limit the information returned for each node, pass a code block to the +all+
423
+ subcommand:
424
+
425
+ nodes.all { |node| node.name } #=> [NODE1_NAME, NODE2_NAME, ...]
426
+
427
+ ## SHOW ONE NODE ##
428
+ You can show the data for a single node using the +show+ subcommand:
429
+
430
+ nodes.show("NODE_NAME") => <Chef::Node @name="NODE_NAME" ...>
431
+
432
+ ## SEARCH FOR NODES ##
433
+ You can search for nodes using the +search+ or +find+ subcommands:
434
+
435
+ nodes.find(:name => "app*") #=> [<Chef::Node @name="app1.example.com" ...>, ...]
436
+
437
+ Similarly to +all+, you can pass a code block to limit or transform the
438
+ information returned:
439
+
440
+ nodes.find(:name => "app#") { |node| node.ec2 }
441
+
442
+ ## BULK EDIT NODES ##
443
+ **BE CAREFUL, THIS OPERATION IS DESTRUCTIVE**
444
+
445
+ Bulk edit nodes by passing a code block to the +transform+ or +bulk_edit+
446
+ subcommand. The block will be applied to each matching node, and then the node
447
+ will be saved. If the block returns +nil+ or +false+, that node will be
448
+ skipped.
449
+
450
+ nodes.transform do |node|
451
+ if node.fqdn =~ /.*\\.preprod\\.example\\.com/
452
+ node.set[:environment] = "preprod"
453
+ end
454
+ end
455
+
456
+ This will assign the attribute to every node with a FQDN matching the regex.
457
+ E
458
+ subcommands :all => "list all nodes",
459
+ :show => "load a node by name",
460
+ :search => "search for nodes",
461
+ :transform => "edit all nodes via a code block and save them"
462
+ def nodes
463
+ @nodes ||= Shell::ModelWrapper.new(Chef::Node)
464
+ end
465
+
466
+ desc "Find and edit roles via the API"
467
+ explain(<<-E)
468
+ ## SUMMARY ##
469
+ +roles+ allows you to query and edit roles on your Chef server.
470
+
471
+ ## SUBCOMMANDS ##
472
+ * all (list)
473
+ * show (load)
474
+ * search (find)
475
+ * transform (bulk_edit)
476
+
477
+ ## SEE ALSO ##
478
+ See the help for +nodes+ for more information about the subcommands.
479
+ E
480
+ subcommands :all => "list all roles",
481
+ :show => "load a role by name",
482
+ :search => "search for roles",
483
+ :transform => "edit all roles via a code block and save them"
484
+ def roles
485
+ @roles ||= Shell::ModelWrapper.new(Chef::Role)
486
+ end
487
+
488
+ desc "Find and edit +databag_name+ via the api"
489
+ explain(<<-E)
490
+ ## SUMMARY ##
491
+ +databags(DATABAG_NAME)+ allows you to query and edit data bag items on your
492
+ Chef server. Unlike other commands for working with data on the server,
493
+ +databags+ requires the databag name as an argument, for example:
494
+ databags(:users).all
495
+
496
+ ## SUBCOMMANDS ##
497
+ * all (list)
498
+ * show (load)
499
+ * search (find)
500
+ * transform (bulk_edit)
501
+
502
+ ## SEE ALSO ##
503
+ See the help for +nodes+ for more information about the subcommands.
504
+
505
+ E
506
+ subcommands :all => "list all items in the data bag",
507
+ :show => "load a data bag item by id",
508
+ :search => "search for items in the data bag",
509
+ :transform => "edit all items via a code block and save them"
510
+ def databags(databag_name)
511
+ @named_databags_wrappers ||= {}
512
+ @named_databags_wrappers[databag_name] ||= Shell::NamedDataBagWrapper.new(databag_name)
513
+ end
514
+
515
+ desc "Find and edit environments via the API"
516
+ explain(<<-E)
517
+ ## SUMMARY ##
518
+ +environments+ allows you to query and edit environments on your Chef server.
519
+
520
+ ## SUBCOMMANDS ##
521
+ * all (list)
522
+ * show (load)
523
+ * search (find)
524
+ * transform (bulk_edit)
525
+
526
+ ## SEE ALSO ##
527
+ See the help for +nodes+ for more information about the subcommands.
528
+ E
529
+ subcommands :all => "list all environments",
530
+ :show => "load an environment by name",
531
+ :search => "search for environments",
532
+ :transform => "edit all environments via a code block and save them"
533
+ def environments
534
+ @environments ||= Shell::ModelWrapper.new(Chef::Environment)
535
+ end
536
+
537
+ desc "A REST Client configured to authenticate with the API"
538
+ def api
539
+ @rest = Shell::ShellREST.new(Chef::Config[:chef_server_url])
540
+ end
541
+
542
+ end
543
+
544
+ RecipeUIExtensions = Proc.new do
545
+ alias :original_resources :resources
546
+
547
+ desc "list all the resources on the current recipe"
548
+ def resources(*args)
549
+ if args.empty?
550
+ pp run_context.resource_collection.instance_variable_get(:@resources_by_name).keys
551
+ else
552
+ pp resources = original_resources(*args)
553
+ resources
554
+ end
555
+ end
556
+ end
557
+
558
+ def self.extend_context_object(obj)
559
+ obj.instance_eval(&ObjectUIExtensions)
560
+ obj.instance_eval(&MainContextExtensions)
561
+ obj.instance_eval(&RESTApiExtensions)
562
+ obj.extend(FileUtils)
563
+ obj.extend(Chef::DSL::PlatformIntrospection)
564
+ obj.extend(Chef::DSL::DataQuery)
565
+ end
566
+
567
+ def self.extend_context_node(node_obj)
568
+ node_obj.instance_eval(&ObjectUIExtensions)
569
+ end
570
+
571
+ def self.extend_context_recipe(recipe_obj)
572
+ recipe_obj.instance_eval(&ObjectUIExtensions)
573
+ recipe_obj.instance_eval(&RecipeUIExtensions)
574
+ end
575
+
576
+ end
577
+ end
578
+
579
+ class String
580
+ include Shell::Extensions::String
581
+ end
582
+
583
+ class Symbol
584
+ include Shell::Extensions::Symbol
585
+ end
586
+
587
+ class TrueClass
588
+ include Shell::Extensions::TrueClass
589
+ end
590
+
591
+ class FalseClass
592
+ include Shell::Extensions::FalseClass
593
+ end