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
@@ -155,8 +155,6 @@ class Chef
155
155
  RunListExpansionFromDisk.new(environment, @run_list_items)
156
156
  when 'server'
157
157
  RunListExpansionFromAPI.new(environment, @run_list_items, opts[:rest])
158
- when 'couchdb'
159
- RunListExpansionFromCouchDB.new(environment, @run_list_items, opts[:couchdb])
160
158
  end
161
159
  end
162
160
 
@@ -21,7 +21,6 @@ require 'chef/mash'
21
21
  require 'chef/mixin/deep_merge'
22
22
 
23
23
  require 'chef/role'
24
- require 'chef/couchdb'
25
24
  require 'chef/rest'
26
25
 
27
26
  class Chef
@@ -174,7 +173,7 @@ class Chef
174
173
  class RunListExpansionFromAPI < RunListExpansion
175
174
 
176
175
  def rest
177
- @rest ||= (source || Chef::REST.new(Chef::Config[:role_url]))
176
+ @rest ||= (source || Chef::REST.new(Chef::Config[:chef_server_url]))
178
177
  end
179
178
 
180
179
  def fetch_role(name, included_by)
@@ -188,19 +187,5 @@ class Chef
188
187
  end
189
188
  end
190
189
 
191
- # Expand a run list from couchdb. Used in chef-server-api
192
- class RunListExpansionFromCouchDB < RunListExpansion
193
-
194
- def couchdb
195
- source
196
- end
197
-
198
- def fetch_role(name, included_by)
199
- Chef::Role.cdb_load(name, couchdb)
200
- rescue Chef::Exceptions::CouchDBNotFound
201
- role_not_found(name, included_by)
202
- end
203
-
204
- end
205
190
  end
206
191
  end
@@ -0,0 +1,96 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'chef/mixin/create_path'
19
+ require 'fcntl'
20
+
21
+ class Chef
22
+
23
+ # == Chef::RunLock
24
+ # Provides an interface for acquiring and releasing a system-wide exclusive
25
+ # lock.
26
+ #
27
+ # Used by Chef::Client to ensure only one instance of chef-client (or solo)
28
+ # is modifying the system at a time.
29
+ class RunLock
30
+ include Chef::Mixin::CreatePath
31
+
32
+ attr_reader :runlock
33
+ attr_reader :runlock_file
34
+
35
+ # Create a new instance of RunLock
36
+ # === Arguments
37
+ # * config::: This will generally be the `Chef::Config`, but any Hash-like
38
+ # object with Symbol keys will work. See 'Parameters' section.
39
+ # === Parameters/Config
40
+ # * :lockfile::: if set, this will be used as the full path to the lockfile.
41
+ # * :file_cache_path::: if `:lockfile` is not set, the lock file will be
42
+ # named "chef-client-running.pid" and be placed in the directory given by
43
+ # `:file_cache_path`
44
+ def initialize(config)
45
+ @runlock_file = config[:lockfile] || "#{config[:file_cache_path]}/chef-client-running.pid"
46
+ @runlock = nil
47
+ end
48
+
49
+ # Acquire the system-wide lock. Will block indefinitely if another process
50
+ # already has the lock.
51
+ #
52
+ # Each call to acquire should have a corresponding call to #release.
53
+ #
54
+ # The implementation is based on File#flock (see also: flock(2)).
55
+ def acquire
56
+ # ensure the runlock_file path exists
57
+ create_path(File.dirname(runlock_file))
58
+ @runlock = File.open(runlock_file,'w+')
59
+ # if we support FD_CLOEXEC (linux, !windows), then use it.
60
+ # NB: ruby-2.0.0-p195 sets FD_CLOEXEC by default, but not ruby-1.8.7/1.9.3
61
+ if Fcntl.const_defined?('F_SETFD') && Fcntl.const_defined?('FD_CLOEXEC')
62
+ runlock.fcntl(Fcntl::F_SETFD, runlock.fcntl(Fcntl::F_GETFD, 0) | Fcntl::FD_CLOEXEC)
63
+ end
64
+ unless runlock.flock(File::LOCK_EX|File::LOCK_NB)
65
+ # Another chef client running...
66
+ runpid = runlock.read.strip.chomp
67
+ Chef::Log.warn("Chef client #{runpid} is running, will wait for it to finish and then run.")
68
+ runlock.flock(File::LOCK_EX)
69
+ end
70
+ # We grabbed the run lock. Save the pid.
71
+ runlock.truncate(0)
72
+ runlock.rewind # truncate doesn't reset position to 0.
73
+ runlock.write(Process.pid.to_s)
74
+ end
75
+
76
+ # Release the system-wide lock.
77
+ def release
78
+ if runlock
79
+ runlock.flock(File::LOCK_UN)
80
+ runlock.close
81
+ # Don't unlink the pid file, if another chef-client was waiting, it
82
+ # won't be recreated. Better to leave a "dead" pid file than not have
83
+ # it available if you need to break the lock.
84
+ reset
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def reset
91
+ @runlock = nil
92
+ end
93
+
94
+ end
95
+ end
96
+
@@ -18,10 +18,10 @@
18
18
  # limitations under the License.
