ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b1__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 (709) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_datatag/__init__.py +0 -0
  4. ansible/_internal/_datatag/_tags.py +130 -0
  5. ansible/_internal/_datatag/_utils.py +19 -0
  6. ansible/_internal/_datatag/_wrappers.py +33 -0
  7. ansible/_internal/_errors/__init__.py +0 -0
  8. ansible/_internal/_errors/_captured.py +128 -0
  9. ansible/_internal/_errors/_handler.py +91 -0
  10. ansible/_internal/_errors/_utils.py +310 -0
  11. ansible/_internal/_json/__init__.py +160 -0
  12. ansible/_internal/_json/_legacy_encoder.py +34 -0
  13. ansible/_internal/_json/_profiles/__init__.py +0 -0
  14. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  15. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  16. ansible/_internal/_json/_profiles/_legacy.py +198 -0
  17. ansible/_internal/_locking.py +21 -0
  18. ansible/_internal/_plugins/__init__.py +0 -0
  19. ansible/_internal/_plugins/_cache.py +57 -0
  20. ansible/_internal/_task.py +78 -0
  21. ansible/_internal/_templating/__init__.py +10 -0
  22. ansible/_internal/_templating/_access.py +86 -0
  23. ansible/_internal/_templating/_chain_templar.py +63 -0
  24. ansible/_internal/_templating/_datatag.py +95 -0
  25. ansible/_internal/_templating/_engine.py +588 -0
  26. ansible/_internal/_templating/_errors.py +28 -0
  27. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  28. ansible/_internal/_templating/_jinja_common.py +332 -0
  29. ansible/_internal/_templating/_jinja_patches.py +44 -0
  30. ansible/_internal/_templating/_jinja_plugins.py +351 -0
  31. ansible/_internal/_templating/_lazy_containers.py +633 -0
  32. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  33. ansible/_internal/_templating/_transform.py +63 -0
  34. ansible/_internal/_templating/_utils.py +107 -0
  35. ansible/_internal/_wrapt.py +1052 -0
  36. ansible/_internal/_yaml/__init__.py +0 -0
  37. ansible/_internal/_yaml/_constructor.py +240 -0
  38. ansible/_internal/_yaml/_dumper.py +62 -0
  39. ansible/_internal/_yaml/_errors.py +166 -0
  40. ansible/_internal/_yaml/_loader.py +66 -0
  41. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  58. ansible/cli/__init__.py +153 -89
  59. ansible/cli/_ssh_askpass.py +47 -0
  60. ansible/cli/adhoc.py +14 -7
  61. ansible/cli/arguments/option_helpers.py +154 -7
  62. ansible/cli/config.py +43 -68
  63. ansible/cli/console.py +10 -8
  64. ansible/cli/doc.py +48 -46
  65. ansible/cli/galaxy.py +27 -20
  66. ansible/cli/inventory.py +28 -26
  67. ansible/cli/playbook.py +4 -12
  68. ansible/cli/pull.py +51 -11
  69. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  70. ansible/cli/vault.py +12 -11
  71. ansible/compat/__init__.py +2 -2
  72. ansible/config/base.yml +165 -108
  73. ansible/config/manager.py +52 -49
  74. ansible/constants.py +3 -4
  75. ansible/errors/__init__.py +277 -235
  76. ansible/executor/interpreter_discovery.py +28 -149
  77. ansible/executor/module_common.py +426 -493
  78. ansible/executor/play_iterator.py +22 -27
  79. ansible/executor/playbook_executor.py +11 -11
  80. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  81. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  82. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  83. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  84. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  85. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  86. ansible/executor/powershell/module_manifest.py +417 -265
  87. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  88. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  89. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  90. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  91. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  92. ansible/executor/process/worker.py +136 -76
  93. ansible/executor/stats.py +5 -5
  94. ansible/executor/task_executor.py +237 -236
  95. ansible/executor/task_queue_manager.py +62 -38
  96. ansible/executor/task_result.py +21 -12
  97. ansible/galaxy/__init__.py +2 -2
  98. ansible/galaxy/api.py +22 -18
  99. ansible/galaxy/collection/__init__.py +1 -1
  100. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  101. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  102. ansible/galaxy/dependency_resolution/providers.py +1 -1
  103. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  104. ansible/galaxy/role.py +4 -8
  105. ansible/galaxy/token.py +28 -21
  106. ansible/inventory/data.py +47 -57
  107. ansible/inventory/group.py +44 -72
  108. ansible/inventory/helpers.py +9 -0
  109. ansible/inventory/host.py +32 -54
  110. ansible/inventory/manager.py +77 -34
  111. ansible/keyword_desc.yml +1 -1
  112. ansible/module_utils/_internal/__init__.py +55 -0
  113. ansible/module_utils/_internal/_ambient_context.py +58 -0
  114. ansible/module_utils/_internal/_ansiballz.py +133 -0
  115. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  116. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  117. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  118. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  119. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  120. ansible/module_utils/_internal/_debugging.py +31 -0
  121. ansible/module_utils/_internal/_errors.py +30 -0
  122. ansible/module_utils/_internal/_json/__init__.py +63 -0
  123. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  124. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  125. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  126. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  130. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  131. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  132. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  133. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  134. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  135. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  136. ansible/module_utils/_internal/_testing.py +0 -0
  137. ansible/module_utils/_internal/_traceback.py +89 -0
  138. ansible/module_utils/ansible_release.py +2 -2
  139. ansible/module_utils/api.py +1 -2
  140. ansible/module_utils/basic.py +154 -120
  141. ansible/module_utils/common/_utils.py +24 -28
  142. ansible/module_utils/common/collections.py +1 -2
  143. ansible/module_utils/common/dict_transformations.py +2 -2
  144. ansible/module_utils/common/file.py +2 -2
  145. ansible/module_utils/common/json.py +90 -84
  146. ansible/module_utils/common/locale.py +2 -2
  147. ansible/module_utils/common/messages.py +108 -0
  148. ansible/module_utils/common/parameters.py +27 -24
  149. ansible/module_utils/common/process.py +2 -2
  150. ansible/module_utils/common/respawn.py +41 -19
  151. ansible/module_utils/common/sentinel.py +66 -0
  152. ansible/module_utils/common/sys_info.py +8 -8
  153. ansible/module_utils/common/text/converters.py +16 -37
  154. ansible/module_utils/common/validation.py +35 -24
  155. ansible/module_utils/common/warnings.py +86 -25
  156. ansible/module_utils/common/yaml.py +29 -3
  157. ansible/module_utils/compat/datetime.py +33 -21
  158. ansible/module_utils/compat/paramiko.py +21 -10
  159. ansible/module_utils/compat/typing.py +6 -5
  160. ansible/module_utils/connection.py +2 -2
  161. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  162. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  163. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  164. ansible/module_utils/datatag.py +46 -0
  165. ansible/module_utils/distro/__init__.py +2 -2
  166. ansible/module_utils/facts/ansible_collector.py +4 -5
  167. ansible/module_utils/facts/collector.py +13 -14
  168. ansible/module_utils/facts/compat.py +4 -4
  169. ansible/module_utils/facts/default_collectors.py +1 -1
  170. ansible/module_utils/facts/hardware/aix.py +34 -0
  171. ansible/module_utils/facts/hardware/base.py +1 -1
  172. ansible/module_utils/facts/hardware/darwin.py +1 -3
  173. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  174. ansible/module_utils/facts/hardware/linux.py +4 -4
  175. ansible/module_utils/facts/namespace.py +1 -1
  176. ansible/module_utils/facts/network/base.py +1 -1
  177. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  178. ansible/module_utils/facts/network/iscsi.py +1 -2
  179. ansible/module_utils/facts/network/nvme.py +1 -2
  180. ansible/module_utils/facts/other/facter.py +1 -2
  181. ansible/module_utils/facts/other/ohai.py +2 -3
  182. ansible/module_utils/facts/system/apparmor.py +1 -2
  183. ansible/module_utils/facts/system/caps.py +1 -1
  184. ansible/module_utils/facts/system/chroot.py +1 -2
  185. ansible/module_utils/facts/system/cmdline.py +1 -2
  186. ansible/module_utils/facts/system/date_time.py +5 -3
  187. ansible/module_utils/facts/system/distribution.py +9 -8
  188. ansible/module_utils/facts/system/dns.py +1 -1
  189. ansible/module_utils/facts/system/env.py +1 -2
  190. ansible/module_utils/facts/system/fips.py +7 -20
  191. ansible/module_utils/facts/system/loadavg.py +1 -2
  192. ansible/module_utils/facts/system/local.py +1 -2
  193. ansible/module_utils/facts/system/lsb.py +1 -2
  194. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  195. ansible/module_utils/facts/system/platform.py +1 -2
  196. ansible/module_utils/facts/system/python.py +1 -2
  197. ansible/module_utils/facts/system/selinux.py +1 -1
  198. ansible/module_utils/facts/system/service_mgr.py +1 -2
  199. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  200. ansible/module_utils/facts/system/systemd.py +1 -1
  201. ansible/module_utils/facts/system/user.py +1 -2
  202. ansible/module_utils/facts/utils.py +3 -3
  203. ansible/module_utils/facts/virtual/base.py +1 -1
  204. ansible/module_utils/facts/virtual/sunos.py +3 -15
  205. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  206. ansible/module_utils/json_utils.py +2 -2
  207. ansible/module_utils/parsing/convert_bool.py +1 -1
  208. ansible/module_utils/service.py +18 -21
  209. ansible/module_utils/splitter.py +7 -7
  210. ansible/module_utils/testing.py +31 -0
  211. ansible/module_utils/urls.py +60 -31
  212. ansible/modules/add_host.py +4 -4
  213. ansible/modules/apt.py +60 -46
  214. ansible/modules/apt_key.py +19 -12
  215. ansible/modules/apt_repository.py +19 -16
  216. ansible/modules/assemble.py +6 -6
  217. ansible/modules/assert.py +4 -4
  218. ansible/modules/async_status.py +10 -12
  219. ansible/modules/async_wrapper.py +8 -3
  220. ansible/modules/blockinfile.py +6 -7
  221. ansible/modules/command.py +10 -17
  222. ansible/modules/copy.py +57 -144
  223. ansible/modules/cron.py +20 -15
  224. ansible/modules/deb822_repository.py +8 -9
  225. ansible/modules/debconf.py +5 -5
  226. ansible/modules/debug.py +4 -4
  227. ansible/modules/dnf.py +8 -8
  228. ansible/modules/dnf5.py +39 -13
  229. ansible/modules/dpkg_selections.py +4 -4
  230. ansible/modules/expect.py +8 -10
  231. ansible/modules/fail.py +4 -4
  232. ansible/modules/fetch.py +4 -4
  233. ansible/modules/file.py +174 -133
  234. ansible/modules/find.py +19 -17
  235. ansible/modules/gather_facts.py +3 -3
  236. ansible/modules/get_url.py +59 -53
  237. ansible/modules/getent.py +7 -9
  238. ansible/modules/git.py +28 -25
  239. ansible/modules/group.py +6 -6
  240. ansible/modules/group_by.py +4 -4
  241. ansible/modules/hostname.py +13 -29
  242. ansible/modules/import_playbook.py +6 -6
  243. ansible/modules/import_role.py +6 -6
  244. ansible/modules/import_tasks.py +6 -6
  245. ansible/modules/include_role.py +6 -6
  246. ansible/modules/include_tasks.py +6 -6
  247. ansible/modules/include_vars.py +6 -6
  248. ansible/modules/iptables.py +86 -73
  249. ansible/modules/known_hosts.py +10 -10
  250. ansible/modules/lineinfile.py +5 -5
  251. ansible/modules/meta.py +4 -4
  252. ansible/modules/mount_facts.py +2 -2
  253. ansible/modules/package.py +4 -4
  254. ansible/modules/package_facts.py +22 -10
  255. ansible/modules/pause.py +6 -6
  256. ansible/modules/ping.py +6 -6
  257. ansible/modules/pip.py +10 -11
  258. ansible/modules/raw.py +4 -4
  259. ansible/modules/reboot.py +6 -6
  260. ansible/modules/replace.py +9 -13
  261. ansible/modules/rpm_key.py +7 -8
  262. ansible/modules/script.py +4 -4
  263. ansible/modules/service.py +7 -8
  264. ansible/modules/service_facts.py +87 -10
  265. ansible/modules/set_fact.py +5 -5
  266. ansible/modules/set_stats.py +4 -4
  267. ansible/modules/setup.py +2 -2
  268. ansible/modules/shell.py +6 -6
  269. ansible/modules/slurp.py +6 -6
  270. ansible/modules/stat.py +9 -23
  271. ansible/modules/subversion.py +15 -15
  272. ansible/modules/systemd.py +6 -6
  273. ansible/modules/systemd_service.py +6 -6
  274. ansible/modules/sysvinit.py +6 -6
  275. ansible/modules/tempfile.py +5 -6
  276. ansible/modules/template.py +6 -6
  277. ansible/modules/unarchive.py +32 -11
  278. ansible/modules/uri.py +33 -26
  279. ansible/modules/user.py +53 -34
  280. ansible/modules/validate_argument_spec.py +10 -7
  281. ansible/modules/wait_for.py +32 -27
  282. ansible/modules/wait_for_connection.py +6 -6
  283. ansible/modules/yum_repository.py +6 -6
  284. ansible/parsing/ajson.py +14 -32
  285. ansible/parsing/dataloader.py +99 -54
  286. ansible/parsing/mod_args.py +28 -44
  287. ansible/parsing/plugin_docs.py +21 -86
  288. ansible/parsing/quoting.py +1 -1
  289. ansible/parsing/splitter.py +27 -12
  290. ansible/parsing/utils/addresses.py +24 -24
  291. ansible/parsing/utils/yaml.py +32 -61
  292. ansible/parsing/vault/__init__.py +319 -87
  293. ansible/parsing/yaml/__init__.py +0 -18
  294. ansible/parsing/yaml/dumper.py +6 -120
  295. ansible/parsing/yaml/loader.py +6 -39
  296. ansible/parsing/yaml/objects.py +36 -339
  297. ansible/playbook/__init__.py +1 -1
  298. ansible/playbook/attribute.py +8 -3
  299. ansible/playbook/base.py +182 -132
  300. ansible/playbook/block.py +26 -24
  301. ansible/playbook/collectionsearch.py +1 -15
  302. ansible/playbook/conditional.py +3 -77
  303. ansible/playbook/handler.py +8 -2
  304. ansible/playbook/helpers.py +41 -53
  305. ansible/playbook/included_file.py +6 -15
  306. ansible/playbook/loop_control.py +2 -2
  307. ansible/playbook/play.py +85 -44
  308. ansible/playbook/play_context.py +12 -17
  309. ansible/playbook/playbook_include.py +14 -15
  310. ansible/playbook/role/__init__.py +24 -26
  311. ansible/playbook/role/definition.py +15 -17
  312. ansible/playbook/role/include.py +2 -4
  313. ansible/playbook/role/metadata.py +10 -11
  314. ansible/playbook/role_include.py +3 -3
  315. ansible/playbook/taggable.py +13 -8
  316. ansible/playbook/task.py +188 -118
  317. ansible/playbook/task_include.py +5 -5
  318. ansible/plugins/__init__.py +68 -21
  319. ansible/plugins/action/__init__.py +209 -176
  320. ansible/plugins/action/add_host.py +1 -1
  321. ansible/plugins/action/assemble.py +1 -1
  322. ansible/plugins/action/assert.py +54 -66
  323. ansible/plugins/action/copy.py +7 -11
  324. ansible/plugins/action/debug.py +37 -31
  325. ansible/plugins/action/dnf.py +3 -4
  326. ansible/plugins/action/fail.py +1 -1
  327. ansible/plugins/action/fetch.py +4 -5
  328. ansible/plugins/action/gather_facts.py +7 -6
  329. ansible/plugins/action/group_by.py +1 -1
  330. ansible/plugins/action/include_vars.py +10 -11
  331. ansible/plugins/action/package.py +3 -6
  332. ansible/plugins/action/pause.py +2 -2
  333. ansible/plugins/action/script.py +15 -8
  334. ansible/plugins/action/service.py +6 -11
  335. ansible/plugins/action/set_fact.py +3 -12
  336. ansible/plugins/action/set_stats.py +3 -8
  337. ansible/plugins/action/template.py +35 -59
  338. ansible/plugins/action/unarchive.py +1 -1
  339. ansible/plugins/action/validate_argument_spec.py +5 -5
  340. ansible/plugins/action/wait_for_connection.py +1 -1
  341. ansible/plugins/become/__init__.py +31 -8
  342. ansible/plugins/become/runas.py +71 -0
  343. ansible/plugins/become/su.py +13 -8
  344. ansible/plugins/become/sudo.py +19 -0
  345. ansible/plugins/cache/__init__.py +35 -44
  346. ansible/plugins/cache/base.py +8 -0
  347. ansible/plugins/cache/jsonfile.py +10 -16
  348. ansible/plugins/cache/memory.py +6 -12
  349. ansible/plugins/callback/__init__.py +141 -123
  350. ansible/plugins/callback/default.py +30 -23
  351. ansible/plugins/callback/junit.py +28 -24
  352. ansible/plugins/callback/minimal.py +17 -14
  353. ansible/plugins/callback/oneline.py +13 -7
  354. ansible/plugins/callback/tree.py +10 -6
  355. ansible/plugins/connection/__init__.py +47 -34
  356. ansible/plugins/connection/local.py +150 -54
  357. ansible/plugins/connection/paramiko_ssh.py +21 -18
  358. ansible/plugins/connection/psrp.py +76 -165
  359. ansible/plugins/connection/ssh.py +301 -78
  360. ansible/plugins/connection/winrm.py +58 -140
  361. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  362. ansible/plugins/doc_fragments/action_core.py +6 -6
  363. ansible/plugins/doc_fragments/backup.py +2 -2
  364. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  365. ansible/plugins/doc_fragments/constructed.py +6 -2
  366. ansible/plugins/doc_fragments/decrypt.py +2 -2
  367. ansible/plugins/doc_fragments/default_callback.py +2 -2
  368. ansible/plugins/doc_fragments/files.py +2 -2
  369. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  370. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  371. ansible/plugins/doc_fragments/return_common.py +2 -2
  372. ansible/plugins/doc_fragments/template_common.py +4 -4
  373. ansible/plugins/doc_fragments/url.py +17 -1
  374. ansible/plugins/doc_fragments/url_windows.py +2 -2
  375. ansible/plugins/doc_fragments/validate.py +2 -2
  376. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  377. ansible/plugins/filter/__init__.py +6 -2
  378. ansible/plugins/filter/b64decode.yml +22 -0
  379. ansible/plugins/filter/b64encode.yml +22 -0
  380. ansible/plugins/filter/bool.yml +11 -4
  381. ansible/plugins/filter/core.py +218 -108
  382. ansible/plugins/filter/encryption.py +32 -32
  383. ansible/plugins/filter/flatten.yml +3 -2
  384. ansible/plugins/filter/human_to_bytes.yml +1 -1
  385. ansible/plugins/filter/mathstuff.py +30 -37
  386. ansible/plugins/filter/password_hash.yml +8 -0
  387. ansible/plugins/filter/regex_search.yml +1 -4
  388. ansible/plugins/filter/split.yml +1 -1
  389. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  390. ansible/plugins/filter/to_yaml.yml +0 -4
  391. ansible/plugins/filter/unvault.yml +1 -1
  392. ansible/plugins/filter/urls.py +1 -1
  393. ansible/plugins/filter/urlsplit.py +8 -9
  394. ansible/plugins/filter/vault.yml +14 -9
  395. ansible/plugins/filter/win_basename.yml +6 -1
  396. ansible/plugins/filter/win_dirname.yml +5 -0
  397. ansible/plugins/inventory/__init__.py +97 -77
  398. ansible/plugins/inventory/advanced_host_list.py +7 -5
  399. ansible/plugins/inventory/auto.py +11 -4
  400. ansible/plugins/inventory/constructed.py +21 -24
  401. ansible/plugins/inventory/generator.py +16 -11
  402. ansible/plugins/inventory/host_list.py +7 -5
  403. ansible/plugins/inventory/ini.py +78 -44
  404. ansible/plugins/inventory/script.py +189 -119
  405. ansible/plugins/inventory/toml.py +16 -126
  406. ansible/plugins/inventory/yaml.py +10 -8
  407. ansible/plugins/list.py +3 -3
  408. ansible/plugins/loader.py +197 -82
  409. ansible/plugins/lookup/__init__.py +21 -4
  410. ansible/plugins/lookup/config.py +21 -35
  411. ansible/plugins/lookup/csvfile.py +3 -2
  412. ansible/plugins/lookup/dict.py +1 -6
  413. ansible/plugins/lookup/env.py +12 -9
  414. ansible/plugins/lookup/file.py +5 -8
  415. ansible/plugins/lookup/first_found.py +86 -55
  416. ansible/plugins/lookup/indexed_items.py +1 -10
  417. ansible/plugins/lookup/ini.py +14 -13
  418. ansible/plugins/lookup/items.py +1 -1
  419. ansible/plugins/lookup/lines.py +8 -1
  420. ansible/plugins/lookup/list.py +1 -1
  421. ansible/plugins/lookup/nested.py +2 -18
  422. ansible/plugins/lookup/password.py +5 -5
  423. ansible/plugins/lookup/pipe.py +5 -7
  424. ansible/plugins/lookup/sequence.py +18 -8
  425. ansible/plugins/lookup/subelements.py +1 -4
  426. ansible/plugins/lookup/template.py +42 -36
  427. ansible/plugins/lookup/together.py +0 -12
  428. ansible/plugins/lookup/unvault.py +1 -5
  429. ansible/plugins/lookup/url.py +2 -8
  430. ansible/plugins/lookup/vars.py +16 -24
  431. ansible/plugins/shell/__init__.py +2 -2
  432. ansible/plugins/shell/cmd.py +2 -2
  433. ansible/plugins/shell/powershell.py +39 -22
  434. ansible/plugins/shell/sh.py +3 -2
  435. ansible/plugins/strategy/__init__.py +94 -113
  436. ansible/plugins/strategy/debug.py +2 -2
  437. ansible/plugins/strategy/free.py +13 -28
  438. ansible/plugins/strategy/host_pinned.py +2 -2
  439. ansible/plugins/strategy/linear.py +31 -33
  440. ansible/plugins/terminal/__init__.py +4 -4
  441. ansible/plugins/test/__init__.py +7 -2
  442. ansible/plugins/test/core.py +54 -20
  443. ansible/plugins/test/files.py +1 -1
  444. ansible/plugins/test/mathstuff.py +3 -3
  445. ansible/plugins/test/uri.py +3 -3
  446. ansible/plugins/vars/host_group_vars.py +7 -14
  447. ansible/release.py +2 -2
  448. ansible/template/__init__.py +368 -944
  449. ansible/utils/__init__.py +0 -18
  450. ansible/utils/_ssh_agent.py +657 -0
  451. ansible/utils/collection_loader/__init__.py +52 -5
  452. ansible/utils/collection_loader/_collection_config.py +5 -6
  453. ansible/utils/collection_loader/_collection_finder.py +79 -93
  454. ansible/utils/collection_loader/_collection_meta.py +13 -8
  455. ansible/utils/display.py +428 -58
  456. ansible/utils/encrypt.py +27 -19
  457. ansible/utils/fqcn.py +2 -2
  458. ansible/utils/hashing.py +2 -2
  459. ansible/utils/helpers.py +2 -2
  460. ansible/utils/listify.py +8 -8
  461. ansible/utils/lock.py +2 -2
  462. ansible/utils/path.py +4 -4
  463. ansible/utils/plugin_docs.py +14 -13
  464. ansible/utils/sentinel.py +4 -62
  465. ansible/utils/singleton.py +2 -0
  466. ansible/utils/ssh_functions.py +1 -1
  467. ansible/utils/unsafe_proxy.py +23 -332
  468. ansible/utils/vars.py +28 -8
  469. ansible/utils/version.py +2 -2
  470. ansible/vars/clean.py +4 -4
  471. ansible/vars/hostvars.py +60 -90
  472. ansible/vars/manager.py +205 -264
  473. ansible/vars/reserved.py +8 -9
  474. ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
  475. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
  476. ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
  478. ansible_test/_data/completion/docker.txt +7 -7
  479. ansible_test/_data/completion/remote.txt +6 -6
  480. ansible_test/_data/completion/windows.txt +1 -0
  481. ansible_test/_data/requirements/ansible.txt +2 -2
  482. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  483. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  484. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  485. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  486. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  487. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  488. ansible_test/_data/requirements/units.txt +1 -0
  489. ansible_test/_internal/__init__.py +1 -0
  490. ansible_test/_internal/ansible_util.py +2 -0
  491. ansible_test/_internal/become.py +1 -0
  492. ansible_test/_internal/bootstrap.py +1 -0
  493. ansible_test/_internal/cache.py +1 -0
  494. ansible_test/_internal/cgroup.py +1 -0
  495. ansible_test/_internal/ci/__init__.py +1 -0
  496. ansible_test/_internal/ci/azp.py +1 -0
  497. ansible_test/_internal/ci/local.py +1 -0
  498. ansible_test/_internal/classification/__init__.py +1 -0
  499. ansible_test/_internal/classification/common.py +1 -0
  500. ansible_test/_internal/classification/csharp.py +1 -0
  501. ansible_test/_internal/classification/powershell.py +1 -0
  502. ansible_test/_internal/classification/python.py +1 -0
  503. ansible_test/_internal/cli/__init__.py +1 -0
  504. ansible_test/_internal/cli/actions.py +1 -0
  505. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  506. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  508. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  509. ansible_test/_internal/cli/commands/__init__.py +11 -0
  510. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  511. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  512. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  523. ansible_test/_internal/cli/commands/env.py +1 -0
  524. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  525. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  528. ansible_test/_internal/cli/commands/sanity.py +9 -0
  529. ansible_test/_internal/cli/commands/shell.py +1 -0
  530. ansible_test/_internal/cli/commands/units.py +1 -0
  531. ansible_test/_internal/cli/compat.py +1 -0
  532. ansible_test/_internal/cli/completers.py +1 -0
  533. ansible_test/_internal/cli/converters.py +1 -0
  534. ansible_test/_internal/cli/environments.py +1 -0
  535. ansible_test/_internal/cli/epilog.py +1 -0
  536. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  537. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  538. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  539. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  541. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  542. ansible_test/_internal/commands/__init__.py +1 -0
  543. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  544. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  546. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  551. ansible_test/_internal/commands/coverage/combine.py +2 -1
  552. ansible_test/_internal/commands/coverage/erase.py +1 -0
  553. ansible_test/_internal/commands/coverage/html.py +1 -0
  554. ansible_test/_internal/commands/coverage/report.py +1 -0
  555. ansible_test/_internal/commands/coverage/xml.py +1 -0
  556. ansible_test/_internal/commands/env/__init__.py +2 -0
  557. ansible_test/_internal/commands/integration/__init__.py +4 -0
  558. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  559. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  560. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  562. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  565. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  567. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  568. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  569. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  570. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  573. ansible_test/_internal/commands/integration/coverage.py +1 -0
  574. ansible_test/_internal/commands/integration/filters.py +1 -0
  575. ansible_test/_internal/commands/integration/network.py +1 -0
  576. ansible_test/_internal/commands/integration/posix.py +1 -0
  577. ansible_test/_internal/commands/integration/windows.py +1 -0
  578. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  579. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  580. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  581. ansible_test/_internal/commands/sanity/compile.py +1 -0
  582. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  583. ansible_test/_internal/commands/sanity/import.py +1 -0
  584. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  585. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  586. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  587. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  588. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  589. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  590. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  591. ansible_test/_internal/commands/shell/__init__.py +1 -0
  592. ansible_test/_internal/commands/units/__init__.py +1 -0
  593. ansible_test/_internal/compat/__init__.py +1 -0
  594. ansible_test/_internal/compat/packaging.py +1 -0
  595. ansible_test/_internal/compat/yaml.py +1 -0
  596. ansible_test/_internal/completion.py +1 -0
  597. ansible_test/_internal/config.py +2 -0
  598. ansible_test/_internal/connections.py +1 -0
  599. ansible_test/_internal/constants.py +1 -0
  600. ansible_test/_internal/containers.py +1 -0
  601. ansible_test/_internal/content_config.py +1 -0
  602. ansible_test/_internal/core_ci.py +1 -0
  603. ansible_test/_internal/coverage_util.py +11 -10
  604. ansible_test/_internal/data.py +1 -0
  605. ansible_test/_internal/delegation.py +1 -0
  606. ansible_test/_internal/dev/__init__.py +1 -0
  607. ansible_test/_internal/dev/container_probe.py +1 -0
  608. ansible_test/_internal/diff.py +3 -2
  609. ansible_test/_internal/docker_util.py +2 -1
  610. ansible_test/_internal/encoding.py +1 -0
  611. ansible_test/_internal/executor.py +1 -0
  612. ansible_test/_internal/git.py +1 -0
  613. ansible_test/_internal/host_configs.py +1 -0
  614. ansible_test/_internal/host_profiles.py +1 -0
  615. ansible_test/_internal/http.py +1 -0
  616. ansible_test/_internal/init.py +1 -0
  617. ansible_test/_internal/inventory.py +35 -3
  618. ansible_test/_internal/io.py +1 -0
  619. ansible_test/_internal/metadata.py +1 -0
  620. ansible_test/_internal/payload.py +1 -0
  621. ansible_test/_internal/provider/__init__.py +1 -0
  622. ansible_test/_internal/provider/layout/__init__.py +1 -0
  623. ansible_test/_internal/provider/layout/ansible.py +1 -0
  624. ansible_test/_internal/provider/layout/collection.py +1 -0
  625. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  626. ansible_test/_internal/provider/source/__init__.py +1 -0
  627. ansible_test/_internal/provider/source/git.py +1 -0
  628. ansible_test/_internal/provider/source/installed.py +1 -0
  629. ansible_test/_internal/provider/source/unsupported.py +1 -0
  630. ansible_test/_internal/provider/source/unversioned.py +1 -0
  631. ansible_test/_internal/provisioning.py +1 -0
  632. ansible_test/_internal/pypi_proxy.py +6 -5
  633. ansible_test/_internal/python_requirements.py +1 -0
  634. ansible_test/_internal/ssh.py +1 -0
  635. ansible_test/_internal/target.py +1 -0
  636. ansible_test/_internal/test.py +3 -2
  637. ansible_test/_internal/thread.py +1 -0
  638. ansible_test/_internal/timeout.py +1 -0
  639. ansible_test/_internal/util.py +1 -0
  640. ansible_test/_internal/util_common.py +5 -2
  641. ansible_test/_internal/venv.py +1 -0
  642. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  643. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  653. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  655. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  657. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  658. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  659. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  660. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  661. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  663. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  664. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  665. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  666. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  667. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  668. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  669. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  672. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  673. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  674. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  675. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  676. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  678. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  679. ansible_test/_util/target/sanity/import/importer.py +15 -16
  680. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  681. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  682. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  683. ansible_test/_util/target/setup/requirements.py +35 -27
  684. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  685. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  686. ansible/compat/selectors.py +0 -32
  687. ansible/errors/yaml_strings.py +0 -138
  688. ansible/executor/action_write_locks.py +0 -44
  689. ansible/executor/discovery/python_target.py +0 -47
  690. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  691. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  692. ansible/module_utils/compat/importlib.py +0 -26
  693. ansible/module_utils/compat/selectors.py +0 -32
  694. ansible/module_utils/pycompat24.py +0 -73
  695. ansible/parsing/utils/jsonify.py +0 -36
  696. ansible/parsing/yaml/constructor.py +0 -178
  697. ansible/template/native_helpers.py +0 -251
  698. ansible/template/template.py +0 -43
  699. ansible/template/vars.py +0 -77
  700. ansible/utils/native_jinja.py +0 -11
  701. ansible/vars/fact_cache.py +0 -71
  702. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  703. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
