chef 12.4.3-universal-mingw32 → 12.5.1-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +21 -25
  3. data/Gemfile +46 -0
  4. data/README.md +4 -4
  5. data/Rakefile +4 -110
  6. data/bin/chef-service-manager +3 -1
  7. data/distro/common/html/knife_cookbook_site.html +18 -18
  8. data/distro/common/man/man1/knife-cookbook-site.1 +11 -11
  9. data/lib/chef.rb +1 -1
  10. data/lib/chef/application.rb +1 -1
  11. data/lib/chef/application/apply.rb +19 -1
  12. data/lib/chef/application/client.rb +11 -5
  13. data/lib/chef/application/knife.rb +2 -2
  14. data/lib/chef/application/solo.rb +1 -1
  15. data/lib/chef/application/windows_service_manager.rb +19 -12
  16. data/lib/chef/chef_class.rb +46 -0
  17. data/lib/chef/chef_fs/config.rb +22 -24
  18. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +3 -1
  19. data/lib/chef/chef_fs/file_pattern.rb +4 -15
  20. data/lib/chef/chef_fs/file_system/acl_dir.rb +3 -4
  21. data/lib/chef/chef_fs/file_system/acls_dir.rb +5 -1
  22. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +0 -5
  23. data/lib/chef/chef_fs/file_system/base_fs_object.rb +5 -2
  24. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +2 -9
  25. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +2 -9
  26. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +10 -17
  27. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -12
  28. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +15 -11
  29. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +8 -2
  30. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +4 -4
  31. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +1 -1
  32. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -11
  33. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +3 -5
  34. data/lib/chef/chef_fs/file_system/environments_dir.rb +1 -1
  35. data/lib/chef/chef_fs/file_system/file_system_entry.rb +7 -4
  36. data/lib/chef/chef_fs/file_system/memory_dir.rb +2 -3
  37. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +15 -0
  38. data/lib/chef/chef_fs/file_system/nodes_dir.rb +1 -1
  39. data/lib/chef/chef_fs/file_system/organization_members_entry.rb +2 -2
  40. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +4 -9
  41. data/lib/chef/chef_fs/knife.rb +35 -7
  42. data/lib/chef/chef_fs/path_utils.rb +65 -34
  43. data/lib/chef/client.rb +2 -3
  44. data/lib/chef/config.rb +34 -2
  45. data/lib/chef/{mixin/wstring.rb → constants.rb} +9 -13
  46. data/lib/chef/cookbook/metadata.rb +25 -3
  47. data/lib/chef/cookbook/synchronizer.rb +1 -1
  48. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  49. data/lib/chef/cookbook_version.rb +3 -3
  50. data/lib/chef/delayed_evaluator.rb +21 -0
  51. data/lib/chef/deprecation/mixin/template.rb +1 -2
  52. data/lib/chef/deprecation/provider/cookbook_file.rb +1 -1
  53. data/lib/chef/deprecation/provider/file.rb +1 -1
  54. data/lib/chef/deprecation/provider/remote_directory.rb +52 -0
  55. data/lib/chef/deprecation/provider/remote_file.rb +1 -2
  56. data/lib/chef/deprecation/provider/template.rb +1 -1
  57. data/lib/chef/deprecation/warnings.rb +3 -4
  58. data/lib/chef/dsl/reboot_pending.rb +3 -2
  59. data/lib/chef/dsl/recipe.rb +26 -7
  60. data/lib/chef/dsl/resources.rb +2 -2
  61. data/lib/chef/event_dispatch/base.rb +51 -22
  62. data/lib/chef/event_dispatch/dispatcher.rb +21 -6
  63. data/lib/chef/event_dispatch/dsl.rb +64 -0
  64. data/lib/chef/exceptions.rb +28 -1
  65. data/lib/chef/file_content_management/tempfile.rb +1 -1
  66. data/lib/chef/formatters/base.rb +3 -0
  67. data/lib/chef/formatters/doc.rb +56 -6
  68. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +36 -0
  69. data/lib/chef/formatters/minimal.rb +2 -2
  70. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
  71. data/lib/chef/http/http_request.rb +1 -1
  72. data/lib/chef/knife.rb +35 -55
  73. data/lib/chef/knife/bootstrap.rb +41 -0
  74. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -0
  75. data/lib/chef/knife/bootstrap/client_builder.rb +16 -0
  76. data/lib/chef/knife/bootstrap/templates/README.md +3 -4
  77. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  78. data/lib/chef/knife/cookbook_create.rb +1 -1
  79. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  80. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  81. data/lib/chef/knife/cookbook_site_share.rb +6 -6
  82. data/lib/chef/knife/cookbook_site_unshare.rb +2 -2
  83. data/lib/chef/knife/core/bootstrap_context.rb +12 -4
  84. data/lib/chef/knife/core/custom_manifest_loader.rb +69 -0
  85. data/lib/chef/knife/core/gem_glob_loader.rb +138 -0
  86. data/lib/chef/knife/core/hashed_command_loader.rb +80 -0
  87. data/lib/chef/knife/core/node_presenter.rb +24 -1
  88. data/lib/chef/knife/core/object_loader.rb +1 -0
  89. data/lib/chef/knife/core/subcommand_loader.rb +131 -146
  90. data/lib/chef/knife/node_run_list_remove.rb +12 -1
  91. data/lib/chef/knife/null.rb +10 -0
  92. data/lib/chef/knife/rehash.rb +62 -0
  93. data/lib/chef/knife/search.rb +3 -3
  94. data/lib/chef/knife/ssh.rb +52 -30
  95. data/lib/chef/knife/ssl_check.rb +3 -2
  96. data/lib/chef/knife/user_edit.rb +1 -2
  97. data/lib/chef/local_mode.rb +5 -0
  98. data/lib/chef/log.rb +5 -1
  99. data/lib/chef/mixin/deprecation.rb +8 -8
  100. data/lib/chef/mixin/params_validate.rb +362 -135
  101. data/lib/chef/mixin/template.rb +48 -0
  102. data/lib/chef/mixin/which.rb +1 -1
  103. data/lib/chef/mixin/wide_string.rb +72 -0
  104. data/lib/chef/mixin/windows_architecture_helper.rb +15 -39
  105. data/lib/chef/mixin/windows_env_helper.rb +4 -1
  106. data/lib/chef/monkey_patches/webrick-utils.rb +51 -0
  107. data/lib/chef/monkey_patches/win32/registry.rb +72 -0
  108. data/lib/chef/node.rb +116 -3
  109. data/lib/chef/node_map.rb +2 -2
  110. data/lib/chef/platform/handler_map.rb +0 -5
  111. data/lib/chef/platform/provider_mapping.rb +5 -6
  112. data/lib/chef/platform/query_helpers.rb +46 -4
  113. data/lib/chef/platform/rebooter.rb +1 -1
  114. data/lib/chef/platform/service_helpers.rb +30 -32
  115. data/lib/chef/policy_builder.rb +1 -8
  116. data/lib/chef/policy_builder/dynamic.rb +186 -0
  117. data/lib/chef/policy_builder/expand_node_object.rb +30 -15
  118. data/lib/chef/policy_builder/policyfile.rb +155 -18
  119. data/lib/chef/property.rb +568 -0
  120. data/lib/chef/provider.rb +222 -13
  121. data/lib/chef/provider/batch.rb +8 -0
  122. data/lib/chef/provider/deploy.rb +5 -7
  123. data/lib/chef/provider/directory.rb +14 -2
  124. data/lib/chef/provider/dsc_resource.rb +5 -9
  125. data/lib/chef/provider/group/pw.rb +1 -1
  126. data/lib/chef/provider/ifconfig.rb +2 -2
  127. data/lib/chef/provider/lwrp_base.rb +1 -75
  128. data/lib/chef/provider/mount.rb +7 -3
  129. data/lib/chef/provider/package.rb +1 -1
  130. data/lib/chef/provider/package/dpkg.rb +5 -11
  131. data/lib/chef/provider/package/rpm.rb +2 -2
  132. data/lib/chef/provider/package/rubygems.rb +1 -1
  133. data/lib/chef/provider/package/windows/msi.rb +2 -2
  134. data/lib/chef/provider/package/yum.rb +17 -5
  135. data/lib/chef/provider/powershell_script.rb +59 -23
  136. data/lib/chef/provider/registry_key.rb +5 -5
  137. data/lib/chef/provider/remote_directory.rb +190 -102
  138. data/lib/chef/provider/service.rb +12 -2
  139. data/lib/chef/provider/service/aix.rb +1 -1
  140. data/lib/chef/provider/service/debian.rb +3 -5
  141. data/lib/chef/provider/service/freebsd.rb +1 -1
  142. data/lib/chef/provider/service/gentoo.rb +3 -3
  143. data/lib/chef/provider/service/init.rb +3 -3
  144. data/lib/chef/provider/service/insserv.rb +2 -4
  145. data/lib/chef/provider/service/invokercd.rb +2 -4
  146. data/lib/chef/provider/service/macosx.rb +5 -1
  147. data/lib/chef/provider/service/openbsd.rb +2 -1
  148. data/lib/chef/provider/service/redhat.rb +52 -16
  149. data/lib/chef/provider/service/simple.rb +2 -2
  150. data/lib/chef/provider/service/systemd.rb +3 -5
  151. data/lib/chef/provider/service/upstart.rb +4 -6
  152. data/lib/chef/provider/subversion.rb +13 -7
  153. data/lib/chef/provider/template/content.rb +16 -6
  154. data/lib/chef/provider/user/solaris.rb +32 -4
  155. data/lib/chef/provider/windows_script.rb +3 -5
  156. data/lib/chef/provider_resolver.rb +2 -2
  157. data/lib/chef/recipe.rb +1 -8
  158. data/lib/chef/resource.rb +563 -90
  159. data/lib/chef/resource/action_class.rb +83 -0
  160. data/lib/chef/resource/chef_gem.rb +3 -3
  161. data/lib/chef/resource/deploy.rb +8 -2
  162. data/lib/chef/resource/dsc_script.rb +2 -0
  163. data/lib/chef/resource/file/verification.rb +7 -1
  164. data/lib/chef/resource/lwrp_base.rb +1 -7
  165. data/lib/chef/resource/registry_key.rb +1 -1
  166. data/lib/chef/resource/service.rb +10 -2
  167. data/lib/chef/resource/subversion.rb +5 -0
  168. data/lib/chef/resource/windows_script.rb +6 -2
  169. data/lib/chef/resource/yum_package.rb +10 -1
  170. data/lib/chef/resource_resolver.rb +3 -3
  171. data/lib/chef/run_context.rb +402 -83
  172. data/lib/chef/run_list/versioned_recipe_list.rb +15 -0
  173. data/lib/chef/run_lock.rb +30 -21
  174. data/lib/chef/util/powershell/ps_credential.rb +4 -0
  175. data/lib/chef/util/windows.rb +0 -32
  176. data/lib/chef/util/windows/net_group.rb +85 -106
  177. data/lib/chef/util/windows/net_use.rb +35 -71
  178. data/lib/chef/util/windows/net_user.rb +0 -1
  179. data/lib/chef/util/windows/volume.rb +19 -19
  180. data/lib/chef/version.rb +3 -3
  181. data/lib/chef/win32/api.rb +1 -0
  182. data/lib/chef/win32/api/file.rb +20 -0
  183. data/lib/chef/win32/api/net.rb +163 -43
  184. data/lib/chef/win32/api/registry.rb +51 -0
  185. data/lib/chef/win32/api/system.rb +23 -0
  186. data/lib/chef/win32/api/unicode.rb +0 -43
  187. data/lib/chef/win32/crypto.rb +2 -1
  188. data/lib/chef/win32/file.rb +28 -3
  189. data/lib/chef/win32/mutex.rb +1 -2
  190. data/lib/chef/win32/net.rb +162 -8
  191. data/lib/chef/win32/process.rb +13 -0
  192. data/lib/chef/win32/registry.rb +35 -30
  193. data/lib/chef/win32/security.rb +1 -1
  194. data/lib/chef/win32/security/token.rb +1 -1
  195. data/lib/chef/win32/system.rb +62 -0
  196. data/lib/chef/win32/unicode.rb +7 -2
  197. data/lib/chef/win32/version.rb +0 -4
  198. data/lib/chef/workstation_config_loader.rb +3 -158
  199. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -0
  200. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -0
  201. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -0
  202. data/spec/data/dsc_lcm.pfx +0 -0
  203. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
  204. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
  205. data/spec/functional/dsl/reboot_pending_spec.rb +33 -43
  206. data/spec/functional/knife/cookbook_delete_spec.rb +17 -7
  207. data/spec/functional/knife/ssh_spec.rb +16 -0
  208. data/spec/functional/rebooter_spec.rb +1 -1
  209. data/spec/functional/resource/deploy_revision_spec.rb +1 -1
  210. data/spec/functional/resource/dsc_resource_spec.rb +2 -0
  211. data/spec/functional/resource/dsc_script_spec.rb +91 -2
  212. data/spec/functional/resource/group_spec.rb +67 -44
  213. data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +107 -18
  214. data/spec/functional/resource/windows_service_spec.rb +1 -1
  215. data/spec/functional/run_lock_spec.rb +368 -189
  216. data/spec/functional/win32/{registry_helper_spec.rb → registry_spec.rb} +16 -23
  217. data/spec/functional/win32/service_manager_spec.rb +2 -2
  218. data/spec/integration/client/client_spec.rb +51 -0
  219. data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
  220. data/spec/integration/knife/download_spec.rb +4 -0
  221. data/spec/integration/knife/list_spec.rb +8 -0
  222. data/spec/integration/knife/upload_spec.rb +1 -1
  223. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -16
  224. data/spec/integration/recipes/remote_directory.rb +74 -0
  225. data/spec/integration/recipes/resource_action_spec.rb +363 -0
  226. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +423 -0
  227. data/spec/integration/recipes/resource_load_spec.rb +206 -0
  228. data/spec/spec_helper.rb +9 -0
  229. data/spec/support/platform_helpers.rb +13 -0
  230. data/spec/support/shared/context/win32.rb +34 -0
  231. data/spec/support/shared/functional/win32_service.rb +2 -1
  232. data/spec/support/shared/functional/windows_script.rb +63 -26
  233. data/spec/support/shared/unit/mock_shellout.rb +46 -0
  234. data/spec/support/shared/unit/provider/file.rb +10 -4
  235. data/spec/unit/application/client_spec.rb +16 -3
  236. data/spec/unit/application/knife_spec.rb +2 -2
  237. data/spec/unit/application/solo_spec.rb +4 -3
  238. data/spec/unit/chef_class_spec.rb +23 -4
  239. data/spec/unit/chef_fs/path_util_spec.rb +108 -0
  240. data/spec/unit/client_spec.rb +6 -1
  241. data/spec/unit/config_spec.rb +31 -0
  242. data/spec/unit/cookbook/metadata_spec.rb +23 -3
  243. data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
  244. data/spec/unit/deprecation_spec.rb +3 -6
  245. data/spec/unit/dsl/reboot_pending_spec.rb +12 -6
  246. data/spec/unit/event_dispatch/dispatcher_spec.rb +65 -3
  247. data/spec/unit/event_dispatch/dsl_spec.rb +83 -0
  248. data/spec/unit/formatters/doc_spec.rb +32 -0
  249. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +26 -0
  250. data/spec/unit/json_compat_spec.rb +4 -3
  251. data/spec/unit/knife/bootstrap/client_builder_spec.rb +27 -0
  252. data/spec/unit/knife/bootstrap_spec.rb +55 -3
  253. data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
  254. data/spec/unit/knife/core/bootstrap_context_spec.rb +21 -4
  255. data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -0
  256. data/spec/unit/knife/core/gem_glob_loader_spec.rb +210 -0
  257. data/spec/unit/knife/core/hashed_command_loader_spec.rb +93 -0
  258. data/spec/unit/knife/core/subcommand_loader_spec.rb +16 -192
  259. data/spec/unit/knife/node_run_list_remove_spec.rb +17 -0
  260. data/spec/unit/knife/ssl_check_spec.rb +4 -0
  261. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +10 -10
  262. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  263. data/spec/unit/mixin/template_spec.rb +5 -1
  264. data/spec/unit/mixin/windows_architecture_helper_spec.rb +13 -8
  265. data/spec/unit/node_spec.rb +220 -0
  266. data/spec/unit/platform/query_helpers_spec.rb +146 -3
  267. data/spec/unit/policy_builder/dynamic_spec.rb +275 -0
  268. data/spec/unit/policy_builder/expand_node_object_spec.rb +37 -38
  269. data/spec/unit/policy_builder/policyfile_spec.rb +260 -46
  270. data/spec/unit/property/state_spec.rb +506 -0
  271. data/spec/unit/property/validation_spec.rb +663 -0
  272. data/spec/unit/property_spec.rb +1094 -0
  273. data/spec/unit/provider/deploy_spec.rb +5 -5
  274. data/spec/unit/provider/directory_spec.rb +35 -0
  275. data/spec/unit/provider/dsc_resource_spec.rb +3 -10
  276. data/spec/unit/provider/ifconfig_spec.rb +22 -2
  277. data/spec/unit/provider/mount/aix_spec.rb +2 -1
  278. data/spec/unit/provider/mount/mount_spec.rb +6 -0
  279. data/spec/unit/provider/mount/windows_spec.rb +14 -0
  280. data/spec/unit/provider/mount_spec.rb +12 -1
  281. data/spec/unit/provider/package/dpkg_spec.rb +8 -1
  282. data/spec/unit/provider/package/rpm_spec.rb +18 -1
  283. data/spec/unit/provider/package/rubygems_spec.rb +18 -0
  284. data/spec/unit/provider/package/yum_spec.rb +97 -24
  285. data/spec/unit/provider/powershell_script_spec.rb +106 -0
  286. data/spec/unit/provider/registry_key_spec.rb +12 -0
  287. data/spec/unit/provider/remote_directory_spec.rb +1 -2
  288. data/spec/unit/provider/service/aix_service_spec.rb +3 -3
  289. data/spec/unit/provider/service/gentoo_service_spec.rb +4 -4
  290. data/spec/unit/provider/service/macosx_spec.rb +4 -4
  291. data/spec/unit/provider/service/openbsd_service_spec.rb +10 -8
  292. data/spec/unit/provider/service/redhat_spec.rb +88 -8
  293. data/spec/unit/provider/service/upstart_service_spec.rb +11 -7
  294. data/spec/unit/provider/service/windows_spec.rb +211 -200
  295. data/spec/unit/provider/subversion_spec.rb +50 -31
  296. data/spec/unit/provider/template/content_spec.rb +93 -2
  297. data/spec/unit/provider/user/solaris_spec.rb +66 -9
  298. data/spec/unit/provider_resolver_spec.rb +707 -650
  299. data/spec/unit/provider_spec.rb +1 -3
  300. data/spec/unit/recipe_spec.rb +0 -4
  301. data/spec/unit/resource/deploy_spec.rb +7 -1
  302. data/spec/unit/resource/dsc_script_spec.rb +4 -0
  303. data/spec/unit/resource/file/verification_spec.rb +33 -5
  304. data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +17 -13
  305. data/spec/unit/resource/service_spec.rb +4 -4
  306. data/spec/unit/resource/subversion_spec.rb +4 -0
  307. data/spec/unit/resource/yum_package_spec.rb +10 -1
  308. data/spec/unit/resource_spec.rb +2 -2
  309. data/spec/unit/run_context/child_run_context_spec.rb +133 -0
  310. data/spec/unit/run_context_spec.rb +7 -0
  311. data/spec/unit/run_list/versioned_recipe_list_spec.rb +5 -0
  312. data/spec/unit/win32/registry_spec.rb +394 -0
  313. data/tasks/external_tests.rb +47 -23
  314. data/tasks/maintainers.rb +155 -14
  315. metadata +64 -53
  316. data/lib/chef/knife/bootstrap/templates/archlinux-gems.erb +0 -76
  317. data/lib/chef/knife/bootstrap/templates/chef-aix.erb +0 -72
  318. data/spec/unit/provider/powershell_spec.rb +0 -80
  319. data/spec/unit/registry_helper_spec.rb +0 -376
  320. data/spec/unit/workstation_config_loader_spec.rb +0 -283
