chef 11.4.4 → 11.6.0.hotfix.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. data/README.md +1 -1
  2. data/Rakefile +18 -1
  3. data/bin/chef-service-manager +37 -0
  4. data/distro/common/html/chef-client.8.html +4 -4
  5. data/distro/common/html/chef-expander.8.html +4 -4
  6. data/distro/common/html/chef-expanderctl.8.html +4 -4
  7. data/distro/common/html/chef-server-webui.8.html +4 -4
  8. data/distro/common/html/chef-server.8.html +4 -4
  9. data/distro/common/html/chef-shell.1.html +4 -4
  10. data/distro/common/html/chef-solo.8.html +12 -18
  11. data/distro/common/html/chef-solr.8.html +4 -4
  12. data/distro/common/html/knife-bootstrap.1.html +4 -4
  13. data/distro/common/html/knife-client.1.html +4 -4
  14. data/distro/common/html/knife-configure.1.html +4 -4
  15. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  16. data/distro/common/html/knife-cookbook.1.html +7 -10
  17. data/distro/common/html/knife-data-bag.1.html +7 -10
  18. data/distro/common/html/knife-environment.1.html +6 -8
  19. data/distro/common/html/knife-exec.1.html +4 -4
  20. data/distro/common/html/knife-index.1.html +4 -4
  21. data/distro/common/html/knife-node.1.html +4 -4
  22. data/distro/common/html/knife-role.1.html +4 -4
  23. data/distro/common/html/knife-search.1.html +4 -4
  24. data/distro/common/html/knife-ssh.1.html +4 -4
  25. data/distro/common/html/knife-status.1.html +4 -4
  26. data/distro/common/html/knife-tag.1.html +4 -4
  27. data/distro/common/html/knife.1.html +4 -4
  28. data/distro/common/man/man1/chef-shell.1 +1 -1
  29. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  30. data/distro/common/man/man1/knife-client.1 +1 -1
  31. data/distro/common/man/man1/knife-configure.1 +1 -1
  32. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  33. data/distro/common/man/man1/knife-cookbook.1 +2 -15
  34. data/distro/common/man/man1/knife-data-bag.1 +2 -15
  35. data/distro/common/man/man1/knife-environment.1 +2 -12
  36. data/distro/common/man/man1/knife-exec.1 +1 -1
  37. data/distro/common/man/man1/knife-index.1 +1 -1
  38. data/distro/common/man/man1/knife-node.1 +1 -1
  39. data/distro/common/man/man1/knife-role.1 +1 -1
  40. data/distro/common/man/man1/knife-search.1 +1 -1
  41. data/distro/common/man/man1/knife-ssh.1 +1 -1
  42. data/distro/common/man/man1/knife-status.1 +1 -1
  43. data/distro/common/man/man1/knife-tag.1 +1 -1
  44. data/distro/common/man/man1/knife.1 +1 -1
  45. data/distro/common/man/man8/chef-client.8 +1 -1
  46. data/distro/common/man/man8/chef-expander.8 +1 -1
  47. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  48. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  49. data/distro/common/man/man8/chef-server.8 +1 -1
  50. data/distro/common/man/man8/chef-solo.8 +4 -36
  51. data/distro/common/man/man8/chef-solr.8 +1 -1
  52. data/distro/debian/etc/init.d/chef-client +4 -2
  53. data/distro/windows/service_manager.rb +2 -146
  54. data/lib/chef.rb +1 -1
  55. data/lib/chef/application.rb +5 -12
  56. data/lib/chef/application/apply.rb +2 -0
  57. data/lib/chef/application/client.rb +12 -12
  58. data/lib/chef/application/knife.rb +2 -2
  59. data/lib/chef/application/solo.rb +4 -5
  60. data/lib/chef/application/windows_service.rb +113 -56
  61. data/lib/chef/application/windows_service_manager.rb +179 -0
  62. data/lib/chef/chef_fs.rb +2 -4
  63. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  64. data/lib/chef/chef_fs/command_line.rb +145 -93
  65. data/lib/chef/chef_fs/config.rb +205 -0
  66. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  67. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  68. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  69. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  70. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  71. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  72. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  73. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  74. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  75. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  76. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  77. data/lib/chef/chef_fs/file_system.rb +195 -127
  78. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  79. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  80. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  81. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  82. data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
  83. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  84. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  85. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  86. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  87. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
  88. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
  89. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
  90. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
  91. data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
  92. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  94. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
  95. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
  96. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
  97. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  98. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  99. data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
  100. data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
  101. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  102. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  103. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  104. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  105. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
  106. data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
  107. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  108. data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
  109. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  110. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  111. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
  112. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
  113. data/lib/chef/chef_fs/knife.rb +68 -29
  114. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  115. data/lib/chef/chef_fs/path_utils.rb +29 -3
  116. data/lib/chef/chef_fs/raw_request.rb +79 -0
  117. data/lib/chef/client.rb +46 -20
  118. data/lib/chef/config.rb +59 -61
  119. data/lib/chef/cookbook/chefignore.rb +2 -1
  120. data/lib/chef/cookbook/synchronizer.rb +8 -6
  121. data/lib/chef/cookbook/syntax_check.rb +17 -2
  122. data/lib/chef/cookbook_uploader.rb +10 -1
  123. data/lib/chef/cookbook_version.rb +0 -109
  124. data/lib/chef/data_bag.rb +15 -6
  125. data/lib/chef/deprecation/mixin/template.rb +49 -0
  126. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  127. data/lib/chef/deprecation/provider/file.rb +197 -0
  128. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  129. data/lib/chef/deprecation/provider/template.rb +63 -0
  130. data/lib/chef/deprecation/warnings.rb +38 -0
  131. data/lib/chef/encrypted_data_bag_item.rb +153 -61
  132. data/lib/chef/environment.rb +34 -3
  133. data/lib/chef/event_dispatch/base.rb +3 -0
  134. data/lib/chef/exceptions.rb +27 -2
  135. data/lib/chef/file_access_control/unix.rb +64 -7
  136. data/lib/chef/file_access_control/windows.rb +22 -11
  137. data/lib/chef/file_content_management/content_base.rb +56 -0
  138. data/lib/chef/file_content_management/deploy.rb +38 -0
  139. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  140. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  141. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  142. data/lib/chef/file_content_management/tempfile.rb +61 -0
  143. data/lib/chef/formatters/doc.rb +1 -1
  144. data/lib/chef/formatters/error_descriptor.rb +5 -4
  145. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  146. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
  147. data/lib/chef/json_compat.rb +3 -0
  148. data/lib/chef/knife.rb +12 -3
  149. data/lib/chef/knife/bootstrap.rb +46 -2
  150. data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
  151. data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
  152. data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
  153. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
  154. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
  155. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
  156. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
  157. data/lib/chef/knife/client_show.rb +2 -5
  158. data/lib/chef/knife/configure.rb +3 -3
  159. data/lib/chef/knife/cookbook_create.rb +6 -5
  160. data/lib/chef/knife/cookbook_download.rb +13 -5
  161. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  162. data/lib/chef/knife/cookbook_test.rb +1 -0
  163. data/lib/chef/knife/cookbook_upload.rb +4 -9
  164. data/lib/chef/knife/core/bootstrap_context.rb +10 -4
  165. data/lib/chef/knife/core/generic_presenter.rb +16 -0
  166. data/lib/chef/knife/core/node_editor.rb +1 -1
  167. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  168. data/lib/chef/knife/core/ui.rb +19 -4
  169. data/lib/chef/knife/delete.rb +76 -9
  170. data/lib/chef/knife/deps.rb +139 -0
  171. data/lib/chef/knife/diff.rb +22 -5
  172. data/lib/chef/knife/download.rb +16 -3
  173. data/lib/chef/knife/edit.rb +76 -0
  174. data/lib/chef/knife/environment_show.rb +2 -7
  175. data/lib/chef/knife/list.rb +91 -47
  176. data/lib/chef/knife/node_run_list_set.rb +66 -0
  177. data/lib/chef/knife/node_show.rb +1 -7
  178. data/lib/chef/knife/raw.rb +20 -64
  179. data/lib/chef/knife/role_show.rb +2 -4
  180. data/lib/chef/knife/search.rb +5 -6
  181. data/lib/chef/knife/show.rb +34 -11
  182. data/lib/chef/knife/ssh.rb +8 -0
  183. data/lib/chef/knife/upload.rb +23 -4
  184. data/lib/chef/knife/user_show.rb +2 -5
  185. data/lib/chef/knife/xargs.rb +265 -0
  186. data/lib/chef/log.rb +2 -2
  187. data/lib/chef/mixin/file_class.rb +0 -9
  188. data/lib/chef/mixin/language_include_recipe.rb +1 -1
  189. data/lib/chef/mixin/params_validate.rb +19 -9
  190. data/lib/chef/mixin/template.rb +126 -36
  191. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  192. data/lib/chef/monkey_patches/file.rb +26 -0
  193. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  194. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  195. data/lib/chef/monologger.rb +93 -0
  196. data/lib/chef/node.rb +4 -0
  197. data/lib/chef/platform.rb +4 -490
  198. data/lib/chef/platform/provider_mapping.rb +529 -0
  199. data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
  200. data/lib/chef/provider.rb +12 -9
  201. data/lib/chef/provider/batch.rb +35 -0
  202. data/lib/chef/provider/cookbook_file.rb +9 -78
  203. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  204. data/lib/chef/provider/deploy.rb +24 -20
  205. data/lib/chef/provider/deploy/revision.rb +27 -0
  206. data/lib/chef/provider/directory.rb +19 -22
  207. data/lib/chef/provider/execute.rb +22 -5
  208. data/lib/chef/provider/file.rb +299 -217
  209. data/lib/chef/provider/file/content.rb +39 -0
  210. data/lib/chef/provider/git.rb +76 -43
  211. data/lib/chef/provider/group/usermod.rb +2 -2
  212. data/lib/chef/provider/ifconfig.rb +25 -35
  213. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  214. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  215. data/lib/chef/provider/link.rb +10 -3
  216. data/lib/chef/provider/mount.rb +1 -1
  217. data/lib/chef/provider/mount/mount.rb +8 -3
  218. data/lib/chef/provider/mount/windows.rb +4 -1
  219. data/lib/chef/provider/package/portage.rb +9 -4
  220. data/lib/chef/provider/package/rubygems.rb +45 -10
  221. data/lib/chef/provider/package/smartos.rb +47 -36
  222. data/lib/chef/provider/package/yum.rb +19 -12
  223. data/lib/chef/provider/package/zypper.rb +45 -55
  224. data/lib/chef/provider/powershell_script.rb +77 -0
  225. data/lib/chef/provider/remote_directory.rb +5 -6
  226. data/lib/chef/provider/remote_file.rb +12 -108
  227. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  228. data/lib/chef/provider/remote_file/content.rb +75 -0
  229. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  230. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  231. data/lib/chef/provider/remote_file/http.rb +124 -0
  232. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  233. data/lib/chef/provider/route.rb +6 -2
  234. data/lib/chef/provider/script.rb +14 -2
  235. data/lib/chef/provider/service/macosx.rb +16 -10
  236. data/lib/chef/provider/service/solaris.rb +6 -5
  237. data/lib/chef/provider/template.rb +16 -78
  238. data/lib/chef/provider/template/content.rb +61 -0
  239. data/lib/chef/provider/user/solaris.rb +90 -0
  240. data/lib/chef/provider/user/useradd.rb +76 -63
  241. data/lib/chef/provider/windows_script.rb +73 -0
  242. data/lib/chef/providers.rb +16 -0
  243. data/lib/chef/resource.rb +23 -2
  244. data/lib/chef/resource/batch.rb +31 -0
  245. data/lib/chef/resource/conditional.rb +4 -0
  246. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  247. data/lib/chef/resource/file.rb +31 -3
  248. data/lib/chef/resource/link.rb +17 -0
  249. data/lib/chef/resource/lwrp_base.rb +1 -1
  250. data/lib/chef/resource/mount.rb +29 -2
  251. data/lib/chef/resource/powershell_script.rb +31 -0
  252. data/lib/chef/resource/remote_file.rb +47 -1
  253. data/lib/chef/resource/route.rb +1 -1
  254. data/lib/chef/resource/template.rb +145 -0
  255. data/lib/chef/resource/windows_script.rb +62 -0
  256. data/lib/chef/resource_collection.rb +45 -11
  257. data/lib/chef/resource_reporter.rb +81 -52
  258. data/lib/chef/resources.rb +2 -0
  259. data/lib/chef/rest.rb +13 -4
  260. data/lib/chef/rest/rest_request.rb +5 -1
  261. data/lib/chef/run_context/cookbook_compiler.rb +3 -3
  262. data/lib/chef/run_list/run_list_expansion.rb +1 -1
  263. data/lib/chef/run_lock.rb +7 -1
  264. data/lib/chef/runner.rb +0 -1
  265. data/lib/chef/scan_access_control.rb +6 -1
  266. data/lib/chef/search/query.rb +2 -2
  267. data/lib/chef/shell/shell_session.rb +2 -2
  268. data/lib/chef/util/backup.rb +84 -0
  269. data/lib/chef/util/diff.rb +145 -0
  270. data/lib/chef/util/file_edit.rb +1 -1
  271. data/lib/chef/util/selinux.rb +100 -0
  272. data/lib/chef/util/windows/net_user.rb +14 -1
  273. data/lib/chef/util/windows/volume.rb +2 -2
  274. data/lib/chef/version.rb +1 -1
  275. data/lib/chef/version/platform.rb +42 -0
  276. data/lib/chef/version_class.rb +1 -1
  277. data/lib/chef/version_constraint.rb +6 -5
  278. data/lib/chef/version_constraint/platform.rb +26 -0
  279. data/lib/chef/win32/api/file.rb +8 -2
  280. data/lib/chef/win32/version.rb +25 -8
  281. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  282. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  283. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  284. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  285. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  286. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  287. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  288. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  289. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  290. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  291. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  292. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  293. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  294. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  295. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  296. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  297. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  298. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  299. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  300. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  301. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  302. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  303. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  304. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  305. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  306. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  307. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  308. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  309. data/spec/data/apt/var/www/apt/db/version +4 -0
  310. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  311. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  312. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  313. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  314. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  315. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  316. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  317. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  318. data/spec/data/bootstrap/secret.erb +9 -0
  319. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  320. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  321. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  322. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  323. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  324. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  325. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  326. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  327. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  328. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  329. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  330. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  331. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  332. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  333. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  334. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  335. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  336. data/spec/data/null_config.rb +1 -0
  337. data/spec/data/partial_one.erb +1 -1
  338. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  339. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  340. data/spec/functional/knife/exec_spec.rb +2 -2
  341. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  342. data/spec/functional/resource/batch_spec.rb +64 -0
  343. data/spec/functional/resource/cookbook_file_spec.rb +2 -3
  344. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  345. data/spec/functional/resource/directory_spec.rb +2 -2
  346. data/spec/functional/resource/file_spec.rb +17 -1
  347. data/spec/functional/resource/git_spec.rb +259 -0
  348. data/spec/functional/resource/link_spec.rb +422 -388
  349. data/spec/functional/resource/package_spec.rb +297 -0
  350. data/spec/functional/resource/powershell_spec.rb +188 -0
  351. data/spec/functional/resource/registry_spec.rb +8 -4
  352. data/spec/functional/resource/remote_directory_spec.rb +2 -2
  353. data/spec/functional/resource/remote_file_spec.rb +97 -29
  354. data/spec/functional/resource/template_spec.rb +173 -17
  355. data/spec/functional/resource/user_spec.rb +547 -0
  356. data/spec/functional/run_lock_spec.rb +5 -0
  357. data/spec/functional/shell_spec.rb +2 -1
  358. data/spec/functional/win32/service_manager_spec.rb +269 -0
  359. data/spec/functional/win32/versions_spec.rb +78 -0
  360. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  361. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  362. data/spec/integration/knife/chefignore_spec.rb +271 -0
  363. data/spec/integration/knife/delete_spec.rb +944 -0
  364. data/spec/integration/knife/deps_spec.rb +648 -0
  365. data/spec/integration/knife/diff_spec.rb +536 -0
  366. data/spec/integration/knife/download_spec.rb +962 -0
  367. data/spec/integration/knife/list_spec.rb +633 -0
  368. data/spec/integration/knife/raw_spec.rb +166 -0
  369. data/spec/integration/knife/redirection_spec.rb +57 -0
  370. data/spec/integration/knife/show_spec.rb +158 -0
  371. data/spec/integration/knife/upload_spec.rb +1060 -0
  372. data/spec/integration/solo/solo_spec.rb +41 -0
  373. data/spec/spec_helper.rb +55 -1
  374. data/spec/support/chef_helpers.rb +32 -0
  375. data/spec/support/platform_helpers.rb +40 -0
  376. data/spec/support/platforms/win32/spec_service.rb +59 -0
  377. data/spec/support/shared/functional/directory_resource.rb +43 -16
  378. data/spec/support/shared/functional/file_resource.rb +661 -20
  379. data/spec/support/shared/functional/securable_resource.rb +109 -8
  380. data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
  381. data/spec/support/shared/integration/integration_helper.rb +166 -0
  382. data/spec/support/shared/integration/knife_support.rb +171 -0
  383. data/spec/support/shared/unit/execute_resource.rb +125 -0
  384. data/spec/support/shared/unit/file_system_support.rb +8 -48
  385. data/spec/support/shared/unit/provider/file.rb +609 -0
  386. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  387. data/spec/support/shared/unit/script_resource.rb +52 -0
  388. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  389. data/spec/tiny_server.rb +13 -11
  390. data/spec/unit/application/client_spec.rb +39 -1
  391. data/spec/unit/application/knife_spec.rb +12 -0
  392. data/spec/unit/application/solo_spec.rb +1 -1
  393. data/spec/unit/application_spec.rb +57 -2
  394. data/spec/unit/chef_fs/diff_spec.rb +30 -31
  395. data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
  396. data/spec/unit/chef_fs/file_system_spec.rb +2 -3
  397. data/spec/unit/client_spec.rb +20 -1
  398. data/spec/unit/config_spec.rb +70 -52
  399. data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
  400. data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
  401. data/spec/unit/cookbook_loader_spec.rb +3 -2
  402. data/spec/unit/daemon_spec.rb +7 -7
  403. data/spec/unit/data_bag_spec.rb +7 -0
  404. data/spec/unit/deprecation_spec.rb +86 -0
  405. data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
  406. data/spec/unit/environment_spec.rb +98 -0
  407. data/spec/unit/exceptions_spec.rb +6 -1
  408. data/spec/unit/file_access_control_spec.rb +21 -1
  409. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  410. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  411. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  412. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  413. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
  414. data/spec/unit/knife/bootstrap_spec.rb +128 -29
  415. data/spec/unit/knife/configure_spec.rb +42 -26
  416. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  417. data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
  418. data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
  419. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  420. data/spec/unit/knife/core/ui_spec.rb +41 -0
  421. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  422. data/spec/unit/knife_spec.rb +21 -0
  423. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
  424. data/spec/unit/mixin/params_validate_spec.rb +35 -0
  425. data/spec/unit/mixin/template_spec.rb +69 -57
  426. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  427. data/spec/unit/node_spec.rb +7 -0
  428. data/spec/unit/platform_spec.rb +15 -1
  429. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  430. data/spec/unit/provider/cookbook_file_spec.rb +26 -183
  431. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  432. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  433. data/spec/unit/provider/deploy_spec.rb +2 -2
  434. data/spec/unit/provider/directory_spec.rb +23 -23
  435. data/spec/unit/provider/execute_spec.rb +27 -1
  436. data/spec/unit/provider/file/content_spec.rb +101 -0
  437. data/spec/unit/provider/file_spec.rb +25 -484
  438. data/spec/unit/provider/git_spec.rb +224 -28
  439. data/spec/unit/provider/group/usermod_spec.rb +3 -1
  440. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  441. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  442. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  443. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  444. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  445. data/spec/unit/provider/mount_spec.rb +16 -6
  446. data/spec/unit/provider/package/portage_spec.rb +44 -0
  447. data/spec/unit/provider/package/rubygems_spec.rb +44 -1
  448. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  449. data/spec/unit/provider/package/yum_spec.rb +36 -39
  450. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  451. data/spec/unit/provider/package_spec.rb +0 -4
  452. data/spec/unit/provider/powershell_spec.rb +38 -0
  453. data/spec/unit/provider/remote_directory_spec.rb +0 -4
  454. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  455. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  456. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  457. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  458. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  459. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  460. data/spec/unit/provider/remote_file_spec.rb +33 -295
  461. data/spec/unit/provider/route_spec.rb +25 -9
  462. data/spec/unit/provider/service/macosx_spec.rb +176 -152
  463. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  464. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  465. data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
  466. data/spec/unit/provider/service_spec.rb +3 -3
  467. data/spec/unit/provider/template/content_spec.rb +78 -0
  468. data/spec/unit/provider/template_spec.rb +52 -184
  469. data/spec/unit/provider/user/solaris_spec.rb +80 -0
  470. data/spec/unit/provider/user/useradd_spec.rb +12 -358
  471. data/spec/unit/resource/batch_spec.rb +48 -0
  472. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  473. data/spec/unit/resource/execute_spec.rb +3 -101
  474. data/spec/unit/resource/file_spec.rb +0 -5
  475. data/spec/unit/resource/group_spec.rb +9 -0
  476. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  477. data/spec/unit/resource/link_spec.rb +1 -0
  478. data/spec/unit/resource/mount_spec.rb +37 -0
  479. data/spec/unit/resource/powershell_spec.rb +48 -0
  480. data/spec/unit/resource/remote_file_spec.rb +44 -4
  481. data/spec/unit/resource/route_spec.rb +1 -1
  482. data/spec/unit/resource/script_spec.rb +13 -36
  483. data/spec/unit/resource/template_spec.rb +111 -8
  484. data/spec/unit/resource/user_spec.rb +7 -0
  485. data/spec/unit/resource_collection_spec.rb +61 -32
  486. data/spec/unit/resource_reporter_spec.rb +115 -102
  487. data/spec/unit/resource_spec.rb +170 -1
  488. data/spec/unit/rest/auth_credentials_spec.rb +2 -2
  489. data/spec/unit/rest_spec.rb +6 -2
  490. data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
  491. data/spec/unit/runner_spec.rb +1 -1
  492. data/spec/unit/scan_access_control_spec.rb +4 -2
  493. data/spec/unit/shell/shell_session_spec.rb +15 -2
  494. data/spec/unit/util/backup_spec.rb +149 -0
  495. data/spec/unit/util/diff_spec.rb +596 -0
  496. data/spec/unit/util/selinux_spec.rb +172 -0
  497. data/spec/unit/version/platform_spec.rb +61 -0
  498. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  499. data/spec/unit/version_constraint_spec.rb +5 -0
  500. metadata +233 -10
  501. data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
  502. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
  503. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
  504. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