ansible/modules/uri.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: uri
12
12
  short_description: Interacts with webservices
@@ -61,6 +61,7 @@ options:
61
61
  or list of tuples into an C(application/x-www-form-urlencoded) string. (Added in v2.7)
62
62
  - If O(body_format) is set to V(form-multipart) it will convert a dictionary
63
63
  into C(multipart/form-multipart) body. (Added in v2.10)
64
+ - If C(body_format) is set to V(form-multipart) the option 'multipart_encoding' allows to change multipart file encoding. (Added in v2.19)
64
65
  type: raw
65
66
  body_format:
66
67
  description:
@@ -105,18 +106,6 @@ options:
105
106
  - The webservice bans or rate-limits clients that cause any HTTP 401 errors.
106
107
  type: bool
107
108
  default: no
108
- follow_redirects:
109
- description:
110
- - Whether or not the URI module should follow redirects.
111
- type: str
112
- default: safe
113
- choices:
114
- all: Will follow all redirects.
115
- none: Will not follow any redirects.
116
- safe: Only redirects doing GET or HEAD requests will be followed.
117
- urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
118
- 'no': (DEPRECATED, removed in 2.22) alias of V(none).
119
- 'yes': (DEPRECATED, removed in 2.22) alias of V(all).
120
109
  creates:
121
110
  description:
122
111
  - A filename, when it already exists, this step will not be run.
@@ -234,6 +223,7 @@ options:
234
223
  extends_documentation_fragment:
235
224
  - action_common_attributes
236
225
  - files
226
+ - url.url_redirect
237
227
  attributes:
238
228
  check_mode:
239
229
  support: none
@@ -250,9 +240,9 @@ seealso:
250
240
  - module: ansible.windows.win_uri
251
241
  author:
252
242
  - Romeo Theriault (@romeotheriault)
253
- '''
243
+ """
254
244
 
255
- EXAMPLES = r'''
245
+ EXAMPLES = r"""
256
246
  - name: Check that you can connect (GET) to a page and it returns a status 200
257
247
  ansible.builtin.uri:
258
248
  url: http://www.example.com
@@ -262,7 +252,7 @@ EXAMPLES = r'''
262
252
  url: http://www.example.com
263
253
  return_content: true
264
254
  register: this
265
- failed_when: this is failed or "'AWESOME' not in this.content"
255
+ failed_when: "this is failed or 'AWESOME' not in this.content"
266
256
 
267
257
  - name: Create a JIRA issue
268
258
  ansible.builtin.uri:
@@ -308,10 +298,12 @@ EXAMPLES = r'''
308
298
  file1:
309
299
  filename: /bin/true
310
300
  mime_type: application/octet-stream
301
+ multipart_encoding: base64
311
302
  file2:
312
303
  content: text based file content
313
304
  filename: fake.txt
314
305
  mime_type: text/plain
306
+ multipart_encoding: 7or8bit
315
307
  text_form_field: value
316
308
 
317
309
  - name: Connect to website using a previously stored cookie
@@ -387,9 +379,9 @@ EXAMPLES = r'''
387
379
  uri:
388
380
  url: https://example.org
389
381
  ciphers: '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM'
390
- '''
382
+ """
391
383
 