@@ -44,6 +44,52 @@ class Chef
44
44
 
45
45
  attr_reader :_extension_modules
46
46
 
47
+ #
48
+ # Helpers for adding context of which resource is rendering the template (CHEF-5012)
49
+ #
50
+
51
+ # name of the cookbook containing the template resource, e.g.:
52
+ # test
53
+ #
54
+ # @return [String] cookbook name
55
+ attr_reader :cookbook_name
56
+
57
+ # name of the recipe containing the template resource, e.g.:
58
+ # default
59
+ #
60
+ # @return [String] recipe name
61
+ attr_reader :recipe_name
62
+
63
+ # string representation of the line in the recipe containing the template resource, e.g.:
64
+ # /Users/lamont/solo/cookbooks/test/recipes/default.rb:2:in `from_file'
65
+ #
66
+ # @return [String] recipe line
67
+ attr_reader :recipe_line_string
68
+
69
+ # path to the recipe containing the template resource, e.g.:
70
+ # /Users/lamont/solo/cookbooks/test/recipes/default.rb
71
+ #
72
+ # @return [String] recipe path
73
+ attr_reader :recipe_path
74
+
75
+ # line in the recipe containing the template reosurce, e.g.:
76
+ # 2
77
+ #
78
+ # @return [String] recipe line
79
+ attr_reader :recipe_line
80
+
81
+ # name of the template source itself, e.g.:
82
+ # foo.erb
83
+ #
84
+ # @return [String] template name
85
+ attr_reader :template_name
86
+
87
+ # path to the template source itself, e.g.:
88
+ # /Users/lamont/solo/cookbooks/test/templates/default/foo.erb
89
+ #
90
+ # @return [String] template path
91
+ attr_reader :template_path
92
+
47
93
  def initialize(variables)
