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
@@ -1,18 +1,30 @@
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 Delete < Chef::ChefFS::Knife
7
6
  banner "knife delete [PATTERN1 ... PATTERNn]"
8
7
 
9
- common_options
8
+ deps do
9
+ require 'chef/chef_fs/file_system'
10
+ end
10
11
 
11
12
  option :recurse,
13
+ :short => '-r',
12
14
  :long => '--[no-]recurse',
13
15
  :boolean => true,
14
16
  :default => false,
15
17
  :description => "Delete directories recursively."
18
+ option :both,
19
+ :long => '--both',
20
+ :boolean => true,
21
+ :default => false,
22
+ :description => "Delete both the local and remote copies."
23
+ option :local,
24
+ :long => '--local',
25
+ :boolean => true,
26
+ :default => false,
27
+ :description => "Delete the local copy (leave the remote copy)."
16
28
 
17
29
  def run
18
30
  if name_args.length == 0
@@ -22,16 +34,71 @@ class Chef
22
34
  end
23
35
 
24
36
  # Get the matches (recursively)
25
- pattern_args.each do |pattern|
26
- Chef::ChefFS::FileSystem.list(chef_fs, pattern) do |result|
27
- begin
28
- result.delete(config[:recurse])
29
- puts "Deleted #{result.path_for_printing}"
30
- rescue Chef::ChefFS::FileSystem::NotFoundError
31
- STDERR.puts "#{result.path_for_printing}: No such file or directory"
37
+ error = false
38
+ if config[:local]
39
+ pattern_args.each do |pattern|
40
+ Chef::ChefFS::FileSystem.list(local_fs, pattern).each do |result|
41
+ if delete_result(result)
42
+ error = true
43
+ end
32
44
  end
33
45
  end
46
+ elsif config[:both]
47
+ pattern_args.each do |pattern|
48
+ Chef::ChefFS::FileSystem.list_pairs(pattern, chef_fs, local_fs).each do |chef_result, local_result|
49
+ if delete_result(chef_result, local_result)
50
+ error = true
51
+ end
52
+ end
53
+ end
54
+ else # Remote only
55
+ pattern_args.each do |pattern|
56
+ Chef::ChefFS::FileSystem.list(chef_fs, pattern).each do |result|
57
+ if delete_result(result)
58
+ error = true
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ if error
65
+ exit 1
66
+ end
67
+ end
68
+
69
+ def format_path_with_root(entry)
70
+ root = entry.root == chef_fs ? " (remote)" : " (local)"
71
+ "#{format_path(entry)}#{root}"
72
+ end
73
+
74
+ def delete_result(*results)
75
+ deleted_any = false
76
+ found_any = false
77
+ error = false
78
+ results.each do |result|
79
+ begin
80
+ result.delete(config[:recurse])
81
+ deleted_any = true
82
+ found_any = true
83
+ rescue Chef::ChefFS::FileSystem::NotFoundError
84
+ # This is not an error unless *all* of them were not found
85
+ rescue Chef::ChefFS::FileSystem::MustDeleteRecursivelyError => e
86
+ ui.error "#{format_path_with_root(e.entry)} must be deleted recursively! Pass -r to knife delete."
87
+ found_any = true
88
+ error = true
89
+ rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
90
+ ui.error "#{format_path_with_root(e.entry)} #{e.reason}."
91
+ found_any = true
92
+ error = true
93
+ end
94
+ end
95
+ if deleted_any
96
+ output("Deleted #{format_path(results[0])}")
97
+ elsif !found_any
98
+ ui.error "#{format_path(results[0])}: No such file or directory"
99
+ error = true
34
100
  end
101
+ error
35
102
  end
36
103
  end
37
104
  end