392
- RETURN = r'''
384
+ RETURN = r"""
393
385
  # The return information includes all the HTTP headers in lower-case.
394
386
  content:
395
387
  description: The response body content.
@@ -438,21 +430,29 @@ url:
438
430
  returned: always
439
431
  type: str
440
432
  sample: https://www.ansible.com/
441
- '''
433
+ """
442
434
 
435
+ import http
443
436
  import json
444
437
  import os
445
438
  import re
446
439
  import shutil
447
440
  import tempfile
441
+ from datetime import datetime, timezone
448
442
 
449
443
  from ansible.module_utils.basic import AnsibleModule, sanitize_keys
450
444
  from ansible.module_utils.six import binary_type, iteritems, string_types
451
445
  from ansible.module_utils.six.moves.urllib.parse import urlencode, urljoin
452
446
  from ansible.module_utils.common.text.converters import to_native, to_text
453
- from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp
454
447
  from ansible.module_utils.six.moves.collections_abc import Mapping, Sequence
455
- from ansible.module_utils.urls import fetch_url, get_response_filename, parse_content_type, prepare_multipart, url_argument_spec
448
+ from ansible.module_utils.urls import (
449
+ fetch_url,
450
+ get_response_filename,
451
+ parse_content_type,
452
+ prepare_multipart,
453
+ url_argument_spec,
454
+ url_redirect_argument_spec,
455
+ )
456
456
 
457
457
  JSON_CANDIDATES = {'json', 'javascript'}
458
458
 
@@ -506,7 +506,7 @@ def write_file(module, dest, content, resp):
506
506
 
507
507
 
508
508
  def kv_list(data):
509
- ''' Convert data into a list of key-value tuples '''
509
+ """ Convert data into a list of key-value tuples """
510
510
  if data is None:
511
511
  return None
512
512
 
@@ -520,7 +520,7 @@ def kv_list(data):
520
520
 
521
521
 
522
522
  def form_urlencoded(body):
523
- ''' Convert data into a form-urlencoded string '''
523
+ """ Convert data into a form-urlencoded string """
524
524
  if isinstance(body, string_types):
525
525
  return body
526
526
 
@@ -558,7 +558,10 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
558
558
  kwargs = {}
559
559
  if dest is not None and os.path.isfile(dest):
560
560
  # if destination file already exist, only download if file newer
561
- kwargs['last_mod_time'] = utcfromtimestamp(os.path.getmtime(dest))
561
+ kwargs['last_mod_time'] = datetime.fromtimestamp(
562
+ os.path.getmtime(dest),
563
+ tz=timezone.utc,
564
+ )
562
565
 
563
566
  if module.params.get('follow_redirects') in ('no', 'yes'):
564
567
  module.deprecate(
@@ -584,6 +587,8 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
584
587
 
585
588
  def main():
586
589
  argument_spec = url_argument_spec()
590
+ argument_spec['url']['required'] = True
591
+ argument_spec.update(url_redirect_argument_spec())
587
592
  argument_spec.update(
588
593
  dest=dict(type='path'),
589
594
  url_username=dict(type='str', aliases=['user']),
@@ -670,12 +675,12 @@ def main():
670
675
  module.exit_json(stdout="skipped, since '%s' does not exist" % removes, changed=False)
671
676
 
672
677
  # Make the request
673
- start = utcnow()
678
+ start = datetime.now(timezone.utc)
674
679
  r, info = uri(module, url, dest, body, body_format, method,
675
680
  dict_headers, socket_timeout, ca_path, unredirected_headers,
676
681
  decompress, ciphers, use_netrc)
677
682
 
678
- elapsed = (utcnow() - start).seconds
683
+ elapsed = (datetime.now(timezone.utc) - start).seconds
679
684
 
680
685
  if r and dest is not None and os.path.isdir(dest):
681
686
  filename = get_response_filename(r) or 'index.html'
@@ -711,6 +716,8 @@ def main():
711
716
  # there was no content, but the error read()
712
717
  # may have been stored in the info as 'body'
713
718
  content = info.pop('body', b'')
719
+ except http.client.HTTPException as http_err:
720
+ module.fail_json(msg=f"HTTP Error while fetching {url}: {to_native(http_err)}")
714
721
  elif r:
715
722
  content = r
716
723
  else:
ansible/modules/user.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  module: user
11
11
  version_added: "0.2"
12
12
  short_description: Manage user accounts
@@ -319,9 +319,9 @@ seealso:
319
319
  - module: ansible.windows.win_user
320
320
  author:
321
321
  - Stephen Fromm (@sfromm)
322
- '''
322
+ """
323
323
 