48
94
  super
49
95
  @_extension_modules = []
@@ -62,6 +108,7 @@ class Chef
62
108
  "include a node variable if you plan to use it."
63
109
  end
64
110
 
111
+
65
112
  #
66
113
  # Takes the name of the partial, plus a hash of options. Returns a
67
114
  # string that contains the result of the evaluation of the partial.
@@ -89,6 +136,7 @@ class Chef
89
136
  raise "You cannot render partials in this context" unless @template_finder
90
137
 
91
138
  partial_variables = options.delete(:variables) || _public_instance_variables
139
+ partial_variables[:template_finder] = @template_finder
92
140
  partial_context = self.class.new(partial_variables)
93
141
  partial_context._extend_modules(@_extension_modules)
94
142
 
@@ -28,7 +28,7 @@ class Chef
28
28
  paths = ENV['PATH'].split(File::PATH_SEPARATOR) + extra_path
29
29
  paths.each do |path|
30
30
  filename = File.join(path, cmd)
31
- return filename if File.executable?(filename)
31
+ return filename if File.executable?(Chef.path_to(filename))
32
32
  end
33
33
  false
34
34
  end
@@ -0,0 +1,72 @@
1
+ #
2
+ # Author:: Jay Mundrawala(<jdm@chef.io>)
3
+ # Copyright:: Copyright 2015 Chef Software
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
+ module Mixin
21
+ module WideString
22
+
23
+ def wstring(str)
24
+ if str.nil? || str.encoding == Encoding::UTF_16LE
25
+ str
26
+ else
27
+ utf8_to_wide(str)
28
+ end
29
+ end
30
+
31
+ def utf8_to_wide(ustring)
32
+ # ensure it is actually UTF-8
33
+ # Ruby likes to mark binary data as ASCII-8BIT
34
+ ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8"
35
+
36
+ # ensure we have the double-null termination Windows Wide likes
37
+ ustring = ustring + "\000\000" if ustring.length == 0 or ustring[-1].chr != "\000"
38
+
39
+ # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode
40
+ ustring = begin
41
+ if ustring.respond_to?(:encode)
42
+ ustring.encode('UTF-16LE')
43
+ else
44
+ require 'iconv'
45
+ Iconv.conv("UTF-16LE", "UTF-8", ustring)
46
+ end
47
+ end
48
+ ustring
49
+ end
50
+
51
+ def wide_to_utf8(wstring)
52
+ # ensure it is actually UTF-16LE
53
+ # Ruby likes to mark binary data as ASCII-8BIT
54
+ wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding)
55
+
56
+ # encode it all as UTF-8
57
+ wstring = begin
58
+ if wstring.respond_to?(:encode)
59
+ wstring.encode('UTF-8')
60
+ else
61
+ require 'iconv'
62
+ Iconv.conv("UTF-8", "UTF-16LE", wstring)
63
+ end
64
+ end
65
+ # remove trailing CRLF and NULL characters
66
+ wstring.strip!
67
+ wstring
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -19,19 +19,13 @@
19
19
 
