ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__py3-none-any.whl

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.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -1,229 +1,238 @@
1
- # (c) 2018 Ansible Project
1
+ # (c) 2025 Ansible Project
2
2
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
3
 
4
- <#
5
- .SYNOPSIS
6
- Invokes an Ansible module in a new Runspace. This cmdlet will output the
7
- module's output and write any errors to the error stream of the current
8
- host.
9
-
10
- .PARAMETER Scripts
11
- [Object[]] String or ScriptBlocks to execute.
12
-
13
- .PARAMETER Variables
14
- [System.Collections.ArrayList] The variables to set in the new Pipeline.
15
- Each value is a hashtable that contains the parameters to use with
16
- Set-Variable;
17
- Name: the name of the variable to set
18
- Value: the value of the variable to set
19
- Scope: the scope of the variable
20
-
21
- .PARAMETER Environment
22
- [System.Collections.IDictionary] A Dictionary of environment key/values to
23
- set in the new Pipeline.
24
-
25
- .PARAMETER Modules
26
- [System.Collections.IDictionary] A Dictionary of PowerShell modules to
27
- import into the new Pipeline. The key is the name of the module and the
28
- value is a base64 string of the module util code.
29
-
30
- .PARAMETER ModuleName
31
- [String] The name of the module that is being executed.
32
-
33
- .PARAMETER Breakpoints
34
- A list of line breakpoints to add to the runspace debugger. This is used to
35
- track module and module_utils coverage.
36
- #>
4
+ using namespace System.Collections
5
+ using namespace System.IO
6
+ using namespace System.Management.Automation
7
+ using namespace System.Management.Automation.Language
8
+ using namespace System.Management.Automation.Security
9
+ using namespace System.Text
10
+
11
+ [CmdletBinding()]
37
12
  param(
38
- [Object[]]$Scripts,
39
- [System.Collections.ArrayList][AllowEmptyCollection()]$Variables,
40
- [System.Collections.IDictionary]$Environment,
41
- [System.Collections.IDictionary]$Modules,
42
- [String]$ModuleName,
43
- [System.Management.Automation.LineBreakpoint[]]$Breakpoints = @()
13
+ [Parameter(Mandatory)]
14
+ [string]
15
+ $Script,
16
+
17
+ [Parameter()]
18
+ [IDictionary[]]
19
+ [AllowEmptyCollection()]
20
+ $Variables = @(),
21
+
22
+ [Parameter()]
23
+ [IDictionary]
24
+ $Environment,
25
+
26
+ [Parameter()]
27
+ [AllowEmptyCollection()]
28
+ [string[]]
29
+ $CSharpModules,
30
+
31
+ [Parameter()]
32
+ [AllowEmptyCollection()]
33
+ [string[]]
34
+ $PowerShellModules,
35
+
36
+ [Parameter()]
37
+ [LineBreakpoint[]]
38
+ $Breakpoints,
39
+
40
+ [Parameter()]
41
+ [switch]
42
+ $ForModule
44
43
  )
45
44
 