324
- EXAMPLES = r'''
324
+ EXAMPLES = r"""
325
325
  - name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
326
326
  ansible.builtin.user:
327
327
  name: johnd
@@ -385,9 +385,9 @@ EXAMPLES = r'''
385
385
  ansible.builtin.user:
386
386
  name: jimholden2016
387
387
  password_expire_account_disable: 15
388
- '''
388
+ """
389
389
 
390
- RETURN = r'''
390
+ RETURN = r"""
391
391
  append:
392
392
  description: Whether or not to append the user to groups.
393
393
  returned: When O(state) is V(present) and the user exists
@@ -486,10 +486,11 @@ uid:
486
486
  returned: When O(uid) is passed to the module
487
487
  type: int
488
488
  sample: 1044
489
- '''
489
+ """
490
490
 
491
491
 
492
492
  import ctypes.util
493
+ from datetime import datetime
493
494
  import grp
494
495
  import calendar
495
496
  import os
@@ -502,13 +503,13 @@ import socket
502
503
  import subprocess
503
504
  import time
504
505
  import math
506
+ import typing as t
505
507
 
506
508
  from ansible.module_utils import distro
507
509
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
508
510
  from ansible.module_utils.basic import AnsibleModule
509
511
  from ansible.module_utils.common.locale import get_best_parsable_locale