20
20
  require 'chef/exceptions'
21
21
  require 'chef/platform/query_helpers'
22
- require 'win32/api' if Chef::Platform.windows?
23
- require 'chef/win32/api/process' if Chef::Platform.windows?
24
- require 'chef/win32/api/error' if Chef::Platform.windows?
22
+ require 'chef/win32/process' if Chef::Platform.windows?
23
+ require 'chef/win32/system' if Chef::Platform.windows?
25
24
 
26
25
  class Chef
27
26
  module Mixin
28
27
  module WindowsArchitectureHelper
29
28
 
30
- if Chef::Platform.windows?
31
- include Chef::ReservedNames::Win32::API::Process
32
- include Chef::ReservedNames::Win32::API::Error
33
- end
34
-
35
29
  def node_windows_architecture(node)
36
30
  node[:kernel][:machine].to_sym
37
31
  end
@@ -42,6 +36,16 @@ class Chef
42
36
  is_i386_process_on_x86_64_windows?
43
37
  end
44
38
 
39
+ def forced_32bit_override_required?(node, desired_architecture)
40
+ desired_architecture == :i386 &&
41
+ node_windows_architecture(node) == :x86_64 &&
42
+ !is_i386_process_on_x86_64_windows?
43
+ end
44
+
45
+ def wow64_directory
46
+ Chef::ReservedNames::Win32::System.get_system_wow64_directory
47
+ end
48
+
45
49
  def with_os_architecture(node, architecture: nil)