@@ -0,0 +1,66 @@
1
+ #
2
+ # Author:: Mike Fiedler (<miketheman@gmail.com>)
3
+ # Copyright:: Copyright (c) 2013 Mike Fiedler
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class NodeRunListSet < Knife
24
+
25
+ deps do
26
+ require 'chef/node'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife node run_list set NODE ENTRIES (options)"
31
+
32
+ def run
33
+ if @name_args.size < 2
34
+ ui.fatal "You must supply both a node name and a run list."
35
+ show_usage
36
+ exit 1
37
+ elsif @name_args.size > 2
38
+ # Check for nested lists and create a single plain one
39
+ entries = @name_args[1..-1].map do |entry|
40
+ entry.split(',').map { |e| e.strip }
41
+ end.flatten
42
+ else
43
+ # Convert to array and remove the extra spaces
44
+ entries = @name_args[1].split(',').map { |e| e.strip }
45
+ end
46
+ node = Chef::Node.load(@name_args[0])
47
+
48
+ set_run_list(node, entries)
49
+
50
+ node.save
51
+
52
+ config[:run_list] = true
53
+
54
+ output(format_for_display(node))
55
+ end
56
+
57
+ # Clears out any existing run_list_items and sets them to the
58
+ # specified entries
59
+ def set_run_list(node, entries)
60
+ node.run_list.run_list_items.clear
61
+ entries.each { |e| node.run_list << e }
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -24,6 +24,7 @@ class Chef
24
24
  class NodeShow < Knife