@@ -0,0 +1,139 @@
1
+ require 'chef/chef_fs/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class Deps < Chef::ChefFS::Knife
6
+ banner "knife deps PATTERN1 [PATTERNn]"
7
+
8
+ deps do
9
+ require 'chef/chef_fs/file_system'
10
+ require 'chef/run_list'
11
+ end
12
+
13
+ option :recurse,
14
+ :long => '--[no-]recurse',
15
+ :boolean => true,
16
+ :description => "List dependencies recursively (default: true). Only works with --tree."
17
+ option :tree,
18
+ :long => '--tree',
19
+ :boolean => true,
20
+ :description => "Show dependencies in a visual tree. May show duplicates."
21
+ option :remote,
22
+ :long => '--remote',
23
+ :boolean => true,
24
+ :description => "List dependencies on the server instead of the local filesystem"
25
+
26
+ attr_accessor :exit_code
27
+
28
+ def run
29
+ if config[:recurse] == false && !config[:tree]
30
+ ui.error "--no-recurse requires --tree"
31
+ exit(1)
32
+ end
33
+ config[:recurse] = true if config[:recurse].nil?
34
+
35
+ @root = config[:remote] ? chef_fs : local_fs
36
+ dependencies = {}
37
+ pattern_args.each do |pattern|
38
+ Chef::ChefFS::FileSystem.list(@root, pattern).each do |entry|
39
+ if config[:tree]
40
+ print_dependencies_tree(entry, dependencies)
41
+ else
42
+ print_flattened_dependencies(entry, dependencies)
43
+ end
44
+ end
45
+ end
46
+ exit exit_code if exit_code
47
+ end
48
+
49
+ def print_flattened_dependencies(entry, dependencies)
50
+ if !dependencies[entry.path]
51
+ dependencies[entry.path] = get_dependencies(entry)
52
+ dependencies[entry.path].each do |child|
53
+ child_entry = Chef::ChefFS::FileSystem.resolve_path(@root, child)
54
+ print_flattened_dependencies(child_entry, dependencies)
55
+ end
56
+ output format_path(entry)
57
+ end
58
+ end
59
+
60
+ def print_dependencies_tree(entry, dependencies, printed = {}, depth = 0)
61
+ dependencies[entry.path] = get_dependencies(entry) if !dependencies[entry.path]
62
+ output "#{' '*depth}#{format_path(entry)}"
63
+ if !printed[entry.path] && (config[:recurse] || depth == 0)
64
+ printed[entry.path] = true
65
+ dependencies[entry.path].each do |child|
66
+ child_entry = Chef::ChefFS::FileSystem.resolve_path(@root, child)
67
+ print_dependencies_tree(child_entry, dependencies, printed, depth+1)
68
+ end
69
+ end
70
+ end
71
+
72
+ def get_dependencies(entry)
73
+ begin
74
+ if entry.parent && entry.parent.path == '/cookbooks'
75
+ return entry.chef_object.metadata.dependencies.keys.map { |cookbook| "/cookbooks/#{cookbook}" }
76
+
77
+ elsif entry.parent && entry.parent.path == '/nodes'
78
+ node = JSON.parse(entry.read, :create_additions => false)
79
+ result = []
80
+ if node['chef_environment'] && node['chef_environment'] != '_default'
81
+ result << "/environments/#{node['chef_environment']}.json"
82
+ end
83
+ if node['run_list']
84
+ result += dependencies_from_runlist(node['run_list'])
85
+ end
86
+ result
87
+
88
+ elsif entry.parent && entry.parent.path == '/roles'
89
+ role = JSON.parse(entry.read, :create_additions => false)
90
+ result = []
91
+ if role['run_list']
92
+ dependencies_from_runlist(role['run_list']).each do |dependency|
93
+ result << dependency if !result.include?(dependency)
94
+ end
95
+ end
96
+ if role['env_run_lists']
97
+ role['env_run_lists'].each_pair do |env,run_list|
98
+ dependencies_from_runlist(run_list).each do |dependency|
99
+ result << dependency if !result.include?(dependency)
100
+ end
101
+ end
102
+ end
103
+ result
104
+
105
+ elsif !entry.exists?
106
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(entry)
107
+
108
+ else
109
+ []
110
+ end
111
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
112
+ ui.error "#{format_path(e.entry)}: No such file or directory"
113
+ self.exit_code = 2
114
+ []
115
+ end
116
+ end
117
+
118
+ def dependencies_from_runlist(run_list)
119
+ chef_run_list = Chef::RunList.new
120
+ chef_run_list.reset!(run_list)
121
+ chef_run_list.map do |run_list_item|
122
+ case run_list_item.type
123
+ when :role
124
+ "/roles/#{run_list_item.name}.json"
125
+ when :recipe
126
+ if run_list_item.name =~ /(.+)::[^:]*/
127
+ "/cookbooks/#{$1}"
128
+ else
129
+ "/cookbooks/#{run_list_item.name}"
130
+ end
131
+ else
132
+ raise "Unknown run list item type #{run_list_item.type}"
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+
@@ -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 Diff < Chef::ChefFS::Knife
7
6
  banner "knife diff 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,6 +25,11 @@ class Chef