46
50
  node ||= begin
47
51
  os_arch = ENV['PROCESSOR_ARCHITEW6432'] ||
@@ -88,49 +92,21 @@ class Chef
88
92
 
89
93
  def is_i386_process_on_x86_64_windows?
90
94
  if Chef::Platform.windows?
91
- is_64_bit_process_result = FFI::MemoryPointer.new(:int)
92
-
93
- # The return value of IsWow64Process is nonzero value if the API call succeeds.
94
- # The result data are returned in the last parameter, not the return value.
95
- call_succeeded = IsWow64Process(GetCurrentProcess(), is_64_bit_process_result)
96
-
97
- # The result is nonzero if IsWow64Process's calling process, in the case here
98
- # this process, is running under WOW64, i.e. the result is nonzero if this
99
- # process is 32-bit (aka :i386).
100
- result = (call_succeeded != 0) && (is_64_bit_process_result.get_int(0) != 0)
95
+ Chef::ReservedNames::Win32::Process.is_wow64_process
101
96
  else
102
97
  false
103
98
  end
104
99
  end
105
100
 
106
101
  def disable_wow64_file_redirection( node )
107
- original_redirection_state = ['0'].pack('P')
108
-
109
102
  if ( ( node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?)
110
- win32_wow_64_disable_wow_64_fs_redirection =
111
- ::Win32::API.new('Wow64DisableWow64FsRedirection', 'P', 'L', 'kernel32')
112
-
113
- succeeded = win32_wow_64_disable_wow_64_fs_redirection.call(original_redirection_state)
114
-
115
- if succeeded == 0
116
- raise Win32APIError "Failed to disable Wow64 file redirection"
117
- end
118
-
103
+ Chef::ReservedNames::Win32::System.wow64_disable_wow64_fs_redirection
119
104
  end
120
-
121
- original_redirection_state
122
105
  end
123
106
 
124
107
  def restore_wow64_file_redirection( node, original_redirection_state )
125
108
  if ( (node_windows_architecture(node) == :x86_64) && ::Chef::Platform.windows?)
126
- win32_wow_64_revert_wow_64_fs_redirection =
127
- ::Win32::API.new('Wow64RevertWow64FsRedirection', 'P', 'L', 'kernel32')
128
-
129
- succeeded = win32_wow_64_revert_wow_64_fs_redirection.call(original_redirection_state)
130
-
131
- if succeeded == 0
132
- raise Win32APIError "Failed to revert Wow64 file redirection"
133
- end
109
+ Chef::ReservedNames::Win32::System.wow64_revert_wow64_fs_redirection(original_redirection_state)
134
110
  end
135
111
  end
136
112
 
@@ -18,6 +18,7 @@
18
18
 
19
19
 
20
20
  require 'chef/exceptions'
21
+ require 'chef/mixin/wide_string'
21
22
  require 'chef/platform/query_helpers'
22
23
  require 'chef/win32/error' if Chef::Platform.windows?
23
24
  require 'chef/win32/api/system' if Chef::Platform.windows?
@@ -26,6 +27,8 @@ require 'chef/win32/api/unicode' if Chef::Platform.windows?
26
27
  class Chef
27
28
  module Mixin
28
29
  module WindowsEnvHelper
30
+ include Chef::Mixin::WideString
31
+
29
32
  if Chef::Platform.windows?
30
33
  include Chef::ReservedNames::Win32::API::System
31
34
  end
@@ -45,7 +48,7 @@ class Chef
45
48
  Chef::ReservedNames::Win32::Error.raise!
46
49
  end
47
50
  if ( SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, FFI::MemoryPointer.from_string(
48
- Chef::ReservedNames::Win32::Unicode.utf8_to_wide('Environment')
51
+ utf8_to_wide('Environment')
49
52
  ).address, flags, 5000, nil) == 0 )