25
25
 
26
26
  include Knife::Core::NodeFormattingOptions
27
+ include Knife::Core::MultiAttributeReturnOption
27
28
 
28
29
  deps do
29
30
  require 'chef/node'
@@ -32,13 +33,6 @@ class Chef
32
33
 
33
34
  banner "knife node show NODE (options)"
34
35
 
35
- @attrs_to_show = []
36
- option :attribute,
37
- :short => "-a [ATTR]",
38
- :long => "--attribute [ATTR]",
39
- :proc => lambda {|val| @attrs_to_show << val},
40
- :description => "Show one or more attributes"
41
-
42
36
  option :run_list,
43
37
  :short => "-r",
44
38
  :long => "--run-list",
@@ -1,21 +1,28 @@
1
- require 'json'
1
+ require 'chef/knife'
2
2
 
3
3
  class Chef
4
4
  class Knife
5
5
  class Raw < Chef::Knife
6
6
  banner "knife raw REQUEST_PATH"
7
7
 
8
+ deps do
9
+ require 'json'
10
+ require 'chef/rest'
11
+ require 'chef/config'
12
+ require 'chef/chef_fs/raw_request'
13
+ end
14
+
8
15
  option :method,
9
16
  :long => '--method METHOD',
10
17
  :short => '-m METHOD',
