ansible-core 2.18.7__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.7.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.7.dist-info/RECORD +0 -992
  749. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
  750. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
  751. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
  752. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
  753. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  754. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  755. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  756. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  757. {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,54 @@
1
+ # Copyright: Contributors to the Ansible project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import multiprocessing.resource_tracker
7
+ import os
8
+ import re
9
+ import sys
10
+ import typing as t
11
+
12
+ from multiprocessing.shared_memory import SharedMemory
13
+
14
+
15
+ def main() -> t.Never:
16
+ if len(sys.argv) > 1:
17
+ exit_code = 0 if handle_prompt(sys.argv[1]) else 1
18
+ else:
19
+ exit_code = 1
20
+
21
+ sys.exit(exit_code)
22
+
23
+
24
+ def handle_prompt(prompt: str) -> bool:
25
+ if re.search(r'(The authenticity of host |differs from the key for the IP address)', prompt):
26
+ sys.stdout.write('no')
27
+ sys.stdout.flush()
28
+ return True
29
+
30
+ # deprecated: description='Python 3.13 and later support track' python_version='3.12'
31
+ can_track = sys.version_info[:2] >= (3, 13)
32
+ kwargs = dict(track=False) if can_track else {}
33
+
34
+ # This SharedMemory instance is intentionally not closed or unlinked.
35
+ # Closing will occur naturally in the SharedMemory finalizer.
36
+ # Unlinking is the responsibility of the process which created it.
37
+ shm = SharedMemory(name=os.environ['_ANSIBLE_SSH_ASKPASS_SHM'], **kwargs)
38
+
39
+ if not can_track:
40
+ # When track=False is not available, we must unregister explicitly, since it otherwise only occurs during unlink.
41
+ # This avoids resource tracker noise on stderr during process exit.
42
+ multiprocessing.resource_tracker.unregister(shm._name, 'shared_memory')
43
+
44
+ cfg = json.loads(shm.buf.tobytes().rstrip(b'\x00'))
45
+
46
+ if cfg['prompt'] not in prompt:
47
+ return False
48
+
49
+ # Report the password provided by the SharedMemory instance.
50
+ # The contents are left untouched after consumption to allow subsequent attempts to succeed.
51
+ # This can occur when multiple password prompting methods are enabled, such as password and keyboard-interactive, which is the default on macOS.
52
+ sys.stdout.write(cfg['password'])
53
+ sys.stdout.flush()
54
+ return True
ansible/cli/adhoc.py CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import json
10
+
9
11
  # ansible.cli needs to be imported first, to ensure the source bin/* scripts run that code first
10
12
  from ansible.cli import CLI
11
13
  from ansible import constants as C
@@ -15,23 +17,26 @@ from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
15
17
  from ansible.executor.task_queue_manager import TaskQueueManager
16
18
  from ansible.module_utils.common.text.converters import to_text
17
19
  from ansible.parsing.splitter import parse_kv
18
- from ansible.parsing.utils.yaml import from_yaml
19
20
  from ansible.playbook import Playbook
20
21
  from ansible.playbook.play import Play
22
+ from ansible._internal._datatag._tags import Origin
21
23
  from ansible.utils.display import Display
24
+ from ansible._internal._json._profiles import _legacy
22
25
 
23
26
  display = Display()
24
27
 
25
28
 
26
29
  class AdHocCLI(CLI):
27
- ''' is an extra-simple tool/framework/API for doing 'remote things'.
30
+ """ is an extra-simple tool/framework/API for doing 'remote things'.
28
31
  this command allows you to define and run a single task 'playbook' against a set of hosts
29
- '''
32
+ """
30
33
 
31
34
  name = 'ansible'
32
35
 
36
+ USES_CONNECTION = True
37
+
33
38
  def init_parser(self):
34
- ''' create an options parser for bin/ansible '''
39
+ """ create an options parser for bin/ansible """
35
40
  super(AdHocCLI, self).init_parser(usage='%prog <host-pattern> [options]',
36
41
  desc="Define and run a single task 'playbook' against a set of hosts",
37
42
  epilog="Some actions do not make sense in Ad-Hoc (include, meta, etc)")
@@ -60,7 +65,7 @@ class AdHocCLI(CLI):
60
65
  self.parser.add_argument('args', metavar='pattern', help='host pattern')
61
66
 
62
67
  def post_process_args(self, options):
63
- '''Post process and validate options for bin/ansible '''
68
+ """Post process and validate options for bin/ansible """
64
69
 
65
70
  options = super(AdHocCLI, self).post_process_args(options)
66
71
 
@@ -76,15 +81,20 @@ class AdHocCLI(CLI):
76
81
  module_args = None
77
82
  if module_args_raw and module_args_raw.startswith('{') and module_args_raw.endswith('}'):
78
83
  try:
79
- module_args = from_yaml(module_args_raw.strip(), json_only=True)
84
+ module_args = json.loads(module_args_raw, cls=_legacy.Decoder)
80
85
  except AnsibleParserError:
81
86
  pass
82
87
 
83
88
  if not module_args:
84
89
  module_args = parse_kv(module_args_raw, check_raw=check_raw)
85
90
 
86
- mytask = {'action': {'module': context.CLIARGS['module_name'], 'args': module_args},
87
- 'timeout': context.CLIARGS['task_timeout']}
91
+ mytask = dict(
92
+ action=context.CLIARGS['module_name'],
93
+ args=module_args,
94
+ timeout=context.CLIARGS['task_timeout'],
95
+ )
96
+
97
+ mytask = Origin(description=f'<adhoc {context.CLIARGS["module_name"]!r} task>').tag(mytask)
88
98
 
89
99
  # avoid adding to tasks that don't support it, unless set, then give user an error
90
100
  if context.CLIARGS['module_name'] not in C._ACTION_ALL_INCLUDE_ROLE_TASKS and any(frozenset((async_val, poll))):
@@ -98,7 +108,7 @@ class AdHocCLI(CLI):
98
108
  tasks=[mytask])
99
109
 
100
110
  def run(self):
101
- ''' create and execute the single task playbook '''
111
+ """ create and execute the single task playbook """
102
112
 
103
113
  super(AdHocCLI, self).run()
104
114
 
@@ -177,7 +187,7 @@ class AdHocCLI(CLI):
177
187
  variable_manager=variable_manager,
178
188
  loader=loader,
179
189
  passwords=passwords,
180
- stdout_callback=cb,
190
+ stdout_callback_name=cb,
181
191
  run_additional_callbacks=C.DEFAULT_LOAD_CALLBACK_PLUGINS,
182
192
  run_tree=run_tree,
183
193
  forks=context.CLIARGS['forks'],
@@ -4,22 +4,28 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import copy
7
+ import dataclasses
8
+ import inspect
7
9
  import operator
8
10
  import argparse
9
11
  import os
10
12
  import os.path
11
13
  import sys
12
14
  import time
15
+ import typing as t
13
16
 
14
- from jinja2 import __version__ as j2_version
17
+ import yaml
15
18
 
16
19
  import ansible
17
20
  from ansible import constants as C
21
+ from ansible._internal import _templating
18
22
  from ansible.module_utils.common.text.converters import to_native
19
23
  from ansible.module_utils.common.yaml import HAS_LIBYAML, yaml_load
20
24
  from ansible.release import __version__
21
25
  from ansible.utils.path import unfrackpath
22
26
 
27
+ from ansible._internal._datatag._tags import TrustedAsTemplate, Origin
28
+
23
29
 
24
30
  #
25
31
  # Special purpose OptionParsers
@@ -30,13 +36,118 @@ class SortingHelpFormatter(argparse.HelpFormatter):
30
36
  super(SortingHelpFormatter, self).add_arguments(actions)
31
37
 
32
38
 
39
+ @dataclasses.dataclass(frozen=True, kw_only=True)
40
+ class DeprecatedArgument:
41
+ version: str
42
+ """The Ansible version that will remove the deprecated argument."""
43
+
44
+ option: str | None = None
45
+ """The specific option string that is deprecated; None applies to all options for this argument."""
46
+
47
+ def is_deprecated(self, option: str) -> bool:
48
+ """Return True if the given option is deprecated, otherwise False."""
49
+ return self.option is None or option == self.option
50
+
51
+ def check(self, option: str) -> None:
52
+ """Display a deprecation warning if the given option is deprecated."""
53
+ if not self.is_deprecated(option):
54
+ return
55
+
56
+ from ansible.utils.display import Display
57
+
58
+ Display().deprecated( # pylint: disable=ansible-invalid-deprecated-version
59
+ msg=f'The {option!r} argument is deprecated.',
60
+ version=self.version,
61
+ )
62
+
63
+
33
64
  class ArgumentParser(argparse.ArgumentParser):
34
- def add_argument(self, *args, **kwargs):
65
+ def __init__(self, *args, **kwargs) -> None:
66
+ self.__actions: dict[str | None, type[argparse.Action]] = {}
67
+
68
+ super().__init__(*args, **kwargs)
69
+
70
+ def register(self, registry_name, value, object):
71
+ """Track registration of actions so that they can be resolved later by name, without depending on the internals of ArgumentParser."""
72
+ if registry_name == 'action':
73
+ self.__actions[value] = object
74
+
75
+ super().register(registry_name, value, object)
76
+
77
+ def _patch_argument(self, args: tuple[str, ...], kwargs: dict[str, t.Any]) -> None:
78
+ """
79
+ Patch `kwargs` for an `add_argument` call using the given `args` and `kwargs`.
80
+ This is used to apply tags to entire categories of CLI arguments.
81
+ """
82
+ name = args[0]
83
+ action = kwargs.get('action')
84
+ resolved_action = self.__actions.get(action, action) # get the action by name, or use as-is (assume it's a subclass of argparse.Action)
85
+ action_signature = inspect.signature(resolved_action.__init__)
86
+
87
+ if action_signature.parameters.get('type'):
88
+ arg_type = kwargs.get('type', str)
89
+
90
+ if not callable(arg_type):
91
+ raise ValueError(f'Argument {name!r} requires a callable for the {"type"!r} parameter, not {arg_type!r}.')
92
+
93
+ wrapped_arg_type = _tagged_type_factory(name, arg_type)
94
+
95
+ kwargs.update(type=wrapped_arg_type)
96
+
97
+ def _patch_parser(self, parser):
98
+ """Patch and return the given parser to intercept the `add_argument` method for further patching."""
99
+ parser_add_argument = parser.add_argument
100
+
101
+ def add_argument(*ag_args, **ag_kwargs):
102
+ self._patch_argument(ag_args, ag_kwargs)
103
+
104
+ parser_add_argument(*ag_args, **ag_kwargs)
105
+
106
+ parser.add_argument = add_argument
107
+
108
+ return parser
109
+
110
+ def add_subparsers(self, *args, **kwargs):
111
+ sub = super().add_subparsers(*args, **kwargs)
112
+ sub_add_parser = sub.add_parser
113
+
114
+ def add_parser(*sub_args, **sub_kwargs):
115
+ return self._patch_parser(sub_add_parser(*sub_args, **sub_kwargs))
116
+
117
+ sub.add_parser = add_parser
118
+
119
+ return sub
120
+
121
+ def add_argument_group(self, *args, **kwargs):
122
+ return self._patch_parser(super().add_argument_group(*args, **kwargs))
123
+
124
+ def add_mutually_exclusive_group(self, *args, **kwargs):
125
+ return self._patch_parser(super().add_mutually_exclusive_group(*args, **kwargs))
126
+
127
+ def add_argument(self, *args, **kwargs) -> argparse.Action:
35
128
  action = kwargs.get('action')
36
129
  help = kwargs.get('help')
37
130
  if help and action in {'append', 'append_const', 'count', 'extend', PrependListAction}:
38
131
  help = f'{help.rstrip(".")}. This argument may be specified multiple times.'
39
132
  kwargs['help'] = help
133
+
134
+ self._patch_argument(args, kwargs)
135
+
136
+ deprecated: DeprecatedArgument | None
137
+
138
+ if deprecated := kwargs.pop('deprecated', None):
139
+ action_type = self.__actions.get(action, action)
140
+
141
+ class DeprecatedAction(action_type): # type: ignore[misc, valid-type]
142
+ """A wrapper around an action which handles deprecation warnings."""
143
+
144
+ def __call__(self, parser, namespace, values, option_string=None) -> t.Any:
145
+ deprecated.check(option_string)
146
+
147
+ return super().__call__(parser, namespace, values, option_string)
148
+
149
+ kwargs['action'] = DeprecatedAction
150
+
40
151
  return super().add_argument(*args, **kwargs)
41
152
 
42
153
 
@@ -132,7 +243,7 @@ def _git_repo_info(repo_path):
132
243
  repo_path = gitdir
133
244
  else:
134
245
  repo_path = os.path.join(repo_path[:-4], gitdir)
135
- except (IOError, AttributeError):
246
+ except (OSError, AttributeError):
136
247
  return ''
137
248
  with open(os.path.join(repo_path, "HEAD")) as f:
138
249
  line = f.readline().rstrip("\n")
@@ -182,13 +293,28 @@ def version(prog=None):
182
293
  cpath = "Default w/o overrides"
183
294
  else:
184
295
  cpath = C.DEFAULT_MODULE_PATH
296
+
297
+ if HAS_LIBYAML:
298
+ libyaml_fragment = "with libyaml"
299
+
300
+ # noinspection PyBroadException
301
+ try:
302
+ from yaml._yaml import get_version_string
303
+
304
+ libyaml_fragment += f" v{get_version_string()}"
305
+ except Exception: # pylint: disable=broad-except
306
+ libyaml_fragment += ", version unknown"
307
+ else:
308
+ libyaml_fragment = "without libyaml"
309
+
185
310
  result.append(" configured module search path = %s" % cpath)
186
311
  result.append(" ansible python module location = %s" % ':'.join(ansible.__path__))
187
312
  result.append(" ansible collection location = %s" % ':'.join(C.COLLECTIONS_PATHS))
188
313
  result.append(" executable location = %s" % sys.argv[0])
189
314
  result.append(" python version = %s (%s)" % (''.join(sys.version.splitlines()), to_native(sys.executable)))
190
- result.append(" jinja version = %s" % j2_version)
191
- result.append(" libyaml = %s" % HAS_LIBYAML)
315
+ result.append(f" jinja version = {_templating.jinja2_version}")
316
+ result.append(f" pyyaml version = {yaml.__version__} ({libyaml_fragment})")
317
+
192
318
  return "\n".join(result)
193
319
 
194
320
 
@@ -292,19 +418,20 @@ def add_fork_options(parser):
292
418
  def add_inventory_options(parser):
293
419
  """Add options for commands that utilize inventory"""
294
420
  parser.add_argument('-i', '--inventory', '--inventory-file', dest='inventory', action="append",
295
- help="specify inventory host path or comma separated host list. --inventory-file is deprecated")
421
+ help="specify inventory host path or comma separated host list",
422
+ deprecated=DeprecatedArgument(version='2.23', option='--inventory-file'))
296
423
  parser.add_argument('--list-hosts', dest='listhosts', action='store_true',
297
424
  help='outputs a list of matching hosts; does not execute anything else')
298
425
  parser.add_argument('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset',
299
426
  help='further limit selected hosts to an additional pattern')
427
+ parser.add_argument('--flush-cache', dest='flush_cache', action='store_true',
428
+ help="clear the fact cache for every host in inventory")
300
429
 
301
430
 
302
431
  def add_meta_options(parser):
303
432
  """Add options for commands which can launch meta tasks from the command line"""
304
433
  parser.add_argument('--force-handlers', default=C.DEFAULT_FORCE_HANDLERS, dest='force_handlers', action='store_true',
305
434
  help="run handlers even if a task fails")
306
- parser.add_argument('--flush-cache', dest='flush_cache', action='store_true',
307
- help="clear the fact cache for every host in inventory")
308
435
 
309
436
 
310
437
  def add_module_options(parser):
@@ -318,9 +445,9 @@ def add_module_options(parser):
318
445
  def add_output_options(parser):
319
446
  """Add options for commands which can change their output"""
320
447
  parser.add_argument('-o', '--one-line', dest='one_line', action='store_true',
321
- help='condense output')
448
+ help='condense output', deprecated=DeprecatedArgument(version='2.23'))
322
449
  parser.add_argument('-t', '--tree', dest='tree', default=None,
323
- help='log output to this directory')
450
+ help='log output to this directory', deprecated=DeprecatedArgument(version='2.23'))
324
451
 
325
452
 
326
453
  def add_runas_options(parser):
@@ -396,3 +523,29 @@ def add_vault_options(parser):
396
523
  help='ask for vault password')
397
524
  base_group.add_argument('--vault-password-file', '--vault-pass-file', default=[], dest='vault_password_files',
398
525
  help="vault password file", type=unfrack_path(follow=False), action='append')
526
+
527
+
528
+ def _tagged_type_factory(name: str, func: t.Callable[[str], object], /) -> t.Callable[[str], object]:
529
+ """
530
+ Return a callable that wraps the given function.
531
+ The result of the wrapped function will be tagged with Origin.
532
+ It will also be tagged with TrustedAsTemplate if it is equal to the original input string.
533
+ """
534
+ def tag_value(value: str) -> object:
535
+ result = func(value)
536
+
537
+ if result is value or func is str:
538
+ # Values which are not mutated are automatically trusted for templating.
539
+ # The `is` reference equality is critically important, as other types may only alter the tags, so object equality is
540
+ # not sufficient to prevent them being tagged as trusted when they should not.
541
+ # Explicitly include all usages using the `str` type factory since it strips tags.
542
+ result = TrustedAsTemplate().tag(result)
543
+
544
+ if not (origin := Origin.get_tag(value)):
545
+ origin = Origin(description=f'<CLI option {name!r}>')
546
+
547
+ return origin.tag(result)
548
+
549
+ tag_value._name = name # simplify debugging by attaching the argument name to the function
550
+
551
+ return tag_value
ansible/cli/config.py CHANGED
@@ -10,7 +10,6 @@ from ansible.cli import CLI
10
10
 
11
11
  import os
12
12
  import shlex
13
- import subprocess
14
13
  import sys
15
14
  import yaml
16
15
 
@@ -21,10 +20,10 @@ import ansible.plugins.loader as plugin_loader
21
20
 
22
21
  from ansible import constants as C
23
22
  from ansible.cli.arguments import option_helpers as opt_help
24
- from ansible.config.manager import ConfigManager, Setting
23
+ from ansible.config.manager import ConfigManager
25
24
  from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleRequiredOptionError
26
25
  from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes
27
- from ansible.module_utils.common.json import json_dump
26
+ from ansible._internal import _json
28
27
  from ansible.module_utils.six import string_types
29
28
  from ansible.parsing.quoting import is_quoted
30
29
  from ansible.parsing.yaml.dumper import AnsibleDumper
@@ -47,14 +46,14 @@ def yaml_short(data):
47
46
 
48
47
 
49
48
  def get_constants():
50
- ''' helper method to ensure we can template based on existing constants '''
49
+ """ helper method to ensure we can template based on existing constants """
51
50
  if not hasattr(get_constants, 'cvars'):
52
51
  get_constants.cvars = {k: getattr(C, k) for k in dir(C) if not k.startswith('__')}
53
52
  return get_constants.cvars
54
53
 
55
54
 
56
55
  def _ansible_env_vars(varname):
57
- ''' return true or false depending if variable name is possibly a 'configurable' ansible env variable '''
56
+ """ return true or false depending if variable name is possibly a 'configurable' ansible env variable """
58
57
  return all(
59
58
  [
60
59
  varname.startswith("ANSIBLE_"),
@@ -178,8 +177,6 @@ class ConfigCLI(CLI):
178
177
  except Exception:
179
178
  if context.CLIARGS['action'] in ['view']:
180
179
  raise
181
- elif context.CLIARGS['action'] in ['edit', 'update']:
182
- display.warning("File does not exist, used empty file: %s" % self.config_file)
183
180
 
184
181
  elif context.CLIARGS['action'] == 'view':
185
182
  raise AnsibleError('Invalid or no config file was supplied')
@@ -187,54 +184,16 @@ class ConfigCLI(CLI):
187
184
  # run the requested action
188
185
  context.CLIARGS['func']()
189
186
 
190
- def execute_update(self):
191
- '''
192
- Updates a single setting in the specified ansible.cfg
193
- '''
194
- raise AnsibleError("Option not implemented yet")
195
-
196
- # pylint: disable=unreachable
197
- if context.CLIARGS['setting'] is None:
198
- raise AnsibleOptionsError("update option requires a setting to update")
199
-
200
- (entry, value) = context.CLIARGS['setting'].split('=')
201
- if '.' in entry:
202
- (section, option) = entry.split('.')
203
- else:
204
- section = 'defaults'
205
- option = entry
206
- subprocess.call([
207
- 'ansible',
208
- '-m', 'ini_file',
209
- 'localhost',
210
- '-c', 'local',
211
- '-a', '"dest=%s section=%s option=%s value=%s backup=yes"' % (self.config_file, section, option, value)
212
- ])
213
-
214
187
  def execute_view(self):
215
- '''
188
+ """
216
189
  Displays the current config file
217
- '''
190
+ """
218
191
  try:
219
192
  with open(self.config_file, 'rb') as f:
220
193
  self.pager(to_text(f.read(), errors='surrogate_or_strict'))
221
194
  except Exception as e:
222
195
  raise AnsibleError("Failed to open config file: %s" % to_native(e))
223
196
 
224
- def execute_edit(self):
225
- '''
226
- Opens ansible.cfg in the default EDITOR
227
- '''
228
- raise AnsibleError("Option not implemented yet")
229
-
230
- # pylint: disable=unreachable
231
- try:
232
- editor = shlex.split(C.config.get_config_value('EDITOR'))
233
- editor.append(self.config_file)
234
- subprocess.call(editor)
235
- except Exception as e:
236
- raise AnsibleError("Failed to open editor: %s" % to_native(e))
237
-
238
197
  def _list_plugin_settings(self, ptype, plugins=None):
239
198
  entries = {}
240
199
  loader = getattr(plugin_loader, '%s_loader' % ptype)
@@ -266,9 +225,9 @@ class ConfigCLI(CLI):
266
225
  return entries
267
226
 
268
227
  def _list_entries_from_args(self):
269
- '''
228
+ """
270
229
  build a dict with the list requested configs
271
- '''
230
+ """
272
231
 
273
232
  config_entries = {}
274
233
  if context.CLIARGS['type'] in ('base', 'all'):
@@ -294,15 +253,15 @@ class ConfigCLI(CLI):
294
253
  return config_entries
295
254
 
296
255
  def execute_list(self):
297
- '''
256
+ """
298
257
  list and output available configs
299
- '''
258
+ """
300
259
 
301
260
  config_entries = self._list_entries_from_args()
302
261
  if context.CLIARGS['format'] == 'yaml':
303
262
  output = yaml_dump(config_entries)
304
263
  elif context.CLIARGS['format'] == 'json':
305
- output = json_dump(config_entries)
264
+ output = _json.json_dumps_formatted(config_entries)
306
265
 
307
266
  self.pager(to_text(output, errors='surrogate_or_strict'))
308
267
 
@@ -458,21 +417,21 @@ class ConfigCLI(CLI):
458
417
 
459
418
  entries = []
460
419
  for setting in sorted(config):
461
- changed = (config[setting].origin not in ('default', 'REQUIRED') and setting not in _IGNORE_CHANGED)
420
+ changed = (config[setting]['origin'] not in ('default', 'REQUIRED') and setting not in _IGNORE_CHANGED)
462
421
 
463
422
  if context.CLIARGS['format'] == 'display':
464
- if isinstance(config[setting], Setting):
423
+ if isinstance(config[setting], dict):
465
424
  # proceed normally
466
- value = config[setting].value
467
- if config[setting].origin == 'default' or setting in _IGNORE_CHANGED:
425
+ value = config[setting]['value']
426
+ if config[setting]['origin'] == 'default' or setting in _IGNORE_CHANGED:
468
427
  color = 'green'
469
428
  value = self.config.template_default(value, get_constants())
470
- elif config[setting].origin == 'REQUIRED':
429
+ elif config[setting]['origin'] == 'REQUIRED':
471
430
  # should include '_terms', '_input', etc
472
431
  color = 'red'
473
432
  else:
474
433
  color = 'yellow'
475
- msg = "%s(%s) = %s" % (setting, config[setting].origin, value)
434
+ msg = "%s(%s) = %s" % (setting, config[setting]['origin'], value)
476
435
  else:
477
436
  color = 'green'
478
437
  msg = "%s(%s) = %s" % (setting, 'default', config[setting].get('default'))
@@ -480,10 +439,10 @@ class ConfigCLI(CLI):
480
439
  entry = stringc(msg, color)
481
440
  else:
482
441
  entry = {}
483
- for key in config[setting]._fields:
442
+ for key in config[setting].keys():
484
443
  if key == 'type':
485
444
  continue
486
- entry[key] = getattr(config[setting], key)
445
+ entry[key] = config[setting][key]
487
446
 
488
447
  if not context.CLIARGS['only_changed'] or changed:
489
448
  entries.append(entry)
@@ -495,11 +454,17 @@ class ConfigCLI(CLI):
495
454
  # Add base
496
455
  config = self.config.get_configuration_definitions(ignore_private=True)
497
456
  # convert to settings
457
+ settings = {}
498
458
  for setting in config.keys():
499
459
  v, o = C.config.get_config_value_and_origin(setting, cfile=self.config_file, variables=get_constants())
500
- config[setting] = Setting(setting, v, o, None)
460
+ settings[setting] = {
461
+ 'name': setting,
462
+ 'value': v,
463
+ 'origin': o,
464
+ 'type': None
465
+ }
501
466
 
502
- return self._render_settings(config)
467
+ return self._render_settings(settings)
503
468
 
504
469
  def _get_plugin_configs(self, ptype, plugins):
505
470
 
@@ -554,7 +519,12 @@ class ConfigCLI(CLI):
554
519
  # not all cases will be error
555
520
  o = 'REQUIRED'
556
521
 
557
- config_entries[finalname][setting] = Setting(setting, v, o, None)
522
+ config_entries[finalname][setting] = {
523
+ 'name': setting,
524
+ 'value': v,
525
+ 'origin': o,
526
+ 'type': None
527
+ }
558
528
 
559
529
  # pretty please!
560
530
  results = self._render_settings(config_entries[finalname])
@@ -587,7 +557,12 @@ class ConfigCLI(CLI):
587
557
  if v is None and o is None:
588
558
  # not all cases will be error
589
559
  o = 'REQUIRED'
590
- server_config[setting] = Setting(setting, v, o, None)
560
+ server_config[setting] = {
561
+ 'name': setting,
562
+ 'value': v,
563
+ 'origin': o,
564
+ 'type': None
565
+ }
591
566
  if context.CLIARGS['format'] == 'display':
592
567
  if not context.CLIARGS['only_changed'] or server_config:
593
568
  equals = '=' * len(server)
@@ -599,9 +574,9 @@ class ConfigCLI(CLI):
599
574
  return output
600
575
 
601
576
  def execute_dump(self):
602
- '''
577
+ """
603
578
  Shows the current settings, merges ansible.cfg if specified
604
- '''
579
+ """
605
580
  output = []
606
581
  if context.CLIARGS['type'] in ('base', 'all'):
607
582
  # deal with base
@@ -617,7 +592,7 @@ class ConfigCLI(CLI):
617
592
  for server_config in server_config_list:
618
593
  server = list(server_config.keys())[0]
619
594
  server_reduced_config = server_config.pop(server)
620
- configs[server] = server_reduced_config
595
+ configs[server] = list(server_reduced_config.values())
621
596
  output.append({'GALAXY_SERVERS': configs})
622
597
 
623
598
  if context.CLIARGS['type'] == 'all':
@@ -644,7 +619,7 @@ class ConfigCLI(CLI):
644
619
  if context.CLIARGS['format'] == 'yaml':
645
620
  text = yaml_dump(output)
646
621
  elif context.CLIARGS['format'] == 'json':
647
- text = json_dump(output)
622
+ text = _json.json_dumps_formatted(output)
648
623
 
649
624
  self.pager(to_text(text, errors='surrogate_or_strict'))
650
625