50
53
  Chef::ReservedNames::Win32::Error.raise!
51
54
  end
@@ -0,0 +1,51 @@
1
+ require 'webrick/utils'
2
+
3
+ module WEBrick
4
+ module Utils
5
+ ##
6
+ # Creates TCP server sockets bound to +address+:+port+ and returns them.
7
+ #
8
+ # It will create IPV4 and IPV6 sockets on all interfaces.
9
+ #
10
+ # NOTE: We need to monkey patch this method because
11
+ # create_listeners on Windows with Ruby > 2.0.0 does not
12
+ # raise an error if we're already listening on a port.
13
+ #
14
+ def create_listeners(address, port, logger=nil)
15
+ #
16
+ # utils.rb -- Miscellaneous utilities
17
+ #
18
+ # Author: IPR -- Internet Programming with Ruby -- writers
19
+ # Copyright (c) 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
20
+ # Copyright (c) 2002 Internet Programming with Ruby writers. All rights
21
+ # reserved.
22
+ #
23
+ # $IPR: utils.rb,v 1.10 2003/02/16 22:22:54 gotoyuzo Exp $
24
+ unless port
25
+ raise ArgumentError, "must specify port"
26
+ end
27
+ res = Socket::getaddrinfo(address, port,
28
+ Socket::AF_UNSPEC, # address family
29
+ Socket::SOCK_STREAM, # socket type
30
+ 0, # protocol
31
+ Socket::AI_PASSIVE) # flag
32
+ last_error = nil
33
+ sockets = []
34
+ res.each{|ai|
35
+ begin
36
+ logger.debug("TCPServer.new(#{ai[3]}, #{port})") if logger
37
+ sock = TCPServer.new(ai[3], port)
38
+ port = sock.addr[1] if port == 0
39
+ Utils::set_close_on_exec(sock)
40
+ sockets << sock
41
+ rescue => ex
42
+ logger.warn("TCPServer Error: #{ex}") if logger
43
+ last_error = ex
44
+ end
45
+ }
46
+ raise last_error if sockets.empty?
47
+ return sockets
48
+ end
49
+ module_function :create_listeners
50
+ end
51
+ end
@@ -0,0 +1,72 @@
1
+ #
2
+ # Copyright:: Copyright 2015 Chef Software, 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/win32/api/registry'
19
+ require 'chef/win32/unicode'
20
+ require 'win32/registry'
21
+
22
+ module Win32
23
+ class Registry
24
+
25
+ module API
26
+
27
+ extend Chef::ReservedNames::Win32::API::Registry
28
+
29
+ module_function
30
+
31
+ if RUBY_VERSION =~ /^2\.1/
32
+ # ::Win32::Registry#delete_value is broken in Ruby 2.1 (up to Ruby 2.1.6).
33
+ # This should be resolved in a later release (see note #9 in link below).
34
+ # https://bugs.ruby-lang.org/issues/10820
35
+ def DeleteValue(hkey, name)
36
+ check RegDeleteValueW(hkey, name.to_wstring)
37
+ end
38
+ end
39
+
40
+ # ::Win32::Registry#delete_key uses RegDeleteKeyW. We need to use
41
+ # RegDeleteKeyExW to properly support WOW64 systems.
42
+ def DeleteKey(hkey, name)
43
+ check RegDeleteKeyExW(hkey, name.to_wstring, 0, 0)
44
+ end
45
+
46
+ end
47
+
48
+ if RUBY_VERSION =~ /^2.1/
49
+ # ::Win32::Registry#write does not correctly handle data in Ruby 2.1 (up to Ruby 2.1.6).
50
+ # https://bugs.ruby-lang.org/issues/11439
51
+ def write(name, type, data)
52
+ case type
53
+ when REG_SZ, REG_EXPAND_SZ
54
+ data = data.to_s.encode(WCHAR) + WCHAR_NUL
55
+ when REG_MULTI_SZ
56
+ data = data.to_a.map {|s| s.encode(WCHAR)}.join(WCHAR_NUL) << WCHAR_NUL << WCHAR_NUL
57
+ when REG_BINARY
58
+ data = data.to_s
59
+ when REG_DWORD
60
+ data = API.packdw(data.to_i)
61
+ when REG_DWORD_BIG_ENDIAN
62
+ data = [data.to_i].pack('N')
63
+ when REG_QWORD
64
+ data = API.packqw(data.to_i)
65
+ else
66
+ raise TypeError, "Unsupported type #{type}"
67
+ end
68
+ API.SetValue(@hkey, name, type, data, data.bytesize)
69
+ end
70
+ end
71
+ end
72
+ end
@@ -63,6 +63,8 @@ class Chef
63
63
 