11
18
  :default => "GET",
12
- :description => "Request method (GET, POST, PUT or DELETE)"
19
+ :description => "Request method (GET, POST, PUT or DELETE). Default: GET"
13
20
 
14
21
  option :pretty,
15
22
  :long => '--[no-]pretty',
16
23
  :boolean => true,
17
24
  :default => true,
18
- :description => "Pretty-print JSON output"
25
+ :description => "Pretty-print JSON output. Default: true"
19
26
 
20
27
  option :input,
21
28
  :long => '--input FILE',
@@ -39,70 +46,19 @@ class Chef
39
46
  data = IO.read(config[:input])
40
47
  end
41
48
  chef_rest = Chef::REST.new(Chef::Config[:chef_server_url])
42
- puts api_request(chef_rest, config[:method].to_sym, chef_rest.create_url(name_args[0]), {}, data)
43
- end
44
-
45
- ACCEPT_ENCODING = "Accept-Encoding".freeze
46
- ENCODING_GZIP_DEFLATE = "gzip;q=1.0,deflate;q=0.6,identity;q=0.3".freeze
47
-
48
- def redirected_to(response)
49
- return nil unless response.kind_of?(Net::HTTPRedirection)
50
- # Net::HTTPNotModified is undesired subclass of Net::HTTPRedirection so test for this
51
- return nil if response.kind_of?(Net::HTTPNotModified)
52
- response['location']
53
- end
54
-
55
- def api_request(chef_rest, method, url, headers={}, data=false)
56
- json_body = data
57
- # json_body = data ? Chef::JSONCompat.to_json(data) : nil
58
- # Force encoding to binary to fix SSL related EOFErrors
59
- # cf. http://tickets.opscode.com/browse/CHEF-2363
60
- # http://redmine.ruby-lang.org/issues/5233
61
- # json_body.force_encoding(Encoding::BINARY) if json_body.respond_to?(:force_encoding)
62
- headers = build_headers(chef_rest, method, url, headers, json_body)
63
-
64
- chef_rest.retriable_rest_request(method, url, json_body, headers) do |rest_request|
65
- response = rest_request.call {|r| r.read_body}
66
-
67
- response_body = chef_rest.decompress_body(response)
68
-
69
- if response.kind_of?(Net::HTTPSuccess)
70
- if config[:pretty] && response['content-type'] =~ /json/
71
- JSON.pretty_generate(JSON.parse(response_body, :create_additions => false))
72
- else
73
- response_body
74
- end
75
- elsif redirect_location = redirected_to(response)
76
- raise "Redirected to #{create_url(redirect_location)}"
77
- follow_redirect {api_request(:GET, create_url(redirect_location))}
78
- else
79
- # have to decompress the body before making an exception for it. But the body could be nil.
80
- response.body.replace(chef_rest.decompress_body(response)) if response.body.respond_to?(:replace)
81
-
82
- if response['content-type'] =~ /json/
83
- exception = response_body
84
- msg = "HTTP Request Returned #{response.code} #{response.message}: "
85
- msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
86
- Chef::Log.info(msg)
87
- end
88
- puts response.body
89
- response.error!
90
- end
49
+ begin
50
+ output Chef::ChefFS::RawRequest.api_request(chef_rest, config[:method].to_sym, chef_rest.create_url(name_args[0]), {}, data)
51
+ rescue Timeout::Error => e
52
+ ui.error "Server timeout"
53
+ exit 1
54
+ rescue Net::HTTPServerException => e
55
+ ui.error "Server responded with error #{e.response.code} \"#{e.response.message}\""
56
+ ui.error "Error Body: #{e.response.body}" if e.response.body && e.response.body != ''
57
+ exit 1
91
58
  end
