chef 16.0.257-universal-mingw32 → 16.2.44-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 (391) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/README.md +3 -3
  4. data/Rakefile +44 -16
  5. data/chef.gemspec +4 -4
  6. data/distro/powershell/chef/chef.psm1 +3 -3
  7. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  8. data/lib/chef/application/apply.rb +2 -2
  9. data/lib/chef/application/base.rb +1 -1
  10. data/lib/chef/application/client.rb +1 -1
  11. data/lib/chef/application/exit_code.rb +2 -2
  12. data/lib/chef/application/windows_service_manager.rb +1 -1
  13. data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -3
  14. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  15. data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +1 -1
  17. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +1 -1
  18. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +1 -1
  19. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
  20. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  21. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  22. data/lib/chef/chef_fs/path_utils.rb +4 -4
  23. data/lib/chef/cookbook/chefignore.rb +1 -1
  24. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  25. data/lib/chef/cookbook/metadata.rb +2 -2
  26. data/lib/chef/cookbook_loader.rb +1 -1
  27. data/lib/chef/cookbook_manifest.rb +1 -1
  28. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  29. data/lib/chef/cookbook_version.rb +7 -7
  30. data/lib/chef/data_bag.rb +4 -4
  31. data/lib/chef/data_collector.rb +1 -1
  32. data/lib/chef/data_collector/error_handlers.rb +1 -1
  33. data/lib/chef/decorator/lazy_array.rb +2 -2
  34. data/lib/chef/deprecated.rb +5 -1
  35. data/lib/chef/digester.rb +4 -4
  36. data/lib/chef/dsl/declare_resource.rb +1 -1
  37. data/lib/chef/dsl/platform_introspection.rb +1 -1
  38. data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
  39. data/lib/chef/encrypted_data_bag_item/encryptor.rb +1 -1
  40. data/lib/chef/file_access_control.rb +1 -1
  41. data/lib/chef/formatters/base.rb +1 -1
  42. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +1 -1
  43. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +2 -2
  44. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +7 -7
  45. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
  46. data/lib/chef/http.rb +18 -3
  47. data/lib/chef/http/decompressor.rb +1 -1
  48. data/lib/chef/http/http_request.rb +1 -1
  49. data/lib/chef/http/json_output.rb +1 -1
  50. data/lib/chef/http/ssl_policies.rb +18 -0
  51. data/lib/chef/json_compat.rb +1 -1
  52. data/lib/chef/key.rb +1 -1
  53. data/lib/chef/knife.rb +2 -2
  54. data/lib/chef/knife/bootstrap.rb +13 -16
  55. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  56. data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
  57. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  58. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +3 -1
  59. data/lib/chef/knife/client_bulk_delete.rb +1 -1
  60. data/lib/chef/knife/config_get.rb +1 -1
  61. data/lib/chef/knife/cookbook_delete.rb +1 -1
  62. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  63. data/lib/chef/knife/core/hashed_command_loader.rb +1 -1
  64. data/lib/chef/knife/core/node_presenter.rb +1 -1
  65. data/lib/chef/knife/core/status_presenter.rb +1 -1
  66. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  67. data/lib/chef/knife/core/windows_bootstrap_context.rb +18 -3
  68. data/lib/chef/knife/data_bag_create.rb +1 -1
  69. data/lib/chef/knife/environment_compare.rb +1 -1
  70. data/lib/chef/knife/key_create_base.rb +1 -1
  71. data/lib/chef/knife/key_edit_base.rb +1 -1
  72. data/lib/chef/knife/list.rb +1 -1
  73. data/lib/chef/knife/node_bulk_delete.rb +1 -1
  74. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  75. data/lib/chef/knife/role_bulk_delete.rb +1 -1
  76. data/lib/chef/knife/ssh.rb +2 -2
  77. data/lib/chef/knife/supermarket_install.rb +1 -1
  78. data/lib/chef/knife/supermarket_share.rb +1 -1
  79. data/lib/chef/knife/supermarket_unshare.rb +1 -1
  80. data/lib/chef/knife/{user_invite_recind.rb → user_invite_rescind.rb} +6 -6
  81. data/lib/chef/knife/yaml_convert.rb +2 -2
  82. data/lib/chef/log.rb +1 -1
  83. data/lib/chef/mixin/api_version_request_handling.rb +1 -1
  84. data/lib/chef/mixin/checksum.rb +0 -1
  85. data/lib/chef/mixin/create_path.rb +8 -8
  86. data/lib/chef/mixin/openssl_helper.rb +4 -4
  87. data/lib/chef/mixin/properties.rb +4 -2
  88. data/lib/chef/mixin/securable.rb +2 -2
  89. data/lib/chef/mixin/shell_out.rb +1 -1
  90. data/lib/chef/node/attribute.rb +2 -2
  91. data/lib/chef/node/immutable_collections.rb +1 -1
  92. data/lib/chef/node/mixin/deep_merge_cache.rb +7 -7
  93. data/lib/chef/policy_builder/policyfile.rb +1 -1
  94. data/lib/chef/powershell.rb +1 -1
  95. data/lib/chef/property.rb +2 -2
  96. data/lib/chef/provider.rb +3 -3
  97. data/lib/chef/provider/batch.rb +3 -10
  98. data/lib/chef/provider/cron.rb +2 -14
  99. data/lib/chef/provider/directory.rb +1 -1
  100. data/lib/chef/provider/execute.rb +3 -2
  101. data/lib/chef/provider/file.rb +1 -1
  102. data/lib/chef/provider/group/dscl.rb +2 -2
  103. data/lib/chef/provider/group/windows.rb +1 -1
  104. data/lib/chef/provider/ifconfig.rb +7 -7
  105. data/lib/chef/provider/launchd.rb +28 -32
  106. data/lib/chef/provider/mount/aix.rb +1 -1
  107. data/lib/chef/provider/mount/windows.rb +2 -2
  108. data/lib/chef/provider/noop.rb +1 -1
  109. data/lib/chef/provider/package/cab.rb +1 -1
  110. data/lib/chef/provider/package/chocolatey.rb +1 -1
  111. data/lib/chef/provider/package/dpkg.rb +1 -1
  112. data/lib/chef/provider/package/freebsd/base.rb +2 -1
  113. data/lib/chef/provider/package/homebrew.rb +1 -1
  114. data/lib/chef/provider/package/macports.rb +0 -2
  115. data/lib/chef/provider/package/openbsd.rb +1 -1
  116. data/lib/chef/provider/package/portage.rb +3 -2
  117. data/lib/chef/provider/package/powershell.rb +6 -2
  118. data/lib/chef/provider/package/rubygems.rb +3 -3
  119. data/lib/chef/provider/package/snap.rb +96 -27
  120. data/lib/chef/provider/package/windows.rb +27 -52
  121. data/lib/chef/provider/package/windows/msi.rb +3 -3
  122. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
  123. data/lib/chef/provider/package/yum.rb +1 -1
  124. data/lib/chef/provider/package/yum/yum_cache.rb +1 -1
  125. data/lib/chef/provider/powershell_script.rb +11 -15
  126. data/lib/chef/provider/remote_directory.rb +2 -2
  127. data/lib/chef/provider/remote_file/http.rb +4 -1
  128. data/lib/chef/provider/script.rb +4 -75
  129. data/lib/chef/provider/service/arch.rb +2 -2
  130. data/lib/chef/provider/service/debian.rb +2 -2
  131. data/lib/chef/provider/service/macosx.rb +13 -2
  132. data/lib/chef/provider/service/openbsd.rb +4 -4
  133. data/lib/chef/provider/service/redhat.rb +1 -1
  134. data/lib/chef/provider/service/simple.rb +3 -3
  135. data/lib/chef/provider/service/upstart.rb +1 -1
  136. data/lib/chef/provider/service/windows.rb +1 -1
  137. data/lib/chef/provider/subversion.rb +2 -2
  138. data/lib/chef/provider/user/aix.rb +1 -1
  139. data/lib/chef/provider/user/dscl.rb +7 -7
  140. data/lib/chef/provider/user/linux.rb +3 -3
  141. data/lib/chef/provider/user/mac.rb +15 -11
  142. data/lib/chef/provider/windows_script.rb +87 -25
  143. data/lib/chef/provider/windows_task.rb +5 -3
  144. data/lib/chef/provider/zypper_repository.rb +30 -10
  145. data/lib/chef/resource.rb +25 -14
  146. data/lib/chef/resource/alternatives.rb +65 -4
  147. data/lib/chef/resource/apt_package.rb +31 -2
  148. data/lib/chef/resource/apt_preference.rb +34 -5
  149. data/lib/chef/resource/apt_repository.rb +22 -15
  150. data/lib/chef/resource/apt_update.rb +6 -4
  151. data/lib/chef/resource/archive_file.rb +33 -12
  152. data/lib/chef/resource/bash.rb +1 -2
  153. data/lib/chef/resource/batch.rb +5 -3
  154. data/lib/chef/resource/bff_package.rb +1 -1
  155. data/lib/chef/resource/breakpoint.rb +1 -1
  156. data/lib/chef/resource/build_essential.rb +8 -4
  157. data/lib/chef/resource/cab_package.rb +1 -1
  158. data/lib/chef/resource/chef_client_cron.rb +12 -9
  159. data/lib/chef/resource/chef_client_scheduled_task.rb +22 -7
  160. data/lib/chef/resource/chef_client_systemd_timer.rb +10 -7
  161. data/lib/chef/resource/chef_gem.rb +6 -2
  162. data/lib/chef/resource/chef_handler.rb +3 -3
  163. data/lib/chef/resource/chef_sleep.rb +7 -4
  164. data/lib/chef/resource/chef_vault_secret.rb +4 -4
  165. data/lib/chef/resource/chocolatey_config.rb +5 -3
  166. data/lib/chef/resource/chocolatey_feature.rb +5 -3
  167. data/lib/chef/resource/chocolatey_package.rb +5 -3
  168. data/lib/chef/resource/chocolatey_source.rb +5 -3
  169. data/lib/chef/resource/cookbook_file.rb +3 -2
  170. data/lib/chef/resource/cron/_cron_shared.rb +98 -0
  171. data/lib/chef/resource/cron/cron.rb +46 -0
  172. data/lib/chef/resource/{cron_d.rb → cron/cron_d.rb} +28 -94
  173. data/lib/chef/resource/cron_access.rb +17 -6
  174. data/lib/chef/resource/csh.rb +1 -2
  175. data/lib/chef/resource/directory.rb +1 -1
  176. data/lib/chef/resource/dmg_package.rb +18 -15
  177. data/lib/chef/resource/dnf_package.rb +1 -1
  178. data/lib/chef/resource/dpkg_package.rb +1 -1
  179. data/lib/chef/resource/execute.rb +479 -9
  180. data/lib/chef/resource/file.rb +11 -8
  181. data/lib/chef/resource/freebsd_package.rb +2 -2
  182. data/lib/chef/resource/gem_package.rb +6 -6
  183. data/lib/chef/resource/group.rb +1 -1
  184. data/lib/chef/resource/helpers/cron_validations.rb +6 -3
  185. data/lib/chef/resource/homebrew_cask.rb +1 -1
  186. data/lib/chef/resource/homebrew_package.rb +30 -1
  187. data/lib/chef/resource/homebrew_tap.rb +1 -1
  188. data/lib/chef/resource/homebrew_update.rb +107 -0
  189. data/lib/chef/resource/hostname.rb +11 -24
  190. data/lib/chef/resource/http_request.rb +1 -1
  191. data/lib/chef/resource/ifconfig.rb +7 -7
  192. data/lib/chef/resource/ips_package.rb +1 -1
  193. data/lib/chef/resource/kernel_module.rb +15 -2
  194. data/lib/chef/resource/ksh.rb +1 -1
  195. data/lib/chef/resource/launchd.rb +5 -5
  196. data/lib/chef/resource/link.rb +4 -4
  197. data/lib/chef/resource/locale.rb +4 -4
  198. data/lib/chef/resource/log.rb +1 -1
  199. data/lib/chef/resource/macos_userdefaults.rb +15 -10
  200. data/lib/chef/resource/macosx_service.rb +1 -1
  201. data/lib/chef/resource/macports_package.rb +1 -1
  202. data/lib/chef/resource/mdadm.rb +1 -1
  203. data/lib/chef/resource/mount.rb +2 -2
  204. data/lib/chef/resource/msu_package.rb +2 -2
  205. data/lib/chef/resource/ohai.rb +1 -1
  206. data/lib/chef/resource/ohai_hint.rb +1 -1
  207. data/lib/chef/resource/openbsd_package.rb +1 -1
  208. data/lib/chef/resource/openssl_dhparam.rb +1 -1
  209. data/lib/chef/resource/openssl_ec_private_key.rb +1 -1
  210. data/lib/chef/resource/openssl_ec_public_key.rb +1 -1
  211. data/lib/chef/resource/openssl_rsa_private_key.rb +1 -1
  212. data/lib/chef/resource/openssl_rsa_public_key.rb +1 -1
  213. data/lib/chef/resource/openssl_x509_certificate.rb +1 -1
  214. data/lib/chef/resource/openssl_x509_crl.rb +1 -1
  215. data/lib/chef/resource/openssl_x509_request.rb +1 -1
  216. data/lib/chef/resource/osx_profile.rb +1 -1
  217. data/lib/chef/resource/package.rb +1 -1
  218. data/lib/chef/resource/pacman_package.rb +1 -1
  219. data/lib/chef/resource/paludis_package.rb +1 -1
  220. data/lib/chef/resource/perl.rb +1 -2
  221. data/lib/chef/resource/plist.rb +24 -5
  222. data/lib/chef/resource/portage_package.rb +1 -1
  223. data/lib/chef/resource/powershell_package.rb +1 -1
  224. data/lib/chef/resource/powershell_package_source.rb +1 -1
  225. data/lib/chef/resource/powershell_script.rb +5 -3
  226. data/lib/chef/resource/python.rb +1 -2
  227. data/lib/chef/resource/reboot.rb +1 -1
  228. data/lib/chef/resource/registry_key.rb +1 -1
  229. data/lib/chef/resource/remote_directory.rb +1 -1
  230. data/lib/chef/resource/remote_file.rb +26 -11
  231. data/lib/chef/resource/rhsm_errata.rb +1 -3
  232. data/lib/chef/resource/rhsm_errata_level.rb +1 -1
  233. data/lib/chef/resource/rhsm_register.rb +1 -2
  234. data/lib/chef/resource/rhsm_repo.rb +1 -2
  235. data/lib/chef/resource/rhsm_subscription.rb +1 -3
  236. data/lib/chef/resource/route.rb +1 -1
  237. data/lib/chef/resource/rpm_package.rb +5 -2
  238. data/lib/chef/resource/ruby.rb +1 -2
  239. data/lib/chef/resource/ruby_block.rb +1 -4
  240. data/lib/chef/resource/scm/_scm.rb +4 -3
  241. data/lib/chef/resource/scm/git.rb +2 -2
  242. data/lib/chef/resource/scm/subversion.rb +2 -2
  243. data/lib/chef/resource/script.rb +1 -1
  244. data/lib/chef/resource/service.rb +1 -1
  245. data/lib/chef/resource/smartos_package.rb +1 -1
  246. data/lib/chef/resource/snap_package.rb +1 -1
  247. data/lib/chef/resource/solaris_package.rb +1 -1
  248. data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
  249. data/lib/chef/resource/sudo.rb +4 -4
  250. data/lib/chef/resource/swap_file.rb +2 -2
  251. data/lib/chef/resource/sysctl.rb +61 -2
  252. data/lib/chef/resource/systemd_unit.rb +2 -2
  253. data/lib/chef/resource/template.rb +1 -1
  254. data/lib/chef/resource/timezone.rb +1 -1
  255. data/lib/chef/resource/user.rb +2 -2
  256. data/lib/chef/resource/user_ulimit.rb +24 -22
  257. data/lib/chef/resource/windows_ad_join.rb +31 -2
  258. data/lib/chef/resource/windows_audit_policy.rb +227 -0
  259. data/lib/chef/resource/windows_auto_run.rb +13 -2
  260. data/lib/chef/resource/windows_certificate.rb +28 -2
  261. data/lib/chef/resource/windows_dfs_folder.rb +1 -1
  262. data/lib/chef/resource/windows_dfs_namespace.rb +1 -1
  263. data/lib/chef/resource/windows_dfs_server.rb +2 -2
  264. data/lib/chef/resource/windows_env.rb +10 -1
  265. data/lib/chef/resource/windows_feature.rb +57 -2
  266. data/lib/chef/resource/windows_feature_dism.rb +15 -2
  267. data/lib/chef/resource/windows_feature_powershell.rb +29 -2
  268. data/lib/chef/resource/windows_firewall_rule.rb +11 -7
  269. data/lib/chef/resource/windows_font.rb +13 -4
  270. data/lib/chef/resource/windows_package.rb +66 -6
  271. data/lib/chef/resource/windows_pagefile.rb +32 -4
  272. data/lib/chef/resource/windows_path.rb +18 -1
  273. data/lib/chef/resource/windows_printer.rb +26 -6
  274. data/lib/chef/resource/windows_printer_port.rb +29 -1
  275. data/lib/chef/resource/windows_script.rb +2 -16
  276. data/lib/chef/resource/windows_security_policy.rb +47 -16
  277. data/lib/chef/resource/windows_service.rb +1 -1
  278. data/lib/chef/resource/windows_share.rb +23 -3
  279. data/lib/chef/resource/windows_shortcut.rb +13 -3
  280. data/lib/chef/resource/windows_task.rb +143 -29
  281. data/lib/chef/resource/windows_uac.rb +20 -1
  282. data/lib/chef/resource/windows_user_privilege.rb +45 -3
  283. data/lib/chef/resource/windows_workgroup.rb +19 -3
  284. data/lib/chef/resource/yum_package.rb +88 -6
  285. data/lib/chef/resource/yum_repository.rb +36 -19
  286. data/lib/chef/resource/zypper_package.rb +29 -3
  287. data/lib/chef/resource/zypper_repository.rb +17 -5
  288. data/lib/chef/resource_inspector.rb +5 -4
  289. data/lib/chef/resources.rb +4 -2
  290. data/lib/chef/run_context/cookbook_compiler.rb +1 -1
  291. data/lib/chef/scan_access_control.rb +1 -1
  292. data/lib/chef/search/query.rb +1 -1
  293. data/lib/chef/shell/ext.rb +1 -1
  294. data/lib/chef/util/diff.rb +2 -2
  295. data/lib/chef/util/dsc/lcm_output_parser.rb +3 -3
  296. data/lib/chef/util/windows/net_user.rb +1 -1
  297. data/lib/chef/util/windows/volume.rb +1 -1
  298. data/lib/chef/version.rb +1 -1
  299. data/lib/chef/win32/api.rb +2 -2
  300. data/lib/chef/win32/api/error.rb +3 -1
  301. data/lib/chef/win32/api/file.rb +18 -18
  302. data/lib/chef/win32/api/net.rb +1 -0
  303. data/lib/chef/win32/file.rb +1 -1
  304. data/lib/chef/win32/mutex.rb +1 -1
  305. data/lib/chef/win32/net.rb +1 -0
  306. data/lib/chef/win32/process.rb +2 -2
  307. data/lib/chef/win32/registry.rb +2 -2
  308. data/lib/chef/win32/security.rb +1 -1
  309. data/lib/chef/win32/security/sid.rb +4 -4
  310. data/spec/data/lwrp/providers/buck_passer.rb +1 -1
  311. data/spec/data/lwrp/providers/buck_passer_2.rb +1 -1
  312. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +1 -1
  313. data/spec/functional/resource/cron_spec.rb +10 -0
  314. data/spec/functional/resource/dnf_package_spec.rb +2 -2
  315. data/spec/functional/resource/git_spec.rb +6 -6
  316. data/spec/functional/resource/launchd_spec.rb +232 -0
  317. data/spec/functional/resource/link_spec.rb +3 -3
  318. data/spec/functional/resource/remote_file_spec.rb +3 -3
  319. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  320. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  321. data/spec/functional/resource/windows_task_spec.rb +12 -12
  322. data/spec/integration/knife/raw_spec.rb +4 -4
  323. data/spec/integration/knife/redirection_spec.rb +2 -2
  324. data/spec/support/chef_helpers.rb +1 -1
  325. data/spec/support/platform_helpers.rb +1 -14
  326. data/spec/support/platforms/win32/spec_service.rb +1 -1
  327. data/spec/support/shared/functional/execute_resource.rb +1 -1
  328. data/spec/support/shared/functional/file_resource.rb +1 -1
  329. data/spec/support/shared/functional/http.rb +2 -2
  330. data/spec/support/shared/functional/windows_script.rb +1 -1
  331. data/spec/support/shared/unit/execute_resource.rb +1 -1
  332. data/spec/support/shared/unit/mock_shellout.rb +1 -1
  333. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
  334. data/spec/unit/application_spec.rb +7 -0
  335. data/spec/unit/data_bag_spec.rb +1 -1
  336. data/spec/unit/file_access_control_spec.rb +1 -1
  337. data/spec/unit/http/ssl_policies_spec.rb +20 -0
  338. data/spec/unit/knife/bootstrap_spec.rb +2 -2
  339. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +7 -1
  340. data/spec/unit/knife/role_env_run_list_add_spec.rb +6 -6
  341. data/spec/unit/knife/role_env_run_list_clear_spec.rb +4 -4
  342. data/spec/unit/knife/role_env_run_list_remove_spec.rb +4 -4
  343. data/spec/unit/knife/role_env_run_list_replace_spec.rb +4 -4
  344. data/spec/unit/knife/role_env_run_list_set_spec.rb +4 -4
  345. data/spec/unit/knife/role_run_list_add_spec.rb +6 -6
  346. data/spec/unit/knife/role_run_list_clear_spec.rb +4 -4
  347. data/spec/unit/knife/role_run_list_remove_spec.rb +4 -4
  348. data/spec/unit/knife/role_run_list_replace_spec.rb +4 -4
  349. data/spec/unit/knife/role_run_list_set_spec.rb +4 -4
  350. data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
  351. data/spec/unit/mixin/shell_out_spec.rb +25 -31
  352. data/spec/unit/mixin/user_context_spec.rb +1 -9
  353. data/spec/unit/node/attribute_spec.rb +1 -1
  354. data/spec/unit/property_spec.rb +1 -1
  355. data/spec/unit/provider/apt_repository_spec.rb +27 -27
  356. data/spec/unit/provider/batch_spec.rb +130 -0
  357. data/spec/unit/provider/cron_spec.rb +9 -49
  358. data/spec/unit/provider/git_spec.rb +3 -3
  359. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  360. data/spec/unit/provider/launchd_spec.rb +8 -50
  361. data/spec/unit/provider/osx_profile_spec.rb +2 -2
  362. data/spec/unit/provider/package/msu_spec.rb +3 -3
  363. data/spec/unit/provider/package/portage_spec.rb +2 -2
  364. data/spec/unit/provider/package/powershell_spec.rb +96 -87
  365. data/spec/unit/provider/package/snap_spec.rb +1 -1
  366. data/spec/unit/provider/powershell_script_spec.rb +3 -45
  367. data/spec/unit/provider/script_spec.rb +20 -110
  368. data/spec/unit/provider/service/gentoo_service_spec.rb +1 -1
  369. data/spec/unit/provider/zypper_repository_spec.rb +75 -25
  370. data/spec/unit/provider_resolver_spec.rb +11 -11
  371. data/spec/unit/resource/archive_file_spec.rb +11 -2
  372. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
  373. data/spec/unit/resource/cron_spec.rb +2 -2
  374. data/spec/unit/resource/helpers/cron_validations_spec.rb +5 -1
  375. data/spec/unit/resource/homebrew_update_spec.rb +30 -0
  376. data/spec/unit/resource/powershell_script_spec.rb +10 -15
  377. data/spec/unit/resource/timezone_spec.rb +1 -1
  378. data/spec/unit/resource/windows_audit_policy_spec.rb +64 -0
  379. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  380. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  381. data/spec/unit/resource/windows_package_spec.rb +10 -0
  382. data/spec/unit/resource/windows_task_spec.rb +1 -1
  383. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  384. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  385. data/spec/unit/resource_spec.rb +67 -1
  386. data/spec/unit/run_context_spec.rb +1 -1
  387. data/spec/unit/util/dsc/configuration_generator_spec.rb +1 -1
  388. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  389. data/spec/unit/win32/registry_spec.rb +1 -1
  390. metadata +28 -27
  391. data/lib/chef/resource/cron.rb +0 -157
