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
@@ -18,6 +18,7 @@
18
18
 
19
19
  require 'chef/resource/apt_package'
20
20
  require 'chef/resource/bash'
21
+ require 'chef/resource/batch'
21
22
  require 'chef/resource/breakpoint'
22
23
  require 'chef/resource/cookbook_file'
23
24
  require 'chef/resource/chef_gem'
@@ -49,6 +50,7 @@ require 'chef/resource/package'
49
50
  require 'chef/resource/pacman_package'
50
51
  require 'chef/resource/perl'
51
52
  require 'chef/resource/portage_package'
53
+ require 'chef/resource/powershell_script'
52
54
  require 'chef/resource/python'
53
55
  require 'chef/resource/registry_key'
54
56
  require 'chef/resource/remote_directory'
@@ -31,8 +31,7 @@ require 'chef/monkey_patches/string'
31
31
  require 'chef/monkey_patches/net_http'
32
32
  require 'chef/config'
33
33
  require 'chef/exceptions'
34
- require 'chef/platform'
35
-
34
+ require 'chef/platform/query_helpers'
36
35
 
37
36
  class Chef
38
37
  # == Chef::REST
@@ -84,6 +83,10 @@ class Chef
84
83
  @raw_key
85
84
  end
86
85
 
86
+ def last_response
87
+ @last_response
88
+ end
89
+
87
90
  # Send an HTTP GET request to the path
88
91
  #
89
92
  # Using this method to +fetch+ a file is considered deprecated.
@@ -164,6 +167,7 @@ class Chef
164
167
  retriable_rest_request(method, url, body, headers) do |rest_request|
165
168
  begin
166
169
  response = rest_request.call {|r| r.read_body}
170
+ @last_response = response
167
171
 
168
172
  Chef::Log.debug("---- HTTP Status and Header Data: ----")
169
173
  Chef::Log.debug("HTTP #{response.http_version} #{response.code} #{response.msg}")
@@ -185,7 +189,11 @@ class Chef
185
189
  elsif response.kind_of?(Net::HTTPNotModified) # Must be tested before Net::HTTPRedirection because it's subclass.
186
190
  false
187
191
  elsif redirect_location = redirected_to(response)
188
- follow_redirect {api_request(:GET, create_url(redirect_location))}
192
+ if [:GET, :HEAD].include?(method)
193
+ follow_redirect {api_request(method, create_url(redirect_location))}
194
+ else
195
+ raise Exceptions::InvalidRedirect, "#{method} request was redirected from #{url} to #{redirect_location}. Only GET and HEAD support redirects."
196
+ end
189
197
  else
190
198
  # have to decompress the body before making an exception for it. But the body could be nil.
191
199
  response.body.replace(response_body) if response.body.respond_to?(:replace)
@@ -248,6 +256,7 @@ class Chef
248
256
  tempfile = stream_to_tempfile(url, r)
249
257
  end
250
258
  end
259
+ @last_response = response
251
260
  if response.kind_of?(Net::HTTPSuccess)
252
261
  tempfile
253
262
  elsif redirect_location = redirected_to(response)
@@ -364,7 +373,7 @@ class Chef
364
373
  def stream_to_tempfile(url, response)
365
374
  tf = Tempfile.open("chef-rest")
366
375
  if Chef::Platform.windows?
367
- tf.binmode #required for binary files on Windows platforms
376
+ tf.binmode # required for binary files on Windows platforms
368
377
  end
369
378
  Chef::Log.debug("Streaming download from #{url.to_s} to tempfile #{tf.path}")
370
379
  # Stolen from http://www.ruby-forum.com/topic/166423
@@ -220,7 +220,11 @@ class Chef
220
220
 
221
221
  @http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
222
222
  # Optionally handle HTTP Basic Authentication
223
- @http_request.basic_auth(url.user, url.password) if url.user
223
+ if url.user
224
+ user = URI.unescape(url.user)
225
+ password = URI.unescape(url.password) if url.password
226
+ @http_request.basic_auth(user, password)
227
+ end
224
228
  @http_request[USER_AGENT] = self.class.user_agent