46
- Write-AnsibleLog "INFO - creating new PowerShell pipeline for $ModuleName" "module_wrapper"
45
+ Function Write-AnsibleErrorDetail {
46
+ [CmdletBinding()]
47
+ param (
48
+ [Parameter(Mandatory)]
49
+ [System.Management.Automation.ErrorRecord]
50
+ $ErrorRecord,
51
+
52
+ [Parameter()]
53
+ [switch]
54
+ $ForModule
55
+ )
56
+
57
+ # Be more defensive when trying to find the InnerException in case it isn't
58
+ # set. This shouldn't ever be the case but if it is then it makes it more
59
+ # difficult to track down the problem.
60
+ if ($ErrorRecord.Exception.InnerException.ErrorRecord) {
61
+ $ErrorRecord = $ErrorRecord.Exception.InnerException.ErrorRecord
62
+ }
63
+
64
+ $exception = @(
65
+ "$ErrorRecord"
66
+
67
+ # stderr from sub processes have this error id, we don't want to format those errors
68
+ # like a normal powershell error record.
69
+ if ($ErrorRecord.FullyQualifiedErrorId -notin @('NativeCommandError', 'NativeCommandErrorMessage')) {
70
+ "$($ErrorRecord.InvocationInfo.PositionMessage)"
71
+ "+ CategoryInfo : $($ErrorRecord.CategoryInfo)"
72
+ "+ FullyQualifiedErrorId : $($ErrorRecord.FullyQualifiedErrorId)"
73
+ ""
74
+ "ScriptStackTrace:"
75
+ "$($ErrorRecord.ScriptStackTrace)"
76
+
77
+ if ($ErrorRecord.Exception.StackTrace) {
78
+ "$($ErrorRecord.Exception.StackTrace)"
79
+ }
80
+ }
81
+ ) -join ([Environment]::NewLine)
82
+
83
+ if ($ForModule) {
84
+ @{
85
+ failed = $true
86
+ msg = "Unhandled exception while executing module: $ErrorRecord"
87
+ exception = $exception
88
+ } | ConvertTo-Json -Compress
89
+ }
90
+ else {
91
+ $host.UI.WriteErrorLine($exception)
92
+ }
93
+ }
94
+
47
95
  $ps = [PowerShell]::Create()
48
96
 
49
- # do not set ErrorActionPreference for script
50
- if ($ModuleName -ne "script") {
97
+ if ($ForModule) {
51
98
  $ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "Stop")
52
99
  }