@@ -93,12 +93,12 @@ class Chef
93
93
  description: "For WinRM basic authentication when using the 'ssl' auth method.",
94
94
  boolean: true
95
95
 
96
- # This option was provided in knife bootstrap windows winrm,
97
- # but it is ignored in knife-windows/WinrmSession, and so remains unimplemeneted here.
98
- # option :kerberos_keytab_file,
99
- # :short => "-T KEYTAB_FILE",
100
- # :long => "--keytab-file KEYTAB_FILE",
101
- # :description => "The Kerberos keytab file used for authentication"
96
+ # This option was provided in knife bootstrap windows winrm,
97
+ # but it is ignored in knife-windows/WinrmSession, and so remains unimplemented here.
98
+ # option :kerberos_keytab_file,
99
+ # :short => "-T KEYTAB_FILE",
100
+ # :long => "--keytab-file KEYTAB_FILE",
101
+ # :description => "The Kerberos keytab file used for authentication"
102
102
 
103
103
  option :kerberos_realm,
104
104
  short: "-R KERBEROS_REALM",
@@ -275,7 +275,7 @@ class Chef
275
275
  accumulator
276
276
  }
277
277
 
278
- # bootstrap override: url of a an installer shell script touse in place of omnitruck
278
+ # bootstrap override: url of a an installer shell script to use in place of omnitruck
279
279
  # Note that the bootstrap template _only_ references this out of Chef::Config, and not from
