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
@@ -0,0 +1,619 @@
1
+ # Copyright: Contributors to the Ansible project
2
+ # BSD 3 Clause License (see licenses/BSD-3-Clause.txt or https://opensource.org/license/bsd-3-clause/)
3
+
4
+ from __future__ import annotations
5
+
6
+ import binascii
7
+ import copy
8
+ import dataclasses
9
+ import enum
10
+ import functools
11
+ import hashlib
12
+ import socket
13
+ import types
14
+ import typing as t
15
+
16
+ try:
17
+ from cryptography.hazmat.primitives import serialization
18
+ from cryptography.hazmat.primitives.asymmetric.dsa import (
19
+ DSAParameterNumbers,
20
+ DSAPrivateKey,
21
+ DSAPublicKey,
22
+ DSAPublicNumbers,
23
+ )
24
+ from cryptography.hazmat.primitives.asymmetric.ec import (
25
+ EllipticCurve,
26
+ EllipticCurvePrivateKey,
27
+ EllipticCurvePublicKey,
28
+ SECP256R1,
29
+ SECP384R1,
30
+ SECP521R1,
31
+ )
32
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import (
33
+ Ed25519PrivateKey,
34
+ Ed25519PublicKey,
35
+ )
36
+ from cryptography.hazmat.primitives.asymmetric.rsa import (
37
+ RSAPrivateKey,
38
+ RSAPublicKey,
39
+ RSAPublicNumbers,
40
+ )
41
+ except ImportError:
42
+ HAS_CRYPTOGRAPHY = False
43
+ else:
44
+ HAS_CRYPTOGRAPHY = True
45
+
46
+ CryptoPublicKey = t.Union[
47
+ DSAPublicKey,
48
+ EllipticCurvePublicKey,
49
+ Ed25519PublicKey,
50
+ RSAPublicKey,
51
+ ]
52
+
53
+ CryptoPrivateKey = t.Union[
54
+ DSAPrivateKey,
55
+ EllipticCurvePrivateKey,
56
+ Ed25519PrivateKey,
57
+ RSAPrivateKey,
58
+ ]
59
+
60
+
61
+ if t.TYPE_CHECKING:
62
+ from cryptography.hazmat.primitives.asymmetric.dsa import DSAPrivateNumbers
63
+ from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePrivateNumbers
64
+ from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateNumbers
65
+
66
+
67
+ _SSH_AGENT_CLIENT_SOCKET_TIMEOUT = 10
68
+
69
+
70
+ class ProtocolMsgNumbers(enum.IntEnum):
71
+ # Responses
72
+ SSH_AGENT_FAILURE = 5
73
+ SSH_AGENT_SUCCESS = 6
74
+ SSH_AGENT_IDENTITIES_ANSWER = 12
75
+ SSH_AGENT_SIGN_RESPONSE = 14
76
+ SSH_AGENT_EXTENSION_FAILURE = 28
77
+ SSH_AGENT_EXTENSION_RESPONSE = 29
78
+
79
+ # Constraints
80
+ SSH_AGENT_CONSTRAIN_LIFETIME = 1
81
+ SSH_AGENT_CONSTRAIN_CONFIRM = 2
82
+ SSH_AGENT_CONSTRAIN_EXTENSION = 255
83
+
84
+ # Requests
85
+ SSH_AGENTC_REQUEST_IDENTITIES = 11
86
+ SSH_AGENTC_SIGN_REQUEST = 13
87
+ SSH_AGENTC_ADD_IDENTITY = 17
88
+ SSH_AGENTC_REMOVE_IDENTITY = 18
89
+ SSH_AGENTC_REMOVE_ALL_IDENTITIES = 19
90
+ SSH_AGENTC_ADD_SMARTCARD_KEY = 20
91
+ SSH_AGENTC_REMOVE_SMARTCARD_KEY = 21
92
+ SSH_AGENTC_LOCK = 22
93
+ SSH_AGENTC_UNLOCK = 23
94
+ SSH_AGENTC_ADD_ID_CONSTRAINED = 25
95
+ SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED = 26
96
+ SSH_AGENTC_EXTENSION = 27
97
+
98
+ def to_blob(self) -> bytes:
99
+ return bytes([self])
100
+
101
+
102
+ class SshAgentFailure(RuntimeError):
103
+ """Server failure or unexpected response."""
104
+
105
+
106
+ # NOTE: Classes below somewhat represent "Data Type Representations Used in the SSH Protocols"
107
+ # as specified by RFC4251
108
+
109
+
110
+ @t.runtime_checkable
111
+ class SupportsToBlob(t.Protocol):
112
+ def to_blob(self) -> bytes: ...
113
+
114
+
115
+ @t.runtime_checkable
116
+ class SupportsFromBlob(t.Protocol):
117
+ @classmethod
118
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self: ...
119
+
120
+ @classmethod
121
+ def consume_from_blob(cls, blob: memoryview | bytes) -> tuple[t.Self, memoryview | bytes]: ...
122
+
123
+
124
+ def _split_blob(blob: memoryview | bytes, length: int) -> tuple[memoryview | bytes, memoryview | bytes]:
125
+ if len(blob) < length:
126
+ raise ValueError("_split_blob: unexpected data length")
127
+ return blob[:length], blob[length:]
128
+
129
+
130
+ class VariableSized:
131
+ @classmethod
132
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
133
+ raise NotImplementedError
134
+
135
+ @classmethod
136
+ def consume_from_blob(cls, blob: memoryview | bytes) -> tuple[t.Self, memoryview | bytes]:
137
+ length = uint32.from_blob(blob[:4])
138
+ blob = blob[4:]
139
+ data, rest = _split_blob(blob, length)
140
+ return cls.from_blob(data), rest
141
+
142
+
143
+ class uint32(int):
144
+ def to_blob(self) -> bytes:
145
+ return self.to_bytes(length=4, byteorder='big')
146
+
147
+ @classmethod
148
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
149
+ return cls.from_bytes(blob, byteorder='big')
150
+
151
+ @classmethod
152
+ def consume_from_blob(cls, blob: memoryview | bytes) -> tuple[t.Self, memoryview | bytes]:
153
+ length = uint32(4)
154
+ data, rest = _split_blob(blob, length)
155
+ return cls.from_blob(data), rest
156
+
157
+
158
+ class mpint(int, VariableSized):
159
+ def to_blob(self) -> bytes:
160
+ if self < 0:
161
+ raise ValueError("negative mpint not allowed")
162
+ if not self:
163
+ return b""
164
+ nbytes = (self.bit_length() + 8) // 8
165
+ ret = bytearray(self.to_bytes(length=nbytes, byteorder='big'))
166
+ ret[:0] = uint32(len(ret)).to_blob()
167
+ return ret
168
+
169
+ @classmethod
170
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
171
+ if blob and blob[0] > 127:
172
+ raise ValueError("Invalid data")
173
+ return cls.from_bytes(blob, byteorder='big')
174
+
175
+
176
+ class constraints(bytes):
177
+ def to_blob(self) -> bytes:
178
+ return self
179
+
180
+
181
+ class binary_string(bytes, VariableSized):
182
+ def to_blob(self) -> bytes:
183
+ if length := len(self):
184
+ return uint32(length).to_blob() + self
185
+ else:
186
+ return b""
187
+
188
+ @classmethod
189
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
190
+ return cls(blob)
191
+
192
+
193
+ class unicode_string(str, VariableSized):
194
+ def to_blob(self) -> bytes:
195
+ val = self.encode('utf-8')
196
+ if length := len(val):
197
+ return uint32(length).to_blob() + val
198
+ else:
199
+ return b""
200
+
201
+ @classmethod
202
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
203
+ return cls(bytes(blob).decode('utf-8'))
204
+
205
+
206
+ class KeyAlgo(str, VariableSized, enum.Enum):
207
+ RSA = "ssh-rsa"
208
+ DSA = "ssh-dss"
209
+ ECDSA256 = "ecdsa-sha2-nistp256"
210
+ SKECDSA256 = "sk-ecdsa-sha2-nistp256@openssh.com"
211
+ ECDSA384 = "ecdsa-sha2-nistp384"
212
+ ECDSA521 = "ecdsa-sha2-nistp521"
213
+ ED25519 = "ssh-ed25519"
214
+ SKED25519 = "sk-ssh-ed25519@openssh.com"
215
+ RSASHA256 = "rsa-sha2-256"
216
+ RSASHA512 = "rsa-sha2-512"
217
+
218
+ @property
219
+ def main_type(self) -> str:
220
+ match self:
221
+ case self.RSA:
222
+ return 'RSA'
223
+ case self.DSA:
224
+ return 'DSA'
225
+ case self.ECDSA256 | self.ECDSA384 | self.ECDSA521:
226
+ return 'ECDSA'
227
+ case self.ED25519:
228
+ return 'ED25519'
229
+ case _:
230
+ raise NotImplementedError(self.name)
231
+
232
+ def to_blob(self) -> bytes:
233
+ b_self = self.encode('utf-8')
234
+ return uint32(len(b_self)).to_blob() + b_self
235
+
236
+ @classmethod
237
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
238
+ return cls(bytes(blob).decode('utf-8'))
239
+
240
+
241
+ if HAS_CRYPTOGRAPHY:
242
+ _ECDSA_KEY_TYPE: dict[KeyAlgo, type[EllipticCurve]] = {
243
+ KeyAlgo.ECDSA256: SECP256R1,
244
+ KeyAlgo.ECDSA384: SECP384R1,
245
+ KeyAlgo.ECDSA521: SECP521R1,
246
+ }
247
+
248
+
249
+ @dataclasses.dataclass
250
+ class Msg:
251
+ def to_blob(self) -> bytes:
252
+ rv = bytearray()
253
+ for field in dataclasses.fields(self):
254
+ fv = getattr(self, field.name)
255
+ if isinstance(fv, SupportsToBlob):
256
+ rv.extend(fv.to_blob())
257
+ else:
258
+ raise NotImplementedError(field.type)
259
+ return rv
260
+
261
+ @classmethod
262
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self:
263
+ args: list[t.Any] = []
264
+ for _field_name, field_type in t.get_type_hints(cls).items():
265
+ if isinstance(field_type, SupportsFromBlob):
266
+ fv, blob = field_type.consume_from_blob(blob)
267
+ args.append(fv)
268
+ else:
269
+ raise NotImplementedError(str(field_type))
270
+ return cls(*args)
271
+
272
+
273
+ @dataclasses.dataclass
274
+ class PrivateKeyMsg(Msg):
275
+ @staticmethod
276
+ def from_private_key(private_key: CryptoPrivateKey) -> PrivateKeyMsg:
277
+ match private_key:
278
+ case RSAPrivateKey():
279
+ rsa_pn: RSAPrivateNumbers = private_key.private_numbers()
280
+ return RSAPrivateKeyMsg(
281
+ KeyAlgo.RSA,
282
+ mpint(rsa_pn.public_numbers.n),
283
+ mpint(rsa_pn.public_numbers.e),
284
+ mpint(rsa_pn.d),
285
+ mpint(rsa_pn.iqmp),
286
+ mpint(rsa_pn.p),
287
+ mpint(rsa_pn.q),
288
+ )
289
+ case DSAPrivateKey():
290
+ dsa_pn: DSAPrivateNumbers = private_key.private_numbers()
291
+ return DSAPrivateKeyMsg(
292
+ KeyAlgo.DSA,
293
+ mpint(dsa_pn.public_numbers.parameter_numbers.p),
294
+ mpint(dsa_pn.public_numbers.parameter_numbers.q),
295
+ mpint(dsa_pn.public_numbers.parameter_numbers.g),
296
+ mpint(dsa_pn.public_numbers.y),
297
+ mpint(dsa_pn.x),
298
+ )
299
+ case EllipticCurvePrivateKey():
300
+ ecdsa_pn: EllipticCurvePrivateNumbers = private_key.private_numbers()
301
+ key_size = private_key.key_size
302
+ return EcdsaPrivateKeyMsg(
303
+ getattr(KeyAlgo, f'ECDSA{key_size}'),
304
+ unicode_string(f'nistp{key_size}'),
305
+ binary_string(
306
+ private_key.public_key().public_bytes(
307
+ encoding=serialization.Encoding.X962,
308
+ format=serialization.PublicFormat.UncompressedPoint,
309
+ )
310
+ ),
311
+ mpint(ecdsa_pn.private_value),
312
+ )
313
+ case Ed25519PrivateKey():
314
+ public_bytes = private_key.public_key().public_bytes(
315
+ encoding=serialization.Encoding.Raw,
316
+ format=serialization.PublicFormat.Raw,
317
+ )
318
+ private_bytes = private_key.private_bytes(
319
+ encoding=serialization.Encoding.Raw,
320
+ format=serialization.PrivateFormat.Raw,
321
+ encryption_algorithm=serialization.NoEncryption(),
322
+ )
323
+ return Ed25519PrivateKeyMsg(
324
+ KeyAlgo.ED25519,
325
+ binary_string(public_bytes),
326
+ binary_string(private_bytes + public_bytes),
327
+ )
328
+ case _:
329
+ raise NotImplementedError(private_key)
330
+
331
+
332
+ @dataclasses.dataclass(order=True, slots=True)
333
+ class RSAPrivateKeyMsg(PrivateKeyMsg):
334
+ type: KeyAlgo
335
+ n: mpint
336
+ e: mpint
337
+ d: mpint
338
+ iqmp: mpint
339
+ p: mpint
340
+ q: mpint
341
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
342
+ constraints: constraints = dataclasses.field(default=constraints(b''))
343
+
344
+
345
+ @dataclasses.dataclass(order=True, slots=True)
346
+ class DSAPrivateKeyMsg(PrivateKeyMsg):
347
+ type: KeyAlgo
348
+ p: mpint
349
+ q: mpint
350
+ g: mpint
351
+ y: mpint
352
+ x: mpint
353
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
354
+ constraints: constraints = dataclasses.field(default=constraints(b''))
355
+
356
+
357
+ @dataclasses.dataclass(order=True, slots=True)
358
+ class EcdsaPrivateKeyMsg(PrivateKeyMsg):
359
+ type: KeyAlgo
360
+ ecdsa_curve_name: unicode_string
361
+ Q: binary_string
362
+ d: mpint
363
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
364
+ constraints: constraints = dataclasses.field(default=constraints(b''))
365
+
366
+
367
+ @dataclasses.dataclass(order=True, slots=True)
368
+ class Ed25519PrivateKeyMsg(PrivateKeyMsg):
369
+ type: KeyAlgo
370
+ enc_a: binary_string
371
+ k_env_a: binary_string
372
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
373
+ constraints: constraints = dataclasses.field(default=constraints(b''))
374
+
375
+
376
+ @dataclasses.dataclass
377
+ class PublicKeyMsg(Msg):
378
+ @staticmethod
379
+ def get_dataclass(type: KeyAlgo) -> type[
380
+ t.Union[
381
+ RSAPublicKeyMsg,
382
+ EcdsaPublicKeyMsg,
383
+ Ed25519PublicKeyMsg,
384
+ DSAPublicKeyMsg,
385
+ ]
386
+ ]:
387
+ match type:
388
+ case KeyAlgo.RSA:
389
+ return RSAPublicKeyMsg
390
+ case KeyAlgo.ECDSA256 | KeyAlgo.ECDSA384 | KeyAlgo.ECDSA521:
391
+ return EcdsaPublicKeyMsg
392
+ case KeyAlgo.ED25519:
393
+ return Ed25519PublicKeyMsg
394
+ case KeyAlgo.DSA:
395
+ return DSAPublicKeyMsg
396
+ case _:
397
+ raise NotImplementedError(type)
398
+
399
+ @functools.cached_property
400
+ def public_key(self) -> CryptoPublicKey:
401
+ type: KeyAlgo = self.type
402
+ match type:
403
+ case KeyAlgo.RSA:
404
+ return RSAPublicNumbers(self.e, self.n).public_key()
405
+ case KeyAlgo.ECDSA256 | KeyAlgo.ECDSA384 | KeyAlgo.ECDSA521:
406
+ curve = _ECDSA_KEY_TYPE[KeyAlgo(type)]
407
+ return EllipticCurvePublicKey.from_encoded_point(curve(), self.Q)
408
+ case KeyAlgo.ED25519:
409
+ return Ed25519PublicKey.from_public_bytes(self.enc_a)
410
+ case KeyAlgo.DSA:
411
+ return DSAPublicNumbers(self.y, DSAParameterNumbers(self.p, self.q, self.g)).public_key()
412
+ case _:
413
+ raise NotImplementedError(type)
414
+
415
+ @staticmethod
416
+ def from_public_key(public_key: CryptoPublicKey) -> PublicKeyMsg:
417
+ match public_key:
418
+ case DSAPublicKey():
419
+ dsa_pn: DSAPublicNumbers = public_key.public_numbers()
420
+ return DSAPublicKeyMsg(
421
+ KeyAlgo.DSA,
422
+ mpint(dsa_pn.parameter_numbers.p),
423
+ mpint(dsa_pn.parameter_numbers.q),
424
+ mpint(dsa_pn.parameter_numbers.g),
425
+ mpint(dsa_pn.y),
426
+ )
427
+ case EllipticCurvePublicKey():
428
+ return EcdsaPublicKeyMsg(
429
+ getattr(KeyAlgo, f'ECDSA{public_key.curve.key_size}'),
430
+ unicode_string(f'nistp{public_key.curve.key_size}'),
431
+ binary_string(
432
+ public_key.public_bytes(
433
+ encoding=serialization.Encoding.X962,
434
+ format=serialization.PublicFormat.UncompressedPoint,
435
+ )
436
+ ),
437
+ )
438
+ case Ed25519PublicKey():
439
+ return Ed25519PublicKeyMsg(
440
+ KeyAlgo.ED25519,
441
+ binary_string(
442
+ public_key.public_bytes(
443
+ encoding=serialization.Encoding.Raw,
444
+ format=serialization.PublicFormat.Raw,
445
+ )
446
+ ),
447
+ )
448
+ case RSAPublicKey():
449
+ rsa_pn: RSAPublicNumbers = public_key.public_numbers()
450
+ return RSAPublicKeyMsg(KeyAlgo.RSA, mpint(rsa_pn.e), mpint(rsa_pn.n))
451
+ case _:
452
+ raise NotImplementedError(public_key)
453
+
454
+ @functools.cached_property
455
+ def fingerprint(self) -> str:
456
+ digest = hashlib.sha256()
457
+ msg = copy.copy(self)
458
+ msg.comments = unicode_string('')
459
+ k = msg.to_blob()
460
+ digest.update(k)
461
+ return binascii.b2a_base64(digest.digest(), newline=False).rstrip(b'=').decode('utf-8')
462
+
463
+
464
+ @dataclasses.dataclass(order=True, slots=True)
465
+ class RSAPublicKeyMsg(PublicKeyMsg):
466
+ type: KeyAlgo
467
+ e: mpint
468
+ n: mpint
469
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
470
+
471
+
472
+ @dataclasses.dataclass(order=True, slots=True)
473
+ class DSAPublicKeyMsg(PublicKeyMsg):
474
+ type: KeyAlgo
475
+ p: mpint
476
+ q: mpint
477
+ g: mpint
478
+ y: mpint
479
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
480
+
481
+
482
+ @dataclasses.dataclass(order=True, slots=True)
483
+ class EcdsaPublicKeyMsg(PublicKeyMsg):
484
+ type: KeyAlgo
485
+ ecdsa_curve_name: unicode_string
486
+ Q: binary_string
487
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
488
+
489
+
490
+ @dataclasses.dataclass(order=True, slots=True)
491
+ class Ed25519PublicKeyMsg(PublicKeyMsg):
492
+ type: KeyAlgo
493
+ enc_a: binary_string
494
+ comments: unicode_string = dataclasses.field(default=unicode_string(''), compare=False)
495
+
496
+
497
+ @dataclasses.dataclass(order=True, slots=True)
498
+ class KeyList(Msg):
499
+ nkeys: uint32
500
+ keys: PublicKeyMsgList
501
+
502
+ def __post_init__(self) -> None:
503
+ if self.nkeys != len(self.keys):
504
+ raise SshAgentFailure("agent: invalid number of keys received for identities list")
505
+
506
+
507
+ @dataclasses.dataclass(order=True, slots=True)
508
+ class PublicKeyMsgList(Msg):
509
+ keys: list[PublicKeyMsg]
510
+
511
+ def __iter__(self) -> t.Iterator[PublicKeyMsg]:
512
+ yield from self.keys
513
+
514
+ def __len__(self) -> int:
515
+ return len(self.keys)
516
+
517
+ @classmethod
518
+ def from_blob(cls, blob: memoryview | bytes) -> t.Self: ...
519
+
520
+ @classmethod
521
+ def consume_from_blob(cls, blob: memoryview | bytes) -> tuple[t.Self, memoryview | bytes]:
522
+ args: list[PublicKeyMsg] = []
523
+ while blob:
524
+ prev_blob = blob
525
+ key_blob, key_blob_length, comment_blob = cls._consume_field(blob)
526
+
527
+ peek_key_algo, _length, _blob = cls._consume_field(key_blob)
528
+ pub_key_msg_cls = PublicKeyMsg.get_dataclass(KeyAlgo(bytes(peek_key_algo).decode('utf-8')))
529
+
530
+ _fv, comment_blob_length, blob = cls._consume_field(comment_blob)
531
+ key_plus_comment = prev_blob[4 : (4 + key_blob_length) + (4 + comment_blob_length)]
532
+
533
+ args.append(pub_key_msg_cls.from_blob(key_plus_comment))
534
+ return cls(args), b""
535
+
536
+ @staticmethod
537
+ def _consume_field(blob: memoryview | bytes) -> tuple[memoryview | bytes, uint32, memoryview | bytes]:
538
+ length = uint32.from_blob(blob[:4])
539
+ blob = blob[4:]
540
+ data, rest = _split_blob(blob, length)
541
+ return data, length, rest
542
+
543
+
544
+ class SshAgentClient:
545
+ def __init__(self, auth_sock: str) -> None:
546
+ self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
547
+ self._sock.settimeout(_SSH_AGENT_CLIENT_SOCKET_TIMEOUT)
548
+ self._sock.connect(auth_sock)
549
+
550
+ def close(self) -> None:
551
+ self._sock.close()
552
+
553
+ def __enter__(self) -> t.Self:
554
+ return self
555
+
556
+ def __exit__(
557
+ self,
558
+ exc_type: type[BaseException] | None,
559
+ exc_value: BaseException | None,
560
+ traceback: types.TracebackType | None,
561
+ ) -> None:
562
+ self.close()
563
+
564
+ def send(self, msg: bytes) -> bytes:
565
+ length = uint32(len(msg)).to_blob()
566
+ self._sock.sendall(length + msg)
567
+ bufsize = uint32.from_blob(self._sock.recv(4))
568
+ resp = self._sock.recv(bufsize)
569
+ if resp[0] == ProtocolMsgNumbers.SSH_AGENT_FAILURE:
570
+ raise SshAgentFailure('agent: failure')
571
+ return resp
572
+
573
+ def remove_all(self) -> None:
574
+ self.send(ProtocolMsgNumbers.SSH_AGENTC_REMOVE_ALL_IDENTITIES.to_blob())
575
+
576
+ def remove(self, public_key: CryptoPublicKey) -> None:
577
+ key_blob = PublicKeyMsg.from_public_key(public_key).to_blob()
578
+ self.send(ProtocolMsgNumbers.SSH_AGENTC_REMOVE_IDENTITY.to_blob() + uint32(len(key_blob)).to_blob() + key_blob)
579
+
580
+ def add(
581
+ self,
582
+ private_key: CryptoPrivateKey,
583
+ comments: str | None = None,
584
+ lifetime: int | None = None,
585
+ confirm: bool | None = None,
586
+ ) -> None:
587
+ key_msg = PrivateKeyMsg.from_private_key(private_key)
588
+ key_msg.comments = unicode_string(comments or '')
589
+ if lifetime:
590
+ key_msg.constraints += constraints([ProtocolMsgNumbers.SSH_AGENT_CONSTRAIN_LIFETIME]).to_blob() + uint32(lifetime).to_blob()
591
+ if confirm:
592
+ key_msg.constraints += constraints([ProtocolMsgNumbers.SSH_AGENT_CONSTRAIN_CONFIRM]).to_blob()
593
+
594
+ if key_msg.constraints:
595
+ msg = ProtocolMsgNumbers.SSH_AGENTC_ADD_ID_CONSTRAINED.to_blob()
596
+ else:
597
+ msg = ProtocolMsgNumbers.SSH_AGENTC_ADD_IDENTITY.to_blob()
598
+ msg += key_msg.to_blob()
599
+ self.send(msg)
600
+
601
+ def list(self) -> KeyList:
602
+ req = ProtocolMsgNumbers.SSH_AGENTC_REQUEST_IDENTITIES.to_blob()
603
+ r = memoryview(bytearray(self.send(req)))
604
+ if r[0] != ProtocolMsgNumbers.SSH_AGENT_IDENTITIES_ANSWER:
605
+ raise SshAgentFailure('agent: non-identities answer received for identities list')
606
+ return KeyList.from_blob(r[1:])
607
+
608
+ def __contains__(self, public_key: CryptoPublicKey) -> bool:
609
+ msg = PublicKeyMsg.from_public_key(public_key)
610
+ return msg in self.list().keys
611
+
612
+
613
+ @functools.cache
614
+ def key_data_into_crypto_objects(key_data: bytes, passphrase: bytes | None) -> tuple[CryptoPrivateKey, CryptoPublicKey, str]:
615
+ private_key = serialization.ssh.load_ssh_private_key(key_data, passphrase)
616
+ public_key = private_key.public_key()
617
+ fingerprint = PublicKeyMsg.from_public_key(public_key).fingerprint
618
+
619
+ return private_key, public_key, fingerprint
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import typing as t
5
+
6
+ from collections import abc as c
7
+
8
+ from ansible import constants
9
+ from ansible._internal._templating import _engine
10
+ from ansible._internal._templating._chain_templar import ChainTemplar
11
+ from ansible.errors import AnsibleError
12
+ from ansible.module_utils._internal._ambient_context import AmbientContextBase
13
+ from ansible.module_utils.datatag import native_type_name
14
+ from ansible.parsing import vault as _vault
15
+ from ansible.utils.display import Display
16
+
17
+ if t.TYPE_CHECKING:
18
+ from ansible.playbook.task import Task
19
+
20
+
21
+ @dataclasses.dataclass
22
+ class TaskContext(AmbientContextBase):
23
+ """Ambient context that wraps task execution on workers. It provides access to the currently executing task."""
24
+
25
+ task: Task
26
+
27
+
28
+ TaskArgsFinalizerCallback = t.Callable[[str, t.Any, _engine.TemplateEngine, t.Any], t.Any]
29
+ """Type alias for the shape of the `ActionBase.finalize_task_arg` method."""
30
+
31
+
32
+ class TaskArgsChainTemplar(ChainTemplar):
33
+ """
34
+ A ChainTemplar that carries a user-provided context object, optionally provided by `ActionBase.get_finalize_task_args_context`.
35
+ TaskArgsFinalizer provides the context to each `ActionBase.finalize_task_arg` call to allow for more complex/stateful customization.
36
+ """
37
+
38
+ def __init__(self, *sources: c.Mapping, templar: _engine.TemplateEngine, callback: TaskArgsFinalizerCallback, context: t.Any) -> None:
39
+ super().__init__(*sources, templar=templar)
40
+
41
+ self.callback = callback
42
+ self.context = context
43
+
44
+ def template(self, key: t.Any, value: t.Any) -> t.Any:
45
+ return self.callback(key, value, self.templar, self.context)
46
+
47
+
48
+ class TaskArgsFinalizer:
49
+ """Invoked during task args finalization; allows actions to override default arg processing (e.g., templating)."""
50
+
51
+ def __init__(self, *args: c.Mapping[str, t.Any] | str | None, templar: _engine.TemplateEngine) -> None:
52
+ self._args_layers = [arg for arg in args if arg is not None]
53
+ self._templar = templar
54
+
55
+ def finalize(self, callback: TaskArgsFinalizerCallback, context: t.Any) -> dict[str, t.Any]:
56
+ resolved_layers: list[c.Mapping[str, t.Any]] = []
57
+
58
+ for layer in self._args_layers:
59
+ if isinstance(layer, (str, _vault.EncryptedString)): # EncryptedString can hide a template
60
+ if constants.config.get_config_value('INJECT_FACTS_AS_VARS'):
61
+ Display().warning(
62
+ "Using a template for task args is unsafe in some situations "
63
+ "(see https://docs.ansible.com/ansible/devel/reference_appendices/faq.html#argsplat-unsafe).",
64
+ obj=layer,
65
+ )
66
+
67
+ resolved_layer = self._templar.resolve_to_container(layer, options=_engine.TemplateOptions(value_for_omit={}))
68
+ else:
69
+ resolved_layer = layer
70
+
71
+ if not isinstance(resolved_layer, dict):
72
+ raise AnsibleError(f'Task args must resolve to a {native_type_name(dict)!r} not {native_type_name(resolved_layer)!r}.', obj=layer)
73
+
74
+ resolved_layers.append(resolved_layer)
75
+
76
+ ct = TaskArgsChainTemplar(*reversed(resolved_layers), templar=self._templar, callback=callback, context=context)
77
+
78
+ return ct.as_dict()
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ import importlib.metadata
4
+
5
+ jinja2_version = importlib.metadata.version('jinja2')
6
+
7
+ # DTFIX-FUTURE: sanity test to ensure this doesn't drift from requirements
8
+ _MINIMUM_JINJA_VERSION = (3, 1)
9
+ _CURRENT_JINJA_VERSION = tuple(map(int, jinja2_version.split('.', maxsplit=2)[:2]))
10
+
11
+ if _CURRENT_JINJA_VERSION < _MINIMUM_JINJA_VERSION:
12
+ raise RuntimeError(f'Jinja version {".".join(map(str, _MINIMUM_JINJA_VERSION))} or higher is required (current version {jinja2_version}).')