510
512
  from ansible.module_utils.common.sys_info import get_platform_subclass
511
- import ansible.module_utils.compat.typing as t
512
513
 
513
514
 
514
515
  class StructSpwdType(ctypes.Structure):
@@ -1091,7 +1092,7 @@ class User(object):
1091
1092
  return groups
1092
1093
 
1093
1094
  def user_group_membership(self, exclude_primary=True):
1094
- ''' Return a list of groups the user belongs to '''
1095
+ """ Return a list of groups the user belongs to """
1095
1096
  groups = []
1096
1097
  info = self.get_pwd_info()
1097
1098
  for group in grp.getgrall():
@@ -1279,11 +1280,16 @@ class User(object):
1279
1280
  env=env)
1280
1281
  out_buffer = b''
1281
1282
  err_buffer = b''
1283
+ first_prompt = b'Enter passphrase'
1284
+ second_prompt = b'Enter same passphrase again'
1285
+ prompt = first_prompt
1286
+ start = datetime.now()
1287
+ timeout = 900
1282
1288
  while p.poll() is None:
1283
1289
  r_list = select.select([master_out_fd, master_err_fd], [], [], 1)[0]
1284
- first_prompt = b'Enter passphrase (empty for no passphrase):'
1285
- second_prompt = b'Enter same passphrase again'
1286
- prompt = first_prompt
1290
+ now = datetime.now()
1291
+ if (now - start).seconds > timeout:
1292
+ return (1, '', f'Timeout after {timeout} while reading passphrase for SSH key')
1287
1293
  for fd in r_list:
1288
1294
  if fd == master_out_fd:
1289
1295
  chunk = os.read(master_out_fd, 10240)
@@ -1370,16 +1376,24 @@ class User(object):
1370
1376
  self.module.exit_json(failed=True, msg="%s" % to_native(e))
1371
1377
  # get umask from /etc/login.defs and set correct home mode
1372
1378
  if os.path.exists(self.LOGIN_DEFS):
1373
- with open(self.LOGIN_DEFS, 'r') as f:
1374
- for line in f:
1375
- m = re.match(r'^UMASK\s+(\d+)$', line)
1376
- if m:
1377
- umask = int(m.group(1), 8)
1379
+ # fallback if neither HOME_MODE nor UMASK are set;
1380
+ # follow behaviour of useradd initializing UMASK = 022
1381
+ mode = 0o755
1382
+ with open(self.LOGIN_DEFS, 'r') as fh:
1383
+ for line in fh:
1384
+ # HOME_MODE has higher precedence as UMASK
1385
+ match = re.match(r'^HOME_MODE\s+(\d+)$', line)
1386
+ if match:
1387
+ mode = int(match.group(1), 8)
1388
+ break # higher precedence
1389
+ match = re.match(r'^UMASK\s+(\d+)$', line)
1390
+ if match:
1391
+ umask = int(match.group(1), 8)
1378
1392
  mode = 0o777 & ~umask
1379
- try:
1380
- os.chmod(path, mode)
1381
- except OSError as e:
1382
- self.module.exit_json(failed=True, msg="%s" % to_native(e))
1393
+ try:
1394
+ os.chmod(path, mode)
1395
+ except OSError as e:
1396
+ self.module.exit_json(failed=True, msg=to_native(e))
1383
1397
 
1384
1398
  def chown_homedir(self, uid, gid, path):
1385
1399
  try:
@@ -2436,7 +2450,7 @@ class DarwinUser(User):
2436
2450
  return groups
2437
2451
 
2438
2452
  def _get_user_property(self, property):