280
280
  # the provided options to knife bootstrap, so we set the Chef::Config option here.
281
281
  option :bootstrap_url,
@@ -580,11 +580,8 @@ class Chef
580
580
 
581
581
  bootstrap_context.client_pem = client_builder.client_path
582
582
  else
583
- ui.info <<~EOM
584
- Performing legacy client registration with the validation key at #{Chef::Config[:validation_key]}...
585
- Delete your validation key in order to use your user credentials for client registration instead.
586
- EOM
587
-
583
+ ui.warn "Performing legacy client registration with the validation key at #{Chef::Config[:validation_key]}..."
584
+ ui.warn "Remove the key file or remove the 'validation_key' configuration option from your config.rb (knife.rb) to use more secure user credentials for client registration."
588
585
  end
589
586
  end
590
587
 
@@ -602,7 +599,7 @@ class Chef
602
599
  end
603
600
 
604
601
  def connect!
605
- ui.info("Connecting to #{ui.color(server_name, :bold)}")
602
+ ui.info("Connecting to #{ui.color(server_name, :bold)} using #{connection_protocol}")
606
603
  opts ||= connection_opts.dup
607
604
  do_connect(opts)
608
605
  rescue Train::Error => e
@@ -713,7 +710,7 @@ class Chef
713
710
  # Fail if using plaintext auth without ssl because
