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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (757) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz/__init__.py +0 -0
  3. ansible/_internal/_ansiballz/_builder.py +101 -0
  4. ansible/_internal/_ansiballz/_wrapper.py +262 -0
  5. ansible/_internal/_collection_proxy.py +47 -0
  6. ansible/_internal/_datatag/__init__.py +0 -0
  7. ansible/_internal/_datatag/_tags.py +130 -0
  8. ansible/_internal/_datatag/_utils.py +19 -0
  9. ansible/_internal/_datatag/_wrappers.py +33 -0
  10. ansible/_internal/_errors/__init__.py +0 -0
  11. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  12. ansible/_internal/_errors/_captured.py +123 -0
  13. ansible/_internal/_errors/_error_factory.py +89 -0
  14. ansible/_internal/_errors/_error_utils.py +240 -0
  15. ansible/_internal/_errors/_handler.py +91 -0
  16. ansible/_internal/_errors/_task_timeout.py +28 -0
  17. ansible/_internal/_event_formatting.py +127 -0
  18. ansible/_internal/_json/__init__.py +214 -0
  19. ansible/_internal/_json/_legacy_encoder.py +34 -0
  20. ansible/_internal/_json/_profiles/__init__.py +0 -0
  21. ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
  22. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  23. ansible/_internal/_json/_profiles/_legacy.py +189 -0
  24. ansible/_internal/_locking.py +21 -0
  25. ansible/_internal/_plugins/__init__.py +0 -0
  26. ansible/_internal/_plugins/_cache.py +57 -0
  27. ansible/_internal/_ssh/__init__.py +0 -0
  28. ansible/_internal/_ssh/_agent_launch.py +91 -0
  29. ansible/_internal/_ssh/_ssh_agent.py +619 -0
  30. ansible/_internal/_task.py +78 -0
  31. ansible/_internal/_templating/__init__.py +12 -0
  32. ansible/_internal/_templating/_access.py +86 -0
  33. ansible/_internal/_templating/_chain_templar.py +63 -0
  34. ansible/_internal/_templating/_datatag.py +95 -0
  35. ansible/_internal/_templating/_engine.py +592 -0
  36. ansible/_internal/_templating/_errors.py +28 -0
  37. ansible/_internal/_templating/_jinja_bits.py +1106 -0
  38. ansible/_internal/_templating/_jinja_common.py +323 -0
  39. ansible/_internal/_templating/_jinja_patches.py +44 -0
  40. ansible/_internal/_templating/_jinja_plugins.py +375 -0
  41. ansible/_internal/_templating/_lazy_containers.py +633 -0
  42. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  43. ansible/_internal/_templating/_template_vars.py +72 -0
  44. ansible/_internal/_templating/_transform.py +70 -0
  45. ansible/_internal/_templating/_utils.py +108 -0
  46. ansible/_internal/_testing.py +26 -0
  47. ansible/_internal/_wrapt.py +1052 -0
  48. ansible/_internal/_yaml/__init__.py +0 -0
  49. ansible/_internal/_yaml/_constructor.py +240 -0
  50. ansible/_internal/_yaml/_dumper.py +70 -0
  51. ansible/_internal/_yaml/_errors.py +166 -0
  52. ansible/_internal/_yaml/_loader.py +66 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +27 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  59. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  60. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  61. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  62. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  63. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  64. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  65. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  66. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  67. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  68. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  69. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  70. ansible/cli/__init__.py +93 -104
  71. ansible/cli/_ssh_askpass.py +54 -0
  72. ansible/cli/adhoc.py +20 -10
  73. ansible/cli/arguments/option_helpers.py +163 -10
  74. ansible/cli/config.py +43 -68
  75. ansible/cli/console.py +13 -11
  76. ansible/cli/doc.py +134 -77
  77. ansible/cli/galaxy.py +27 -20
  78. ansible/cli/inventory.py +28 -28
  79. ansible/cli/playbook.py +4 -12
  80. ansible/cli/pull.py +6 -3
  81. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  82. ansible/cli/vault.py +12 -11
  83. ansible/compat/__init__.py +2 -2
  84. ansible/compat/importlib_resources.py +9 -12
  85. ansible/config/base.yml +218 -133
  86. ansible/config/manager.py +220 -159
  87. ansible/constants.py +2 -65
  88. ansible/errors/__init__.py +350 -256
  89. ansible/executor/interpreter_discovery.py +28 -149
  90. ansible/executor/module_common.py +480 -514
  91. ansible/executor/play_iterator.py +22 -27
  92. ansible/executor/playbook_executor.py +11 -11
  93. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  94. ansible/executor/powershell/async_wrapper.ps1 +204 -153
  95. ansible/executor/powershell/become_wrapper.ps1 +107 -144
  96. ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
  97. ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
  98. ansible/executor/powershell/exec_wrapper.ps1 +675 -196
  99. ansible/executor/powershell/module_manifest.py +469 -265
  100. ansible/executor/powershell/module_wrapper.ps1 +195 -186
  101. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  102. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  103. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  104. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  105. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  106. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  107. ansible/executor/process/worker.py +139 -149
  108. ansible/executor/stats.py +5 -5
  109. ansible/executor/task_executor.py +270 -297
  110. ansible/executor/task_queue_manager.py +135 -137
  111. ansible/executor/task_result.py +182 -79
  112. ansible/galaxy/__init__.py +2 -2
  113. ansible/galaxy/api.py +26 -25
  114. ansible/galaxy/collection/__init__.py +6 -14
  115. ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
  116. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  117. ansible/galaxy/dependency_resolution/providers.py +4 -4
  118. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  119. ansible/galaxy/role.py +6 -10
  120. ansible/galaxy/token.py +28 -21
  121. ansible/inventory/data.py +47 -57
  122. ansible/inventory/group.py +50 -73
  123. ansible/inventory/helpers.py +9 -0
  124. ansible/inventory/host.py +37 -54
  125. ansible/inventory/manager.py +79 -34
  126. ansible/keyword_desc.yml +1 -1
  127. ansible/module_utils/_internal/__init__.py +55 -0
  128. ansible/module_utils/_internal/_ambient_context.py +58 -0
  129. ansible/module_utils/_internal/_ansiballz/__init__.py +0 -0
  130. ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
  131. ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
  132. ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
  133. ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
  134. ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
  135. ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
  136. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  137. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  138. ansible/module_utils/_internal/_datatag/__init__.py +961 -0
  139. ansible/module_utils/_internal/_datatag/_tags.py +16 -0
  140. ansible/module_utils/_internal/_debugging.py +31 -0
  141. ansible/module_utils/_internal/_deprecator.py +157 -0
  142. ansible/module_utils/_internal/_errors.py +101 -0
  143. ansible/module_utils/_internal/_event_utils.py +61 -0
  144. ansible/module_utils/_internal/_json/__init__.py +63 -0
  145. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  146. ansible/module_utils/_internal/_json/_profiles/__init__.py +428 -0
  147. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  148. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
  149. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -0
  150. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  151. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  152. ansible/module_utils/_internal/_json/_profiles/_tagless.py +52 -0
  153. ansible/module_utils/_internal/_messages.py +130 -0
  154. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  155. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -0
  156. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  157. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  158. ansible/module_utils/_internal/_plugin_info.py +38 -0
  159. ansible/module_utils/_internal/_stack.py +22 -0
  160. ansible/module_utils/_internal/_testing.py +0 -0
  161. ansible/module_utils/_internal/_text_utils.py +6 -0
  162. ansible/module_utils/_internal/_traceback.py +92 -0
  163. ansible/module_utils/_internal/_validation.py +14 -0
  164. ansible/module_utils/ansible_release.py +2 -2
  165. ansible/module_utils/api.py +1 -2
  166. ansible/module_utils/basic.py +303 -202
  167. ansible/module_utils/common/_utils.py +24 -28
  168. ansible/module_utils/common/arg_spec.py +8 -3
  169. ansible/module_utils/common/collections.py +7 -2
  170. ansible/module_utils/common/dict_transformations.py +2 -2
  171. ansible/module_utils/common/file.py +2 -2
  172. ansible/module_utils/common/json.py +90 -84
  173. ansible/module_utils/common/locale.py +2 -2
  174. ansible/module_utils/common/parameters.py +27 -24
  175. ansible/module_utils/common/process.py +2 -3
  176. ansible/module_utils/common/respawn.py +11 -33
  177. ansible/module_utils/common/sentinel.py +66 -0
  178. ansible/module_utils/common/sys_info.py +8 -8
  179. ansible/module_utils/common/text/converters.py +16 -37
  180. ansible/module_utils/common/validation.py +35 -24
  181. ansible/module_utils/common/warnings.py +143 -25
  182. ansible/module_utils/common/yaml.py +29 -3
  183. ansible/module_utils/compat/datetime.py +33 -21
  184. ansible/module_utils/compat/paramiko.py +21 -10
  185. ansible/module_utils/compat/typing.py +6 -5
  186. ansible/module_utils/connection.py +10 -13
  187. ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
  188. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  189. ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
  190. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  191. ansible/module_utils/datatag.py +49 -0
  192. ansible/module_utils/distro/__init__.py +2 -2
  193. ansible/module_utils/facts/ansible_collector.py +4 -5
  194. ansible/module_utils/facts/collector.py +13 -14
  195. ansible/module_utils/facts/compat.py +4 -4
  196. ansible/module_utils/facts/default_collectors.py +1 -1
  197. ansible/module_utils/facts/hardware/aix.py +34 -0
  198. ansible/module_utils/facts/hardware/base.py +2 -2
  199. ansible/module_utils/facts/hardware/darwin.py +1 -3
  200. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  201. ansible/module_utils/facts/hardware/linux.py +5 -5
  202. ansible/module_utils/facts/namespace.py +1 -1
  203. ansible/module_utils/facts/network/base.py +1 -1
  204. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  205. ansible/module_utils/facts/network/iscsi.py +1 -2
  206. ansible/module_utils/facts/network/nvme.py +1 -2
  207. ansible/module_utils/facts/other/facter.py +2 -3
  208. ansible/module_utils/facts/other/ohai.py +2 -3
  209. ansible/module_utils/facts/sysctl.py +4 -6
  210. ansible/module_utils/facts/system/apparmor.py +1 -2
  211. ansible/module_utils/facts/system/caps.py +3 -3
  212. ansible/module_utils/facts/system/chroot.py +1 -2
  213. ansible/module_utils/facts/system/cmdline.py +1 -2
  214. ansible/module_utils/facts/system/date_time.py +5 -3
  215. ansible/module_utils/facts/system/distribution.py +27 -13
  216. ansible/module_utils/facts/system/dns.py +1 -1
  217. ansible/module_utils/facts/system/env.py +1 -2
  218. ansible/module_utils/facts/system/fips.py +7 -20
  219. ansible/module_utils/facts/system/loadavg.py +1 -2
  220. ansible/module_utils/facts/system/local.py +2 -3
  221. ansible/module_utils/facts/system/lsb.py +1 -2
  222. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  223. ansible/module_utils/facts/system/platform.py +1 -2
  224. ansible/module_utils/facts/system/python.py +1 -2
  225. ansible/module_utils/facts/system/selinux.py +1 -1
  226. ansible/module_utils/facts/system/service_mgr.py +1 -2
  227. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  228. ansible/module_utils/facts/system/systemd.py +1 -1
  229. ansible/module_utils/facts/system/user.py +1 -2
  230. ansible/module_utils/facts/utils.py +3 -3
  231. ansible/module_utils/facts/virtual/base.py +1 -1
  232. ansible/module_utils/facts/virtual/linux.py +3 -3
  233. ansible/module_utils/facts/virtual/sunos.py +3 -15
  234. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  235. ansible/module_utils/json_utils.py +2 -2
  236. ansible/module_utils/parsing/convert_bool.py +7 -1
  237. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
  238. ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
  239. ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
  240. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  241. ansible/module_utils/service.py +21 -31
  242. ansible/module_utils/splitter.py +7 -7
  243. ansible/module_utils/testing.py +31 -0
  244. ansible/module_utils/urls.py +64 -35
  245. ansible/modules/add_host.py +4 -4
  246. ansible/modules/apt.py +69 -49
  247. ansible/modules/apt_key.py +19 -12
  248. ansible/modules/apt_repository.py +32 -51
  249. ansible/modules/assemble.py +16 -14
  250. ansible/modules/assert.py +4 -4
  251. ansible/modules/async_status.py +24 -24
  252. ansible/modules/async_wrapper.py +20 -25
  253. ansible/modules/blockinfile.py +6 -7
  254. ansible/modules/command.py +13 -20
  255. ansible/modules/copy.py +60 -147
  256. ansible/modules/cron.py +24 -21
  257. ansible/modules/deb822_repository.py +8 -9
  258. ansible/modules/debconf.py +5 -5
  259. ansible/modules/debug.py +4 -4
  260. ansible/modules/dnf.py +8 -8
  261. ansible/modules/dnf5.py +39 -13
  262. ansible/modules/dpkg_selections.py +4 -4
  263. ansible/modules/expect.py +13 -15
  264. ansible/modules/fail.py +4 -4
  265. ansible/modules/fetch.py +4 -4
  266. ansible/modules/file.py +184 -144
  267. ansible/modules/find.py +22 -20
  268. ansible/modules/gather_facts.py +3 -3
  269. ansible/modules/get_url.py +77 -54
  270. ansible/modules/getent.py +7 -9
  271. ansible/modules/git.py +38 -38
  272. ansible/modules/group.py +6 -6
  273. ansible/modules/group_by.py +4 -4
  274. ansible/modules/hostname.py +15 -32
  275. ansible/modules/import_playbook.py +6 -6
  276. ansible/modules/import_role.py +6 -6
  277. ansible/modules/import_tasks.py +6 -6
  278. ansible/modules/include_role.py +6 -6
  279. ansible/modules/include_tasks.py +6 -6
  280. ansible/modules/include_vars.py +6 -6
  281. ansible/modules/iptables.py +86 -73
  282. ansible/modules/known_hosts.py +22 -24
  283. ansible/modules/lineinfile.py +5 -5
  284. ansible/modules/meta.py +4 -4
  285. ansible/modules/mount_facts.py +2 -2
  286. ansible/modules/package.py +10 -4
  287. ansible/modules/package_facts.py +22 -10
  288. ansible/modules/pause.py +6 -6
  289. ansible/modules/ping.py +6 -6
  290. ansible/modules/pip.py +21 -26
  291. ansible/modules/raw.py +6 -6
  292. ansible/modules/reboot.py +6 -6
  293. ansible/modules/replace.py +10 -14
  294. ansible/modules/rpm_key.py +7 -8
  295. ansible/modules/script.py +4 -4
  296. ansible/modules/service.py +10 -17
  297. ansible/modules/service_facts.py +87 -10
  298. ansible/modules/set_fact.py +5 -5
  299. ansible/modules/set_stats.py +4 -4
  300. ansible/modules/setup.py +2 -2
  301. ansible/modules/shell.py +6 -6
  302. ansible/modules/slurp.py +16 -19
  303. ansible/modules/stat.py +15 -31
  304. ansible/modules/subversion.py +15 -15
  305. ansible/modules/systemd.py +7 -7
  306. ansible/modules/systemd_service.py +7 -7
  307. ansible/modules/sysvinit.py +9 -9
  308. ansible/modules/tempfile.py +5 -6
  309. ansible/modules/template.py +6 -6
  310. ansible/modules/unarchive.py +38 -17
  311. ansible/modules/uri.py +33 -26
  312. ansible/modules/user.py +45 -32
  313. ansible/modules/validate_argument_spec.py +10 -7
  314. ansible/modules/wait_for.py +70 -60
  315. ansible/modules/wait_for_connection.py +6 -6
  316. ansible/modules/yum_repository.py +10 -9
  317. ansible/parsing/ajson.py +17 -37
  318. ansible/parsing/dataloader.py +99 -54
  319. ansible/parsing/mod_args.py +62 -60
  320. ansible/parsing/plugin_docs.py +21 -86
  321. ansible/parsing/quoting.py +1 -1
  322. ansible/parsing/splitter.py +27 -12
  323. ansible/parsing/utils/addresses.py +24 -24
  324. ansible/parsing/utils/jsonify.py +5 -1
  325. ansible/parsing/utils/yaml.py +32 -61
  326. ansible/parsing/vault/__init__.py +327 -99
  327. ansible/parsing/yaml/__init__.py +0 -18
  328. ansible/parsing/yaml/dumper.py +6 -120
  329. ansible/parsing/yaml/loader.py +6 -39
  330. ansible/parsing/yaml/objects.py +43 -335
  331. ansible/playbook/__init__.py +1 -1
  332. ansible/playbook/attribute.py +8 -3
  333. ansible/playbook/base.py +187 -134
  334. ansible/playbook/block.py +26 -24
  335. ansible/playbook/collectionsearch.py +1 -15
  336. ansible/playbook/conditional.py +3 -77
  337. ansible/playbook/handler.py +8 -2
  338. ansible/playbook/helpers.py +41 -53
  339. ansible/playbook/included_file.py +32 -26
  340. ansible/playbook/loop_control.py +2 -2
  341. ansible/playbook/play.py +85 -44
  342. ansible/playbook/play_context.py +14 -17
  343. ansible/playbook/playbook_include.py +27 -62
  344. ansible/playbook/role/__init__.py +64 -49
  345. ansible/playbook/role/definition.py +15 -17
  346. ansible/playbook/role/include.py +2 -4
  347. ansible/playbook/role/metadata.py +10 -11
  348. ansible/playbook/role_include.py +3 -3
  349. ansible/playbook/taggable.py +28 -12
  350. ansible/playbook/task.py +192 -121
  351. ansible/playbook/task_include.py +5 -5
  352. ansible/plugins/__init__.py +58 -26
  353. ansible/plugins/action/__init__.py +188 -186
  354. ansible/plugins/action/add_host.py +2 -2
  355. ansible/plugins/action/assemble.py +11 -18
  356. ansible/plugins/action/assert.py +55 -67
  357. ansible/plugins/action/async_status.py +7 -2
  358. ansible/plugins/action/copy.py +14 -17
  359. ansible/plugins/action/debug.py +37 -31
  360. ansible/plugins/action/dnf.py +3 -4
  361. ansible/plugins/action/fail.py +1 -1
  362. ansible/plugins/action/fetch.py +7 -8
  363. ansible/plugins/action/gather_facts.py +13 -14
  364. ansible/plugins/action/group_by.py +1 -1
  365. ansible/plugins/action/include_vars.py +10 -11
  366. ansible/plugins/action/package.py +8 -14
  367. ansible/plugins/action/pause.py +2 -2
  368. ansible/plugins/action/script.py +27 -38
  369. ansible/plugins/action/service.py +9 -18
  370. ansible/plugins/action/set_fact.py +3 -12
  371. ansible/plugins/action/set_stats.py +3 -8
  372. ansible/plugins/action/template.py +47 -67
  373. ansible/plugins/action/unarchive.py +6 -16
  374. ansible/plugins/action/uri.py +9 -20
  375. ansible/plugins/action/validate_argument_spec.py +5 -5
  376. ansible/plugins/action/wait_for_connection.py +1 -1
  377. ansible/plugins/become/__init__.py +31 -8
  378. ansible/plugins/become/runas.py +71 -0
  379. ansible/plugins/become/su.py +13 -8
  380. ansible/plugins/become/sudo.py +19 -0
  381. ansible/plugins/cache/__init__.py +52 -63
  382. ansible/plugins/cache/base.py +8 -0
  383. ansible/plugins/cache/jsonfile.py +10 -16
  384. ansible/plugins/cache/memory.py +6 -12
  385. ansible/plugins/callback/__init__.py +294 -201
  386. ansible/plugins/callback/default.py +99 -95
  387. ansible/plugins/callback/junit.py +44 -43
  388. ansible/plugins/callback/minimal.py +28 -25
  389. ansible/plugins/callback/oneline.py +34 -21
  390. ansible/plugins/callback/tree.py +27 -16
  391. ansible/plugins/connection/__init__.py +47 -34
  392. ansible/plugins/connection/local.py +156 -60
  393. ansible/plugins/connection/paramiko_ssh.py +34 -24
  394. ansible/plugins/connection/psrp.py +76 -165
  395. ansible/plugins/connection/ssh.py +326 -86
  396. ansible/plugins/connection/winrm.py +62 -141
  397. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  398. ansible/plugins/doc_fragments/action_core.py +6 -6
  399. ansible/plugins/doc_fragments/backup.py +2 -2
  400. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  401. ansible/plugins/doc_fragments/constructed.py +8 -4
  402. ansible/plugins/doc_fragments/decrypt.py +2 -2
  403. ansible/plugins/doc_fragments/default_callback.py +2 -2
  404. ansible/plugins/doc_fragments/files.py +2 -2
  405. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  406. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  407. ansible/plugins/doc_fragments/return_common.py +2 -2
  408. ansible/plugins/doc_fragments/template_common.py +4 -4
  409. ansible/plugins/doc_fragments/url.py +17 -1
  410. ansible/plugins/doc_fragments/url_windows.py +2 -2
  411. ansible/plugins/doc_fragments/validate.py +2 -2
  412. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  413. ansible/plugins/filter/__init__.py +6 -2
  414. ansible/plugins/filter/b64decode.yml +22 -0
  415. ansible/plugins/filter/b64encode.yml +22 -0
  416. ansible/plugins/filter/bool.yml +11 -4
  417. ansible/plugins/filter/core.py +245 -120
  418. ansible/plugins/filter/encryption.py +42 -34
  419. ansible/plugins/filter/flatten.yml +3 -2
  420. ansible/plugins/filter/human_to_bytes.yml +1 -1
  421. ansible/plugins/filter/mathstuff.py +30 -37
  422. ansible/plugins/filter/password_hash.yml +8 -0
  423. ansible/plugins/filter/pow.yml +1 -1
  424. ansible/plugins/filter/regex_search.yml +1 -4
  425. ansible/plugins/filter/root.yml +1 -1
  426. ansible/plugins/filter/split.yml +1 -1
  427. ansible/plugins/filter/strftime.yml +3 -3
  428. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  429. ansible/plugins/filter/to_uuid.yml +1 -1
  430. ansible/plugins/filter/to_yaml.yml +0 -4
  431. ansible/plugins/filter/unvault.yml +1 -1
  432. ansible/plugins/filter/urls.py +1 -1
  433. ansible/plugins/filter/urlsplit.py +8 -9
  434. ansible/plugins/filter/vault.yml +14 -9
  435. ansible/plugins/filter/win_basename.yml +6 -1
  436. ansible/plugins/filter/win_dirname.yml +5 -0
  437. ansible/plugins/inventory/__init__.py +107 -86
  438. ansible/plugins/inventory/advanced_host_list.py +7 -5
  439. ansible/plugins/inventory/auto.py +11 -4
  440. ansible/plugins/inventory/constructed.py +21 -24
  441. ansible/plugins/inventory/generator.py +16 -11
  442. ansible/plugins/inventory/host_list.py +7 -5
  443. ansible/plugins/inventory/ini.py +78 -44
  444. ansible/plugins/inventory/script.py +190 -120
  445. ansible/plugins/inventory/toml.py +16 -126
  446. ansible/plugins/inventory/yaml.py +10 -8
  447. ansible/plugins/list.py +72 -19
  448. ansible/plugins/loader.py +383 -198
  449. ansible/plugins/lookup/__init__.py +21 -4
  450. ansible/plugins/lookup/config.py +21 -35
  451. ansible/plugins/lookup/csvfile.py +19 -73
  452. ansible/plugins/lookup/dict.py +1 -6
  453. ansible/plugins/lookup/env.py +12 -9
  454. ansible/plugins/lookup/file.py +5 -8
  455. ansible/plugins/lookup/first_found.py +87 -55
  456. ansible/plugins/lookup/indexed_items.py +1 -10
  457. ansible/plugins/lookup/ini.py +14 -13
  458. ansible/plugins/lookup/items.py +1 -1
  459. ansible/plugins/lookup/lines.py +8 -1
  460. ansible/plugins/lookup/list.py +1 -1
  461. ansible/plugins/lookup/nested.py +2 -18
  462. ansible/plugins/lookup/password.py +5 -5
  463. ansible/plugins/lookup/pipe.py +5 -7
  464. ansible/plugins/lookup/sequence.py +18 -8
  465. ansible/plugins/lookup/subelements.py +1 -4
  466. ansible/plugins/lookup/template.py +47 -36
  467. ansible/plugins/lookup/together.py +0 -12
  468. ansible/plugins/lookup/unvault.py +1 -5
  469. ansible/plugins/lookup/url.py +4 -10
  470. ansible/plugins/lookup/vars.py +16 -24
  471. ansible/plugins/shell/__init__.py +58 -4
  472. ansible/plugins/shell/cmd.py +2 -2
  473. ansible/plugins/shell/powershell.py +106 -31
  474. ansible/plugins/shell/sh.py +13 -7
  475. ansible/plugins/strategy/__init__.py +168 -193
  476. ansible/plugins/strategy/debug.py +2 -2
  477. ansible/plugins/strategy/free.py +16 -31
  478. ansible/plugins/strategy/host_pinned.py +2 -2
  479. ansible/plugins/strategy/linear.py +41 -41
  480. ansible/plugins/terminal/__init__.py +4 -4
  481. ansible/plugins/test/__init__.py +7 -2
  482. ansible/plugins/test/core.py +75 -35
  483. ansible/plugins/test/files.py +1 -1
  484. ansible/plugins/test/finished.yml +1 -1
  485. ansible/plugins/test/mathstuff.py +3 -3
  486. ansible/plugins/test/uri.py +5 -8
  487. ansible/plugins/vars/host_group_vars.py +7 -14
  488. ansible/release.py +2 -2
  489. ansible/template/__init__.py +353 -943
  490. ansible/utils/__init__.py +0 -18
  491. ansible/utils/collection_loader/__init__.py +54 -5
  492. ansible/utils/collection_loader/_collection_config.py +5 -6
  493. ansible/utils/collection_loader/_collection_finder.py +82 -96
  494. ansible/utils/collection_loader/_collection_meta.py +15 -8
  495. ansible/utils/display.py +485 -73
  496. ansible/utils/encrypt.py +27 -19
  497. ansible/utils/fqcn.py +2 -2
  498. ansible/utils/galaxy.py +2 -2
  499. ansible/utils/hashing.py +8 -10
  500. ansible/utils/helpers.py +2 -2
  501. ansible/utils/listify.py +10 -8
  502. ansible/utils/lock.py +2 -2
  503. ansible/utils/path.py +10 -12
  504. ansible/utils/plugin_docs.py +16 -14
  505. ansible/utils/py3compat.py +2 -7
  506. ansible/utils/sentinel.py +4 -62
  507. ansible/utils/singleton.py +2 -0
  508. ansible/utils/ssh_functions.py +6 -2
  509. ansible/utils/unsafe_proxy.py +23 -332
  510. ansible/utils/vars.py +55 -8
  511. ansible/utils/version.py +2 -2
  512. ansible/vars/clean.py +5 -5
  513. ansible/vars/hostvars.py +60 -90
  514. ansible/vars/manager.py +220 -285
  515. ansible/vars/plugins.py +4 -4
  516. ansible/vars/reserved.py +13 -12
  517. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
  518. ansible_core-2.19.0.dist-info/RECORD +1097 -0
  519. ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
  520. ansible_test/_data/completion/docker.txt +7 -7
  521. ansible_test/_data/completion/remote.txt +6 -6
  522. ansible_test/_data/completion/windows.txt +1 -0
  523. ansible_test/_data/requirements/ansible.txt +2 -2
  524. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  525. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  526. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  527. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  528. ansible_test/_data/requirements/sanity.pylint.txt +5 -5
  529. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  530. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  531. ansible_test/_data/requirements/units.txt +1 -0
  532. ansible_test/_internal/__init__.py +6 -0
  533. ansible_test/_internal/ansible_util.py +3 -1
  534. ansible_test/_internal/become.py +1 -0
  535. ansible_test/_internal/bootstrap.py +1 -0
  536. ansible_test/_internal/cache.py +1 -0
  537. ansible_test/_internal/cgroup.py +1 -0
  538. ansible_test/_internal/ci/__init__.py +1 -0
  539. ansible_test/_internal/ci/azp.py +1 -0
  540. ansible_test/_internal/ci/local.py +1 -0
  541. ansible_test/_internal/classification/__init__.py +1 -0
  542. ansible_test/_internal/classification/common.py +1 -0
  543. ansible_test/_internal/classification/csharp.py +1 -0
  544. ansible_test/_internal/classification/powershell.py +1 -0
  545. ansible_test/_internal/classification/python.py +1 -0
  546. ansible_test/_internal/cli/__init__.py +1 -0
  547. ansible_test/_internal/cli/actions.py +1 -0
  548. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  549. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  550. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  551. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  552. ansible_test/_internal/cli/commands/__init__.py +11 -5
  553. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  554. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  555. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  556. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  557. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  558. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  559. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  560. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  561. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  562. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  563. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  564. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  565. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  566. ansible_test/_internal/cli/commands/env.py +1 -0
  567. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  568. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  569. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  570. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  571. ansible_test/_internal/cli/commands/sanity.py +9 -0
  572. ansible_test/_internal/cli/commands/shell.py +1 -0
  573. ansible_test/_internal/cli/commands/units.py +1 -0
  574. ansible_test/_internal/cli/compat.py +1 -0
  575. ansible_test/_internal/cli/completers.py +1 -0
  576. ansible_test/_internal/cli/converters.py +1 -0
  577. ansible_test/_internal/cli/environments.py +52 -5
  578. ansible_test/_internal/cli/epilog.py +1 -0
  579. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  580. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  581. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  582. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  583. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  584. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  585. ansible_test/_internal/commands/__init__.py +1 -0
  586. ansible_test/_internal/commands/coverage/__init__.py +3 -2
  587. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  588. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  589. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  590. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  591. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  592. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  593. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  594. ansible_test/_internal/commands/coverage/combine.py +2 -1
  595. ansible_test/_internal/commands/coverage/erase.py +1 -0
  596. ansible_test/_internal/commands/coverage/html.py +1 -0
  597. ansible_test/_internal/commands/coverage/report.py +1 -0
  598. ansible_test/_internal/commands/coverage/xml.py +1 -0
  599. ansible_test/_internal/commands/env/__init__.py +2 -0
  600. ansible_test/_internal/commands/integration/__init__.py +22 -5
  601. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  602. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  603. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  604. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  605. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  606. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  607. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  608. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  609. ansible_test/_internal/commands/integration/cloud/httptester.py +3 -2
  610. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  611. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  612. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  613. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  614. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  615. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  616. ansible_test/_internal/commands/integration/coverage.py +8 -2
  617. ansible_test/_internal/commands/integration/filters.py +1 -0
  618. ansible_test/_internal/commands/integration/network.py +1 -0
  619. ansible_test/_internal/commands/integration/posix.py +1 -0
  620. ansible_test/_internal/commands/integration/windows.py +1 -0
  621. ansible_test/_internal/commands/sanity/__init__.py +19 -2
  622. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  623. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  624. ansible_test/_internal/commands/sanity/compile.py +1 -0
  625. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  626. ansible_test/_internal/commands/sanity/import.py +1 -0
  627. ansible_test/_internal/commands/sanity/integration_aliases.py +12 -0
  628. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  629. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  630. ansible_test/_internal/commands/sanity/pylint.py +25 -26
  631. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  632. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  633. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  634. ansible_test/_internal/commands/shell/__init__.py +44 -4
  635. ansible_test/_internal/commands/units/__init__.py +5 -1
  636. ansible_test/_internal/compat/__init__.py +1 -0
  637. ansible_test/_internal/compat/packaging.py +1 -0
  638. ansible_test/_internal/compat/yaml.py +1 -0
  639. ansible_test/_internal/completion.py +1 -0
  640. ansible_test/_internal/config.py +23 -13
  641. ansible_test/_internal/connections.py +1 -0
  642. ansible_test/_internal/constants.py +1 -0
  643. ansible_test/_internal/containers.py +1 -0
  644. ansible_test/_internal/content_config.py +1 -0
  645. ansible_test/_internal/core_ci.py +1 -0
  646. ansible_test/_internal/coverage_util.py +11 -10
  647. ansible_test/_internal/data.py +1 -0
  648. ansible_test/_internal/debugging.py +166 -0
  649. ansible_test/_internal/delegation.py +22 -13
  650. ansible_test/_internal/dev/__init__.py +1 -0
  651. ansible_test/_internal/dev/container_probe.py +1 -0
  652. ansible_test/_internal/diff.py +3 -2
  653. ansible_test/_internal/docker_util.py +2 -1
  654. ansible_test/_internal/encoding.py +1 -0
  655. ansible_test/_internal/executor.py +1 -0
  656. ansible_test/_internal/git.py +1 -0
  657. ansible_test/_internal/host_configs.py +1 -0
  658. ansible_test/_internal/host_profiles.py +260 -16
  659. ansible_test/_internal/http.py +1 -0
  660. ansible_test/_internal/init.py +1 -0
  661. ansible_test/_internal/inventory.py +39 -3
  662. ansible_test/_internal/io.py +1 -0
  663. ansible_test/_internal/metadata.py +95 -4
  664. ansible_test/_internal/payload.py +1 -0
  665. ansible_test/_internal/processes.py +80 -0
  666. ansible_test/_internal/provider/__init__.py +1 -0
  667. ansible_test/_internal/provider/layout/__init__.py +1 -0
  668. ansible_test/_internal/provider/layout/ansible.py +1 -0
  669. ansible_test/_internal/provider/layout/collection.py +1 -0
  670. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  671. ansible_test/_internal/provider/source/__init__.py +1 -0
  672. ansible_test/_internal/provider/source/git.py +1 -0
  673. ansible_test/_internal/provider/source/installed.py +1 -0
  674. ansible_test/_internal/provider/source/unsupported.py +1 -0
  675. ansible_test/_internal/provider/source/unversioned.py +1 -0
  676. ansible_test/_internal/provisioning.py +11 -4
  677. ansible_test/_internal/pypi_proxy.py +6 -5
  678. ansible_test/_internal/python_requirements.py +28 -0
  679. ansible_test/_internal/ssh.py +2 -5
  680. ansible_test/_internal/target.py +9 -0
  681. ansible_test/_internal/test.py +3 -2
  682. ansible_test/_internal/thread.py +3 -1
  683. ansible_test/_internal/timeout.py +2 -1
  684. ansible_test/_internal/util.py +41 -12
  685. ansible_test/_internal/util_common.py +18 -5
  686. ansible_test/_internal/venv.py +1 -0
  687. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  688. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  689. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  690. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  691. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  692. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  693. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  694. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  695. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  696. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  697. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  698. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  699. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  700. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  701. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  702. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  703. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  704. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +8 -5
  705. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
  706. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
  707. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
  708. ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
  709. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
  710. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
  711. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  712. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  713. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  714. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  715. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  716. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  717. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  718. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  719. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  720. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  721. ansible_test/_util/target/injector/python.py +8 -0
  722. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  723. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  724. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  725. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  726. ansible_test/_util/target/sanity/import/importer.py +15 -16
  727. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  728. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  729. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  730. ansible_test/_util/target/setup/requirements.py +38 -36
  731. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  732. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  733. ansible/compat/selectors.py +0 -32
  734. ansible/errors/yaml_strings.py +0 -138
  735. ansible/executor/action_write_locks.py +0 -44
  736. ansible/executor/discovery/python_target.py +0 -47
  737. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  738. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  739. ansible/module_utils/compat/importlib.py +0 -26
  740. ansible/module_utils/compat/selectors.py +0 -32
  741. ansible/module_utils/pycompat24.py +0 -73
  742. ansible/parsing/yaml/constructor.py +0 -178
  743. ansible/template/native_helpers.py +0 -251
  744. ansible/template/template.py +0 -43
  745. ansible/template/vars.py +0 -77
  746. ansible/utils/native_jinja.py +0 -11
  747. ansible/vars/fact_cache.py +0 -71
  748. ansible_core-2.18.7rc1.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -10,7 +10,7 @@