19
19
  #
20
20
 
21
+ require 'chef/exceptions'
21
22
  require 'chef/mixin/params_validate'
22
23
  require 'chef/node'
23
24
  require 'chef/resource_collection'
24
- require 'chef/platform'
25
25
 
26
26
  class Chef
27
27
  # == Chef::Runner
@@ -81,15 +81,37 @@ class Chef
81
81
  Array(resource.action).each {|action| run_action(resource, action)}
82
82
  end
83
83
 
84
- # Run all our :delayed actions
84
+ rescue Exception => e
85
+ Chef::Log.info "Running queued delayed notifications before re-raising exception"
86
+ run_delayed_notifications(e)
87
+ else
88
+ run_delayed_notifications(nil)
89
+ true
90
+ end
91
+
92
+ private
93
+
94
+ # Run all our :delayed actions
95
+ def run_delayed_notifications(error=nil)
96
+ collected_failures = Exceptions::MultipleFailures.new
97
+ collected_failures.client_run_failure(error) unless error.nil?
85
98
  delayed_actions.each do |notification|
86
- Chef::Log.info( "#{notification.notifying_resource} sending #{notification.action}"\
87
- " action to #{notification.resource} (delayed)")
88
- # Struct of resource/action to call
89
- run_action(notification.resource, notification.action, :delayed)
99
+ result = run_delayed_notification(notification)
100
+ if result.kind_of?(Exception)
101
+ collected_failures.notification_failure(result)
102
+ end
90
103
  end
104
+ collected_failures.raise!
105
+ end
91
106
 
107
+ def run_delayed_notification(notification)
108
+ Chef::Log.info( "#{notification.notifying_resource} sending #{notification.action}"\
109
+ " action to #{notification.resource} (delayed)")
110
+ # Struct of resource/action to call
111
+ run_action(notification.resource, notification.action, :delayed)
92
112
  true
113
+ rescue Exception => e
114
+ e
93
115
  end
94
116
  end
95
117
  end
@@ -1,153 +1,20 @@
1
- #
2
- # Author:: Tim Hinderliter (<tim@opscode.com>)
3
- # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'chef/log'
19
- require 'uuidtools'
20
-
21
1
  class Chef
22
2
  class Sandbox
