ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__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.
Files changed (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -1,229 +1,212 @@
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"
47
- $ps = [PowerShell]::Create()
45
+ Function Write-AnsibleErrorDetail {
46
+ [CmdletBinding()]
47
+ param (
48
+ [Parameter(Mandatory)]
49
+ [System.Management.Automation.ErrorRecord]
50
+ $ErrorRecord,
48
51
 
49
- # do not set ErrorActionPreference for script
50
- if ($ModuleName -ne "script") {
51
- $ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "Stop")
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
+ }
52
93
  }
53
94
 
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
95
+ $ps = [PowerShell]::Create()
96
+
97
+ if ($ForModule) {
98
+ $ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "Stop")
60
99
  }
61
100
 
62
- # set the variables
63
101
  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
102
+ $null = $ps.AddCommand("Set-Variable").AddParameters($variable).AddStatement()
66
103
  }
67
104
 
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
105
+ # env vars are process side so we can just set them here.
106
+ foreach ($env in $Environment.GetEnumerator()) {
107
+ [Environment]::SetEnvironmentVariable($env.Key, $env.Value)
78
108
  }
79
109
 
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
- }
90
- }
110
+ # Redefine Write-Host to dump to output instead of failing, lots of scripts
111
+ # still use it.
112
+ $null = $ps.AddScript('Function Write-Host($msg) { Write-Output -InputObject $msg }').AddStatement()
91
113
 
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
114
+ $scriptInfo = Get-AnsibleScript -Name $Script
95
115
 
96
- # add the scripts and run
97
- foreach ($script in $Scripts) {
98
- $ps.AddScript($script).AddStatement() > $null
99
- }
116
+ if ($PowerShellModules) {
117
+ foreach ($utilName in $PowerShellModules) {
118
+ $utilInfo = Get-AnsibleScript -Name $utilName
100
119
 
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
112
- }
113
- }
114
- else {
115
- $ps.Runspace.Debugger.SetBreakpoints($Breakpoints)
120
+ $null = $ps.AddScript(@'
121
+ param ($Name, $Script)
122
+
123
+ $moduleName = [System.IO.Path]::GetFileNameWithoutExtension($Name)
124
+ $sbk = [System.Management.Automation.Language.Parser]::ParseInput(
125
+ $Script,
126
+ $Name,
127
+ [ref]$null,
128
+ [ref]$null).GetScriptBlock()
129
+
130
+ New-Module -Name $moduleName -ScriptBlock $sbk |
131
+ Import-Module -WarningAction SilentlyContinue -Scope Global
132
+ '@, $true)
133
+ $null = $ps.AddParameters(
134
+ @{
135
+ Name = $utilName
136
+ Script = $utilInfo.Script
137
+ }
138
+ ).AddStatement()
116
139
  }
117
140
  }
118
141
 