24
25
  :boolean => true,
25
26
  :description => "Only show names and statuses of modified files: Added, Deleted, Modified, and Type Changed."
26
27
 
28
+ option :diff_filter,
29
+ :long => '--diff-filter=[(A|D|M|T)...[*]]',
30
+ :description => "Select only files that are Added (A), Deleted (D), Modified (M), or have their type (i.e. regular file, directory) changed (T). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if
31
+ there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected."
32
+
27
33
  def run
28
34
  if config[:name_only]
29
35
  output_mode = :name_only
@@ -34,10 +40,21 @@ class Chef
34
40
  patterns = pattern_args_from(name_args.length > 0 ? name_args : [ "" ])
35
41
 
36
42
  # Get the matches (recursively)
37
- patterns.each do |pattern|
38
- Chef::ChefFS::CommandLine.diff(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, output_mode) do |diff|
39
- puts diff
43
+ error = false
44
+ begin
45
+ patterns.each do |pattern|
46
+ found_error = Chef::ChefFS::CommandLine.diff_print(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, output_mode, proc { |entry| format_path(entry) }, config[:diff_filter], ui ) do |diff|
47
+ stdout.print diff
48
+ end
49
+ error = true if found_error
40
50
  end
51
+ rescue Chef::ChefFS::FileSystem::OperationFailedError => e
52
+ ui.error "Failed on #{format_path(e.entry)} in #{e.operation}: #{e.message}"
53
+ error = true
54
+ end
55
+
56
+ if error
57
+ exit 1
41
58
  end
42
59
  end
43
60
  end
@@ -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 Download < Chef::ChefFS::Knife
7
6
  banner "knife download 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',
@@ -33,6 +34,12 @@ class Chef
33
34
  :default => false,
34
35
  :description => "Don't take action, only print what would happen"
35
36
 
37
+ option :diff,
38
+ :long => '--[no-]diff',
39
+ :boolean => true,
40
+ :default => true,
41
+ :description => 'Turn off to avoid uploading existing files; only new (and possibly deleted) files with --no-diff'
42
+
36
43
  def run
37
44
  if name_args.length == 0
38
45
  show_usage
@@ -40,8 +47,14 @@ class Chef
40
47
  exit 1
41
48
  end
42
49
 
50
+ error = false
43
51
  pattern_args.each do |pattern|
44
- Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, config)
52
+ if Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, config, ui, proc { |entry| format_path(entry) })
53
+ error = true
54
+ end
55
+ end
56
+ if error
57
+ exit 1
45
58
  end
46
59
  end
47
60
  end
@@ -0,0 +1,76 @@
1
+ require 'chef/chef_fs/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class Edit < Chef::ChefFS::Knife
6
+ banner "knife edit [PATTERN1 ... PATTERNn]"
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
+ option :local,
14
+ :long => '--local',
15
+ :boolean => true,
16
+ :description => "Show local files instead of remote"
17
+
18
+ def run
19
+ # Get the matches (recursively)
20
+ error = false
21
+ pattern_args.each do |pattern|
22
+ Chef::ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern).each do |result|
23
+ if result.dir?
24
+ ui.error "#{format_path(result)}: is a directory" if pattern.exact_path
25
+ error = true
26
+ else
27
+ begin
28
+ new_value = edit_text(result.read, File.extname(result.name))
29
+ if new_value
30
+ result.write(new_value)
31
+ output "Updated #{format_path(result)}"
32
+ else
33
+ output "#{format_path(result)} unchanged!"
34
+ end
35
+ rescue Chef::ChefFS::FileSystem::OperationNotAllowedError => e
36
+ ui.error "#{format_path(e.entry)}: #{e.reason}."
37
+ error = true
38
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
39
+ ui.error "#{format_path(e.entry)}: No such file or directory"
40
+ error = true
41
+ end
42
+ end
43
+ end
44
+ end
45
+ if error
46
+ exit 1
47
+ end
48
+ end
49
+
50
+ def edit_text(text, extension)
51
+ if (!config[:disable_editing])
52
+ file = Tempfile.new([ 'knife-edit-', extension ])
53
+ begin
54
+ # Write the text to a temporary file
55
+ file.open
56
+ file.write(text)
57
+ file.close
58
+
59
+ # Let the user edit the temporary file
60
+ if !system("#{config[:editor]} #{file.path}")
61
+ raise "Please set EDITOR environment variable"
62
+ end
63
+
64
+ file.open
65
+ result_text = file.read
66
+ return result_text if result_text != text
67
+
68
+ ensure
69
+ file.close!
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
@@ -22,18 +22,13 @@ class Chef
22
22
  class Knife