23
- attr_accessor :is_completed, :create_time
24
- alias_method :is_completed?, :is_completed
25
- attr_reader :guid
26
-
27
- alias :name :guid
28
-
29
- attr_accessor :couchdb, :couchdb_id, :couchdb_rev
30
-
31
- # list of checksum ids
32
- attr_accessor :checksums
33
-
34
- DESIGN_DOCUMENT = {
35
- "version" => 1,
36
- "language" => "javascript",
37
- "views" => {
38
- "all" => {
39
- "map" => <<-EOJS
40
- function(doc) {
41
- if (doc.chef_type == "sandbox") {
42
- emit(doc.guid, doc);
43
- }
44
- }
45
- EOJS
46
- },
47
- "all_id" => {
48
- "map" => <<-EOJS
49
- function(doc) {
50
- if (doc.chef_type == "sandbox") {
51
- emit(doc.guid, doc.guid);
52
- }
53
- }
54
- EOJS
55
- },
56
- "all_incomplete" => {
57
- "map" => <<-EOJS
58
- function(doc) {
59
- if (doc.chef_type == "sandbox" && !doc.is_completed) {
60
- emit(doc.guid, doc.guid);
61
- }
62
- }
63
- EOJS
64
- },
65
- "all_completed" => {
66
- "map" => <<-EOJS
67
- function(doc) {
68
- if (doc.chef_type == "sandbox" && doc.is_completed) {
69
- emit(doc.guid, doc.guid);
70
- }
71
- }
72
- EOJS
73
- },
74
- }
75
- }
76
-
77
- # Creates a new Chef::Sandbox object.
3
+ # I DO NOTHING!!
4
+
5
+ # So, the reason we have a completely empty class here is so that
6
+ # Chef 11 clients do not choke when interacting with Chef 10
7
+ # servers. The original Chef::Sandbox class (that actually did
8
+ # things) has been removed since its functionality is no longer
9
+ # needed for Chef 11. However, since we still use the JSON gem
10
+ # and make use of its "auto-inflation" of classes (driven by the
11
+ # contents of the 'json_class' key in all of our JSON), any
12
+ # sandbox responses from a Chef 10 server to a Chef 11 client
13
+ # would cause knife to crash. The JSON gem would attempt to
14
+ # auto-inflate based on a "json_class": "Chef::Sandbox" hash
15
+ # entry, but would not be able to find a Chef::Sandbox class!
78
16
  #
79
- # === Returns
80
- # object<Chef::Sandbox>:: Duh. :)
81
- def initialize(guid=nil, couchdb=nil)
82
- @guid = guid || UUIDTools::UUID.random_create.to_s.gsub(/\-/,'').downcase
83
- @is_completed = false
84
- @create_time = Time.now.iso8601
85
- @checksums = Array.new
86
- end
87
-
88
- def include?(checksum)
89
- @checksums.include?(checksum)
90
- end
91
-
92
- alias :member? :include?
93
-
94
- def to_json(*a)
95
- result = {
96
- :guid => guid,
97
- :name => name, # same as guid, used for id_map
98
- :checksums => checksums,
99
- :create_time => create_time,
100
- :is_completed => is_completed,
101
- :json_class => self.class.name,
102
- :chef_type => 'sandbox'
103
- }
104
- result["_rev"] = @couchdb_rev if @couchdb_rev
105
- result.to_json(*a)
106
- end
107
-
108
- def self.json_create(o)
109
- sandbox = new(o['guid'])
110
- sandbox.checksums = o['checksums']
111
- sandbox.create_time = o['create_time']
112
- sandbox.is_completed = o['is_completed']
113
- if o.has_key?('_rev')
114
- sandbox.couchdb_rev = o["_rev"]
115
- o.delete("_rev")
116
- end
117
- if o.has_key?("_id")
118
- sandbox.couchdb_id = o["_id"]
119
- #sandbox.index_id = sandbox.couchdb_id
120
- o.delete("_id")
121
- end
122
- sandbox
123
- end
124
-
125
- ##
126
- # Couchdb
127
- ##
128
-
129
- def self.create_design_document(couchdb=nil)
130
- (couchdb || Chef::CouchDB.new).create_design_document("sandboxes", DESIGN_DOCUMENT)
131
- end
132
-
133
- def self.cdb_list(inflate=false, couchdb=nil)
134
- rs = (couchdb || Chef::CouchDB.new).list("sandboxes", inflate)
135
- lookup = (inflate ? "value" : "key")
136
- rs["rows"].collect { |r| r[lookup] }
137
- end
138
-
139
- def self.cdb_load(guid, couchdb=nil)
140
- # Probably want to look for a view here at some point
141
- (couchdb || Chef::CouchDB.new).load("sandbox", guid)
142
- end
143
-
144
- def cdb_destroy
145
- (couchdb || Chef::CouchDB.new).delete("sandbox", guid, @couchdb_rev)
146
- end
147
-
148
- def cdb_save(couchdb=nil)
149
- @couchdb_rev = (couchdb || Chef::CouchDB.new).store("sandbox", guid, self)["rev"]
150
- end
151
-
17
+ # This is a workaround until such time as we can completely remove
18
+ # the reliance on the "json_class" field.
152
19
  end
153
20
  end
@@ -118,10 +118,8 @@ class Chef
118
118
 