92
59
  end
93
60
 
94
- def build_headers(chef_rest, method, url, headers={}, json_body=false, raw=false)
95
- # headers = @default_headers.merge(headers)
96
- #headers['Accept'] = "application/json" unless raw
97
- headers['Accept'] = "application/json" unless raw
98
- headers["Content-Type"] = 'application/json' if json_body
99
- headers['Content-Length'] = json_body.bytesize.to_s if json_body
100
- headers[Chef::REST::RESTRequest::ACCEPT_ENCODING] = Chef::REST::RESTRequest::ENCODING_GZIP_DEFLATE
101
- headers.merge!(chef_rest.authentication_headers(method, url, json_body)) if chef_rest.sign_requests?
102
- headers.merge!(Chef::Config[:custom_http_headers]) if Chef::Config[:custom_http_headers]
103
- headers
104
- end
105
- end
61
+ end # class Raw
106
62
  end
107
63
  end
108
64
 
@@ -22,6 +22,8 @@ class Chef
22
22
  class Knife
23
23
  class RoleShow < Knife
24
24
 
25
+ include Knife::Core::MultiAttributeReturnOption
26
+
25
27
  deps do
26
28
  require 'chef/node'
27
29
  require 'chef/json_compat'
@@ -29,10 +31,6 @@ class Chef
29
31
 