64
64
  include Chef::Mixin::ParamsValidate
65
65
 
66
+ NULL_ARG = Object.new
67
+
66
68
  # Create a new Chef::Node object.
67
69
  def initialize(chef_server_rest: nil)
68
70
  @chef_server_rest = chef_server_rest
@@ -72,6 +74,9 @@ class Chef
72
74
  @primary_runlist = Chef::RunList.new
73
75
  @override_runlist = Chef::RunList.new
74
76
 
77
+ @policy_name = nil
78
+ @policy_group = nil
79
+
75
80
  @attributes = Chef::Node::Attribute.new({}, {}, {}, {})
76
81
 
77
82
  @run_state = {}
@@ -132,6 +137,50 @@ class Chef
132
137
 
133
138
  alias :environment :chef_environment
134
139
 
140
+ # The `policy_name` for this node. Setting this to a non-nil value will
141
+ # enable policyfile mode when `chef-client` is run. If set in the config
142
+ # file or in node json, running `chef-client` will update this value.
143
+ #
144
+ # @see Chef::PolicyBuilder::Dynamic
145
+ # @see Chef::PolicyBuilder::Policyfile
146
+ #
147
+ # @param arg [String] the new policy_name value
148
+ # @return [String] the current policy_name, or the one you just set
149
+ def policy_name(arg=NULL_ARG)
150
+ return @policy_name if arg.equal?(NULL_ARG)
151
+ validate({policy_name: arg}, { policy_name: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } })
152
+ @policy_name = arg
153
+ end
154
+
155
+ # A "non-DSL-style" setter for `policy_name`
156
+ #
157
+ # @see #policy_name
158
+ def policy_name=(policy_name)
159
+ policy_name(policy_name)
160
+ end
161
+
162
+ # The `policy_group` for this node. Setting this to a non-nil value will
163
+ # enable policyfile mode when `chef-client` is run. If set in the config
164
+ # file or in node json, running `chef-client` will update this value.
165
+ #
166
+ # @see Chef::PolicyBuilder::Dynamic
167
+ # @see Chef::PolicyBuilder::Policyfile
168
+ #
169
+ # @param arg [String] the new policy_group value
170
+ # @return [String] the current policy_group, or the one you just set
171
+ def policy_group(arg=NULL_ARG)
172
+ return @policy_group if arg.equal?(NULL_ARG)
173
+ validate({policy_group: arg}, { policy_group: { kind_of: [ String, NilClass ], regex: /^[\-:.[:alnum:]_]+$/ } })
174
+ @policy_group = arg
175
+ end
176
+
177
+ # A "non-DSL-style" setter for `policy_group`
178
+ #
179
+ # @see #policy_group
180
+ def policy_group=(policy_group)
181
+ policy_group(policy_group)
182
+ end
183
+
135
184
  def attributes
136
185
  @attributes
137
186
  end
@@ -315,6 +364,7 @@ class Chef
315
364
  # Consumes the combined run_list and other attributes in +attrs+
316
365
  def consume_attributes(attrs)