119
119
  def current_mode
120
120
  case new_resource.mode
121
- when String, nil
122
- (stat.mode & 007777).to_s(8)
123
- when Integer
124
- stat.mode & 007777
121
+ when String, Integer, nil
122
+ "0#{(stat.mode & 07777).to_s(8)}"
125
123
  else
126
124
  Chef::Log.error("The `mode` parameter of the #@new_resource resource is set to an invalid value (#{new_resource.mode.inspect})")
127
125
  raise ArgumentError, "Invalid value #{new_resource.mode.inspect} for `mode` on resource #@new_resource"
@@ -129,7 +127,12 @@ class Chef
129
127
  end
130
128
 
131
129
  def stat
132
- @stat ||= @new_resource.instance_of?(Chef::Resource::Link) ? ::File.lstat(@new_resource.path) : ::File.stat(@new_resource.path)
130
+ @stat ||= if @new_resource.instance_of?(Chef::Resource::Link)
131
+ ::File.lstat(@new_resource.path)
132
+ else
133
+ realpath = ::File.realpath(@new_resource.path)
134
+ ::File.stat(realpath)
135
+ end
133
136
  end
134
137
  end
135
138
  end
@@ -31,7 +31,7 @@ class Chef
31
31
  attr_accessor :rest
32
32
 
33
33
  def initialize(url=nil)
34
- @rest = Chef::REST.new(url ||Chef::Config[:search_url])
34
+ @rest = Chef::REST.new(url ||Chef::Config[:chef_server_url])
35
35
  end
36
36
 
37
37
  # Search Solr for objects of a given type, for a given query. If you give
@@ -53,7 +53,7 @@ class Chef
53
53
  end
54
54
 
55
55
  def list_indexes
56
- response = @rest.get_rest("search")
56
+ @rest.get_rest("search")
57
57
  end
58
58
 
59
59
  private
@@ -1,6 +1,6 @@
1
1
  #--