23
23
  class EnvironmentShow < Knife
24
24
 
25
+ include Knife::Core::MultiAttributeReturnOption
26
+
25
27
  deps do
26
28
  require 'chef/environment'
27
29
  require 'chef/json_compat'
28
30
  end
29
31
 
30
- @attrs_to_show = []
31
- option :attribute,
32
- :short => "-a [ATTR]",
33
- :long => "--attribute [ATTR]",
34
- :proc => lambda {|val| @attrs_to_show << val},
35
- :description => "Show one or more attributes"
36
-
37
32
  banner "knife environment show ENVIRONMENT (options)"
38
33
 
39
34
  def run
@@ -1,107 +1,151 @@
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 List < Chef::ChefFS::Knife
7
- banner "knife list [-dR] [PATTERN1 ... PATTERNn]"
6
+ banner "knife list [-dfR1p] [PATTERN1 ... PATTERNn]"
8
7
 
9
- common_options
8
+ deps do
9
+ require 'chef/chef_fs/file_system'
10
+ require 'highline'
11
+ end
10
12
 
11
13
  option :recursive,
12
14
  :short => '-R',
13
15
  :boolean => true,
14
- :description => "List directories recursively."
16
+ :description => "List directories recursively"
15
17
  option :bare_directories,
16
18
  :short => '-d',
17
19
  :boolean => true,
18
- :description => "When directories match the pattern, do not show the directories' children."
20
+ :description => "When directories match the pattern, do not show the directories' children"
21
+ option :local,
22
+ :long => '--local',
23
+ :boolean => true,
24
+ :description => "List local directory instead of remote"
25
+ option :flat,
26
+ :short => '-f',
27
+ :long => '--flat',
28
+ :boolean => true,
29
+ :description => "Show a list of filenames rather than the prettified ls-like output normally produced"
30
+ option :one_column,
31
+ :short => '-1',
32
+ :boolean => true,
33
+ :description => "Show only one column of results"
34
+ option :trailing_slashes,
35
+ :short => '-p',
36
+ :boolean => true,
37
+ :description => "Show trailing slashes after directories"
38
+
39
+ attr_accessor :exit_code
19
40
 
20
41
  def run
21
42
  patterns = name_args.length == 0 ? [""] : name_args
22
43
 
23
44
  # Get the matches (recursively)
24
- results = []
25
- dir_results = []
26
- pattern_args_from(patterns).each do |pattern|
27
- Chef::ChefFS::FileSystem.list(chef_fs, pattern) do |result|
28
- if result.dir? && !config[:bare_directories]
29
- dir_results += add_dir_result(result)
30
- elsif result.exists?
31
- results << result
32
- elsif pattern.exact_path
33
- STDERR.puts "#{format_path(result.path)}: No such file or directory"
34
- end
45
+ all_results = parallelize(pattern_args_from(patterns), :flatten => true) do |pattern|
46
+ pattern_results = Chef::ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern)
47
+ if pattern_results.first && !pattern_results.first.exists? && pattern.exact_path
48
+ ui.error "#{format_path(pattern_results.first)}: No such file or directory"
49
+ self.exit_code = 1
50
+ end
51
+ pattern_results
52
+ end
53
+
54
+ # Process directories
55
+ if !config[:bare_directories]
56
+ dir_results = parallelize(all_results.select { |result| result.dir? }, :flatten => true) do |result|
57
+ add_dir_result(result)
58
+ end.to_a
59
+ else
60
+ dir_results = []
61
+ end
62
+
63
+ # Process all other results
64
+ results = all_results.select { |result| result.exists? && (!result.dir? || config[:bare_directories]) }.to_a
65
+
66
+ # Flatten out directory results if necessary
67
+ if config[:flat]
68
+ dir_results.each do |result, children|
69
+ results += children
35
70
  end