2439
- '''Return user PROPERTY as given my dscl(1) read or None if not found.'''
2453
+ """Return user PROPERTY as given my dscl(1) read or None if not found."""
2440
2454
  cmd = self._get_dscl()
2441
2455
  cmd += ['-read', '/Users/%s' % self.name, property]
2442
2456
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
@@ -2456,10 +2470,10 @@ class DarwinUser(User):
2456
2470
  return None
2457
2471
 
2458
2472
  def _get_next_uid(self, system=None):
2459
- '''
2473
+ """
2460
2474
  Return the next available uid. If system=True, then
2461
2475
  uid should be below of 500, if possible.
2462
- '''
2476
+ """
2463
2477
  cmd = self._get_dscl()
2464
2478
  cmd += ['-list', '/Users', 'UniqueID']
2465
2479
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
@@ -2485,10 +2499,10 @@ class DarwinUser(User):
2485
2499
  return max_uid + 1
2486
2500
 
2487
2501
  def _change_user_password(self):
2488
- '''Change password for SELF.NAME against SELF.PASSWORD.
2502
+ """Change password for SELF.NAME against SELF.PASSWORD.
2489
2503
 
2490
2504
  Please note that password must be cleartext.
2491
- '''
2505
+ """
2492
2506
  # some documentation on how is stored passwords on OSX:
2493
2507
  # http://blog.lostpassword.com/2012/07/cracking-mac-os-x-lion-accounts-passwords/
2494
2508
  # http://null-byte.wonderhowto.com/how-to/hack-mac-os-x-lion-passwords-0130036/
@@ -2507,7 +2521,7 @@ class DarwinUser(User):
2507
2521
  return (rc, out, err)
2508
2522
 
2509
2523
  def _make_group_numerical(self):
2510
- '''Convert SELF.GROUP to is stringed numerical value suitable for dscl.'''
2524
+ """Convert SELF.GROUP to is stringed numerical value suitable for dscl."""
2511
2525
  if self.group is None:
2512
2526
  self.group = 'nogroup'
2513
2527
  try:
@@ -2518,8 +2532,8 @@ class DarwinUser(User):
2518
2532
  self.group = str(self.group)
2519
2533
 
2520
2534
  def __modify_group(self, group, action):
2521
- '''Add or remove SELF.NAME to or from GROUP depending on ACTION.
2522
- ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. '''
2535
+ """Add or remove SELF.NAME to or from GROUP depending on ACTION.
2536
+ ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
2523
2537
  if action == 'add':
2524
2538
  option = '-a'
2525
2539
  else:
@@ -2532,8 +2546,8 @@ class DarwinUser(User):
2532
2546
  return (rc, out, err)
2533
2547
 
2534
2548
  def _modify_group(self):
2535
- '''Add or remove SELF.NAME to or from GROUP depending on ACTION.
2536
- ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. '''
2549
+ """Add or remove SELF.NAME to or from GROUP depending on ACTION.
2550
+ ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
2537
2551
 
2538
2552
  rc = 0
2539
2553
  out = ''
@@ -2564,9 +2578,9 @@ class DarwinUser(User):
2564
2578
  return (rc, out, err, changed)
2565
2579
 
2566
2580
  def _update_system_user(self):
2567
- '''Hide or show user on login window according SELF.SYSTEM.
2581
+ """Hide or show user on login window according SELF.SYSTEM.
2568
2582
 
2569
- Returns 0 if a change has been made, None otherwise.'''
2583
+ Returns 0 if a change has been made, None otherwise."""
2570
2584
 
2571
2585
  plist_file = '/Library/Preferences/com.apple.loginwindow.plist'
2572
2586
 
@@ -2605,14 +2619,14 @@ class DarwinUser(User):
2605
2619
  return 0
2606
2620
 
2607
2621
  def user_exists(self):
2608
- '''Check is SELF.NAME is a known user on the system.'''
2622
+ """Check is SELF.NAME is a known user on the system."""
2609
2623
  cmd = self._get_dscl()
2610
2624
  cmd += ['-read', '/Users/%s' % self.name, 'UniqueID']
2611
2625
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
2612
2626
  return rc == 0
2613
2627
 
2614
2628
  def remove_user(self):
2615
- '''Delete SELF.NAME. If SELF.FORCE is true, remove its home directory.'''
2629
+ """Delete SELF.NAME. If SELF.FORCE is true, remove its home directory."""
2616
2630
  info = self.user_info()
2617
2631
 
2618
2632
  cmd = self._get_dscl()
@@ -3243,6 +3257,11 @@ class Alpine(BusyBox):
3243
3257
  distribution = 'Alpine'
3244
3258
 
3245
3259
 
3260
+ class Buildroot(BusyBox):
3261
+ platform = 'Linux'
3262
+ distribution = 'Buildroot'
3263
+
3264
+
3246
3265
  def main():