2
- # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
- # Copyright:: Copyright (c) 2009 Daniel DeLeo
2
+ # Author:: Joshua Timberman (<joshua@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,576 +16,4 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'tempfile'
20
- require 'chef/recipe'
21
- require 'fileutils'
22
- require 'chef/version'
23
- require 'chef/shef/shef_session'
24
- require 'chef/shef/model_wrapper'
25
- require 'chef/shef/shef_rest'
26
- require 'chef/json_compat'
27
-
28
- module Shef
29
- module Extensions
30
-
31
- Help = Struct.new(:cmd, :desc, :explanation)
32
-
33
- # Extensions to be included in every 'main' object in shef. These objects
34
- # are extended with this module.
35
- module ObjectCoreExtensions
36
-
37
- def ensure_session_select_defined
38
- # irb breaks if you prematurely define IRB::JobMangager
39
- # so these methods need to be defined at the latest possible time.
40
- unless jobs.respond_to?(:select_session_by_context)
41
- def jobs.select_session_by_context(&block)
42
- @jobs.select { |job| block.call(job[1].context.main)}
43
- end
44
- end
45
-
46
- unless jobs.respond_to?(:session_select)
47
- def jobs.select_shef_session(target_context)
48
- session = if target_context.kind_of?(Class)
49
- select_session_by_context { |main| main.kind_of?(target_context) }
50
- else
51
- select_session_by_context { |main| main.equal?(target_context) }
52
- end
53
- Array(session.first)[1]
54
- end
55
- end
56
- end
57
-
58
- def find_or_create_session_for(context_obj)
59
- ensure_session_select_defined
60
- if subsession = jobs.select_shef_session(context_obj)
61
- jobs.switch(subsession)
62
- else
63
- irb(context_obj)
64
- end
65
- end
66
-
67
- def help_banner
68
- banner = []
69
- banner << ""
70
- banner << "Shef Help"
71
- banner << "".ljust(80, "=")
72
- banner << "| " + "Command".ljust(25) + "| " + "Description"
73
- banner << "".ljust(80, "=")
74
-
75
- self.all_help_descriptions.each do |help_text|
76
- banner << "| " + help_text.cmd.ljust(25) + "| " + help_text.desc
77
- end
78
- banner << "".ljust(80, "=")
79
- banner << "\n"
80
- banner << "Use help(:command) to get detailed help with individual commands"
81
- banner << "\n"
82
- banner.join("\n")
83
- end
84
-
85
- def explain_command(method_name)
86
- help = self.all_help_descriptions.find { |h| h.cmd.to_s == method_name.to_s }
87
- if help
88
- puts ""
89
- puts "Command: #{method_name}"
90
- puts "".ljust(80, "=")
91
- puts help.explanation || help.desc
92
- puts "".ljust(80, "=")
93
- puts ""
94
- else
95
- puts ""
96
- puts "command #{method_name} not found or no help available"
97
- puts ""
98
- end
99
- end
100
-
101
- # helpfully returns +:on+ so we can have sugary syntax like `tracing on'
102
- def on
103
- :on
104
- end
105
-
106
- # returns +:off+ so you can just do `tracing off'
107
- def off
108
- :off
109
- end
110
-
111
- def help_descriptions
112
- @help_descriptions ||= []
113
- end
114
-
115
- def all_help_descriptions
116
- help_descriptions
117
- end
118
-
119
- def desc(help_text)
120
- @desc = help_text
121
- end
122
-
123
- def explain(explain_text)
124
- @explain = explain_text
125
- end
126
-
127
- def subcommands(subcommand_help={})
128
- @subcommand_help = subcommand_help
129
- end
130
-
131
- def singleton_method_added(mname)
132
- if @desc
133
- help_descriptions << Help.new(mname.to_s, @desc.to_s, @explain)
134
- @desc, @explain = nil, nil
135
- end
136
- if @subcommand_help
137
- @subcommand_help.each do |subcommand, text|
138
- help_descriptions << Help.new("#{mname}.#{subcommand}", text.to_s, nil)
139
- end
140
- end
141
- @subcommand_help = {}
142
- end
143
-
144
- end
145
-
146
- module String
147
- def on_off_to_bool
148
- case self
149
- when "on"
150
- true
151
- when "off"
152
- false
153
- else
154
- self
155
- end
156
- end
157
- end
158
-
159
- module Symbol
160
- def on_off_to_bool
161
- self.to_s.on_off_to_bool
162
- end
163
- end
164
-
165
- module TrueClass
166
- def to_on_off_str
167
- "on"
168
- end
169
-
170
- def on_off_to_bool
171
- self
172
- end
173
- end
174
-
175
- module FalseClass
176
- def to_on_off_str
177
- "off"
178
- end
179
-
180
- def on_off_to_bool
181
- self
182
- end
183
- end
184
-
185
- # Methods that have associated help text need to be dynamically added
186
- # to the main irb objects, so we define them in a proc and later
187
- # instance_eval the proc in the object.
188
- ObjectUIExtensions = Proc.new do
189
- extend Shef::Extensions::ObjectCoreExtensions
190
-
191
- desc "prints this help message"
192
- explain(<<-E)
193
- ## SUMMARY ##
194
- When called with no argument, +help+ prints a table of all shef commands. When
195
- called with an argument COMMAND, +help+ prints a detailed explanation of the
196
- command if available, or the description if no explanation is available.
197
- E
198
- def help(commmand=nil)
199
- if commmand
200
- explain_command(commmand)
201
- else
202
- puts help_banner
203
- end
204
- :ucanhaz_halp
205
- end
206
- alias :halp :help
207
-
208
- desc "prints information about chef"
209
- def version
210
- puts "This is shef, the Chef shell.\n" +
211
- " Chef Version: #{::Chef::VERSION}\n" +
212
- " http://www.opscode.com/chef\n" +
213
- " http://wiki.opscode.com/display/chef/Home"
214
- :ucanhaz_automation
215
- end
216
- alias :shef :version
217
-
218
- desc "switch to recipe mode"
219
- def recipe
220
- find_or_create_session_for Shef.session.recipe
221
- :recipe
222
- end
223
-
224
- desc "switch to attributes mode"
225
- def attributes
226
- find_or_create_session_for Shef.session.node
227
- :attributes
228
- end
229
-
230
- desc "run chef using the current recipe"
231
- def run_chef
232
- Chef::Log.level = :debug
233
- session = Shef.session
234
- runrun = Chef::Runner.new(session.run_context).converge
235
- Chef::Log.level = :info
236
- runrun
237
- end
238
-
239
- desc "returns an object to control a paused chef run"
240
- subcommands :resume => "resume the chef run",
241
- :step => "run only the next resource",
242
- :skip_back => "move back in the run list",
243
- :skip_forward => "move forward in the run list"
244
- def chef_run
245
- Shef.session.resource_collection.iterator
246
- end
247
-
248
- desc "resets the current recipe"
249
- def reset
250
- Shef.session.reset!
251
- end
252
-
253
- desc "assume the identity of another node."
254
- def become_node(node_name)
255
- Shef::DoppelGangerSession.instance.assume_identity(node_name)
256
- :doppelganger
257
- end
258
- alias :doppelganger :become_node
259
-
260
- desc "turns printout of return values on or off"
261
- def echo(on_or_off)
262
- conf.echo = on_or_off.on_off_to_bool
263
- end
264
-
265
- desc "says if echo is on or off"
266
- def echo?
267
- puts "echo is #{conf.echo.to_on_off_str}"
268
- end
269
-
270
- desc "turns on or off tracing of execution. *verbose*"
271
- def tracing(on_or_off)
272
- conf.use_tracer = on_or_off.on_off_to_bool
273
- tracing?
274
- end
275
- alias :trace :tracing
276
-
277
- desc "says if tracing is on or off"
278
- def tracing?
279
- puts "tracing is #{conf.use_tracer.to_on_off_str}"
280
- end
281
- alias :trace? :tracing?
282
-
283
- desc "simple ls style command"
284
- def ls(directory)
285
- Dir.entries(directory)
286
- end
287
- end
288
-
289
- MainContextExtensions = Proc.new do
290
- desc "returns the current node (i.e., this host)"
291
- def node
292
- Shef.session.node
293
- end
294
-
295
- desc "pretty print the node's attributes"
296
- def ohai(key=nil)
297
- pp(key ? node.attribute[key] : node.attribute)
298
- end
299
- end
300
-
301
- RESTApiExtensions = Proc.new do
302
- desc "edit an object in your EDITOR"
303
- explain(<<-E)
304
- ## SUMMARY ##
305
- +edit(object)+ allows you to edit any object that can be converted to JSON.
306
- When finished editing, this method will return the edited object:
307
-
308
- new_node = edit(existing_node)
309
-
310
- ## EDITOR SELECTION ##
311
- Shef looks for an editor using the following logic
312
- 1. Looks for an EDITOR set by Shef.editor = "EDITOR"
313
- 2. Looks for an EDITOR configured in your shef config file
314
- 3. Uses the value of the EDITOR environment variable
315
- E
316
- def edit(object)
317
- unless Shef.editor
318
- puts "Please set your editor with Shef.editor = \"vim|emacs|mate|ed\""
319
- return :failburger
320
- end
321
-
322
- filename = "shef-edit-#{object.class.name}-"
323
- if object.respond_to?(:name)
324
- filename += object.name
325
- elsif object.respond_to?(:id)
326
- filename += object.id
327
- end
328
-
329
- edited_data = Tempfile.open([filename, ".js"]) do |tempfile|
330
- tempfile.sync = true
331
- tempfile.puts Chef::JSONCompat.to_json(object)
332
- system("#{Shef.editor.to_s} #{tempfile.path}")
333
- tempfile.rewind
334
- tempfile.read
335
- end
336
-
337
- Chef::JSONCompat.from_json(edited_data)
338
- end
339
-
340
- desc "Find and edit API clients"
341
- explain(<<-E)
342
- ## SUMMARY ##
343
- +clients+ allows you to query you chef server for information about your api
344
- clients.
345
-
346
- ## LIST ALL CLIENTS ##
347
- To see all clients on the system, use
348
-
349
- clients.all #=> [<Chef::ApiClient...>, ...]
350
-
351
- If the output from all is too verbose, or you're only interested in a specific
352
- value from each of the objects, you can give a code block to +all+:
353
-
354
- clients.all { |client| client.name } #=> [CLIENT1_NAME, CLIENT2_NAME, ...]
355
-
356
- ## SHOW ONE CLIENT ##
357
- To see a specific client, use
358
-
359
- clients.show(CLIENT_NAME)
360
-
361
- ## SEARCH FOR CLIENTS ##
362
- You can also search for clients using +find+ or +search+. You can use the
363
- familiar string search syntax:
364
-
365
- clients.search("KEY:VALUE")
366
-
367
- Just as the +all+ subcommand, the +search+ subcommand can use a code block to
368
- filter or transform the information returned from the search:
369
-
370
- clients.search("KEY:VALUE") { |c| c.name }
371
-
372
- You can also use a Hash based syntax, multiple search conditions will be
373
- joined with AND.
374
-
375
- clients.find :KEY => :VALUE, :KEY2 => :VALUE2, ...
376
-
377
- ## BULK-EDIT CLIENTS ##
378
- **BE CAREFUL, THIS IS DESTRUCTIVE**
379
- You can bulk edit API Clients using the +transform+ subcommand, which requires
380
- a code block. Each client will be saved after the code block is run. If the
381
- code block returns +nil+ or +false+, that client will be skipped:
382
-
383
- clients.transform("*:*") do |client|
384
- if client.name =~ /borat/i
385
- client.admin(false)
386
- true
387
- else
388
- nil
389
- end
390
- end
391
-
392
- This will strip the admin privileges from any client named after borat.
393
- E
394
- subcommands :all => "list all api clients",
395
- :show => "load an api client by name",
396
- :search => "search for API clients",
397
- :transform => "edit all api clients via a code block and save them"
398
- def clients
399
- @clients ||= Shef::ModelWrapper.new(Chef::ApiClient, :client)
400
- end
401
-
402
- desc "Find and edit cookbooks"
403
- subcommands :all => "list all cookbooks",
404
- :show => "load a cookbook by name",
405
- :transform => "edit all cookbooks via a code block and save them"
406
- def cookbooks
407
- @cookbooks ||= Shef::ModelWrapper.new(Chef::CookbookVersion)
408
- end
409
-
410
- desc "Find and edit nodes via the API"
411
- explain(<<-E)
412
- ## SUMMARY ##
413
- +nodes+ Allows you to query your chef server for information about your nodes.
414
-
415
- ## LIST ALL NODES ##
416
- You can list all nodes using +all+ or +list+
417
-
418
- nodes.all #=> [<Chef::Node...>, <Chef::Node...>, ...]
419
-
420
- To limit the information returned for each node, pass a code block to the +all+
421
- subcommand:
422
-
423
- nodes.all { |node| node.name } #=> [NODE1_NAME, NODE2_NAME, ...]
424
-
425
- ## SHOW ONE NODE ##
426
- You can show the data for a single node using the +show+ subcommand:
427
-
428
- nodes.show("NODE_NAME") => <Chef::Node @name="NODE_NAME" ...>
429
-
430
- ## SEARCH FOR NODES ##
431
- You can search for nodes using the +search+ or +find+ subcommands:
432
-
433
- nodes.find(:name => "app*") #=> [<Chef::Node @name="app1.example.com" ...>, ...]
434
-
435
- Similarly to +all+, you can pass a code block to limit or transform the
436
- information returned:
437
-
438
- nodes.find(:name => "app#") { |node| node.ec2 }
439
-
440
- ## BULK EDIT NODES ##
441
- **BE CAREFUL, THIS OPERATION IS DESTRUCTIVE**
442
-
443
- Bulk edit nodes by passing a code block to the +transform+ or +bulk_edit+
444
- subcommand. The block will be applied to each matching node, and then the node
445
- will be saved. If the block returns +nil+ or +false+, that node will be
446
- skipped.
447
-
448
- nodes.transform do |node|
449
- if node.fqdn =~ /.*\\.preprod\\.example\\.com/
450
- node.set[:environment] = "preprod"
451
- end
452
- end
453
-
454
- This will assign the attribute to every node with a FQDN matching the regex.
455
- E
456
- subcommands :all => "list all nodes",
457
- :show => "load a node by name",
458
- :search => "search for nodes",
459
- :transform => "edit all nodes via a code block and save them"
460
- def nodes
461
- @nodes ||= Shef::ModelWrapper.new(Chef::Node)
462
- end
463
-
464
- desc "Find and edit roles via the API"
465
- explain(<<-E)
466
- ## SUMMARY ##
467
- +roles+ allows you to query and edit roles on your Chef server.
468
-
469
- ## SUBCOMMANDS ##
470
- * all (list)
471
- * show (load)
472
- * search (find)
473
- * transform (bulk_edit)
474
-
475
- ## SEE ALSO ##
476
- See the help for +nodes+ for more information about the subcommands.
477
- E
478
- subcommands :all => "list all roles",
479
- :show => "load a role by name",
480
- :search => "search for roles",
481
- :transform => "edit all roles via a code block and save them"
482
- def roles
483
- @roles ||= Shef::ModelWrapper.new(Chef::Role)
484
- end
485
-
486
- desc "Find and edit +databag_name+ via the api"
487
- explain(<<-E)
488
- ## SUMMARY ##
489
- +databags(DATABAG_NAME)+ allows you to query and edit data bag items on your
490
- Chef server. Unlike other commands for working with data on the server,
491
- +databags+ requires the databag name as an argument, for example:
492
- databags(:users).all
493
-
494
- ## SUBCOMMANDS ##
495
- * all (list)
496
- * show (load)
497
- * search (find)
498
- * transform (bulk_edit)
499
-
500
- ## SEE ALSO ##
501
- See the help for +nodes+ for more information about the subcommands.
502
-
503
- E
504
- subcommands :all => "list all items in the data bag",
505
- :show => "load a data bag item by id",
506
- :search => "search for items in the data bag",
507
- :transform => "edit all items via a code block and save them"
508
- def databags(databag_name)
509
- @named_databags_wrappers ||= {}
510
- @named_databags_wrappers[databag_name] ||= Shef::NamedDataBagWrapper.new(databag_name)
511
- end
512
-
513
- desc "Find and edit environments via the API"
514
- explain(<<-E)
515
- ## SUMMARY ##
516
- +environments+ allows you to query and edit environments on your Chef server.
517
-
518
- ## SUBCOMMANDS ##
519
- * all (list)
520
- * show (load)
521
- * search (find)
522
- * transform (bulk_edit)
523
-
524
- ## SEE ALSO ##
525
- See the help for +nodes+ for more information about the subcommands.
526
- E
527
- subcommands :all => "list all environments",
528
- :show => "load an environment by name",
529
- :search => "search for environments",
530
- :transform => "edit all environments via a code block and save them"
531
- def environments
532
- @environments ||= Shef::ModelWrapper.new(Chef::Environment)
533
- end
534
-
535
- desc "A REST Client configured to authenticate with the API"
536
- def api
537
- @rest = Shef::ShefREST.new(Chef::Config[:chef_server_url])
538
- end
539
-
540
- end
541
-
542
- RecipeUIExtensions = Proc.new do
543
- alias :original_resources :resources
544
-
545
- desc "list all the resources on the current recipe"
546
- def resources(*args)
547
- if args.empty?
548
- pp run_context.resource_collection.instance_variable_get(:@resources_by_name).keys
549
- else
550
- pp resources = original_resources(*args)
551
- resources
552
- end
553
- end
554
- end
555
-
556
- def self.extend_context_object(obj)
557
- obj.instance_eval(&ObjectUIExtensions)
558
- obj.instance_eval(&MainContextExtensions)
559
- obj.instance_eval(&RESTApiExtensions)
560
- obj.extend(FileUtils)
561
- obj.extend(Chef::Mixin::Language)
562
- end
563
-
564
- def self.extend_context_node(node_obj)
565
- node_obj.instance_eval(&ObjectUIExtensions)
566
- end
567
-
568
- def self.extend_context_recipe(recipe_obj)
569
- recipe_obj.instance_eval(&ObjectUIExtensions)
570
- recipe_obj.instance_eval(&RecipeUIExtensions)
571
- end
572
-
573
- end
574
- end
575
-
576
- class String
577
- include Shef::Extensions::String
578
- end
579
-
580
- class Symbol
581
- include Shef::Extensions::Symbol
582
- end
583
-
584
- class TrueClass
585
- include Shef::Extensions::TrueClass
586
- end
587
-
588
- class FalseClass
589
- include Shef::Extensions::FalseClass
590
- end
591
-
19
+ require 'chef/shell/ext'