53
-
54
- # force input encoding to preamble-free UTF8 so PS sub-processes (eg,
55
- # Start-Job) don't blow up. This is only required for WinRM, a PSRP
56
- # runspace doesn't have a host console and this will bomb out
57
- if ($host.Name -eq "ConsoleHost") {
58
- Write-AnsibleLog "INFO - setting console input encoding to UTF8 for $ModuleName" "module_wrapper"
59
- $ps.AddScript('[Console]::InputEncoding = New-Object Text.UTF8Encoding $false').AddStatement() > $null
100
+ else {
101
+ # For script files we want to ensure we load it as UTF-8. We don't set this
102
+ # for modules as they are loaded from memory whereas a script is loaded
103
+ # from disk as part of the script being run than by us.
104
+ Set-WinPSDefaultFileEncoding
60
105
  }
61
106
 
62
- # set the variables
63
107
  foreach ($variable in $Variables) {
64
- Write-AnsibleLog "INFO - setting variable '$($variable.Name)' for $ModuleName" "module_wrapper"
65
- $ps.AddCommand("Set-Variable").AddParameters($variable).AddStatement() > $null
66
- }
67
-
68
- # set the environment vars
69
- if ($Environment) {
70
- # Escaping quotes can be problematic, instead just pass the string to the runspace and set it directly.
71
- Write-AnsibleLog "INFO - setting environment vars for $ModuleName" "module_wrapper"
72
- $ps.Runspace.SessionStateProxy.SetVariable("_AnsibleEnvironment", $Environment)
73
- $ps.AddScript(@'
74
- foreach ($env_kv in $_AnsibleEnvironment.GetEnumerator()) {
75
- [System.Environment]::SetEnvironmentVariable($env_kv.Key, $env_kv.Value)
76
- }
77
- '@).AddStatement() > $null
108
+ $null = $ps.AddCommand("Set-Variable").AddParameters($variable).AddStatement()
78
109
  }
79
110
 
80
- # import the PS modules
81
- if ($Modules) {
82
- foreach ($module in $Modules.GetEnumerator()) {
83
- Write-AnsibleLog "INFO - create module util '$($module.Key)' for $ModuleName" "module_wrapper"
84
- $module_name = $module.Key
85
- $module_code = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($module.Value))
86
- $ps.AddCommand("New-Module").AddParameters(@{Name = $module_name; ScriptBlock = [ScriptBlock]::Create($module_code) }) > $null
87
- $ps.AddCommand("Import-Module").AddParameter("WarningAction", "SilentlyContinue") > $null
88
- $ps.AddCommand("Out-Null").AddStatement() > $null
89
- }
111
+ # env vars are process side so we can just set them here.
112
+ foreach ($env in $Environment.GetEnumerator()) {
113
+ [Environment]::SetEnvironmentVariable($env.Key, $env.Value)
90
114
  }
91
115
 
92
- # redefine Write-Host to dump to output instead of failing
93
- # lots of scripts still use it
94
- $ps.AddScript('Function Write-Host($msg) { Write-Output -InputObject $msg }').AddStatement() > $null
116
+ # Redefine Write-Host to dump to output instead of failing, lots of scripts
117
+ # still use it.
118
+ $null = $ps.AddScript('Function Write-Host($msg) { Write-Output -InputObject $msg }').AddStatement()
95
119
 
96
- # add the scripts and run
97
- foreach ($script in $Scripts) {
98
- $ps.AddScript($script).AddStatement() > $null
99
- }
120
+ $scriptInfo = Get-AnsibleScript -Name $Script
121
+ if ($scriptInfo.ShouldConstrain) {
122
+ # Fail if there are any module utils, in the future we may allow unsigned
123
+ # PowerShell utils in CLM but for now we don't.
124
+ if ($PowerShellModules -or $CSharpModules) {
125
+ throw "Cannot run untrusted PowerShell script '$Script' in ConstrainedLanguage mode with module util imports."
126
+ }
100
127
 
101
- if ($Breakpoints.Count -gt 0) {
102
- Write-AnsibleLog "INFO - adding breakpoint to runspace that will run the modules" "module_wrapper"
103
- if ($PSVersionTable.PSVersion.Major -eq 3) {
104
- # The SetBreakpoints method was only added in PowerShell v4+. We need to rely on a private method to
105
- # achieve the same functionality in this older PowerShell version. This should be removed once we drop
106
- # support for PowerShell v3.
107
- $set_method = $ps.Runspace.Debugger.GetType().GetMethod(
108
- 'AddLineBreakpoint', [System.Reflection.BindingFlags]'Instance, NonPublic'
109
- )
110
- foreach ($b in $Breakpoints) {
111
- $set_method.Invoke($ps.Runspace.Debugger, [Object[]]@(, $b)) > $null
128
+ # If the module is marked as needing to be constrained then we set the
129
+ # language mode to ConstrainedLanguage so that when parsed inside the
130
+ # Runspace it will run in CLM. We need to run it from a filepath as in
131
+ # CLM we cannot call the methods needed to create the ScriptBlock and we
132
+ # need to be in CLM to downgrade the language mode.
133
+ $null = $ps.AddScript('$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"').AddStatement()
134
+ $scriptPath = New-TempAnsibleFile -FileName $Script -Content $scriptInfo.Script
135
+ $null = $ps.AddCommand($scriptPath, $false).AddStatement()
136
+ }
137
+ else {
138
+ if ($PowerShellModules) {
139
+ foreach ($utilName in $PowerShellModules) {
140
+ $utilInfo = Get-AnsibleScript -Name $utilName
141
+ if ($utilInfo.ShouldConstrain) {
142
+ throw "PowerShell module util '$utilName' is not trusted and cannot be loaded."
143
+ }
144
+
145
+ $null = $ps.AddScript(@'
146
+ param ($Name, $Script)
147
+
148
+ $moduleName = [System.IO.Path]::GetFileNameWithoutExtension($Name)
149
+ $sbk = [System.Management.Automation.Language.Parser]::ParseInput(
150
+ $Script,
151
+ $Name,
152
+ [ref]$null,
153
+ [ref]$null).GetScriptBlock()
154
+
155
+ New-Module -Name $moduleName -ScriptBlock $sbk |
156
+ Import-Module -WarningAction SilentlyContinue -Scope Global
157
+ '@, $true)
158
+ $null = $ps.AddParameters(
159
+ @{
160
+ Name = $utilName
161
+ Script = $utilInfo.Script
162
+ }
163
+ ).AddStatement()
112
164
  }
113
165
  }
114
- else {
115
- $ps.Runspace.Debugger.SetBreakpoints($Breakpoints)
116
- }
117
- }
118
166
 
119
- Write-AnsibleLog "INFO - start module exec with Invoke() - $ModuleName" "module_wrapper"
167
+ if ($CSharpModules) {
168
+ # C# utils are process wide so just load them here.
169
+ Import-CSharpUtil -Name $CSharpModules
170
+ }
120
171
 
121
- # temporarily override the stdout stream and create our own in a StringBuilder
122
- # we use this to ensure there's always an Out pipe and that we capture the
123
- # output for things like async or psrp
124
- $orig_out = [System.Console]::Out
125
- $sb = New-Object -TypeName System.Text.StringBuilder
126
- $new_out = New-Object -TypeName System.IO.StringWriter -ArgumentList $sb
172
+ # We invoke it through a command with useLocalScope $false to
173
+ # ensure the code runs with it's own $script: scope. It also
174
+ # cleans up the StackTrace on errors by not showing the stub
175
+ # execution line and starts immediately at the module "cmd".
176
+ $null = $ps.AddScript(@'
177
+ ${function:<AnsibleModule>} = [System.Management.Automation.Language.Parser]::ParseInput(
178
+ $args[0],
179
+ $args[1],
180
+ [ref]$null,
181
+ [ref]$null).GetScriptBlock()
182
+ '@).AddArgument($scriptInfo.Script).AddArgument($Script).AddStatement()
183
+ $null = $ps.AddCommand('<AnsibleModule>', $false).AddStatement()
184
+ }
185
+
186
+ if ($Breakpoints) {
187
+ $ps.Runspace.Debugger.SetBreakpoints($Breakpoints)
188
+ }
189
+
190
+ # Temporarily override the stdout stream and create our own in a StringBuilder.
191
+ # We use this to ensure there's always an Out pipe and that we capture the
192
+ # output for things like async or psrp.
193
+ $origOut = [Console]::Out
194
+ $sb = [StringBuilder]::new()
127
195
  try {
128
- [System.Console]::SetOut($new_out)
129
- $module_output = $ps.Invoke()
196
+ $newOut = [StringWriter]::new($sb)
197
+ [Console]::SetOut($newOut)
198
+
199
+ $modOut = @($ps.Invoke())
130
200
  }
131
201
  catch {
132
- # uncaught exception while executing module, present a prettier error for
133
- # Ansible to parse
134
- $error_params = @{
135
- Message = "Unhandled exception while executing module"
136
- ErrorRecord = $_
137
- }
138
-
139
- # Be more defensive when trying to find the InnerException in case it isn't
140
- # set. This shouldn't ever be the case but if it is then it makes it more
141
- # difficult to track down the problem.
142
- if ($_.Exception.PSObject.Properties.Name -contains "InnerException") {
143
- $inner_exception = $_.Exception.InnerException
144
- if ($inner_exception.PSObject.Properties.Name -contains "ErrorRecord") {
145
- $error_params.ErrorRecord = $inner_exception.ErrorRecord
146
- }
202
+ Write-AnsibleErrorDetail -ErrorRecord $_ -ForModule:$ForModule
203
+ if ($ForModule) {
204
+ $host.SetShouldExit(1)
205
+ return
147
206
  }
148
-
149
- Write-AnsibleError @error_params
150
- $host.SetShouldExit(1)
151
- return
152
207
  }
153
208
  finally {
154
- [System.Console]::SetOut($orig_out)
155
- $new_out.Dispose()
156
- }
157
-
158
- # other types of errors may not throw an exception in Invoke but rather just
159
- # set the pipeline state to failed
160
- if ($ps.InvocationStateInfo.State -eq "Failed" -and $ModuleName -ne "script") {
161
- $reason = $ps.InvocationStateInfo.Reason
162
- $error_params = @{
163
- Message = "Unhandled exception while executing module"
209
+ if ($newOut) {
210
+ [Console]::SetOut($origOut)
211
+ $newOut.Dispose()
164
212
  }
165
-
166
- # The error record should always be set on the reason but this does not
167
- # always happen on Server 2008 R2 for some reason (probably memory hotfix).
168
- # Be defensive when trying to get the error record and fall back to other
169
- # options.
170
- if ($null -eq $reason) {
171
- $error_params.Message += ": Unknown error"
172
- }
173
- elseif ($reason.PSObject.Properties.Name -contains "ErrorRecord") {
174
- $error_params.ErrorRecord = $reason.ErrorRecord
175
- }
176
- else {
177
- $error_params.Message += ": $($reason.ToString())"
178
- }
179
-
180
- Write-AnsibleError @error_params
181
- $host.SetShouldExit(1)
182
- return
183
213
  }
184
214
 
185
- Write-AnsibleLog "INFO - module exec ended $ModuleName" "module_wrapper"
186
215
  $stdout = $sb.ToString()
187
216
  if ($stdout) {
188
- Write-Output -InputObject $stdout
217
+ $stdout
189
218
  }
190
- if ($module_output.Count -gt 0) {
191
- # do not output if empty collection
192
- Write-AnsibleLog "INFO - using the output stream for module output - $ModuleName" "module_wrapper"
193
- Write-Output -InputObject ($module_output -join "`r`n")
219
+ if ($modOut.Count) {
220
+ $modOut -join "`r`n"
194
221
  }
195
222
 
196
- # we attempt to get the return code from the LASTEXITCODE variable
197
- # this is set explicitly in newer style variables when calling
198
- # ExitJson and FailJson. If set we set the current hosts' exit code
199
- # to that same value
223
+ # Attempt to set the return code from the LASTEXITCODE variable. This is set
224
+ # explicitly in newer style modules when calling ExitJson and FailJson.
200
225
  $rc = $ps.Runspace.SessionStateProxy.GetVariable("LASTEXITCODE")
201
226
  if ($null -ne $rc) {
202
- Write-AnsibleLog "INFO - got an rc of $rc from $ModuleName exec" "module_wrapper"
203
227
  $host.SetShouldExit($rc)
204
228
  }
205
229
 
206
- # PS3 doesn't properly set HadErrors in many cases, inspect the error stream as a fallback
207
- # with the trap handler that's now in place, this should only write to the output if
208
- # $ErrorActionPreference != "Stop", that's ok because this is sent to the stderr output
209
- # for a user to manually debug if something went horribly wrong
210
- if (
211
- $ps.Streams.Error.Count -and
212
- ($ps.HadErrors -or $PSVersionTable.PSVersion.Major -lt 4)
213
- ) {
214
- Write-AnsibleLog "WARN - module had errors, outputting error info $ModuleName" "module_wrapper"
215
- # if the rc wasn't explicitly set, we return an exit code of 1
216
- if ($null -eq $rc) {
217
- $host.SetShouldExit(1)
218
- }
219
-
220
- # output each error to the error stream of the current pipeline
221
- foreach ($err in $ps.Streams.Error) {
222
- $error_msg = Format-AnsibleException -ErrorRecord $err
223
-
224
- # need to use the current hosts's UI class as we may not have
225
- # a console to write the stderr to, e.g. psrp
226
- Write-AnsibleLog "WARN - error msg for for $($ModuleName):`r`n$error_msg" "module_wrapper"
227
- $host.UI.WriteErrorLine($error_msg)
230
+ foreach ($err in $ps.Streams.Error) {
231
+ Write-AnsibleErrorDetail -ErrorRecord $err -ForModule:$ForModule
232
+ if ($ForModule) {
233
+ if ($null -eq $rc) {
234
+ $host.SetShouldExit(1)
235
+ }
236
+ return
228
237
  }
229
238
  }
@@ -0,0 +1,20 @@
1
+ # (c) 2025 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ [CmdletBinding()]
5
+ param (
6
+ [Parameter(Mandatory)]
7
+ [string]
8
+ $Path
9
+ )
10
+
11
+ $userProfile = [Environment]::GetFolderPath([Environment+SpecialFolder]::UserProfile)
12
+ if ($Path -eq '~') {
13
+ $userProfile
14
+ }
15
+ elseif ($Path.StartsWith(('~\'))) {
16
+ Join-Path -Path $userProfile -ChildPath $Path.Substring(2)
17
+ }
18
+ else {
19
+ $Path
20
+ }
@@ -0,0 +1,17 @@
1
+ # (c) 2025 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ [CmdletBinding()]
5
+ param (
6
+ [Parameter(Mandatory)]
7
+ [string]
8
+ $Directory,
9
+
10
+ [Parameter(Mandatory)]
11
+ [string]
12
+ $Name
13
+ )
14
+
15
+ $path = [Environment]::ExpandEnvironmentVariables($Directory)
16
+ $tmp = New-Item -Path $path -Name $Name -ItemType Directory
17
+ $tmp.FullName
@@ -0,0 +1,41 @@
1
+ # (c) 2025 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ using namespace System.IO
5
+
6
+ [CmdletBinding()]
7
+ param(
8
+ [Parameter(Mandatory)]
9
+ [string]
10
+ $Path,
11
+
12
+ [Parameter(Mandatory)]
13
+ [int]
14
+ $BufferSize
15
+ )
16
+
17
+ if (Test-Path -LiteralPath $Path -PathType Leaf) {
18
+ "[FILE]"
19
+
20
+ $fs = [FileStream]::new(
21
+ $path,
22
+ [FileMode]::Open,
23
+ [FileAccess]::Read,
24
+ [FileShare]::Read)
25
+
26
+ try {
27
+ $buffer = [byte[]]::new($BufferSize)
28
+ while ($read = $fs.Read($buffer, 0, $buffer.Length)) {
29
+ [Convert]::ToBase64String($buffer, 0, $read)
30
+ }
31
+ }
32
+ finally {
33
+ $fs.Dispose()
34
+ }
35
+ }
36
+ elseif (Test-Path -LiteralPath $Path -PathType Container) {
37
+ "[DIR]"
38
+ }
39
+ else {
40
+ Write-Error -Message "$Path does not exist"
41
+ }
@@ -0,0 +1,122 @@
1
+ # (c) 2025 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ using namespace System.IO
5
+ using namespace System.Reflection
6
+ using namespace System.Security.Cryptography
7
+
8
+ [CmdletBinding()]
9
+ param (
10
+ [Parameter(Mandatory = $true)]
11
+ [string]
12
+ $Path,
13
+
14
+ [Parameter(Mandatory, ValueFromPipeline)]
15
+ [AllowEmptyString()]
16
+ [string]
17
+ $InputObject
18
+ )
19
+
20
+ begin {
21
+ $fd = [File]::Create($Path)
22
+ $algo = [SHA1]::Create()
23
+ $bytes = @()
24
+
25
+ $bindingFlags = [BindingFlags]'NonPublic, Instance'
26
+ Function Get-Property {
27
+ <#
28
+ .SYNOPSIS
29
+ Gets the private/internal property specified of the object passed in.
30
+ #>
31
+ Param (
32
+ [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
33
+ [Object]
34
+ $Object,
35
+
36
+ [Parameter(Mandatory = $true, Position = 1)]
37
+ [String]
38
+ $Name
39
+ )
40
+
41
+ process {
42
+ $Object.GetType().GetProperty($Name, $bindingFlags).GetValue($Object, $null)
43
+ }
44
+ }
45
+
46
+ Function Set-Property {
47
+ <#
48
+ .SYNOPSIS
49
+ Sets the private/internal property specified on the object passed in.
50
+ #>
51
+ Param (
52
+ [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
53
+ [Object]
54
+ $Object,
55
+
56
+ [Parameter(Mandatory = $true, Position = 1)]
57
+ [String]
58
+ $Name,
59
+
60
+ [Parameter(Mandatory = $true, Position = 2)]
61
+ [AllowNull()]
62
+ [Object]
63
+ $Value
64
+ )
65
+
66
+ process {
67
+ $Object.GetType().GetProperty($Name, $bindingFlags).SetValue($Object, $Value, $null)
68
+ }
69
+ }
70
+
71
+ Function Get-Field {
72
+ <#
73
+ .SYNOPSIS
74
+ Gets the private/internal field specified of the object passed in.
75
+ #>
76
+ Param (
77
+ [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
78
+ [Object]
79
+ $Object,
80
+
81
+ [Parameter(Mandatory = $true, Position = 1)]
82
+ [String]
83
+ $Name
84
+ )
85
+
86
+ process {
87
+ $Object.GetType().GetField($Name, $bindingFlags).GetValue($Object)
88
+ }
89
+ }
90
+
91
+ # MaximumAllowedMemory is required to be set to so we can send input data that exceeds the limit on a PS
92
+ # Runspace. We use reflection to access/set this property as it is not accessible publicly. This is not ideal
93
+ # but works on all PowerShell versions I've tested with. We originally used WinRS to send the raw bytes to the
94
+ # host but this falls flat if someone is using a custom PS configuration name so this is a workaround. This
95
+ # isn't required for smaller files so if it fails we ignore the error and hope it wasn't needed.
96
+ # https://github.com/PowerShell/PowerShell/blob/c8e72d1e664b1ee04a14f226adf655cced24e5f0/src/System.Management.Automation/engine/serialization.cs#L325
97
+ try {
98
+ $Host | Get-Property 'ExternalHost' |
99
+ Get-Field '_transportManager' |
100
+ Get-Property 'Fragmentor' |
101
+ Get-Property 'DeserializationContext' |
102
+ Set-Property 'MaximumAllowedMemory' $null
103
+ }
104
+ catch {
105
+ # Satisfy pslint, we purposefully ignore this error as it is not critical it works.
106
+ $null = $null
107
+ }
108
+ }
109
+ process {
110
+ if ($InputObject) {
111
+ $bytes = [Convert]::FromBase64String($InputObject)
112
+ $algo.TransformBlock($bytes, 0, $bytes.Length, $bytes, 0) > $null
113
+ $fd.Write($bytes, 0, $bytes.Length)
114
+ }
115
+ }
116
+ end {
117
+ $fd.Close()
118
+
119
+ $algo.TransformFinalBlock($bytes, 0, 0) > $null
120
+ $hash = [BitConverter]::ToString($algo.Hash).Replace('-', '').ToLowerInvariant()
121
+ "{`"sha1`":`"$hash`"}"
122
+ }
@@ -0,0 +1,46 @@
1
+ # (c) 2025 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+
4
+ using namespace System.IO
5
+
6
+ [CmdletBinding()]
7
+ param (
8
+ [Parameter(Mandatory)]
9
+ [string]
10
+ $Path,
11
+
12
+ [Parameter(Mandatory)]
13
+ [int]
14
+ $BufferSize,
15
+
16
+ [Parameter(Mandatory)]
17
+ [long]
18
+ $Offset
19
+ )
20
+
21
+ if (Test-Path -LiteralPath $Path -PathType Leaf) {
22
+ $stream = [FileStream]::new(
23
+ $Path,
24
+ [FileMode]::Open,
25
+ [FileAccess]::Read,
26
+ [FileShare]::ReadWrite)
27
+
28
+ try {
29
+ $null = $stream.Seek($Offset, [SeekOrigin]::Begin)
30
+ $buffer = [byte[]]::new($BufferSize)
31
+ $read = $stream.Read($buffer, 0, $buffer.Length)
32
+ if ($read) {
33
+ [Convert]::ToBase64String($buffer, 0, $read)
34
+ }
35
+ }
36
+ finally {
37
+ $stream.Dispose()
38
+ }
39
+ }
40
+ elseif (Test-Path -LiteralPath $Path -PathType Container) {
41
+ "[DIR]"
42
+ }
43
+ else {
44
+ $host.UI.WriteErrorLine("$Path does not exist")
45
+ exit 1
46
+ }