10
10
  from __future__ import annotations
11
11
 
12
12
 
13
- DOCUMENTATION = r'''
13
+ DOCUMENTATION = r"""
14
14
  ---
15
15
  module: unarchive
16
16
  version_added: '1.4'
@@ -150,9 +150,9 @@ seealso:
150
150
  - module: community.general.iso_extract
151
151
  - module: community.windows.win_unzip
152
152
  author: Michael DeHaan
153
- '''
153
+ """
154
154
 
155
- EXAMPLES = r'''
155
+ EXAMPLES = r"""
156
156
  - name: Extract foo.tgz into /var/lib/foo
157
157
  ansible.builtin.unarchive:
158
158
  src: foo.tgz
@@ -177,9 +177,9 @@ EXAMPLES = r'''
177
177
  extra_opts:
178
178
  - --transform
179
179
  - s/^xxx/yyy/
180
- '''
180
+ """
181
181
 
182
- RETURN = r'''
182
+ RETURN = r"""
183
183
  dest:
184
184
  description: Path to the destination directory.
185
185
  returned: always
@@ -237,10 +237,11 @@ uid:
237
237
  returned: always
238
238
  type: int
239
239
  sample: 1000
240
- '''
240
+ """
241
241
 
242
242
  import binascii
243
243
  import codecs
244
+ import ctypes
244
245
  import fnmatch
245
246
  import grp
246
247
  import os
@@ -249,7 +250,6 @@ import pwd
249
250
  import re
250
251
  import stat
251
252
  import time
252
- import traceback
253
253
  from functools import partial
254
254
  from zipfile import ZipFile
255
255
 
@@ -262,6 +262,13 @@ from ansible.module_utils.urls import fetch_file
262
262
  from shlex import quote
263
263
  from zipfile import BadZipFile
264
264
 
265
+ try:
266
+ from functools import cache
267
+ except ImportError:
268
+ # Python < 3.9
269
+ from functools import lru_cache
270
+ cache = lru_cache(maxsize=None)
271
+
265
272
  # String from tar that shows the tar contents are different from the
266
273
  # filesystem
267
274
  OWNER_DIFF_RE = re.compile(r': Uid differs$')
@@ -279,8 +286,20 @@ CONTENT_DIFF_RE = re.compile(r': Contents differ$')
279
286
  SIZE_DIFF_RE = re.compile(r': Size differs$')
280
287
 
281
288
 
289
+ @cache
290
+ def _y2038_impacted():
291
+ """Determine if the system has 64-bit time_t."""
292
+ if hasattr(ctypes, "c_time_t"): # Python >= 3.12
293
+ return ctypes.sizeof(ctypes.c_time_t) < 8
294
+ try:
295
+ time.gmtime(2**31)
296
+ except OverflowError:
297
+ return True
298
+ return False
299
+
300
+
282
301
  def crc32(path, buffer_size):
283
- ''' Return a CRC32 checksum of a file '''
302
+ """ Return a CRC32 checksum of a file """
284
303
 
285
304
  crc = binascii.crc32(b'')
286
305
  with open(path, 'rb') as f:
@@ -290,7 +309,7 @@ def crc32(path, buffer_size):
290
309
 
291
310
 
292
311
  def shell_escape(string):
293
- ''' Quote meta-characters in the args for the unix shell '''
312
+ """ Quote meta-characters in the args for the unix shell """
294
313
  return re.sub(r'([^A-Za-z0-9_])', r'\\\1', string)
295
314
 
296
315
 
@@ -321,7 +340,7 @@ class ZipArchive(object):
321
340
  )
322
341
 
323
342
  def _permstr_to_octal(self, modestr, umask):
324
- ''' Convert a Unix permission string (rw-r--r--) into a mode (0644) '''
343
+ """ Convert a Unix permission string (rw-r--r--) into a mode (0644) """
325
344
  revstr = modestr[::-1]
326
345
  mode = 0
327
346
  for j in range(0, 3):
@@ -414,6 +433,8 @@ class ZipArchive(object):
414
433
  try:
415
434
  if int(match.groups()[0]) < 1980:
416
435
  date_time = epoch_date_time
436
+ elif int(match.groups()[0]) >= 2038 and _y2038_impacted():
437
+ date_time = (2038, 1, 1, 0, 0, 0, 0, 0, 0)
417
438
  elif int(match.groups()[0]) > 2107:
418
439
  date_time = (2107, 12, 31, 23, 59, 59, 0, 0, 0)
419
440
  else:
@@ -676,7 +697,7 @@ class ZipArchive(object):
676
697
  try:
677
698
  mode = AnsibleModule._symbolic_mode_to_octal(st, self.file_args['mode'])
678
699
  except ValueError as e:
679
- self.module.fail_json(path=path, msg="%s" % to_native(e), exception=traceback.format_exc())
700
+ self.module.fail_json(path=path, msg="%s" % to_native(e))
680
701
  # Only special files require no umask-handling
681
702
  elif ztype == '?':
682
703
  mode = self._permstr_to_octal(permstr, 0)
@@ -1111,8 +1132,8 @@ def main():
1111
1132
  res_args['extract_results'] = handler.unarchive()
1112
1133
  if res_args['extract_results']['rc'] != 0:
1113
1134
  module.fail_json(msg="failed to unpack %s to %s" % (src, dest), **res_args)
1114
- except IOError:
1115
- module.fail_json(msg="failed to unpack %s to %s" % (src, dest), **res_args)
1135
+ except OSError as ex:
1136
+ module.fail_json(f"Failed to unpack {src!r} to {dest!r}.", exception=ex, **res_args)
1116
1137
  else:
1117
1138
  res_args['changed'] = True
1118
1139
 
@@ -1129,8 +1150,8 @@ def main():
1129
1150
 
1130
1151
  try:
1131
1152
  res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
1132
- except (IOError, OSError) as e:
1133
- module.fail_json(msg="Unexpected error when accessing exploded file: %s" % to_native(e), **res_args)
1153
+ except OSError as ex:
1154
+ module.fail_json("Unexpected error when accessing exploded file.", exception=ex, **res_args)
1134
1155
 
1135
1156
  if '/' in filename:
1136
1157
  top_folder_path = filename.split('/')[0]
@@ -1144,8 +1165,8 @@ def main():
1144
1165
  file_args['path'] = "%s/%s" % (dest, f)
1145
1166
  try:
1146
1167
  res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
1147
- except (IOError, OSError) as e:
1148
- module.fail_json(msg="Unexpected error when accessing exploded file: %s" % to_native(e), **res_args)
1168
+ except OSError as ex:
1169
+ module.fail_json("Unexpected error when accessing exploded file.", exception=ex, **res_args)
1149
1170
 
1150
1171
  if module.params['list_files']:
1151
1172
  res_args['files'] = handler.files_in_archive
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,7 +486,7 @@ 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
@@ -503,13 +503,13 @@ import socket
503
503
  import subprocess
504
504
  import time
505
505
  import math
506
+ import typing as t
506
507
 
507
508
  from ansible.module_utils import distro
508
509
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
509
510
  from ansible.module_utils.basic import AnsibleModule
510
511
  from ansible.module_utils.common.locale import get_best_parsable_locale
511
512
  from ansible.module_utils.common.sys_info import get_platform_subclass
512
- import ansible.module_utils.compat.typing as t
513
513
 
514
514
 
515
515
  class StructSpwdType(ctypes.Structure):
@@ -1092,7 +1092,7 @@ class User(object):
1092
1092
  return groups
1093
1093
 
1094
1094
  def user_group_membership(self, exclude_primary=True):
1095
- ''' Return a list of groups the user belongs to '''
1095
+ """ Return a list of groups the user belongs to """
1096
1096
  groups = []
1097
1097
  info = self.get_pwd_info()
1098
1098
  for group in grp.getgrall():
@@ -1341,7 +1341,7 @@ class User(object):
1341
1341
  try:
1342
1342
  with open(ssh_public_key_file, 'r') as f:
1343
1343
  ssh_public_key = f.read().strip()
1344
- except IOError:
1344
+ except OSError:
1345
1345
  return None
1346
1346
  return ssh_public_key
1347
1347
 
@@ -1376,16 +1376,24 @@ class User(object):
1376
1376
  self.module.exit_json(failed=True, msg="%s" % to_native(e))
1377
1377
  # get umask from /etc/login.defs and set correct home mode
1378
1378
  if os.path.exists(self.LOGIN_DEFS):
1379
- with open(self.LOGIN_DEFS, 'r') as f:
1380
- for line in f:
1381
- m = re.match(r'^UMASK\s+(\d+)$', line)
1382
- if m:
1383
- 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)
1384
1392
  mode = 0o777 & ~umask
1385
- try:
1386
- os.chmod(path, mode)
1387
- except OSError as e:
1388
- 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))
1389
1397
 
1390
1398
  def chown_homedir(self, uid, gid, path):
1391
1399
  try:
@@ -2442,7 +2450,7 @@ class DarwinUser(User):
2442
2450
  return groups
2443
2451
 
2444
2452
  def _get_user_property(self, property):
2445
- '''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."""
2446
2454
  cmd = self._get_dscl()
2447
2455
  cmd += ['-read', '/Users/%s' % self.name, property]
2448
2456
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
@@ -2462,10 +2470,10 @@ class DarwinUser(User):
2462
2470
  return None
2463
2471
 
2464
2472
  def _get_next_uid(self, system=None):
2465
- '''
2473
+ """
2466
2474
  Return the next available uid. If system=True, then