71
+ dir_results = []
36
72
  end
37
73
 
74
+ # Sort by path for happy output
38
75
  results = results.sort_by { |result| result.path }
39
76
  dir_results = dir_results.sort_by { |result| result[0].path }
40
77
 
78
+ # Print!
41
79
  if results.length == 0 && dir_results.length == 1
42
80
  results = dir_results[0][1]
43
81
  dir_results = []
44
82
  end
45
83
 
46
84
  print_result_paths results
85
+ printed_something = results.length > 0
47
86
  dir_results.each do |result, children|
48
- puts ""
49
- puts "#{format_path(result.path)}:"
50
- print_results(children.map { |result| result.name }.sort, "")
87
+ if printed_something
88
+ output ""
89
+ else
90
+ printed_something = true
91
+ end
92
+ output "#{format_path(result)}:"
93
+ print_results(children.map { |result| maybe_add_slash(result.name, result.dir?) }.sort, "")
51
94
  end
95
+
96
+ exit self.exit_code if self.exit_code
52
97
  end
53
98
 
54
99
  def add_dir_result(result)
55
100
  begin
56
101
  children = result.children.sort_by { |child| child.name }
57
- rescue Chef::ChefFS::FileSystem::NotFoundError
58
- STDERR.puts "#{format_path(result.path)}: No such file or directory"
102
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
103
+ ui.error "#{format_path(e.entry)}: No such file or directory"
59
104
  return []
60
105
  end
61
106
 
62
107
  result = [ [ result, children ] ]
63
108
  if config[:recursive]
64
- children.each do |child|
65
- if child.dir?
66
- result += add_dir_result(child)
67
- end
68
- end
109
+ child_dirs = children.select { |child| child.dir? }
110
+ result += parallelize(child_dirs, :flatten => true) { |child| add_dir_result(child) }.to_a
69
111
  end
70
112
  result
71
113
  end
72
114
 
73
- def list_dirs_recursive(children)
74
- results = children.select { |child| child.dir? }.to_a
75
- results.each do |child|
76
- results += list_dirs_recursive(child.children)
77
- end
78
- results
79
- end
80
-
81
115
  def print_result_paths(results, indent = "")
82
- print_results(results.map { |result| format_path(result.path) }, indent)
116
+ print_results(results.map { |result| maybe_add_slash(format_path(result), result.dir?) }, indent)
83
117
  end
84
118
 
85
119
  def print_results(results, indent)
86
120
  return if results.length == 0
87
121
 
88
122
  print_space = results.map { |result| result.length }.max + 2
89
- # TODO: tput cols is not cross platform
90
- columns = $stdout.isatty ? Integer(`tput cols`) : 0
91
- current_column = 0
123
+ if config[:one_column] || !stdout.isatty
124
+ columns = 0
125
+ else
126
+ columns = HighLine::SystemExtensions.terminal_size[0]
127
+ end
128
+ current_line = ''
92
129
  results.each do |result|
93
- if current_column != 0 && current_column + print_space > columns
94
- puts ""
95
- current_column = 0
130
+ if current_line.length > 0 && current_line.length + print_space > columns
131
+ output current_line.rstrip
132
+ current_line = ''
96
133
  end
97
- if current_column == 0
98
- print indent
99
- current_column += indent.length
134
+ if current_line.length == 0
135
+ current_line << indent
100
136
  end
101
- print result + (' ' * (print_space - result.length))
102
- current_column += print_space
137
+ current_line << result
138
+ current_line << (' ' * (print_space - result.length))
139
+ end
140
+ output current_line.rstrip if current_line.length > 0
141
+ end
142
+
143
+ def maybe_add_slash(path, is_dir)
144
+ if config[:trailing_slashes] && is_dir
145
+ "#{path}/"
146
+ else
147
+ path
103
148
  end
104
- puts ""
105
149
  end
106
150
  end
107
151
  end