317
366
  normal_attrs_to_merge = consume_run_list(attrs)
367
+ normal_attrs_to_merge = consume_chef_environment(normal_attrs_to_merge)
318
368
  Chef::Log.debug("Applying attributes from json file")
319
369
  self.normal_attrs = Chef::Mixin::DeepMerge.merge(normal_attrs,normal_attrs_to_merge)
320
370
  self.tags # make sure they're defined
@@ -347,6 +397,24 @@ class Chef
347
397
  attrs
348
398
  end
349
399
 
400
+ # chef_environment when set in -j JSON will take precedence over
401
+ # -E ENVIRONMENT. Ideally, IMO, the order of precedence should be (lowest to
402
+ # highest):
403
+ # config_file
404
+ # -j JSON
405
+ # -E ENVIRONMENT
406
+ # so that users could reuse their JSON and override the chef_environment
407
+ # configured within it with -E ENVIRONMENT. Because command line options are
408
+ # merged with Chef::Config there is currently no way to distinguish between
409
+ # an environment set via config from an environment set via command line.
410
+ def consume_chef_environment(attrs)
411
+ attrs = attrs ? attrs.dup : {}
412
+ if env = attrs.delete("chef_environment")
413
+ chef_environment(env)
414
+ end
415
+ attrs
416
+ end
417
+
350
418
  # Clear defaults and overrides, so that any deleted attributes
351
419
  # between runs are still gone.
352
420
  def reset_defaults_and_overrides
@@ -372,7 +440,7 @@ class Chef
372
440
 
373
441
  self.tags # make sure they're defined
374
442
 
375
- automatic_attrs[:recipes] = expansion.recipes.with_fully_qualified_names_and_version_constraints
443
+ automatic_attrs[:recipes] = expansion.recipes.with_duplicate_names
376
444
  automatic_attrs[:expanded_run_list] = expansion.recipes.with_fully_qualified_names_and_version_constraints
377
445
  automatic_attrs[:roles] = expansion.roles
378
446
 
@@ -442,6 +510,14 @@ class Chef
442
510
  #Render correctly for run_list items so malformed json does not result
443
511
  "run_list" => @primary_runlist.run_list.map { |item| item.to_s }
444
512
  }
513
+ # Chef Server rejects node JSON with extra keys; prior to 12.3,
514
+ # "policy_name" and "policy_group" are unknown; after 12.3 they are
515
+ # optional, therefore only including them in the JSON if present
516
+ # maximizes compatibility for most people.
517
+ unless policy_group.nil? && policy_name.nil?
518
+ result["policy_name"] = policy_name
519
+ result["policy_group"] = policy_group
520
+ end
445
521
  result
446
522
  end
447
523
 
@@ -473,6 +549,10 @@ class Chef
473
549
  else
474
550
  o["recipes"].each { |r| node.recipes << r }
475
551
  end
552
+
553
+ node.policy_name = o["policy_name"] if o.has_key?("policy_name")
554
+ node.policy_group = o["policy_group"] if o.has_key?("policy_group")
555
+
476
556
  node
477
557
  end
478
558
 
@@ -534,8 +614,16 @@ class Chef
534
614
  chef_server_rest.put_rest("nodes/#{name}", data_for_save)
535
615
  end
536
616
  rescue Net::HTTPServerException => e
537
- raise e unless e.response.code == "404"
538
- chef_server_rest.post_rest("nodes", data_for_save)
617
+ if e.response.code == "404"
618
+ chef_server_rest.post_rest("nodes", data_for_save)
619
+ # Chef Server before 12.3 rejects node JSON with 'policy_name' or
620
+ # 'policy_group' keys, but 'policy_name' will be detected first.
621
+ # Backcompat can be removed in 13.0
622
+ elsif e.response.code == "400" && e.response.body.include?("Invalid key policy_name")
623
+ save_without_policyfile_attrs
624
+ else
625
+ raise
626
+ end
539
627
  end
540
628
  self
541
629
  end
@@ -544,6 +632,15 @@ class Chef
544
632
  def create
545
633
  chef_server_rest.post_rest("nodes", data_for_save)
546
634
  self
635
+ rescue Net::HTTPServerException => e
636
+ # Chef Server before 12.3 rejects node JSON with 'policy_name' or
637
+ # 'policy_group' keys, but 'policy_name' will be detected first.
638
+ # Backcompat can be removed in 13.0
639
+ if e.response.code == "400" && e.response.body.include?("Invalid key policy_name")
640
+ chef_server_rest.post_rest("nodes", data_for_save_without_policyfile_attrs)
641
+ else
642
+ raise
643
+ end
547
644
  end
548
645
 
549
646
  def to_s
@@ -556,6 +653,22 @@ class Chef
556
653
 
557
654
  private
558
655
 
656
+ def save_without_policyfile_attrs
657
+ trimmed_data = data_for_save_without_policyfile_attrs
658
+
659
+ chef_server_rest.put_rest("nodes/#{name}", trimmed_data)
660
+ rescue Net::HTTPServerException => e
661
+ raise e unless e.response.code == "404"
662
+ chef_server_rest.post_rest("nodes", trimmed_data)
663
+ end
664
+
665
+ def data_for_save_without_policyfile_attrs
666
+ data_for_save.tap do |trimmed_data|
667
+ trimmed_data.delete("policy_name")
668
+ trimmed_data.delete("policy_group")
669
+ end
670
+ end
671
+
559
672
  def data_for_save
560
673
  data = for_json
561
674
  ["automatic", "default", "normal", "override"].each do |level|