714
711
  # this can expose keys in plaintext on the wire.
715
712
  # TODO test for this method
716
- # TODO check that the protoocol is valid.
713
+ # TODO check that the protocol is valid.
717
714
  def validate_winrm_transport_opts!
718
715
  return true unless winrm?
719
716
 
@@ -967,7 +964,7 @@ class Chef
967
964
  gw_host = split[1]
968
965
  end
969
966
  gw_host, gw_port = gw_host.split(":", 2)
970
- # TODO - validate convertable port in config validation?
967
+ # TODO - validate convertible port in config validation?
971
968
  gw_port = Integer(gw_port) rescue nil
972
969
  opts[:bastion_host] = gw_host
973
970
  opts[:bastion_user] = gw_user
@@ -1073,7 +1070,7 @@ class Chef
1073
1070
  remote_path
1074
1071
  end
1075
1072
 
1076
- # build the command string for bootrapping
1073
+ # build the command string for bootstrapping
1077
1074
  # @return String
1078
1075
  def bootstrap_command(remote_path)
1079
1076
  if connection.windows?
@@ -102,7 +102,7 @@ class Chef
102
102
  config[:bootstrap_vault_item]
103
103
  end
104
104
 
105
- # Helper to return a ruby object represeting all the data bags and items
105
+ # Helper to return a ruby object representing all the data bags and items
106
106
  # to update via chef-vault.