225
229
  end
226
230
 
@@ -259,11 +259,11 @@ class Chef
259
259
  cookbook_collection[cookbook].segment_filenames(segment).sort
260
260
  end
261
261
 
262
- # Yields the name of each cookbook depended on by +cookbook_name+ in
263
- # lexical sort order.
262
+ # Yields the name, as a symbol, of each cookbook depended on by
263
+ # +cookbook_name+ in lexical sort order.
264
264
  def each_cookbook_dep(cookbook_name, &block)
265
265
  cookbook = cookbook_collection[cookbook_name]
266
- cookbook.metadata.dependencies.keys.sort.each(&block)
266
+ cookbook.metadata.dependencies.keys.sort.map{|x| x.to_sym}.each(&block)
267
267
  end
268
268
 
269
269
  # Given a +recipe_name+, finds the file associated with the recipe.
@@ -173,7 +173,7 @@ class Chef
173
173
  class RunListExpansionFromAPI < RunListExpansion
174
174
 
175
175
  def rest
176
- @rest ||= (source || Chef::REST.new(Chef::Config[:role_url]))
176
+ @rest ||= (source || Chef::REST.new(Chef::Config[:chef_server_url]))
177
177
  end
178
178
 
179
179
  def fetch_role(name, included_by)
@@ -16,6 +16,7 @@
16
16
  # limitations under the License.
17
17
 
18
18
  require 'chef/mixin/create_path'
19
+ require 'fcntl'
19
20
 
20
21
  class Chef
21
22
 
@@ -55,10 +56,15 @@ class Chef
55
56
  # ensure the runlock_file path exists
56
57
  create_path(File.dirname(runlock_file))
57
58
  @runlock = File.open(runlock_file,'w+')
59
+ # if we support FD_CLOEXEC (linux, !windows), then use it.
60
+ # NB: ruby-2.0.0-p195 sets FD_CLOEXEC by default, but not ruby-1.8.7/1.9.3
61
+ if Fcntl.const_defined?('F_SETFD') && Fcntl.const_defined?('FD_CLOEXEC')
62
+ runlock.fcntl(Fcntl::F_SETFD, runlock.fcntl(Fcntl::F_GETFD, 0) | Fcntl::FD_CLOEXEC)
63
+ end
58
64
  unless runlock.flock(File::LOCK_EX|File::LOCK_NB)
59
65
  # Another chef client running...
60
66
  runpid = runlock.read.strip.chomp
61
- Chef::Log.info("Chef client #{runpid} is running, will wait for it to finish and then run.")
67
+ Chef::Log.warn("Chef client #{runpid} is running, will wait for it to finish and then run.")
62
68
  runlock.flock(File::LOCK_EX)
63
69
  end
64
70
  # We grabbed the run lock. Save the pid.
@@ -22,7 +22,6 @@ require 'chef/exceptions'
22
22
  require 'chef/mixin/params_validate'
23
23
  require 'chef/node'
24
24
  require 'chef/resource_collection'
25
- require 'chef/platform'
26
25
 
27
26
  class Chef
28
27
  # == Chef::Runner
@@ -127,7 +127,12 @@ class Chef
127
127
  end
128
128
 
129
129
  def stat
130
- @stat ||= @new_resource.instance_of?(Chef::Resource::Link) ? ::File.lstat(@new_resource.path) : ::File.stat(@new_resource.path)
130
+ @stat ||= if @new_resource.instance_of?(Chef::Resource::Link)
131
+ ::File.lstat(@new_resource.path)
132
+ else
133
+ realpath = ::File.realpath(@new_resource.path)
134
+ ::File.stat(realpath)
135
+ end
131
136
  end
132
137
  end
133
138
  end
@@ -31,7 +31,7 @@ class Chef
31
31
  attr_accessor :rest
32
32
 
33
33
  def initialize(url=nil)
34
- @rest = Chef::REST.new(url ||Chef::Config[:search_url])
34
+ @rest = Chef::REST.new(url ||Chef::Config[:chef_server_url])
35
35
  end
