ansible-core 2.18.4rc1__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 +52 -17
  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 +20 -18
  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 +7 -7
  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 +35 -49
  279. ansible/modules/user.py +53 -34
  280. ansible/modules/validate_argument_spec.py +10 -7
  281. ansible/modules/wait_for.py +39 -32
  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 +8 -7
  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 +2 -2
  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.4rc1.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.4rc1.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.4rc1.dist-info/RECORD +0 -992
  703. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
  704. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
  705. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
  706. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
  707. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
  708. {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
  709. {ansible_core-2.18.4rc1.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
- from ansible.module_utils.six.moves.urllib.parse import urlencode, urlsplit
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
 
@@ -505,29 +505,8 @@ def write_file(module, dest, content, resp):
505
505
  os.remove(tmpsrc)
506
506
 
507
507
 
508
- def absolute_location(url, location):
509
- """Attempts to create an absolute URL based on initial URL, and
510
- next URL, specifically in the case of a ``Location`` header.
511
- """
512
-
513
- if '://' in location:
514
- return location
515
-
516
- elif location.startswith('/'):
517
- parts = urlsplit(url)
518
- base = url.replace(parts[2], '')
519
- return '%s%s' % (base, location)
520
-
521
- elif not location.startswith('/'):
522
- base = os.path.dirname(url)
523
- return '%s/%s' % (base, location)
524
-
525
- else:
526
- return location
527
-
528
-
529
508
  def kv_list(data):
530
- ''' Convert data into a list of key-value tuples '''
509
+ """ Convert data into a list of key-value tuples """
531
510
  if data is None:
532
511
  return None
533
512
 
@@ -541,7 +520,7 @@ def kv_list(data):
541
520
 
542
521
 
543
522
  def form_urlencoded(body):
544
- ''' Convert data into a form-urlencoded string '''
523
+ """ Convert data into a form-urlencoded string """
545
524
  if isinstance(body, string_types):
546
525
  return body
547
526
 
@@ -579,7 +558,10 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
579
558
  kwargs = {}
580
559
  if dest is not None and os.path.isfile(dest):
581
560
  # if destination file already exist, only download if file newer
582
- 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
+ )
583
565
 
584
566
  if module.params.get('follow_redirects') in ('no', 'yes'):
585
567
  module.deprecate(
@@ -605,6 +587,8 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
605
587
 
606
588
  def main():
607
589
  argument_spec = url_argument_spec()
590
+ argument_spec['url']['required'] = True
591
+ argument_spec.update(url_redirect_argument_spec())
608
592
  argument_spec.update(
609
593
  dest=dict(type='path'),
610
594
  url_username=dict(type='str', aliases=['user']),
@@ -691,12 +675,12 @@ def main():
691
675
  module.exit_json(stdout="skipped, since '%s' does not exist" % removes, changed=False)
692
676
 
693
677
  # Make the request
694
- start = utcnow()
678
+ start = datetime.now(timezone.utc)
695
679
  r, info = uri(module, url, dest, body, body_format, method,
696
680
  dict_headers, socket_timeout, ca_path, unredirected_headers,
697
681
  decompress, ciphers, use_netrc)
698
682
 
699
- elapsed = (utcnow() - start).seconds
683
+ elapsed = (datetime.now(timezone.utc) - start).seconds
700
684
 
701
685
  if r and dest is not None and os.path.isdir(dest):
702
686
  filename = get_response_filename(r) or 'index.html'
@@ -732,6 +716,8 @@ def main():
732
716
  # there was no content, but the error read()
733
717
  # may have been stored in the info as 'body'
734
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)}")
735
721
  elif r:
736
722
  content = r
737
723
  else:
@@ -766,7 +752,7 @@ def main():
766
752
  uresp[ukey] = value
767
753
 
768
754
  if 'location' in uresp:
769
- uresp['location'] = absolute_location(url, uresp['location'])
755
+ uresp['location'] = urljoin(url, uresp['location'])
770
756
 
771
757
  # Default content_encoding to try
772
758
  if isinstance(content, binary_type):
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
@@ -187,20 +187,22 @@ EXAMPLES = r'''
187
187
  host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
188
188
  search_regex: OpenSSH
189
189
  delay: 10
190
- connection: local
190
+ timeout: 300
191
+ delegate_to: localhost
191
192
 
192
- # Same as above but you normally have ansible_connection set in inventory, which overrides 'connection'
193
+ # Same as above but using config lookup for the target,
194
+ # most plugins use 'remote_addr', but ssh uses 'host'
193
195
  - name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"
194
196
  ansible.builtin.wait_for:
195
197
  port: 22
196
- host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
198
+ host: "{{ lookup('config', 'host', plugin_name='ssh', plugin_type='connection') }}"
197
199
  search_regex: OpenSSH
198
200
  delay: 10
199
- vars:
200
- ansible_connection: local
201
- '''
201
+ timeout: 300
202
+ delegate_to: localhost
203
+ """
202
204
 
203
- RETURN = r'''
205
+ RETURN = r"""
204
206
  elapsed:
205
207
  description: The number of seconds that elapsed while waiting
206
208
  returned: always
@@ -220,11 +222,10 @@ match_groupdict:
220
222
  {
221
223
  'group': 'match'
222
224
  }
223
- '''
225
+ """
224
226
 
225
227
  import binascii
226
228
  import contextlib
227
- import datetime
228
229
  import errno
229
230
  import math
230
231
  import mmap
@@ -233,12 +234,12 @@ import re
233
234
  import select
234
235
  import socket
235
236
  import time
236
- import traceback
237
+
238
+ from datetime import datetime, timedelta, timezone
237
239
 
238
240
  from ansible.module_utils.basic import AnsibleModule, missing_required_lib
239
241
  from ansible.module_utils.common.sys_info import get_platform_subclass
240
242
  from ansible.module_utils.common.text.converters import to_bytes, to_native
241
- from ansible.module_utils.compat.datetime import utcnow
242
243
 
243
244
 
244
245
  HAS_PSUTIL = False
@@ -247,8 +248,8 @@ try:
247
248
  import psutil
248
249
  HAS_PSUTIL = True
249
250
  # just because we can import it on Linux doesn't mean we will use it
250
- except ImportError:
251
- PSUTIL_IMP_ERR = traceback.format_exc()
251
+ except ImportError as ex:
252
+ PSUTIL_IMP_ERR = ex
252
253
 
253
254
 
254
255
  class TCPConnectionInfo(object):
@@ -532,7 +533,7 @@ def main():
532
533
  except Exception:
533
534
  module.fail_json(msg="unknown active_connection_state (%s) defined" % _connection_state, elapsed=0)
534
535
 
535
- start = utcnow()
536
+ start = datetime.now(timezone.utc)
536
537
 
537
538
  if delay:
538
539
  time.sleep(delay)
@@ -541,9 +542,9 @@ def main():
541
542
  time.sleep(timeout)
542
543
  elif state in ['absent', 'stopped']:
543
544
  # first wait for the stop condition
544
- end = start + datetime.timedelta(seconds=timeout)
545
+ end = start + timedelta(seconds=timeout)
545
546
 
546
- while utcnow() < end:
547
+ while datetime.now(timezone.utc) < end:
547
548
  if path:
548
549
  try:
549
550
  if not os.access(b_path, os.F_OK):
@@ -560,7 +561,7 @@ def main():
560
561
  # Conditions not yet met, wait and try again
561
562
  time.sleep(module.params['sleep'])
562
563
  else:
563
- elapsed = utcnow() - start
564
+ elapsed = datetime.now(timezone.utc) - start
564
565
  if port:
565
566
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to stop." % (host, port), elapsed=elapsed.seconds)
566
567
  elif path:
@@ -568,15 +569,15 @@ def main():
568
569
 
569
570
  elif state in ['started', 'present']:
570
571
  # wait for start condition
571
- end = start + datetime.timedelta(seconds=timeout)
572
- while utcnow() < end:
572
+ end = start + timedelta(seconds=timeout)
573
+ while datetime.now(timezone.utc) < end:
573
574
  if path:
574
575
  try:
575
576
  os.stat(b_path)
576
577
  except OSError as e:
577
578
  # If anything except file not present, throw an error
578
579
  if e.errno != 2:
579
- elapsed = utcnow() - start
580
+ elapsed = datetime.now(timezone.utc) - start
580
581
  module.fail_json(msg=msg or "Failed to stat %s, %s" % (path, e.strerror), elapsed=elapsed.seconds)
581
582
  # file doesn't exist yet, so continue
582
583
  else:
@@ -611,9 +612,11 @@ def main():
611
612
  except IOError:
612
613
  pass
613
614
  elif port:
614
- 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
+ )
615
618
  try:
616
- 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))
617
620
  except Exception:
618
621
  # Failed to connect by connect_timeout. wait and try again
619
622
  pass
@@ -622,8 +625,12 @@ def main():
622
625
  if b_compiled_search_re:
623
626
  b_data = b''
624
627
  matched = False
625
- while utcnow() < end:
626
- 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
+ )
627
634
  readable = select.select([s], [], [], max_timeout)[0]
628
635
  if not readable:
629
636
  # No new data. Probably means our timeout
@@ -667,7 +674,7 @@ def main():
667
674
 
668
675
  else: # while-else
669
676
  # Timeout expired
670
- elapsed = utcnow() - start
677
+ elapsed = datetime.now(timezone.utc) - start
671
678
  if port:
672
679
  if search_regex:
673
680
  module.fail_json(msg=msg or "Timeout when waiting for search string %s in %s:%s" % (search_regex, host, port), elapsed=elapsed.seconds)
@@ -681,19 +688,19 @@ def main():
681
688
 
682
689
  elif state == 'drained':
683
690
  # wait until all active connections are gone
684
- end = start + datetime.timedelta(seconds=timeout)
691
+ end = start + timedelta(seconds=timeout)
685
692
  tcpconns = TCPConnectionInfo(module)
686
- while utcnow() < end:
693
+ while datetime.now(timezone.utc) < end:
687
694
  if tcpconns.get_active_connections_count() == 0:
688
695
  break
689
696
 
690
697
  # Conditions not yet met, wait and try again
691
698
  time.sleep(module.params['sleep'])
692
699
  else:
693
- elapsed = utcnow() - start
700
+ elapsed = datetime.now(timezone.utc) - start
694
701
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to drain" % (host, port), elapsed=elapsed.seconds)
695
702
 
696
- elapsed = utcnow() - start
703
+ elapsed = datetime.now(timezone.utc) - start
697
704
  module.exit_json(state=state, port=port, search_regex=search_regex, match_groups=match_groups, match_groupdict=match_groupdict, path=path,
698
705
  elapsed=elapsed.seconds)
699
706