30
32
  banner "knife role show ROLE (options)"
31
33
 
32
- option :attribute,
33
- :short => "-a ATTR",
34
- :long => "--attribute ATTR",
35
- :description => "Show only one attribute"
36
34
 
37
35
  def run
38
36
  @role_name = @name_args[0]
@@ -23,6 +23,8 @@ class Chef
23
23
  class Knife
24
24
  class Search < Knife
25
25
 
26
+ include Knife::Core::MultiAttributeReturnOption
27
+
26
28
  deps do
27
29
  require 'chef/node'
28
30
  require 'chef/environment'
@@ -54,11 +56,6 @@ class Chef
54
56
  :default => 1000,
55
57
  :proc => lambda { |i| i.to_i }
56
58
 
57
- option :attribute,
58
- :short => "-a ATTR",
59
- :long => "--attribute ATTR",
60
- :description => "Show only one attribute"
61
-
62
59
  option :run_list,
63
60
  :short => "-r",
64
61
  :long => "--run-list",
@@ -114,7 +111,9 @@ class Chef
114
111
  ui.msg("\n")
115
112
  result_items.each do |item|
116
113
  output(item)
117
- ui.msg("\n")
114
+ unless config[:id_only]
115
+ ui.msg("\n")
116
+ end
118
117
  end
119
118
  end
120
119
  end
@@ -1,30 +1,53 @@
1
1
  require 'chef/chef_fs/knife'
2
- require 'chef/chef_fs/file_system'
3
2
 
4
3
  class Chef
5
4
  class Knife
6
5
  class Show < Chef::ChefFS::Knife
7
6
  banner "knife show [PATTERN1 ... PATTERNn]"
8
7
 
9
- common_options
8
+ deps do
9
+ require 'chef/chef_fs/file_system'
10
+ require 'chef/chef_fs/file_system/not_found_error'
11
+ end
12
+
13
+ option :local,
14
+ :long => '--local',
15
+ :boolean => true,
16
+ :description => "Show local files instead of remote"
10
17
 
11
18
  def run
12
19
  # Get the matches (recursively)
13
- pattern_args.each do |pattern|
14
- Chef::ChefFS::FileSystem.list(chef_fs, pattern) do |result|
15
- if result.dir?
16
- STDERR.puts "#{result.path_for_printing}: is a directory" if pattern.exact_path
20
+ error = false
21
+ entry_values = parallelize(pattern_args, :flatten => true) do |pattern|
22
+ parallelize(Chef::ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern)) do |entry|
23
+ if entry.dir?
24
+ ui.error "#{format_path(entry)}: is a directory" if pattern.exact_path
25
+ error = true
26
+ nil
17
27
  else
18
28
  begin
19
- value = result.read
20
- puts "#{result.path_for_printing}:"
21
- output(format_for_display(value))
22
- rescue Chef::ChefFS::FileSystem::NotFoundError
23
- STDERR.puts "#{result.path_for_printing}: No such file or directory"
29
+ [entry, entry.read]
30
+ rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
31
+ ui.error "#{format_path(e.entry)}: #{e.reason}."
32
+ error = true
33
+ nil
34
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
35
+ ui.error "#{format_path(e.entry)}: No such file or directory"
36
+ error = true
37
+ nil
24
38
  end
25
39
  end
26
40
  end
27
41
  end
42
+ entry_values.each do |entry, value|
43
+ if entry
44
+ output "#{format_path(entry)}:"
45
+ output(format_for_display(value))
46
+ end
47
+ end
48
+ if error
49
+ exit 1
50
+ end
28
51
  end
29
52
  end
30
53
  end
@@ -25,6 +25,7 @@ class Chef
25
25
  deps do
26
26
  require 'net/ssh'
27
27
  require 'net/ssh/multi'
28
+ require 'chef/monkey_patches/net-ssh-multi'
28
29
  require 'readline'
29
30
  require 'chef/exceptions'
30
31
  require 'chef/search/query'
@@ -80,6 +81,12 @@ class Chef
80
81
  :description => "The ssh gateway",
81
82
  :proc => Proc.new { |key| Chef::Config[:knife][:ssh_gateway] = key.strip }
82
83
 
84
+ option :forward_agent,
85
+ :short => "-A",
86
+ :long => "--forward-agent",
87
+ :description => "Enable SSH agent forwarding",
88
+ :boolean => true
89
+
83
90
  option :identity_file,
84
91
  :short => "-i IDENTITY_FILE",
85
92
  :long => "--identity-file IDENTITY_FILE",
@@ -182,6 +189,7 @@ class Chef
182
189
  session_opts[:keys] = File.expand_path(config[:identity_file]) if config[:identity_file]
183
190
  session_opts[:keys_only] = true if config[:identity_file]
184
191
  session_opts[:password] = config[:ssh_password] if config[:ssh_password]