107
107
  #
108
108
  # @return [Hash] deserialized ruby hash with all the vault items
@@ -86,7 +86,7 @@ class Chef
86
86
  config[:chef_node_name]
87
87
  end
88
88
 
89
- # @return [String] enviroment from the config
89
+ # @return [String] environment from the config
90
90
  def environment
91
91
  config[:environment]
92
92
  end
@@ -185,50 +185,50 @@ if test "x$tmp_dir" != "x"; then
185
185
  rm -r "$tmp_dir"
186
186
  fi
187
187
 
188
- mkdir -p <%= ChefConfig::Config.etc_chef_dir(false) %>
188
+ mkdir -p /etc/chef
189
189
 
190
190
  <% if client_pem -%>
191
- (umask 077 && (cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/client.pem <<'EOP'
191
+ (umask 077 && (cat > /etc/chef/client.pem <<'EOP'
192
192
  <%= ::File.read(::File.expand_path(client_pem)) %>
193
193
  EOP
194
194
  )) || exit 1
195
195
  <% end -%>
196
196
 
197
197
  <% if validation_key -%>
198
- (umask 077 && (cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/validation.pem <<'EOP'
198
+ (umask 077 && (cat > /etc/chef/validation.pem <<'EOP'
199
199
  <%= validation_key %>
200
200
  EOP
201
201
  )) || exit 1
202
202
  <% end -%>
203
203
 
204
204
  <% if encrypted_data_bag_secret -%>
205
- (umask 077 && (cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/encrypted_data_bag_secret <<'EOP'
205
+ (umask 077 && (cat > /etc/chef/encrypted_data_bag_secret <<'EOP'
206
206
  <%= encrypted_data_bag_secret %>
207
207
  EOP
208
208
  )) || exit 1
209
209
  <% end -%>
210
210
 
211
211
  <% unless trusted_certs.empty? -%>
212
- mkdir -p <%= ChefConfig::Config.etc_chef_dir(false) %>/trusted_certs
212
+ mkdir -p /etc/chef/trusted_certs
213
213
  <%= trusted_certs %>
214
214
  <% end -%>
215
215
 
216
216
  <%# Generate Ohai Hints -%>
217
217
  <% unless @config[:hints].nil? || @config[:hints].empty? -%>
218
- mkdir -p <%= ChefConfig::Config.etc_chef_dir(false) %>/ohai/hints
218
+ mkdir -p /etc/chef/ohai/hints
219
219
 
220
220
  <% @config[:hints].each do |name, hash| -%>
221
- cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/ohai/hints/<%= name %>.json <<'EOP'
221
+ cat > /etc/chef/ohai/hints/<%= name %>.json <<'EOP'
222
222
  <%= Chef::JSONCompat.to_json(hash) %>
223
223
  EOP
224
224
  <% end -%>
225
225
  <% end -%>
226
226
 
227
- cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/client.rb <<'EOP'
227
+ cat > /etc/chef/client.rb <<'EOP'
228
228
  <%= config_content %>
229
229
  EOP
230
230
 
231
- cat > <%= ChefConfig::Config.etc_chef_dir(false) %>/first-boot.json <<'EOP'
231
+ cat > /etc/chef/first-boot.json <<'EOP'
232
232
  <%= Chef::JSONCompat.to_json(first_boot) %>
233
233
  EOP
234
234
 
@@ -202,10 +202,12 @@ If !ERRORLEVEL!==0 (
202
202
  ) else (
203
203
  @echo Installation completed successfully
204
204
  del /f /q "%CHEF_CLIENT_MSI_LOG_PATH%"
205
- )
205
+ )
206
206
 
207
207
  <% end %>
208
208
 
209
+ @rem This line is required to separate the key_create label from the "block boundary"
210
+ @rem Removing these lines will cause the error "The system cannot find the batch label specified - key_create"
209
211
  :key_create
210
212
  @endlocal
211
213
 
@@ -44,7 +44,7 @@ class Chef
44
44
  clients_to_delete = {}
45
45
  validators_to_delete = {}
46
46
  all_clients.each do |name, client|
47
- next unless name =~ matcher
47
+ next unless name&.match?(matcher)
48
48
 
49
49
  if client.validator
50
50
  validators_to_delete[client.name] = client
@@ -75,7 +75,7 @@ class Chef
75
75
  # It's a regex.
76
76
  filter_re = Regexp.new($1, $2 ? Regexp::IGNORECASE : 0)
77
77
  config_data.each do |key, value|
78
- output_data[key] = value if key.to_s =~ filter_re
78
+ output_data[key] = value if key.to_s&.match?(filter_re)
79
79
  end
80
80
  else
81
81
  # It's a dotted path string.
@@ -89,7 +89,7 @@ class Chef
89
89
  url_and_version["versions"].map { |url_by_version| url_by_version["version"] }
90
90
  end.flatten
91
91
  rescue Net::HTTPClientException => e
92
- if e.to_s =~ /^404/
92
+ if /^404/.match?(e.to_s)
93
93
  ui.error("Cannot find a cookbook named #{@cookbook_name} to delete.")
94
94
  nil
95
95
  else
@@ -58,7 +58,7 @@ class Chef
58
58
  exit 1
59
59
  end
60
60
  cmd = git("status --porcelain")
61
- if cmd.stdout =~ DIRTY_REPO
61
+ if DIRTY_REPO.match?(cmd.stdout)
62
62
  ui.error "You have uncommitted changes to your cookbook repo (#{repo_path}):"
63
63
  ui.msg cmd.stdout
64
64
  ui.info "Commit or stash your changes before importing cookbooks"
@@ -44,7 +44,7 @@ class Chef
44
44
  else
45
45
  commands = manifest[KEY]["plugins_by_category"]
46
46
  end
47
- # If any of the specified plugins in the manifest dont have a valid path we will
47
+ # If any of the specified plugins in the manifest don't have a valid path we will
48
48
  # eventually get an error and the user will need to rehash - instead, lets just
49
49
  # print out 1 error here telling them to rehash
50
50
  errors = {}
@@ -94,7 +94,7 @@ class Chef
94
94
  def summarize(data)
95
95
  if data.is_a?(Chef::Node)
96
96
  node = data
97
- # special case clouds with their split horizon whatsis.
97
+ # special case clouds with their split horizon thing.
98
98
  ip = (node[:cloud] && node[:cloud][:public_ipv4_addrs] && node[:cloud][:public_ipv4_addrs].first) || node[:ipaddress]
99
99
 
100
100
  summarized = <<~SUMMARY
@@ -95,7 +95,7 @@ class Chef
95
95
  summarized = ""
96
96
  list.each do |data|
97
97
  node = data
98
- # special case clouds with their split horizon whatsis.
98
+ # special case clouds with their split horizon thing.
99
99
  ip = (node[:cloud] && node[:cloud][:public_ipv4_addrs] && node[:cloud][:public_ipv4_addrs].first) || node[:ipaddress]
100
100
  fqdn = (node[:cloud] && node[:cloud][:public_hostname]) || node[:fqdn]
101
101
  name = node["name"] || node.name
@@ -32,7 +32,7 @@ class Chef
32
32
  # optionally filtering by category
33
33
  # subcommand_files - returns an array of all subcommand files
34
34
  # that could be loaded
35
- # commnad_class_from(args) - returns the subcommand class for the
35
+ # command_class_from(args) - returns the subcommand class for the
36
36
  # user-requested command
37
37
  #
38
38
  class SubcommandLoader
@@ -24,7 +24,7 @@ class Chef
24
24
  class Knife
25
25
  module Core
26
26
  # Instances of BootstrapContext are the context objects (i.e., +self+) for
27
- # bootstrap templates. For backwards compatability, they +must+ set the
27
+ # bootstrap templates. For backwards compatibility, they +must+ set the
28
28
  # following instance variables:
29
29
  # * @config - a hash of knife's config values
30
30
  # * @run_list - the run list for the node to boostrap
@@ -41,6 +41,21 @@ class Chef
41
41
  super(config, run_list, chef_config, secret)
42
42
  end
43
43
 
44
+ # This is a duplicate of ChefConfig::PathHelper.cleanpath, however
45
+ # this presumes Windows so we can avoid changing the method definitions
46
+ # across Chef, ChefConfig, and ChefUtils for the circumstance where
47
+ # the methods are being run for a system other than the one Ruby is
48
+ # executing on.
49
+ #
50
+ # We only need to cleanpath the paths that we are passing to cmd.exe,
51
+ # anything written to a configuration file or passed as an argument
52
+ # will be interpreted by ruby later and do the right thing.
53
+ def cleanpath(path)
54
+ path = Pathname.new(path).cleanpath.to_s
55
+ path = path.gsub(File::SEPARATOR, '\\')
56
+ path
57
+ end
58
+
44
59
  def validation_key
45
60
  if File.exist?(File.expand_path(chef_config[:validation_key]))
46
61
  IO.read(File.expand_path(chef_config[:validation_key]))
@@ -160,7 +175,7 @@ class Chef
160
175
 
161
176
  def start_chef
162
177
  bootstrap_environment_option = bootstrap_environment.nil? ? "" : " -E #{bootstrap_environment}"
163
- start_chef = "SET \"PATH=%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\;C:\\ruby\\bin;#{ChefConfig::Config.c_opscode_dir}\\#{ChefConfig::Dist::DIR_SUFFIX}\\bin;#{ChefConfig::Config.c_opscode_dir}\\#{ChefConfig::Dist::DIR_SUFFIX}\\embedded\\bin\;%PATH%\"\n"
178
+ start_chef = "SET \"PATH=%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SYSTEMROOT%\\System32\\WindowsPowerShell\\v1.0\\;C:\\ruby\\bin;#{ChefConfig::Config.c_opscode_dir}\\bin;#{ChefConfig::Config.c_opscode_dir}\\embedded\\bin\;%PATH%\"\n"
164
179
  start_chef << "#{Chef::Dist::CLIENT} -c #{ChefConfig::Config.etc_chef_dir(true)}/client.rb -j #{ChefConfig::Config.etc_chef_dir(true)}/first-boot.json#{bootstrap_environment_option}\n"
165
180
  end
166
181
 
@@ -262,7 +277,7 @@ class Chef
262
277
  end
263
278
 
264
279
  def bootstrap_directory
265
- ChefConfig::Config.etc_chef_dir(true)
280
+ cleanpath(ChefConfig::Config.etc_chef_dir(true))
266
281
  end
267
282
 
268
283
  def local_download_path
@@ -54,7 +54,7 @@ class Chef
54
54
  rest.get("data/#{@data_bag_name}")
55
55
  ui.info("Data bag #{@data_bag_name} already exists")
56
56
  rescue Net::HTTPClientException => e
57
- raise unless e.to_s =~ /^404/
57
+ raise unless /^404/.match?(e.to_s)
58
58
 
59
59
  # if it doesn't exists, try to create it
60
60
  rest.post("data", { "name" => @data_bag_name })
@@ -81,7 +81,7 @@ class Chef
81
81
 
82
82
  def constraint_list(environments)
83
83
  constraints = {}
84
- environments.each do |env, url| # rubocop:disable Performance/HashEachMethods
84
+ environments.each do |env, url| # rubocop:disable Style/HashEachMethods
85
85
  # Because you cannot modify the default environment I filter it out here.
86
86
  unless env == "_default"
87
87
  envdata = Chef::Environment.load(env)
@@ -42,7 +42,7 @@ class Chef
42
42
  option :expiration_date,
43
43
  short: "-e DATE",
44
44
  long: "--expiration-date DATE",
45
- description: "Optionally pass the expiration date for the key in ISO 8601 fomatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z. Defaults to infinity if not passed. UTC timezone assumed."
45
+ description: "Optionally pass the expiration date for the key in ISO 8601 formatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z. Defaults to infinity if not passed. UTC timezone assumed."
46
46
  end
47
47
  end
48
48
  end
@@ -47,7 +47,7 @@ class Chef
47
47
  option :expiration_date,
48
48
  short: "-e DATE",
49
49
  long: "--expiration-date DATE",
50
- description: "Updates the expiration_date field of your key if passed. Pass in ISO 8601 fomatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z or infinity. UTC timezone assumed."
50
+ description: "Updates the expiration_date field of your key if passed. Pass in ISO 8601 formatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z or infinity. UTC timezone assumed."
51
51
  end
52
52
  end
53
53
  end
@@ -90,7 +90,7 @@ class Chef
90
90
 
91
91
  # Flatten out directory results if necessary
92
92
  if config[:flat]
93
- dir_results.each do |result, children| # rubocop:disable Performance/HashEachMethods
93
+ dir_results.each do |result, children| # rubocop:disable Style/HashEachMethods
94
94
  results += children
95
95
  end
96
96
  dir_results = []
@@ -39,7 +39,7 @@ class Chef
39
39
  matcher = /#{name_args[0]}/
40
40
 
41
41
  all_nodes.each do |name, node|
42
- next unless name =~ matcher
42
+ next unless name&.match?(matcher)
43
43
 
44
44
  nodes_to_delete[name] = node
45
45
  end
@@ -49,7 +49,7 @@ class Chef
49
49
  node.run_list.remove(e)
50
50
  else
51
51
  ui.warn "#{e} is not in the run list"
52
- unless e =~ /^(recipe|role)\[/
52
+ unless /^(recipe|role)\[/.match?(e)
53
53
  ui.warn "(did you forget recipe[] or role[] around it?)"
54
54
  end
55
55
  end
@@ -40,7 +40,7 @@ class Chef
40
40
  matcher = /#{@name_args[0]}/
41
41
  roles_to_delete = {}
42
42
  all_roles.each do |name, role|
43
- next unless name =~ matcher
43
+ next unless name&.match?(matcher)
44
44
 
45
45
  roles_to_delete[role.name] = role
46
46
  end
@@ -59,7 +59,7 @@ class Chef
59
59
 
60
60
  option :prefix_attribute,
61
61
  long: "--prefix-attribute ATTR",
62
- description: "The attribute to use for prefixing the ouput - default depends on the context."
62
+ description: "The attribute to use for prefixing the output - default depends on the context."
63
63
 
64
64
  option :ssh_user,
65
65
  short: "-x USERNAME",
@@ -364,7 +364,7 @@ class Chef
364
364
 
365
365
  ch.on_data do |ichannel, data|
366
366
  print_data(ichannel.connection[:prefix], data)
367
- if data =~ /^knife sudo password: /
367
+ if /^knife sudo password: /.match?(data)
368
368
  print_data(ichannel.connection[:prefix], "\n")
369
369
  ichannel.send_data("#{get_password}\n")
370
370
  end
@@ -96,7 +96,7 @@ class Chef
96
96
  extract_cookbook(upstream_file, downloader.version)
97
97
 
98
98
  # TODO: it'd be better to store these outside the cookbook repo and
99
- # keep them around, e.g., in ~/Library/Caches on OS X.
99
+ # keep them around, e.g., in ~/Library/Caches on macOS.
100
100
  ui.info("Removing downloaded tarball")
101
101
  File.unlink(upstream_file)
102
102
 
@@ -132,7 +132,7 @@ class Chef
132
132
  res = Chef::JSONCompat.from_json(http_resp.body)
133
133
  if http_resp.code.to_i != 201
134
134
  if res["error_messages"]
135
- if res["error_messages"][0] =~ /Version already exists/
135
+ if /Version already exists/.match?(res["error_messages"][0])
136
136
  ui.error "The same version of this cookbook already exists on Supermarket."
137
137
  exit(1)
138
138
  else
@@ -48,7 +48,7 @@ class Chef
48
48
  begin
49
49
  rest.delete "#{config[:supermarket_site]}/api/v1/cookbooks/#{@name_args[0]}"
50
50
  rescue Net::HTTPClientException => e
51
- raise e unless e.message =~ /Forbidden/
51
+ raise e unless /Forbidden/.match?(e.message)
52
52
 
53
53
  ui.error "Forbidden: You must be the maintainer of #{@cookbook_name} to unshare it."
54
54
  exit 1
@@ -20,14 +20,14 @@ require_relative "../knife"
20
20
 
21
21
  class Chef
22
22
  class Knife
23
- class UserInviteRecind < Chef::Knife
23
+ class UserInviteRescind < Chef::Knife
24
24
  category "user"
25
- banner "knife user invite recind [USERNAMES] (options)"
25
+ banner "knife user invite rescind [USERNAMES] (options)"
26
26
 
27
27
  option :all,
28
28
  short: "-a",
29
29
  long: "--all",
30
- description: "Recind all invites!"
30
+ description: "Rescind all invites!"
31
31
 
32
32
  def run
33
33
  if (name_args.length < 1) && ! config.key?(:all)
@@ -36,18 +36,18 @@ class Chef
36
36
  exit 1
37
37
  end
38
38
 
39
- # To recind we need to send a DELETE to association_requests/INVITE_ID
39
+ # To rescind we need to send a DELETE to association_requests/INVITE_ID
40
40
  # For user friendliness we look up the invite ID based on username.
41
41
  @invites = {}
42
42
  usernames = name_args
43
43
  rest.get_rest("association_requests").each { |i| @invites[i["username"]] = i["id"] }
44
44
  if config[:all]
45
- ui.confirm("Are you sure you want to recind all association requests")
45
+ ui.confirm("Are you sure you want to rescind all association requests")
46
46
  @invites.each do |u, i|
47
47
  rest.delete_rest("association_requests/#{i}")
48
48
  end
49
49
  else
50
- ui.confirm("Are you sure you want to recind the association requests for: #{usernames.join(", ")}")
50
+ ui.confirm("Are you sure you want to rescind the association requests for: #{usernames.join(", ")}")
51
51
  usernames.each do |u|
52
52
  if @invites.key?(u)
53
53
  rest.delete_rest("association_requests/#{@invites[u]}")