3247
3266
  ssh_defaults = dict(
3248
3267
  bits=0,
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: validate_argument_spec
12
12
  short_description: Validate role argument specs.
@@ -16,7 +16,8 @@ version_added: "2.11"
16
16
  options:
17
17
  argument_spec:
18
18
  description:
19
- - A dictionary like AnsibleModule argument_spec. See R(argument spec definition,argument_spec).
19
+ - A dictionary like AnsibleModule argument_spec.
20
+ - See the C(options) parameter for the R(specification format,role_argument_spec).
20
21
  required: true
21
22
  provided_arguments:
22
23
  description:
@@ -46,9 +47,11 @@ attributes:
46
47
  support: none
47
48
  platform:
48
49
  platforms: all
49
- '''
50
+ notes:
51
+ - It is unnecessary to call this module explicitly if the role contains an R(argument spec,role_argument_spec).
52
+ """
50
53
 
51
- EXAMPLES = r'''
54
+ EXAMPLES = r"""
52
55
  - name: verify vars needed for this task file are present when included
53
56
  ansible.builtin.validate_argument_spec:
54
57
  argument_spec: '{{ required_data }}'
@@ -82,9 +85,9 @@ EXAMPLES = r'''
82
85
  vars:
83
86
  stuff: knows
84
87
  but: nobuts!
85
- '''
88
+ """
86
89
 
87
- RETURN = r'''
90
+ RETURN = r"""
88
91
  argument_errors:
89
92
  description: A list of arg validation errors.
90
93
  returned: failure
@@ -114,4 +117,4 @@ validate_args_context:
114
117
  type: role
115
118
  path: /home/user/roles/my_role/
116
119
  argument_spec_name: main
117
- '''
120
+ """
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: wait_for
12
12
  short_description: Waits for a condition before continuing
@@ -120,9 +120,9 @@ author:
120
120
  - Jeroen Hoekx (@jhoekx)
121
121
  - John Jarvis (@jarv)
122
122
  - Andrii Radyk (@AnderEnder)
123
- '''
123
+ """
124
124
 
125
- EXAMPLES = r'''
125
+ EXAMPLES = r"""
126
126
  - name: Sleep for 300 seconds and continue with play
127
127
  ansible.builtin.wait_for:
128
128
  timeout: 300
@@ -200,9 +200,9 @@ EXAMPLES = r'''
200
200
  delay: 10
201
201
  timeout: 300
202
202
  delegate_to: localhost
203
- '''
203
+ """
204
204
 
205
- RETURN = r'''
205
+ RETURN = r"""
206
206
  elapsed:
207
207
  description: The number of seconds that elapsed while waiting
208
208
  returned: always
@@ -222,11 +222,10 @@ match_groupdict:
222
222
  {
223
223
  'group': 'match'
224
224
  }
225
- '''
225
+ """
226
226
 
227
227
  import binascii
228
228
  import contextlib
229
- import datetime
230
229
  import errno
231
230
  import math
232
231
  import mmap
@@ -235,12 +234,12 @@ import re
235
234
  import select
236
235
  import socket
237
236
  import time
238
- import traceback
237
+
238
+ from datetime import datetime, timedelta, timezone
239
239
 
240
240
  from ansible.module_utils.basic import AnsibleModule, missing_required_lib
241
241
  from ansible.module_utils.common.sys_info import get_platform_subclass
242
242
  from ansible.module_utils.common.text.converters import to_bytes, to_native
243
- from ansible.module_utils.compat.datetime import utcnow
244
243
 
245
244
 
246
245
  HAS_PSUTIL = False
@@ -249,8 +248,8 @@ try:
249
248
  import psutil
250
249
  HAS_PSUTIL = True
251
250
  # just because we can import it on Linux doesn't mean we will use it
252
- except ImportError:
253
- PSUTIL_IMP_ERR = traceback.format_exc()
251
+ except ImportError as ex:
252
+ PSUTIL_IMP_ERR = ex
254
253
 
255
254
 
256
255
  class TCPConnectionInfo(object):
@@ -534,7 +533,7 @@ def main():
534
533
  except Exception:
535
534
  module.fail_json(msg="unknown active_connection_state (%s) defined" % _connection_state, elapsed=0)
536
535
 
537
- start = utcnow()
536
+ start = datetime.now(timezone.utc)
538
537
 
539
538
  if delay:
540
539
  time.sleep(delay)
@@ -543,9 +542,9 @@ def main():
543
542
  time.sleep(timeout)
544
543
  elif state in ['absent', 'stopped']:
545
544
  # first wait for the stop condition
546
- end = start + datetime.timedelta(seconds=timeout)
545
+ end = start + timedelta(seconds=timeout)
547
546
 
548
- while utcnow() < end:
547
+ while datetime.now(timezone.utc) < end:
549
548
  if path:
550
549
  try:
551
550
  if not os.access(b_path, os.F_OK):
@@ -562,7 +561,7 @@ def main():
562
561
  # Conditions not yet met, wait and try again
563
562
  time.sleep(module.params['sleep'])
564
563
  else:
565
- elapsed = utcnow() - start
564
+ elapsed = datetime.now(timezone.utc) - start
566
565
  if port:
567
566
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to stop." % (host, port), elapsed=elapsed.seconds)
568
567
  elif path:
@@ -570,15 +569,15 @@ def main():
570
569
 
571
570
  elif state in ['started', 'present']:
572
571
  # wait for start condition
573
- end = start + datetime.timedelta(seconds=timeout)
574
- while utcnow() < end:
572
+ end = start + timedelta(seconds=timeout)
573
+ while datetime.now(timezone.utc) < end:
575
574
  if path:
576
575
  try:
577
576
  os.stat(b_path)
578
577
  except OSError as e:
579
578
  # If anything except file not present, throw an error
580
579
  if e.errno != 2:
581
- elapsed = utcnow() - start
580
+ elapsed = datetime.now(timezone.utc) - start
582
581
  module.fail_json(msg=msg or "Failed to stat %s, %s" % (path, e.strerror), elapsed=elapsed.seconds)
583
582
  # file doesn't exist yet, so continue
584
583
  else:
@@ -613,9 +612,11 @@ def main():
613
612
  except IOError:
614
613
  pass
615
614
  elif port:
616
- alt_connect_timeout = math.ceil(_timedelta_total_seconds(end - utcnow()))
615
+ alt_connect_timeout = math.ceil(
616
+ _timedelta_total_seconds(end - datetime.now(timezone.utc)),
617
+ )
617
618
  try:
618
- s = socket.create_connection((host, port), min(connect_timeout, alt_connect_timeout))
619
+ s = socket.create_connection((host, int(port)), min(connect_timeout, alt_connect_timeout))
619
620
  except Exception:
620
621
  # Failed to connect by connect_timeout. wait and try again
621
622
  pass
@@ -624,8 +625,12 @@ def main():
624
625
  if b_compiled_search_re:
625
626
  b_data = b''
626
627
  matched = False
627
- while utcnow() < end:
628
- max_timeout = math.ceil(_timedelta_total_seconds(end - utcnow()))
628
+ while datetime.now(timezone.utc) < end:
629
+ max_timeout = math.ceil(
630
+ _timedelta_total_seconds(
631
+ end - datetime.now(timezone.utc),
632
+ ),
633
+ )
629
634
  readable = select.select([s], [], [], max_timeout)[0]
630
635
  if not readable:
631
636
  # No new data. Probably means our timeout
@@ -669,7 +674,7 @@ def main():
669
674
 
670
675
  else: # while-else
671
676
  # Timeout expired
672
- elapsed = utcnow() - start
677
+ elapsed = datetime.now(timezone.utc) - start
673
678
  if port:
674
679
  if search_regex:
675
680
  module.fail_json(msg=msg or "Timeout when waiting for search string %s in %s:%s" % (search_regex, host, port), elapsed=elapsed.seconds)
@@ -683,19 +688,19 @@ def main():
683
688
 
684
689
  elif state == 'drained':
685
690
  # wait until all active connections are gone
686
- end = start + datetime.timedelta(seconds=timeout)
691
+ end = start + timedelta(seconds=timeout)
687
692
  tcpconns = TCPConnectionInfo(module)
688
- while utcnow() < end:
693
+ while datetime.now(timezone.utc) < end:
689
694
  if tcpconns.get_active_connections_count() == 0:
690
695
  break
691
696
 
692
697
  # Conditions not yet met, wait and try again
693
698
  time.sleep(module.params['sleep'])
694
699
  else:
695
- elapsed = utcnow() - start
700
+ elapsed = datetime.now(timezone.utc) - start
696
701
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to drain" % (host, port), elapsed=elapsed.seconds)
697
702
 
698
- elapsed = utcnow() - start
703
+ elapsed = datetime.now(timezone.utc) - start
699
704
  module.exit_json(state=state, port=port, search_regex=search_regex, match_groups=match_groups, match_groupdict=match_groupdict, path=path,
700
705
  elapsed=elapsed.seconds)
701
706
 
@@ -6,7 +6,7 @@
6
6
  from __future__ import annotations
7
7
 
8
8
 
9
- DOCUMENTATION = r'''
9
+ DOCUMENTATION = r"""
10
10
  ---
11
11
  module: wait_for_connection
12
12
  short_description: Waits until remote system is reachable/usable
@@ -62,9 +62,9 @@ seealso:
62
62
  - module: community.windows.win_wait_for_process
63
63
  author:
64
64
  - Dag Wieers (@dagwieers)
65
- '''
65
+ """
66
66
 
67
- EXAMPLES = r'''
67
+ EXAMPLES = r"""
68
68
  - name: Wait 600 seconds for target connection to become reachable/usable
69
69
  ansible.builtin.wait_for_connection:
70
70
 
@@ -110,12 +110,12 @@ EXAMPLES = r'''
110
110
 
111
111
  - name: Gather facts for first time
112
112
  ansible.builtin.setup:
113
- '''
113
+ """
114
114
 
115
- RETURN = r'''
115
+ RETURN = r"""
116
116
  elapsed:
117
117
  description: The number of seconds that elapsed waiting for the connection to appear.
118
118
  returned: always
119
119
  type: float
120
120
  sample: 23.1
121
- '''
121
+ """