192
+ session_opts[:forward_agent] = config[:forward_agent]
185
193
  session_opts[:port] = config[:ssh_port] || Chef::Config[:knife][:ssh_port] || ssh_config[:port]
186
194
  session_opts[:logger] = Chef::Log.logger if Chef::Log.level == :debug
187
195
 
@@ -1,12 +1,13 @@
1
1
  require 'chef/chef_fs/knife'
2
- require 'chef/chef_fs/command_line'
3
2
 
4
3
  class Chef
5
4
  class Knife
6
5
  class Upload < Chef::ChefFS::Knife
7
6
  banner "knife upload PATTERNS"
8
7
 
9
- common_options
8
+ deps do
9
+ require 'chef/chef_fs/command_line'
10
+ end
10
11
 
11
12
  option :recurse,
12
13
  :long => '--[no-]recurse',
@@ -24,7 +25,13 @@ class Chef
24
25
  :long => '--[no-]force',
25
26
  :boolean => true,
26
27
  :default => false,
27
- :description => "Force upload of files even if they match (quicker and harmless, but doesn't print out what it changed)"
28
+ :description => "Force upload of files even if they match (quicker for many files). Will overwrite frozen cookbooks."
29
+
30
+ option :freeze,
31
+ :long => '--[no-]freeze',
32
+ :boolean => true,
33
+ :default => false,
34
+ :description => "Freeze cookbooks that get uploaded."
28
35
 
29
36
  option :dry_run,
30
37
  :long => '--dry-run',
@@ -33,6 +40,12 @@ class Chef
33
40
  :default => false,
34
41
  :description => "Don't take action, only print what would happen"
35
42
 
43
+ option :diff,
44
+ :long => '--[no-]diff',
45
+ :boolean => true,
46
+ :default => true,
47
+ :description => 'Turn off to avoid uploading existing files; only new (and possibly deleted) files with --no-diff'
48
+
36
49
  def run
37
50
  if name_args.length == 0
38
51
  show_usage
@@ -40,8 +53,14 @@ class Chef
40
53
  exit 1
41
54
  end
42
55
 
56
+ error = false
43
57
  pattern_args.each do |pattern|
44
- Chef::ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config)
58
+ if Chef::ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config, ui, proc { |entry| format_path(entry) })
59
+ error = true
60
+ end
61
+ end
62
+ if error
63
+ exit 1
45
64
  end
46
65
  end
47
66
  end
@@ -22,6 +22,8 @@ class Chef
22
22
  class Knife
23
23
  class UserShow < Knife
24
24
 
25
+ include Knife::Core::MultiAttributeReturnOption
26
+
25
27
  deps do
26
28
  require 'chef/user'
27
29
  require 'chef/json_compat'
@@ -29,11 +31,6 @@ class Chef
29
31
 
30
32
  banner "knife user show USER (options)"
31
33
 
32
- option :attribute,
33
- :short => "-a ATTR",
34
- :long => "--attribute ATTR",
35
- :description => "Show only one attribute"
36
-
37
34
  def run
38
35
  @user_name = @name_args[0]
39
36
 