119
- Write-AnsibleLog "INFO - start module exec with Invoke() - $ModuleName" "module_wrapper"
120
-
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
127
- try {
128
- [System.Console]::SetOut($new_out)
129
- $module_output = $ps.Invoke()
142
+ if ($CSharpModules) {
143
+ # C# utils are process wide so just load them here.
144
+ Import-CSharpUtil -Name $CSharpModules
130
145
  }
131
- 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
146
 
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
- }
147
- }
147
+ # We invoke it through a command with useLocalScope $false to
148
+ # ensure the code runs with it's own $script: scope. It also
149
+ # cleans up the StackTrace on errors by not showing the stub
150
+ # execution line and starts immediately at the module "cmd".
151
+ $null = $ps.AddScript(@'
152
+ ${function:<AnsibleModule>} = [System.Management.Automation.Language.Parser]::ParseInput(
153
+ $args[0],
154
+ $args[1],
155
+ [ref]$null,
156
+ [ref]$null).GetScriptBlock()
157
+ '@).AddArgument($scriptInfo.Script).AddArgument($Script).AddStatement()
158
+ $null = $ps.AddCommand('<AnsibleModule>', $false).AddStatement()
148
159
 
149
- Write-AnsibleError @error_params
150
- $host.SetShouldExit(1)
151
- return
152
- }
153
- finally {
154
- [System.Console]::SetOut($orig_out)
155
- $new_out.Dispose()
160
+ if ($Breakpoints) {
161
+ $ps.Runspace.Debugger.SetBreakpoints($Breakpoints)
156
162
  }
157
163
 
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"
164
- }
164
+ # Temporarily override the stdout stream and create our own in a StringBuilder.
165
+ # We use this to ensure there's always an Out pipe and that we capture the
166
+ # output for things like async or psrp.
167
+ $origOut = [Console]::Out
168
+ $sb = [StringBuilder]::new()
169
+ try {
170
+ $newOut = [StringWriter]::new($sb)
171
+ [Console]::SetOut($newOut)
165
172
 
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
173
+ $modOut = @($ps.Invoke())
174
+ }
175
+ catch {
176
+ Write-AnsibleErrorDetail -ErrorRecord $_ -ForModule:$ForModule
177
+ if ($ForModule) {
178
+ $host.SetShouldExit(1)
179
+ return
175
180
  }
176
- else {
177
- $error_params.Message += ": $($reason.ToString())"
181
+ }
182
+ finally {
183
+ if ($newOut) {
184
+ [Console]::SetOut($origOut)
185
+ $newOut.Dispose()
178
186
  }
179
-
180
- Write-AnsibleError @error_params
181
- $host.SetShouldExit(1)
182
- return
183
187
  }
184
188
 
185
- Write-AnsibleLog "INFO - module exec ended $ModuleName" "module_wrapper"
186
189
  $stdout = $sb.ToString()
187
190
  if ($stdout) {
188
- Write-Output -InputObject $stdout
191
+ $stdout
189
192
  }
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")
193
+ if ($modOut.Count) {
194
+ $modOut -join "`r`n"
194
195
  }
195
196
 
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
197
+ # Attempt to set the return code from the LASTEXITCODE variable. This is set
198
+ # explicitly in newer style modules when calling ExitJson and FailJson.
200
199
  $rc = $ps.Runspace.SessionStateProxy.GetVariable("LASTEXITCODE")
201
200
  if ($null -ne $rc) {
202
- Write-AnsibleLog "INFO - got an rc of $rc from $ModuleName exec" "module_wrapper"
203
201
  $host.SetShouldExit($rc)
204
202
  }
205
203
 
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)
204
+ foreach ($err in $ps.Streams.Error) {
205
+ Write-AnsibleErrorDetail -ErrorRecord $err -ForModule:$ForModule
206
+ if ($ForModule) {
207
+ if ($null -eq $rc) {
208
+ $host.SetShouldExit(1)
209
+ }
210
+ return
228
211
  }
229
212
  }
@@ -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
+ # Satify 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
+ }
@@ -0,0 +1,36 @@
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.Security.Cryptography
6
+
7
+ [CmdletBinding()]
8
+ param (
9
+ [Parameter(Mandatory)]
10
+ [string]
11
+ $Path,
12
+
13
+ [Parameter(ValueFromPipeline)]
14
+ [string]
15
+ $InputObject
16
+ )
17
+
18
+ begin {
19
+ $fd = [File]::Create($Path)
20
+ $sha1 = [SHA1]::Create()
21
+ $bytes = @() #initialize for empty file case
22
+ }
23
+
24
+ process {
25
+ $bytes = [Convert]::FromBase64String($InputObject)
26
+ $null = $sha1.TransformBlock($bytes, 0, $bytes.Length, $bytes, 0)
27
+ $fd.Write($bytes, 0, $bytes.Length)
28
+ }
29
+
30
+ end {
31
+ $fd.Dispose()
32
+ $null = $sha1.TransformFinalBlock($bytes, 0, 0)
33
+ $hash = [BitConverter]::ToString($sha1.Hash).Replace("-", "").ToLowerInvariant()
34
+
35
+ '{{"sha1":"{0}"}}' -f $hash
36
+ }