36
36
 
37
37
  # Search Solr for objects of a given type, for a given query. If you give
@@ -53,7 +53,7 @@ class Chef
53
53
  end
54
54
 
55
55
  def list_indexes
56
- response = @rest.get_rest("search")
56
+ @rest.get_rest("search")
57
57
  end
58
58
 
59
59
  private
@@ -204,8 +204,8 @@ module Shell
204
204
  Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
205
205
  cookbook_hash = @client.sync_cookbooks
206
206
  cookbook_collection = Chef::CookbookCollection.new(cookbook_hash)
207
- @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
208
- @run_context.load(Chef::RunList::RunListExpansionFromAPI.new("_default", []))
207
+ @run_context = Chef::RunContext.new(node, cookbook_collection, @events)
208
+ @run_context.load(@node.run_list.expand(@node.chef_environment))
209
209
  @run_status.run_context = run_context
210
210
  end
211
211
 
@@ -0,0 +1,84 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ class Chef
20
+ class Util
21
+ class Backup
22
+ attr_reader :new_resource
23
+ attr_accessor :path
24
+
25
+ def initialize(new_resource, path = nil)
26
+ @new_resource = new_resource
27
+ @path = path.nil? ? new_resource.path : path
28
+ end
29
+
30
+ def backup!
31
+ if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(path)
32
+ do_backup
33
+ # Clean up after the number of backups
34
+ slice_number = @new_resource.backup
35
+ backup_files = sorted_backup_files
36
+ if backup_files.length >= @new_resource.backup
37
+ remainder = backup_files.slice(slice_number..-1)
38
+ remainder.each do |backup_to_delete|
39
+ delete_backup(backup_to_delete)
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def backup_filename
48
+ @backup_filename ||= begin
49
+ time = Time.now
50
+ savetime = time.strftime("%Y%m%d%H%M%S")
51
+ backup_filename = "#{path}.chef-#{savetime}"
52
+ backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") #strip drive letter on Windows
53
+ end
54
+ end
55
+
56
+ def prefix
57
+ # if :file_backup_path is nil, we fallback to the old behavior of
58
+ # keeping the backup in the same directory. We also need to to_s it
59
+ # so we don't get a type error around implicit to_str conversions.
60
+ @prefix ||= Chef::Config[:file_backup_path].to_s
61
+ end
62
+
63
+ def backup_path
64
+ @backup_path ||= ::File.join(prefix, backup_filename)
65
+ end
66
+
67
+ def do_backup
68
+ FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
69
+ FileUtils.cp(path, backup_path, :preserve => true)
70
+ Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
71
+ end
72
+
73
+ def delete_backup(backup_file)
74
+ FileUtils.rm(backup_file)
75
+ Chef::Log.info("#{@new_resource} removed backup at #{backup_file}")
76
+ end
77
+
78
+ def sorted_backup_files
79
+ Dir[::File.join(prefix, ".#{path}.chef-*")].sort { |a,b| b <=> a }
80
+ end
81
+ end
82
+ end
83
+ end
84
+
@@ -0,0 +1,145 @@
1
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
2
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'chef/mixin/shell_out'
19
+
20
+ class Chef
21
+ class Util
22
+ class Diff
23
+ include Chef::Mixin::ShellOut
24
+
25
+ # @todo: to_a, to_s, to_json, inspect defs, accessors for @diff and @error
26
+ # @todo: move coercion to UTF-8 into to_json
27
+ # @todo: replace shellout to diff -u with diff-lcs gem
28
+
29
+ def for_output
30
+ # formatted output to a terminal uses arrays of strings and returns error strings
31
+ @diff.nil? ? [ @error ] : @diff
32
+ end
33
+
34
+ def for_reporting
35
+ # caller needs to ensure that new files aren't posted to resource reporting
36
+ return nil if @diff.nil?
37
+ @diff.join("\\n")
38
+ end
39
+
40
+ def use_tempfile_if_missing(file)
41
+ tempfile = nil
42
+ unless File.exists?(file)
43
+ Chef::Log.debug("file #{file} does not exist to diff against, using empty tempfile")
44
+ tempfile = Tempfile.new("chef-diff")
45
+ file = tempfile.path
46
+ end
47
+ yield file
48
+ unless tempfile.nil?
49
+ tempfile.close
50
+ tempfile.unlink
51
+ end
52
+ end
53
+
54
+ def diff(old_file, new_file)
55
+ use_tempfile_if_missing(old_file) do |old_file|
56
+ use_tempfile_if_missing(new_file) do |new_file|
57
+ @error = do_diff(old_file, new_file)
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def do_diff(old_file, new_file)
65
+ if Chef::Config[:diff_disabled]
66
+ return "(diff output suppressed by config)"
67
+ end
68
+
69
+ diff_filesize_threshold = Chef::Config[:diff_filesize_threshold]
70
+ diff_output_threshold = Chef::Config[:diff_output_threshold]
71
+
72
+ if ::File.size(old_file) > diff_filesize_threshold || ::File.size(new_file) > diff_filesize_threshold
73
+ return "(file sizes exceed #{diff_filesize_threshold} bytes, diff output suppressed)"
74
+ end
75
+
76
+ # MacOSX(BSD?) diff will *sometimes* happily spit out nasty binary diffs
77
+ return "(current file is binary, diff output suppressed)" if is_binary?(old_file)
78
+ return "(new content is binary, diff output suppressed)" if is_binary?(new_file)
79
+
80
+ begin
81
+ # -u: Unified diff format
82
+ # LC_ALL: in ruby 1.9 we want to set nil which is a magic option to mixlib-shellout to
83
+ # pass through the LC_ALL locale. in ruby 1.8 we force to 7-bit 'C' locale
84
+ # (which is the mixlib-shellout default for all rubies all the time).
85
+ Chef::Log.debug("running: diff -u #{old_file} #{new_file}")
86
+ locale = ( Object.const_defined? :Encoding ) ? nil : 'C'
87
+ result = shell_out("diff -u #{old_file} #{new_file}", :env => {'LC_ALL' => locale})
88
+
89
+ rescue Exception => e
90
+ # Should *not* receive this, but in some circumstances it seems that
91
+ # an exception can be thrown even using shell_out instead of shell_out!
92
+ return "Could not determine diff. Error: #{e.message}"
93
+ end
94
+
95
+ # diff will set a non-zero return code even when there's
96
+ # valid stdout results, if it encounters something unexpected
97
+ # So as long as we have output, we'll show it.
98
+ #
99
+ # Also on some platforms (Solaris) diff outputs a single line
100
+ # when there are no differences found. Look for this line
101
+ # before analyzing diff output.
102
+ if !result.stdout.empty? && result.stdout != "No differences encountered\n"
103
+ if result.stdout.length > diff_output_threshold
104
+ return "(long diff of over #{diff_output_threshold} characters, diff output suppressed)"
105
+ else
106
+ diff_str = result.stdout
107
+ if Object.const_defined? :Encoding # ruby >= 1.9
108
+ if ( diff_str.encoding == Encoding::ASCII_8BIT &&
109
+ diff_str.encoding != Encoding.default_external &&
110
+ RUBY_VERSION.to_f < 2.0 )
111
+ # @todo mixlib-shellout under ruby 1.9 hands back an ASCII-8BIT encoded string, which needs to
112
+ # be fixed to the default external encoding -- this should be moved into mixlib-shellout
113
+ diff_str = diff_str.force_encoding(Encoding.default_external)
114
+ end
115
+ diff_str.encode!('UTF-8', :invalid => :replace, :undef => :replace, :replace => '?')
116
+ end
117
+ @diff = diff_str.split("\n")
118
+ @diff.delete("\")
119
+ return "(diff available)"
120
+ end
121
+ elsif !result.stderr.empty?
122
+ return "Could not determine diff. Error: #{result.stderr}"
123
+ else
124
+ return "(no diff)"
125
+ end
126
+ end
127
+
128
+ def is_binary?(path)
129
+ File.open(path) do |file|
130
+ # XXX: this slurps into RAM, but we should have already checked our diff has a reasonable size
131
+ buff = file.read
132
+ buff = "" if buff.nil?
133
+ begin
134
+ return buff !~ /\A[\s[:print:]]*\z/m
135
+ rescue ArgumentError => e
136
+ return true if e.message =~ /invalid byte sequence/
137
+ raise
138
+ end
139
+ end
140
+ end
141
+
142
+ end
143
+ end
144
+ end
145
+
@@ -33,7 +33,7 @@ class Chef
33
33
  @file_edited = false
34
34
 
35
35
  raise ArgumentError, "File doesn't exist" unless File.exist? @original_pathname
36
- raise ArgumentError, "File is blank" unless (@contents = File.new(@original_pathname).readlines).length > 0
36
+ @contents = File.new(@original_pathname).readlines
37
37
  end
38
38
 
39
39
  #search the file line by line and match each line with the given regex
@@ -0,0 +1,100 @@
1
+ #
2
+ # Author:: Sean O'Meara
3
+ # Author:: Kevin Keane
4
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
5
+ #
6
+ # Copyright:: Copyright (c) 2011 Opscode, Inc.
7
+ # Copyright:: Copyright (c) 2013, North County Tech Center, LLC
8
+ #
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+
23
+ require 'chef/mixin/shell_out'
24
+
25
+ class Chef
26
+ class Util
27
+ #
28
+ # IMPORTANT: We assume that selinux utilities are installed on an
29
+ # selinux enabled server. Provisioning an selinux enabled server
30
+ # without selinux utilities is not supported.
31
+ #
32
+ module Selinux
33
+
34
+ include Chef::Mixin::ShellOut
35
+
36
+ # We want to initialize below variables once during a
37
+ # chef-client run therefore they are class variables.
38
+ @@selinux_enabled = nil
39
+ @@restorecon_path = nil
40
+ @@selinuxenabled_path = nil
41
+
42
+ def selinux_enabled?
43
+ @@selinux_enabled = check_selinux_enabled? if @@selinux_enabled.nil?
44
+ @@selinux_enabled
45
+ end
46
+
47
+ def restore_security_context(file_path, recursive = false)
48
+ if restorecon_path
49
+ restorecon_command = recursive ? "#{restorecon_path} -R -r" : "#{restorecon_path} -R"
50
+ restorecon_command += " #{file_path}"
51
+ Chef::Log.debug("Restoring selinux security content with #{restorecon_command}")
52
+ shell_out!(restorecon_command)
53
+ else
54
+ Chef::Log.warn "Can not find 'restorecon' on the system. Skipping selinux security context restore."
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def restorecon_path
61
+ @@restorecon_path = which("restorecon") if @@restorecon_path.nil?
62
+ @@restorecon_path
63
+ end
64
+
65
+ def selinuxenabled_path
66
+ @@selinuxenabled_path = which("selinuxenabled") if @@selinuxenabled_path.nil?
67
+ @@selinuxenabled_path
68
+ end
69
+
70
+ def which(cmd)
71
+ paths = ENV['PATH'].split(File::PATH_SEPARATOR) + [ '/bin', '/usr/bin', '/sbin', '/usr/sbin' ]
72
+ paths.each do |path|
73
+ filename = File.join(path, cmd)
74
+ return filename if File.executable?(filename)
75
+ end
76
+ false
77
+ end
78
+
79
+ def check_selinux_enabled?
80
+ if selinuxenabled_path
81
+ cmd = shell_out!(selinuxenabled_path, :returns => [0,1])
82
+ case cmd.exitstatus
83
+ when 1
84
+ return false
85
+ when 0
86
+ return true
87
+ else
88
+ raise RuntimeError, "Unknown exit code from command #{selinuxenabled_path}: #{cmd.exitstatus}"
89
+ end
90
+ else
91
+ # We assume selinux is not enabled if selinux utils are not
92
+ # installed.
93
+ return false
94
+ end
95
+ end
96
+
97
+ end
98
+ end
99
+ end
100
+