@@ -0,0 +1,265 @@
1
+ require 'chef/chef_fs/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class Xargs < Chef::ChefFS::Knife
6
+ banner "knife xargs [COMMAND]"
7
+
8
+ deps do
9
+ require 'chef/chef_fs/file_system'
10
+ require 'chef/chef_fs/file_system/not_found_error'
11
+ end
12
+
13
+ # TODO modify to remote-only / local-only pattern (more like delete)
14
+ option :local,
15
+ :long => '--local',
16
+ :boolean => true,
17
+ :description => "Xargs local files instead of remote"
18
+
19
+ option :patterns,
20
+ :long => '--pattern [PATTERN]',
21
+ :short => '-p [PATTERN]',
22
+ :description => "Pattern on command line (if these are not specified, a list of patterns is expected on standard input). Multiple patterns may be passed in this way.",
23
+ :arg_arity => [1,-1]
24
+
25
+ option :diff,
26
+ :long => '--[no-]diff',
27
+ :default => true,
28
+ :boolean => true,
29
+ :description => "Whether to show a diff when files change (default: true)"
30
+
31
+ option :dry_run,
32
+ :long => '--dry-run',
33
+ :boolean => true,
34
+ :description => "Prevents changes from actually being uploaded to the server."
35
+
36
+ option :force,
37
+ :long => '--[no-]force',
38
+ :boolean => true,
39
+ :default => false,
40
+ :description => "Force upload of files even if they are not changed (quicker and harmless, but doesn't print out what it changed)"
41
+
42
+ option :replace_first,
43
+ :long => '--replace-first REPLACESTR',
44
+ :short => '-J REPLACESTR',
45
+ :description => "String to replace with filenames. -J will only replace the FIRST occurrence of the replacement string."
46
+
47
+ option :replace_all,
48
+ :long => '--replace REPLACESTR',
49
+ :short => '-I REPLACESTR',
50
+ :description => "String to replace with filenames. -I will replace ALL occurrence of the replacement string."
51
+
52
+ option :max_arguments_per_command,
53
+ :long => '--max-args MAXARGS',
54
+ :short => '-n MAXARGS',
55
+ :description => "Maximum number of arguments per command line."
56
+
57
+ option :max_command_line,
58
+ :long => '--max-chars LENGTH',
59
+ :short => '-s LENGTH',
60
+ :description => "Maximum size of command line, in characters"
61
+
62
+ option :verbose_commands,
63
+ :short => '-t',
64
+ :description => "Print command to be run on the command line"
65
+
66
+ option :null_separator,
67
+ :short => '-0',
68
+ :boolean => true,
69
+ :description => "Use the NULL character (\0) as a separator, instead of whitespace"
70
+
71
+ def run
72
+ error = false
73
+ # Get the matches (recursively)
74
+ files = []
75
+ pattern_args_from(get_patterns).each do |pattern|
76
+ Chef::ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern).each do |result|
77
+ if result.dir?
78
+ # TODO option to include directories
79
+ ui.warn "#{format_path(result)}: is a directory. Will not run #{command} on it."
80
+ else
81
+ files << result
82
+ ran = false
83
+
84
+ # If the command would be bigger than max command line, back it off a bit
85
+ # and run a slightly smaller command (with one less arg)
86
+ if config[:max_command_line]
87
+ command, tempfiles = create_command(files)
88
+ begin
89
+ if command.length > config[:max_command_line].to_i
90
+ if files.length > 1
91
+ command, tempfiles_minus_one = create_command(files[0..-2])
92
+ begin
93
+ error = true if xargs_files(command, tempfiles_minus_one)
94
+ files = [ files[-1] ]
95
+ ran = true
96
+ ensure
97
+ destroy_tempfiles(tempfiles)
98
+ end
99
+ else
100
+ error = true if xargs_files(command, tempfiles)
101
+ files = [ ]
102
+ ran = true
103
+ end
104
+ end
105
+ ensure
106
+ destroy_tempfiles(tempfiles)
107
+ end
108
+ end
109
+
110
+ # If the command has hit the limit for the # of arguments, run it
111
+ if !ran && config[:max_arguments_per_command] && files.size >= config[:max_arguments_per_command].to_i
112
+ command, tempfiles = create_command(files)
113
+ begin
114
+ error = true if xargs_files(command, tempfiles)
115
+ files = []
116
+ ran = true
117
+ ensure
118
+ destroy_tempfiles(tempfiles)
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ # Any leftovers commands shall be run
126
+ if files.size > 0
127
+ command, tempfiles = create_command(files)
128
+ begin
129
+ error = true if xargs_files(command, tempfiles)
130
+ ensure
131
+ destroy_tempfiles(tempfiles)
132
+ end
133
+ end
134
+
135
+ if error
136
+ exit 1
137
+ end
138
+ end
139
+
140
+ def get_patterns
141
+ if config[:patterns]
142
+ [ config[:patterns] ].flatten
143
+ elsif config[:null_separator]
144
+ stdin.binmode
145
+ stdin.read.split("\000")
146
+ else
147
+ stdin.read.split(/\s+/)
148
+ end
149
+ end
150
+
151
+ def create_command(files)
152
+ command = name_args.join(' ')
153
+
154
+ # Create the (empty) tempfiles
155
+ tempfiles = {}
156
+ begin
157
+ # Create the temporary files
158
+ files.each do |file|
159
+ tempfile = Tempfile.new(file.name)
160
+ tempfiles[tempfile] = { :file => file }
161
+ end
162
+ rescue
163
+ destroy_tempfiles(files)
164
+ raise
165
+ end
166
+
167
+ # Create the command
168
+ paths = tempfiles.keys.map { |tempfile| tempfile.path }.join(' ')
169
+ if config[:replace_all]
170
+ final_command = command.gsub(config[:replace_all], paths)
171
+ elsif config[:replace_first]
172
+ final_command = command.sub(config[:replace_first], paths)
173
+ else
174
+ final_command = "#{command} #{paths}"
175
+ end
176
+
177
+ [final_command, tempfiles]
178
+ end
179
+
180
+ def destroy_tempfiles(tempfiles)
181
+ # Unlink the files now that we're done with them
182
+ tempfiles.keys.each { |tempfile| tempfile.close! }
183
+ end
184
+
185
+ def xargs_files(command, tempfiles)
186
+ error = false
187
+ # Create the temporary files
188
+ tempfiles.each_pair do |tempfile, file|
189
+ begin
190
+ value = file[:file].read
191
+ file[:value] = value
192
+ tempfile.open
193
+ tempfile.write(value)
194
+ tempfile.close
195
+ rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
196
+ ui.error "#{format_path(e.entry)}: #{e.reason}."
197
+ error = true
198
+ tempfile.close!
199
+ tempfiles.delete(tempfile)
200
+ next
201
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
202
+ ui.error "#{format_path(e.entry)}: No such file or directory"
203
+ error = true
204
+ tempfile.close!
205
+ tempfiles.delete(tempfile)
206
+ next
207
+ end
208
+ end
209
+
210
+ return error if error && tempfiles.size == 0
211
+
212
+ # Run the command
213
+ if config[:verbose_commands] || Chef::Config[:verbosity] && Chef::Config[:verbosity] >= 1
214
+ output sub_filenames(command, tempfiles)
215
+ end
216
+ command_output = `#{command}`
217
+ command_output = sub_filenames(command_output, tempfiles)
218
+ stdout.write command_output
219
+
220
+ # Check if the output is different
221
+ tempfiles.each_pair do |tempfile, file|
222
+ # Read the new output
223
+ new_value = IO.binread(tempfile.path)
224
+
225
+ # Upload the output if different
226
+ if config[:force] || new_value != file[:value]
227
+ if config[:dry_run]
228
+ output "Would update #{format_path(file[:file])}"
229
+ else
230
+ file[:file].write(new_value)
231
+ output "Updated #{format_path(file[:file])}"
232
+ end
233
+ end
234
+
235
+ # Print a diff of what was uploaded
236
+ if config[:diff] && new_value != file[:value]
237
+ old_file = Tempfile.open(file[:file].name)
238
+ begin
239
+ old_file.write(file[:value])
240
+ old_file.close
241
+
242
+ diff = `diff -u #{old_file.path} #{tempfile.path}`
243
+ diff.gsub!(old_file.path, "#{format_path(file[:file])} (old)")
244
+ diff.gsub!(tempfile.path, "#{format_path(file[:file])} (new)")
245
+ stdout.write diff
246
+ ensure
247
+ old_file.close!
248
+ end
249
+ end
250
+ end
251
+
252
+ error
253
+ end
254
+
255
+ def sub_filenames(str, tempfiles)
256
+ tempfiles.each_pair do |tempfile, file|
257
+ str = str.gsub(tempfile.path, format_path(file[:file]))
258
+ end
259
+ str
260
+ end
261
+
262
+ end
263
+ end
264
+ end
265
+