2467
2475
  uid should be below of 500, if possible.
2468
- '''
2476
+ """
2469
2477
  cmd = self._get_dscl()
2470
2478
  cmd += ['-list', '/Users', 'UniqueID']
2471
2479
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
@@ -2491,10 +2499,10 @@ class DarwinUser(User):
2491
2499
  return max_uid + 1
2492
2500
 
2493
2501
  def _change_user_password(self):
2494
- '''Change password for SELF.NAME against SELF.PASSWORD.
2502
+ """Change password for SELF.NAME against SELF.PASSWORD.
2495
2503
 
2496
2504
  Please note that password must be cleartext.
2497
- '''
2505
+ """
2498
2506
  # some documentation on how is stored passwords on OSX:
2499
2507
  # http://blog.lostpassword.com/2012/07/cracking-mac-os-x-lion-accounts-passwords/
2500
2508
  # http://null-byte.wonderhowto.com/how-to/hack-mac-os-x-lion-passwords-0130036/
@@ -2513,7 +2521,7 @@ class DarwinUser(User):
2513
2521
  return (rc, out, err)
2514
2522
 
2515
2523
  def _make_group_numerical(self):
2516
- '''Convert SELF.GROUP to is stringed numerical value suitable for dscl.'''
2524
+ """Convert SELF.GROUP to is stringed numerical value suitable for dscl."""
2517
2525
  if self.group is None:
2518
2526
  self.group = 'nogroup'
2519
2527
  try:
@@ -2524,8 +2532,8 @@ class DarwinUser(User):
2524
2532
  self.group = str(self.group)
2525
2533
 
2526
2534
  def __modify_group(self, group, action):
2527
- '''Add or remove SELF.NAME to or from GROUP depending on ACTION.
2528
- 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. """
2529
2537
  if action == 'add':
2530
2538
  option = '-a'
2531
2539
  else:
@@ -2538,8 +2546,8 @@ class DarwinUser(User):
2538
2546
  return (rc, out, err)
2539
2547
 
2540
2548
  def _modify_group(self):
2541
- '''Add or remove SELF.NAME to or from GROUP depending on ACTION.
2542
- 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. """
2543
2551
 
2544
2552
  rc = 0
2545
2553
  out = ''
@@ -2570,9 +2578,9 @@ class DarwinUser(User):
2570
2578
  return (rc, out, err, changed)
2571
2579
 
2572
2580
  def _update_system_user(self):
2573
- '''Hide or show user on login window according SELF.SYSTEM.
2581
+ """Hide or show user on login window according SELF.SYSTEM.
2574
2582
 
2575
- Returns 0 if a change has been made, None otherwise.'''
2583
+ Returns 0 if a change has been made, None otherwise."""
2576
2584
 
2577
2585
  plist_file = '/Library/Preferences/com.apple.loginwindow.plist'
2578
2586
 
@@ -2611,14 +2619,14 @@ class DarwinUser(User):
2611
2619
  return 0
2612
2620
 
2613
2621
  def user_exists(self):
2614
- '''Check is SELF.NAME is a known user on the system.'''
2622
+ """Check is SELF.NAME is a known user on the system."""
2615
2623
  cmd = self._get_dscl()
2616
2624
  cmd += ['-read', '/Users/%s' % self.name, 'UniqueID']
2617
2625
  (rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
2618
2626
  return rc == 0
2619
2627
 
2620
2628
  def remove_user(self):
2621
- '''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."""
2622
2630
  info = self.user_info()
2623
2631
 
2624
2632
  cmd = self._get_dscl()
@@ -3249,6 +3257,11 @@ class Alpine(BusyBox):
3249
3257
  distribution = 'Alpine'
3250
3258
 
3251
3259
 
3260
+ class Buildroot(BusyBox):
3261
+ platform = 'Linux'
3262
+ distribution = 'Buildroot'
3263
+
3264
+
3252
3265
  def main():
3253
3266
  ssh_defaults = dict(
3254
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
+ """