ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_datatag/__init__.py +0 -0
  4. ansible/_internal/_datatag/_tags.py +130 -0
  5. ansible/_internal/_datatag/_utils.py +19 -0
  6. ansible/_internal/_datatag/_wrappers.py +33 -0
  7. ansible/_internal/_errors/__init__.py +0 -0
  8. ansible/_internal/_errors/_captured.py +128 -0
  9. ansible/_internal/_errors/_handler.py +91 -0
  10. ansible/_internal/_errors/_utils.py +310 -0
  11. ansible/_internal/_json/__init__.py +160 -0
  12. ansible/_internal/_json/_legacy_encoder.py +34 -0
  13. ansible/_internal/_json/_profiles/__init__.py +0 -0
  14. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  15. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  16. ansible/_internal/_json/_profiles/_legacy.py +198 -0
  17. ansible/_internal/_locking.py +21 -0
  18. ansible/_internal/_plugins/__init__.py +0 -0
  19. ansible/_internal/_plugins/_cache.py +57 -0
  20. ansible/_internal/_task.py +78 -0
  21. ansible/_internal/_templating/__init__.py +10 -0
  22. ansible/_internal/_templating/_access.py +86 -0
  23. ansible/_internal/_templating/_chain_templar.py +63 -0
  24. ansible/_internal/_templating/_datatag.py +95 -0
  25. ansible/_internal/_templating/_engine.py +588 -0
  26. ansible/_internal/_templating/_errors.py +28 -0
  27. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  28. ansible/_internal/_templating/_jinja_common.py +332 -0
  29. ansible/_internal/_templating/_jinja_patches.py +44 -0
  30. ansible/_internal/_templating/_jinja_plugins.py +351 -0
  31. ansible/_internal/_templating/_lazy_containers.py +633 -0
  32. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  33. ansible/_internal/_templating/_transform.py +63 -0
  34. ansible/_internal/_templating/_utils.py +107 -0
  35. ansible/_internal/_wrapt.py +1052 -0
  36. ansible/_internal/_yaml/__init__.py +0 -0
  37. ansible/_internal/_yaml/_constructor.py +240 -0
  38. ansible/_internal/_yaml/_dumper.py +62 -0
  39. ansible/_internal/_yaml/_errors.py +166 -0
  40. ansible/_internal/_yaml/_loader.py +66 -0
  41. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  58. ansible/cli/__init__.py +153 -89
  59. ansible/cli/_ssh_askpass.py +47 -0
  60. ansible/cli/adhoc.py +14 -7
  61. ansible/cli/arguments/option_helpers.py +154 -7
  62. ansible/cli/config.py +43 -68
  63. ansible/cli/console.py +10 -8
  64. ansible/cli/doc.py +48 -46
  65. ansible/cli/galaxy.py +27 -20
  66. ansible/cli/inventory.py +28 -26
  67. ansible/cli/playbook.py +4 -12
  68. ansible/cli/pull.py +51 -11
  69. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  70. ansible/cli/vault.py +12 -11
  71. ansible/compat/__init__.py +2 -2
  72. ansible/config/base.yml +165 -108
  73. ansible/config/manager.py +52 -49
  74. ansible/constants.py +3 -4
  75. ansible/errors/__init__.py +277 -235
  76. ansible/executor/interpreter_discovery.py +28 -149
  77. ansible/executor/module_common.py +426 -493
  78. ansible/executor/play_iterator.py +22 -27
  79. ansible/executor/playbook_executor.py +11 -11
  80. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  81. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  82. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  83. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  84. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  85. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  86. ansible/executor/powershell/module_manifest.py +417 -265
  87. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  88. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  89. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  90. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  91. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  92. ansible/executor/process/worker.py +136 -76
  93. ansible/executor/stats.py +5 -5
  94. ansible/executor/task_executor.py +237 -236
  95. ansible/executor/task_queue_manager.py +62 -38
  96. ansible/executor/task_result.py +21 -12
  97. ansible/galaxy/__init__.py +2 -2
  98. ansible/galaxy/api.py +22 -18
  99. ansible/galaxy/collection/__init__.py +1 -1
  100. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  101. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  102. ansible/galaxy/dependency_resolution/providers.py +1 -1
  103. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  104. ansible/galaxy/role.py +4 -8
  105. ansible/galaxy/token.py +28 -21
  106. ansible/inventory/data.py +47 -57
  107. ansible/inventory/group.py +44 -72
  108. ansible/inventory/helpers.py +9 -0
  109. ansible/inventory/host.py +32 -54
  110. ansible/inventory/manager.py +77 -34
  111. ansible/keyword_desc.yml +1 -1
  112. ansible/module_utils/_internal/__init__.py +55 -0
  113. ansible/module_utils/_internal/_ambient_context.py +58 -0
  114. ansible/module_utils/_internal/_ansiballz.py +133 -0
  115. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  116. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  117. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  118. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  119. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  120. ansible/module_utils/_internal/_debugging.py +31 -0
  121. ansible/module_utils/_internal/_errors.py +30 -0
  122. ansible/module_utils/_internal/_json/__init__.py +63 -0
  123. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  124. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  125. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  126. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  130. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  131. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  132. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  133. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  134. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  135. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  136. ansible/module_utils/_internal/_testing.py +0 -0
  137. ansible/module_utils/_internal/_traceback.py +89 -0
  138. ansible/module_utils/ansible_release.py +2 -2
  139. ansible/module_utils/api.py +1 -2
  140. ansible/module_utils/basic.py +154 -120
  141. ansible/module_utils/common/_utils.py +24 -28
  142. ansible/module_utils/common/collections.py +1 -2
  143. ansible/module_utils/common/dict_transformations.py +2 -2
  144. ansible/module_utils/common/file.py +2 -2
  145. ansible/module_utils/common/json.py +90 -84
  146. ansible/module_utils/common/locale.py +2 -2
  147. ansible/module_utils/common/messages.py +108 -0
  148. ansible/module_utils/common/parameters.py +27 -24
  149. ansible/module_utils/common/process.py +2 -2
  150. ansible/module_utils/common/respawn.py +41 -19
  151. ansible/module_utils/common/sentinel.py +66 -0
  152. ansible/module_utils/common/sys_info.py +8 -8
  153. ansible/module_utils/common/text/converters.py +16 -37
  154. ansible/module_utils/common/validation.py +35 -24
  155. ansible/module_utils/common/warnings.py +86 -25
  156. ansible/module_utils/common/yaml.py +29 -3
  157. ansible/module_utils/compat/datetime.py +33 -21
  158. ansible/module_utils/compat/paramiko.py +21 -10
  159. ansible/module_utils/compat/typing.py +6 -5
  160. ansible/module_utils/connection.py +2 -2
  161. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  162. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  163. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  164. ansible/module_utils/datatag.py +46 -0
  165. ansible/module_utils/distro/__init__.py +2 -2
  166. ansible/module_utils/facts/ansible_collector.py +4 -5
  167. ansible/module_utils/facts/collector.py +13 -14
  168. ansible/module_utils/facts/compat.py +4 -4
  169. ansible/module_utils/facts/default_collectors.py +1 -1
  170. ansible/module_utils/facts/hardware/aix.py +34 -0
  171. ansible/module_utils/facts/hardware/base.py +1 -1
  172. ansible/module_utils/facts/hardware/darwin.py +1 -3
  173. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  174. ansible/module_utils/facts/hardware/linux.py +4 -4
  175. ansible/module_utils/facts/namespace.py +1 -1
  176. ansible/module_utils/facts/network/base.py +1 -1
  177. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  178. ansible/module_utils/facts/network/iscsi.py +1 -2
  179. ansible/module_utils/facts/network/nvme.py +1 -2
  180. ansible/module_utils/facts/other/facter.py +1 -2
  181. ansible/module_utils/facts/other/ohai.py +2 -3
  182. ansible/module_utils/facts/system/apparmor.py +1 -2
  183. ansible/module_utils/facts/system/caps.py +1 -1
  184. ansible/module_utils/facts/system/chroot.py +1 -2
  185. ansible/module_utils/facts/system/cmdline.py +1 -2
  186. ansible/module_utils/facts/system/date_time.py +5 -3
  187. ansible/module_utils/facts/system/distribution.py +9 -8
  188. ansible/module_utils/facts/system/dns.py +1 -1
  189. ansible/module_utils/facts/system/env.py +1 -2
  190. ansible/module_utils/facts/system/fips.py +7 -20
  191. ansible/module_utils/facts/system/loadavg.py +1 -2
  192. ansible/module_utils/facts/system/local.py +1 -2
  193. ansible/module_utils/facts/system/lsb.py +1 -2
  194. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  195. ansible/module_utils/facts/system/platform.py +1 -2
  196. ansible/module_utils/facts/system/python.py +1 -2
  197. ansible/module_utils/facts/system/selinux.py +1 -1
  198. ansible/module_utils/facts/system/service_mgr.py +1 -2
  199. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  200. ansible/module_utils/facts/system/systemd.py +1 -1
  201. ansible/module_utils/facts/system/user.py +1 -2
  202. ansible/module_utils/facts/utils.py +3 -3
  203. ansible/module_utils/facts/virtual/base.py +1 -1
  204. ansible/module_utils/facts/virtual/sunos.py +3 -15
  205. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  206. ansible/module_utils/json_utils.py +2 -2
  207. ansible/module_utils/parsing/convert_bool.py +1 -1
  208. ansible/module_utils/service.py +18 -21
  209. ansible/module_utils/splitter.py +7 -7
  210. ansible/module_utils/testing.py +31 -0
  211. ansible/module_utils/urls.py +60 -31
  212. ansible/modules/add_host.py +4 -4
  213. ansible/modules/apt.py +60 -46
  214. ansible/modules/apt_key.py +19 -12
  215. ansible/modules/apt_repository.py +19 -16
  216. ansible/modules/assemble.py +6 -6
  217. ansible/modules/assert.py +4 -4
  218. ansible/modules/async_status.py +10 -12
  219. ansible/modules/async_wrapper.py +8 -3
  220. ansible/modules/blockinfile.py +6 -7
  221. ansible/modules/command.py +10 -17
  222. ansible/modules/copy.py +57 -144
  223. ansible/modules/cron.py +20 -15
  224. ansible/modules/deb822_repository.py +8 -9
  225. ansible/modules/debconf.py +5 -5
  226. ansible/modules/debug.py +4 -4
  227. ansible/modules/dnf.py +8 -8
  228. ansible/modules/dnf5.py +39 -13
  229. ansible/modules/dpkg_selections.py +4 -4
  230. ansible/modules/expect.py +8 -10
  231. ansible/modules/fail.py +4 -4
  232. ansible/modules/fetch.py +4 -4
  233. ansible/modules/file.py +174 -133
  234. ansible/modules/find.py +19 -17
  235. ansible/modules/gather_facts.py +3 -3
  236. ansible/modules/get_url.py +59 -53
  237. ansible/modules/getent.py +7 -9
  238. ansible/modules/git.py +28 -25
  239. ansible/modules/group.py +6 -6
  240. ansible/modules/group_by.py +4 -4
  241. ansible/modules/hostname.py +13 -29
  242. ansible/modules/import_playbook.py +6 -6
  243. ansible/modules/import_role.py +6 -6
  244. ansible/modules/import_tasks.py +6 -6
  245. ansible/modules/include_role.py +6 -6
  246. ansible/modules/include_tasks.py +6 -6
  247. ansible/modules/include_vars.py +6 -6
  248. ansible/modules/iptables.py +86 -73
  249. ansible/modules/known_hosts.py +10 -10
  250. ansible/modules/lineinfile.py +5 -5
  251. ansible/modules/meta.py +4 -4
  252. ansible/modules/mount_facts.py +2 -2
  253. ansible/modules/package.py +4 -4
  254. ansible/modules/package_facts.py +22 -10
  255. ansible/modules/pause.py +6 -6
  256. ansible/modules/ping.py +6 -6
  257. ansible/modules/pip.py +10 -11
  258. ansible/modules/raw.py +4 -4
  259. ansible/modules/reboot.py +6 -6
  260. ansible/modules/replace.py +9 -13
  261. ansible/modules/rpm_key.py +7 -8
  262. ansible/modules/script.py +4 -4
  263. ansible/modules/service.py +7 -8
  264. ansible/modules/service_facts.py +87 -10
  265. ansible/modules/set_fact.py +5 -5
  266. ansible/modules/set_stats.py +4 -4
  267. ansible/modules/setup.py +2 -2
  268. ansible/modules/shell.py +6 -6
  269. ansible/modules/slurp.py +6 -6
  270. ansible/modules/stat.py +9 -23
  271. ansible/modules/subversion.py +15 -15
  272. ansible/modules/systemd.py +6 -6
  273. ansible/modules/systemd_service.py +6 -6
  274. ansible/modules/sysvinit.py +6 -6
  275. ansible/modules/tempfile.py +5 -6
  276. ansible/modules/template.py +6 -6
  277. ansible/modules/unarchive.py +32 -11
  278. ansible/modules/uri.py +33 -26
  279. ansible/modules/user.py +53 -34
  280. ansible/modules/validate_argument_spec.py +10 -7
  281. ansible/modules/wait_for.py +32 -27
  282. ansible/modules/wait_for_connection.py +6 -6
  283. ansible/modules/yum_repository.py +6 -6
  284. ansible/parsing/ajson.py +14 -32
  285. ansible/parsing/dataloader.py +99 -54
  286. ansible/parsing/mod_args.py +28 -44
  287. ansible/parsing/plugin_docs.py +21 -86
  288. ansible/parsing/quoting.py +1 -1
  289. ansible/parsing/splitter.py +27 -12
  290. ansible/parsing/utils/addresses.py +24 -24
  291. ansible/parsing/utils/yaml.py +32 -61
  292. ansible/parsing/vault/__init__.py +319 -87
  293. ansible/parsing/yaml/__init__.py +0 -18
  294. ansible/parsing/yaml/dumper.py +6 -120
  295. ansible/parsing/yaml/loader.py +6 -39
  296. ansible/parsing/yaml/objects.py +36 -339
  297. ansible/playbook/__init__.py +1 -1
  298. ansible/playbook/attribute.py +8 -3
  299. ansible/playbook/base.py +182 -132
  300. ansible/playbook/block.py +26 -24
  301. ansible/playbook/collectionsearch.py +1 -15
  302. ansible/playbook/conditional.py +3 -77
  303. ansible/playbook/handler.py +8 -2
  304. ansible/playbook/helpers.py +41 -53
  305. ansible/playbook/included_file.py +6 -15
  306. ansible/playbook/loop_control.py +2 -2
  307. ansible/playbook/play.py +85 -44
  308. ansible/playbook/play_context.py +12 -17
  309. ansible/playbook/playbook_include.py +14 -15
  310. ansible/playbook/role/__init__.py +24 -26
  311. ansible/playbook/role/definition.py +15 -17
  312. ansible/playbook/role/include.py +2 -4
  313. ansible/playbook/role/metadata.py +10 -11
  314. ansible/playbook/role_include.py +3 -3
  315. ansible/playbook/taggable.py +13 -8
  316. ansible/playbook/task.py +188 -118
  317. ansible/playbook/task_include.py +5 -5
  318. ansible/plugins/__init__.py +68 -21
  319. ansible/plugins/action/__init__.py +209 -176
  320. ansible/plugins/action/add_host.py +1 -1
  321. ansible/plugins/action/assemble.py +1 -1
  322. ansible/plugins/action/assert.py +54 -66
  323. ansible/plugins/action/copy.py +7 -11
  324. ansible/plugins/action/debug.py +37 -31
  325. ansible/plugins/action/dnf.py +3 -4
  326. ansible/plugins/action/fail.py +1 -1
  327. ansible/plugins/action/fetch.py +4 -5
  328. ansible/plugins/action/gather_facts.py +7 -6
  329. ansible/plugins/action/group_by.py +1 -1
  330. ansible/plugins/action/include_vars.py +10 -11
  331. ansible/plugins/action/package.py +3 -6
  332. ansible/plugins/action/pause.py +2 -2
  333. ansible/plugins/action/script.py +15 -8
  334. ansible/plugins/action/service.py +6 -11
  335. ansible/plugins/action/set_fact.py +3 -12
  336. ansible/plugins/action/set_stats.py +3 -8
  337. ansible/plugins/action/template.py +35 -59
  338. ansible/plugins/action/unarchive.py +1 -1
  339. ansible/plugins/action/validate_argument_spec.py +5 -5
  340. ansible/plugins/action/wait_for_connection.py +1 -1
  341. ansible/plugins/become/__init__.py +31 -8
  342. ansible/plugins/become/runas.py +71 -0
  343. ansible/plugins/become/su.py +13 -8
  344. ansible/plugins/become/sudo.py +19 -0
  345. ansible/plugins/cache/__init__.py +35 -44
  346. ansible/plugins/cache/base.py +8 -0
  347. ansible/plugins/cache/jsonfile.py +10 -16
  348. ansible/plugins/cache/memory.py +6 -12
  349. ansible/plugins/callback/__init__.py +141 -123
  350. ansible/plugins/callback/default.py +30 -23
  351. ansible/plugins/callback/junit.py +28 -24
  352. ansible/plugins/callback/minimal.py +17 -14
  353. ansible/plugins/callback/oneline.py +13 -7
  354. ansible/plugins/callback/tree.py +10 -6
  355. ansible/plugins/connection/__init__.py +47 -34
  356. ansible/plugins/connection/local.py +150 -54
  357. ansible/plugins/connection/paramiko_ssh.py +21 -18
  358. ansible/plugins/connection/psrp.py +76 -165
  359. ansible/plugins/connection/ssh.py +301 -78
  360. ansible/plugins/connection/winrm.py +58 -140
  361. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  362. ansible/plugins/doc_fragments/action_core.py +6 -6
  363. ansible/plugins/doc_fragments/backup.py +2 -2
  364. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  365. ansible/plugins/doc_fragments/constructed.py +6 -2
  366. ansible/plugins/doc_fragments/decrypt.py +2 -2
  367. ansible/plugins/doc_fragments/default_callback.py +2 -2
  368. ansible/plugins/doc_fragments/files.py +2 -2
  369. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  370. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  371. ansible/plugins/doc_fragments/return_common.py +2 -2
  372. ansible/plugins/doc_fragments/template_common.py +4 -4
  373. ansible/plugins/doc_fragments/url.py +17 -1
  374. ansible/plugins/doc_fragments/url_windows.py +2 -2
  375. ansible/plugins/doc_fragments/validate.py +2 -2
  376. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  377. ansible/plugins/filter/__init__.py +6 -2
  378. ansible/plugins/filter/b64decode.yml +22 -0
  379. ansible/plugins/filter/b64encode.yml +22 -0
  380. ansible/plugins/filter/bool.yml +11 -4
  381. ansible/plugins/filter/core.py +218 -108
  382. ansible/plugins/filter/encryption.py +32 -32
  383. ansible/plugins/filter/flatten.yml +3 -2
  384. ansible/plugins/filter/human_to_bytes.yml +1 -1
  385. ansible/plugins/filter/mathstuff.py +30 -37
  386. ansible/plugins/filter/password_hash.yml +8 -0
  387. ansible/plugins/filter/regex_search.yml +1 -4
  388. ansible/plugins/filter/split.yml +1 -1
  389. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  390. ansible/plugins/filter/to_yaml.yml +0 -4
  391. ansible/plugins/filter/unvault.yml +1 -1
  392. ansible/plugins/filter/urls.py +1 -1
  393. ansible/plugins/filter/urlsplit.py +8 -9
  394. ansible/plugins/filter/vault.yml +14 -9
  395. ansible/plugins/filter/win_basename.yml +6 -1
  396. ansible/plugins/filter/win_dirname.yml +5 -0
  397. ansible/plugins/inventory/__init__.py +97 -77
  398. ansible/plugins/inventory/advanced_host_list.py +7 -5
  399. ansible/plugins/inventory/auto.py +11 -4
  400. ansible/plugins/inventory/constructed.py +21 -24
  401. ansible/plugins/inventory/generator.py +16 -11
  402. ansible/plugins/inventory/host_list.py +7 -5
  403. ansible/plugins/inventory/ini.py +78 -44
  404. ansible/plugins/inventory/script.py +189 -119
  405. ansible/plugins/inventory/toml.py +16 -126
  406. ansible/plugins/inventory/yaml.py +10 -8
  407. ansible/plugins/list.py +3 -3
  408. ansible/plugins/loader.py +197 -82
  409. ansible/plugins/lookup/__init__.py +21 -4
  410. ansible/plugins/lookup/config.py +21 -35
  411. ansible/plugins/lookup/csvfile.py +3 -2
  412. ansible/plugins/lookup/dict.py +1 -6
  413. ansible/plugins/lookup/env.py +12 -9
  414. ansible/plugins/lookup/file.py +5 -8
  415. ansible/plugins/lookup/first_found.py +86 -55
  416. ansible/plugins/lookup/indexed_items.py +1 -10
  417. ansible/plugins/lookup/ini.py +14 -13
  418. ansible/plugins/lookup/items.py +1 -1
  419. ansible/plugins/lookup/lines.py +8 -1
  420. ansible/plugins/lookup/list.py +1 -1
  421. ansible/plugins/lookup/nested.py +2 -18
  422. ansible/plugins/lookup/password.py +5 -5
  423. ansible/plugins/lookup/pipe.py +5 -7
  424. ansible/plugins/lookup/sequence.py +18 -8
  425. ansible/plugins/lookup/subelements.py +1 -4
  426. ansible/plugins/lookup/template.py +42 -36
  427. ansible/plugins/lookup/together.py +0 -12
  428. ansible/plugins/lookup/unvault.py +1 -5
  429. ansible/plugins/lookup/url.py +2 -8
  430. ansible/plugins/lookup/vars.py +16 -24
  431. ansible/plugins/shell/__init__.py +2 -2
  432. ansible/plugins/shell/cmd.py +2 -2
  433. ansible/plugins/shell/powershell.py +39 -22
  434. ansible/plugins/shell/sh.py +3 -2
  435. ansible/plugins/strategy/__init__.py +94 -113
  436. ansible/plugins/strategy/debug.py +2 -2
  437. ansible/plugins/strategy/free.py +13 -28
  438. ansible/plugins/strategy/host_pinned.py +2 -2
  439. ansible/plugins/strategy/linear.py +31 -33
  440. ansible/plugins/terminal/__init__.py +4 -4
  441. ansible/plugins/test/__init__.py +7 -2
  442. ansible/plugins/test/core.py +54 -20
  443. ansible/plugins/test/files.py +1 -1
  444. ansible/plugins/test/mathstuff.py +3 -3
  445. ansible/plugins/test/uri.py +3 -3
  446. ansible/plugins/vars/host_group_vars.py +7 -14
  447. ansible/release.py +2 -2
  448. ansible/template/__init__.py +368 -944
  449. ansible/utils/__init__.py +0 -18
  450. ansible/utils/_ssh_agent.py +657 -0
  451. ansible/utils/collection_loader/__init__.py +52 -5
  452. ansible/utils/collection_loader/_collection_config.py +5 -6
  453. ansible/utils/collection_loader/_collection_finder.py +79 -93
  454. ansible/utils/collection_loader/_collection_meta.py +13 -8
  455. ansible/utils/display.py +428 -58
  456. ansible/utils/encrypt.py +27 -19
  457. ansible/utils/fqcn.py +2 -2
  458. ansible/utils/hashing.py +2 -2
  459. ansible/utils/helpers.py +2 -2
  460. ansible/utils/listify.py +8 -8
  461. ansible/utils/lock.py +2 -2
  462. ansible/utils/path.py +4 -4
  463. ansible/utils/plugin_docs.py +14 -13
  464. ansible/utils/sentinel.py +4 -62
  465. ansible/utils/singleton.py +2 -0
  466. ansible/utils/ssh_functions.py +1 -1
  467. ansible/utils/unsafe_proxy.py +23 -332
  468. ansible/utils/vars.py +28 -8
  469. ansible/utils/version.py +2 -2
  470. ansible/vars/clean.py +4 -4
  471. ansible/vars/hostvars.py +60 -90
  472. ansible/vars/manager.py +205 -264
  473. ansible/vars/reserved.py +8 -9
  474. ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
  475. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
  476. ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
  478. ansible_test/_data/completion/docker.txt +7 -7
  479. ansible_test/_data/completion/remote.txt +6 -6
  480. ansible_test/_data/completion/windows.txt +1 -0
  481. ansible_test/_data/requirements/ansible.txt +2 -2
  482. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  483. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  484. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  485. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  486. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  487. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  488. ansible_test/_data/requirements/units.txt +1 -0
  489. ansible_test/_internal/__init__.py +1 -0
  490. ansible_test/_internal/ansible_util.py +2 -0
  491. ansible_test/_internal/become.py +1 -0
  492. ansible_test/_internal/bootstrap.py +1 -0
  493. ansible_test/_internal/cache.py +1 -0
  494. ansible_test/_internal/cgroup.py +1 -0
  495. ansible_test/_internal/ci/__init__.py +1 -0
  496. ansible_test/_internal/ci/azp.py +1 -0
  497. ansible_test/_internal/ci/local.py +1 -0
  498. ansible_test/_internal/classification/__init__.py +1 -0
  499. ansible_test/_internal/classification/common.py +1 -0
  500. ansible_test/_internal/classification/csharp.py +1 -0
  501. ansible_test/_internal/classification/powershell.py +1 -0
  502. ansible_test/_internal/classification/python.py +1 -0
  503. ansible_test/_internal/cli/__init__.py +1 -0
  504. ansible_test/_internal/cli/actions.py +1 -0
  505. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  506. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  508. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  509. ansible_test/_internal/cli/commands/__init__.py +11 -0
  510. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  511. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  512. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  523. ansible_test/_internal/cli/commands/env.py +1 -0
  524. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  525. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  528. ansible_test/_internal/cli/commands/sanity.py +9 -0
  529. ansible_test/_internal/cli/commands/shell.py +1 -0
  530. ansible_test/_internal/cli/commands/units.py +1 -0
  531. ansible_test/_internal/cli/compat.py +1 -0
  532. ansible_test/_internal/cli/completers.py +1 -0
  533. ansible_test/_internal/cli/converters.py +1 -0
  534. ansible_test/_internal/cli/environments.py +1 -0
  535. ansible_test/_internal/cli/epilog.py +1 -0
  536. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  537. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  538. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  539. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  541. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  542. ansible_test/_internal/commands/__init__.py +1 -0
  543. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  544. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  546. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  551. ansible_test/_internal/commands/coverage/combine.py +2 -1
  552. ansible_test/_internal/commands/coverage/erase.py +1 -0
  553. ansible_test/_internal/commands/coverage/html.py +1 -0
  554. ansible_test/_internal/commands/coverage/report.py +1 -0
  555. ansible_test/_internal/commands/coverage/xml.py +1 -0
  556. ansible_test/_internal/commands/env/__init__.py +2 -0
  557. ansible_test/_internal/commands/integration/__init__.py +4 -0
  558. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  559. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  560. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  562. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  565. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  567. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  568. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  569. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  570. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  573. ansible_test/_internal/commands/integration/coverage.py +1 -0
  574. ansible_test/_internal/commands/integration/filters.py +1 -0
  575. ansible_test/_internal/commands/integration/network.py +1 -0
  576. ansible_test/_internal/commands/integration/posix.py +1 -0
  577. ansible_test/_internal/commands/integration/windows.py +1 -0
  578. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  579. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  580. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  581. ansible_test/_internal/commands/sanity/compile.py +1 -0
  582. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  583. ansible_test/_internal/commands/sanity/import.py +1 -0
  584. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  585. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  586. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  587. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  588. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  589. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  590. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  591. ansible_test/_internal/commands/shell/__init__.py +1 -0
  592. ansible_test/_internal/commands/units/__init__.py +1 -0
  593. ansible_test/_internal/compat/__init__.py +1 -0
  594. ansible_test/_internal/compat/packaging.py +1 -0
  595. ansible_test/_internal/compat/yaml.py +1 -0
  596. ansible_test/_internal/completion.py +1 -0
  597. ansible_test/_internal/config.py +2 -0
  598. ansible_test/_internal/connections.py +1 -0
  599. ansible_test/_internal/constants.py +1 -0
  600. ansible_test/_internal/containers.py +1 -0
  601. ansible_test/_internal/content_config.py +1 -0
  602. ansible_test/_internal/core_ci.py +1 -0
  603. ansible_test/_internal/coverage_util.py +11 -10
  604. ansible_test/_internal/data.py +1 -0
  605. ansible_test/_internal/delegation.py +1 -0
  606. ansible_test/_internal/dev/__init__.py +1 -0
  607. ansible_test/_internal/dev/container_probe.py +1 -0
  608. ansible_test/_internal/diff.py +3 -2
  609. ansible_test/_internal/docker_util.py +2 -1
  610. ansible_test/_internal/encoding.py +1 -0
  611. ansible_test/_internal/executor.py +1 -0
  612. ansible_test/_internal/git.py +1 -0
  613. ansible_test/_internal/host_configs.py +1 -0
  614. ansible_test/_internal/host_profiles.py +1 -0
  615. ansible_test/_internal/http.py +1 -0
  616. ansible_test/_internal/init.py +1 -0
  617. ansible_test/_internal/inventory.py +35 -3
  618. ansible_test/_internal/io.py +1 -0
  619. ansible_test/_internal/metadata.py +1 -0
  620. ansible_test/_internal/payload.py +1 -0
  621. ansible_test/_internal/provider/__init__.py +1 -0
  622. ansible_test/_internal/provider/layout/__init__.py +1 -0
  623. ansible_test/_internal/provider/layout/ansible.py +1 -0
  624. ansible_test/_internal/provider/layout/collection.py +1 -0
  625. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  626. ansible_test/_internal/provider/source/__init__.py +1 -0
  627. ansible_test/_internal/provider/source/git.py +1 -0
  628. ansible_test/_internal/provider/source/installed.py +1 -0
  629. ansible_test/_internal/provider/source/unsupported.py +1 -0
  630. ansible_test/_internal/provider/source/unversioned.py +1 -0
  631. ansible_test/_internal/provisioning.py +1 -0
  632. ansible_test/_internal/pypi_proxy.py +6 -5
  633. ansible_test/_internal/python_requirements.py +1 -0
  634. ansible_test/_internal/ssh.py +1 -0
  635. ansible_test/_internal/target.py +1 -0
  636. ansible_test/_internal/test.py +3 -2
  637. ansible_test/_internal/thread.py +1 -0
  638. ansible_test/_internal/timeout.py +1 -0
  639. ansible_test/_internal/util.py +1 -0
  640. ansible_test/_internal/util_common.py +5 -2
  641. ansible_test/_internal/venv.py +1 -0
  642. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  643. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  653. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  655. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  657. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  658. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  659. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  660. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  661. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  663. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  664. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  665. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  666. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  667. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  668. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  669. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  672. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  673. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  674. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  675. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  676. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  678. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  679. ansible_test/_util/target/sanity/import/importer.py +15 -16
  680. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  681. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  682. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  683. ansible_test/_util/target/setup/requirements.py +35 -27
  684. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  685. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  686. ansible/compat/selectors.py +0 -32
  687. ansible/errors/yaml_strings.py +0 -138
  688. ansible/executor/action_write_locks.py +0 -44
  689. ansible/executor/discovery/python_target.py +0 -47
  690. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  691. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  692. ansible/module_utils/compat/importlib.py +0 -26
  693. ansible/module_utils/compat/selectors.py +0 -32
  694. ansible/module_utils/pycompat24.py +0 -73
  695. ansible/parsing/utils/jsonify.py +0 -36
  696. ansible/parsing/yaml/constructor.py +0 -178
  697. ansible/template/native_helpers.py +0 -251
  698. ansible/template/template.py +0 -43
  699. ansible/template/vars.py +0 -77
  700. ansible/utils/native_jinja.py +0 -11
  701. ansible/vars/fact_cache.py +0 -71
  702. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  703. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  """Import the given python module(s) and report error(s) encountered."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
 
@@ -43,6 +44,7 @@ def main():
43
44
  # noinspection PyCompatibility
44
45
  from importlib import import_module
45
46
  except ImportError:
47
+
46
48
  def import_module(name, package=None): # type: (str, str | None) -> types.ModuleType
47
49
  assert package is None
48
50
  __import__(name)
@@ -60,11 +62,10 @@ def main():
60
62
 
61
63
  if collection_full_name:
62
64
  # allow importing code from collections when testing a collection
63
- from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native, text_type
64
65
 
65
66
  # noinspection PyProtectedMember
66
67
  from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
67
- from ansible.utils.collection_loader import _collection_finder
68
+ from ansible.utils.collection_loader import _collection_finder, _to_text
68
69
 
69
70
  yaml_to_dict_cache = {}
70
71
 
@@ -74,7 +75,7 @@ def main():
74
75
 
75
76
  def parse_value(value):
76
77
  """Custom value parser for JSON deserialization that recognizes our internal ISO date format."""
77
- if isinstance(value, text_type):
78
+ if isinstance(value, str):
78
79
  match = iso_date_re.search(value)
79
80
 
80
81
  if match:
@@ -86,7 +87,7 @@ def main():
86
87
  """Object hook for custom ISO date deserialization from JSON."""
87
88
  return dict((key, parse_value(value)) for key, value in data.items())
88
89
 
89
- def yaml_to_dict(yaml, content_id):
90
+ def yaml_to_dict(yaml: str | bytes, content_id):
90
91
  """
91
92
  Return a Python dict version of the provided YAML.
92
93
  Conversion is done in a subprocess since the current Python interpreter does not have access to PyYAML.
@@ -96,18 +97,18 @@ def main():
96
97
 
97
98
  try:
98
99
  cmd = [external_python, yaml_to_json_path]
99
- proc = subprocess.Popen([to_bytes(c) for c in cmd], # pylint: disable=consider-using-with
100
- stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
101
- stdout_bytes, stderr_bytes = proc.communicate(to_bytes(yaml))
100
+ proc = subprocess.Popen(cmd, # pylint: disable=consider-using-with
101
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
102
+ stdout, stderr = proc.communicate(_to_text(yaml))
102
103
 
103
104
  if proc.returncode != 0:
104
- raise Exception('command %s failed with return code %d: %s' % ([to_native(c) for c in cmd], proc.returncode, to_native(stderr_bytes)))
105
+ raise Exception('command %s failed with return code %d: %s' % (cmd, proc.returncode, stderr))
105
106
 
106
- data = yaml_to_dict_cache[content_id] = json.loads(to_text(stdout_bytes), object_hook=object_hook)
107
+ data = yaml_to_dict_cache[content_id] = json.loads(stdout, object_hook=object_hook)
107
108
 
108
109
  return data
109
110
  except Exception as ex:
110
- raise Exception('internal importer error - failed to parse yaml: %s' % to_native(ex))
111
+ raise Exception(f'internal importer error - failed to parse yaml: {ex}')
111
112
 
112
113
  _collection_finder._meta_yml_to_dict = yaml_to_dict # pylint: disable=protected-access
113
114
 
@@ -142,11 +143,13 @@ def main():
142
143
 
143
144
  class ImporterAnsibleModule:
144
145
  """Replacement for AnsibleModule to support import testing."""
146
+
145
147
  def __init__(self, *args, **kwargs):
146
148
  raise ImporterAnsibleModuleException()
147
149
 
148
150
  class RestrictedModuleLoader:
149
151
  """Python module loader that restricts inappropriate imports."""
152
+
150
153
  def __init__(self, path, name, restrict_to_module_paths):
151
154
  self.path = path
152
155
  self.name = name
@@ -431,6 +434,7 @@ def main():
431
434
 
432
435
  class Capture:
433
436
  """Captured output and/or exception."""
437
+
434
438
  def __init__(self):
435
439
  # use buffered IO to simulate StringIO; allows Ansible's stream patching to behave without warnings
436
440
  self.stdout = TextIOWrapper(BytesIO())
@@ -489,6 +493,7 @@ def main():
489
493
  finally:
490
494
  if import_type == 'plugin' and not collection_loader:
491
495
  from ansible.utils.collection_loader._collection_finder import _AnsibleCollectionFinder
496
+
492
497
  _AnsibleCollectionFinder._remove() # pylint: disable=protected-access
493
498
 
494
499
  if sys.meta_path[0] != restricted_loader:
@@ -541,12 +546,6 @@ def main():
541
546
  "ignore",
542
547
  "AnsibleCollectionFinder has already been configured")
543
548
 
544
- # ansible.utils.unsafe_proxy attempts patching sys.intern generating a warning if it was already patched
545
- warnings.filterwarnings(
546
- "ignore",
547
- "skipped sys.intern patch; appears to have already been patched"
548
- )
549
-
550
549
  try:
551
550
  yield
552
551
  finally:
@@ -26,13 +26,13 @@ install_ssh_keys()
26
26
  echo "${ssh_private_key}" > "${ssh_private_key_path}"
27
27
 
28
28
  # add public key to authorized_keys
29
- authoried_keys_path="${HOME}/.ssh/authorized_keys"
29
+ authorized_keys_path="${HOME}/.ssh/authorized_keys"
30
30
 
31
31
  # the existing file is overwritten to avoid conflicts (ex: RHEL on EC2 blocks root login)
32
- cat "${public_key_path}" > "${authoried_keys_path}"
33
- chmod 0600 "${authoried_keys_path}"
32
+ cat "${public_key_path}" > "${authorized_keys_path}"
33
+ chmod 0600 "${authorized_keys_path}"
34
34
 
35
- # add localhost's server keys to known_hosts
35
+ # add localhost server keys to known_hosts
36
36
  known_hosts_path="${HOME}/.ssh/known_hosts"
37
37
 
38
38
  for key in /etc/ssh/ssh_host_*_key.pub; do
@@ -154,6 +154,7 @@ bootstrap_remote_freebsd()
154
154
  py${python_package_version}-sqlite3
155
155
  py${python_package_version}-setuptools
156
156
  bash
157
+ ca_root_nss
157
158
  curl
158
159
  gtar
159
160
  sudo
@@ -162,27 +163,14 @@ bootstrap_remote_freebsd()
162
163
  if [ "${controller}" ]; then
163
164
  jinja2_pkg="py${python_package_version}-jinja2"
164
165
  cryptography_pkg="py${python_package_version}-cryptography"
165
- pyyaml_pkg="py${python_package_version}-yaml"
166
+ pyyaml_pkg="py${python_package_version}-pyyaml"
166
167
  packaging_pkg="py${python_package_version}-packaging"
167
168
 
168
169
  # Declare platform/python version combinations which do not have supporting OS packages available.
169
170
  # For these combinations ansible-test will use pip to install the requirements instead.
170
171
  case "${platform_version}/${python_version}" in
171
- 13.3/3.9)
172
- # defaults above 'just work'TM
173
- ;;
174
- 13.3/3.11)
175
- jinja2_pkg="" # not available
176
- cryptography_pkg="" # not available
177
- pyyaml_pkg="" # not available
178
- ;;
179
- 14.1/3.9)
180
- # defaults above 'just work'TM
181
- ;;
182
- 14.1/3.11)
183
- cryptography_pkg="" # not available
184
- jinja2_pkg="" # not available
185
- pyyaml_pkg="" # not available
172
+ 14.2/3.11)
173
+ # defaults available
186
174
  ;;
187
175
  *)
188
176
  # just assume nothing is available
@@ -238,6 +226,7 @@ prefer-binary = yes
238
226
 
239
227
  # enable sudo without a password for the wheel group, allowing ansible to use the sudo become plugin
240
228
  echo '%wheel ALL=(ALL:ALL) NOPASSWD: ALL' > /usr/local/etc/sudoers.d/ansible-test
229
+ chmod 440 /usr/local/etc/sudoers.d/ansible-test
241
230
  }
242
231
 
243
232
  bootstrap_remote_macos()
@@ -1,4 +1,5 @@
1
1
  """A tool for probing cgroups to determine write access."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
@@ -1,4 +1,5 @@
1
1
  """Custom entry-point for pip that filters out unwanted logging and warnings."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import logging
@@ -1,4 +1,5 @@
1
1
  """A tool for installing test requirements on the controller and target host."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  # pylint: disable=wrong-import-position
@@ -62,13 +63,15 @@ def main(): # type: () -> None
62
63
 
63
64
 
64
65
  # noinspection PyUnusedLocal
65
- def bootstrap(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
66
+ def bootstrap(pip: str, options: dict[str, t.Any]) -> None:
66
67
  """Bootstrap pip and related packages in an empty virtual environment."""
67
68
  pip_version = options['pip_version']
68
69
  packages = options['packages']
69
70
  setuptools = options['setuptools']
70
71
  wheel = options['wheel']
71
72
 
73
+ del options
74
+
72
75
  url = 'https://ci-files.testing.ansible.com/ansible-test/get-pip-%s.py' % pip_version
73
76
  cache_path = os.path.expanduser('~/.ansible/test/cache/get_pip_%s.py' % pip_version.replace(".", "_"))
74
77
  temp_path = cache_path + '.download'
@@ -83,7 +86,7 @@ def bootstrap(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
83
86
  try:
84
87
  download_file(url, temp_path)
85
88
  except Exception as ex:
86
- raise ApplicationError(('''
89
+ raise ApplicationError(("""
87
90
  Download failed: %s
88
91
 
89
92
  The bootstrap script can be manually downloaded and saved to: %s
@@ -91,7 +94,7 @@ The bootstrap script can be manually downloaded and saved to: %s
91
94
  If you're behind a proxy, consider commenting on the following GitHub issue:
92
95
 
93
96
  https://github.com/ansible/ansible/issues/77304
94
- ''' % (ex, cache_path)).strip())
97
+ """ % (ex, cache_path)).strip())
95
98
 
96
99
  shutil.move(temp_path, cache_path)
97
100
 
@@ -100,31 +103,33 @@ https://github.com/ansible/ansible/issues/77304
100
103
  env = common_pip_environment()
101
104
  env.update(GET_PIP=cache_path)
102
105
 
103
- options = common_pip_options()
104
- options.extend(packages)
106
+ pip_options = common_pip_options()
107
+ pip_options.extend(packages)
105
108
 
106
109
  if not setuptools:
107
- options.append('--no-setuptools')
110
+ pip_options.append('--no-setuptools')
108
111
 
109
112
  if not wheel:
110
- options.append('--no-wheel')
113
+ pip_options.append('--no-wheel')
111
114
 
112
- command = [sys.executable, pip] + options
115
+ command = [sys.executable, pip] + pip_options
113
116
 
114
117
  execute_command(command, env=env)
115
118
 
116
119
 
117
- def install(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
120
+ def install(pip: str, options: dict[str, t.Any]) -> None:
118
121
  """Perform a pip install."""
119
122
  requirements = options['requirements']
120
123
  constraints = options['constraints']
121
124
  packages = options['packages']
122
125
 
126
+ del options
127
+
123
128
  tempdir = tempfile.mkdtemp(prefix='ansible-test-', suffix='-requirements')
124
129
 
125
130
  try:
126
- options = common_pip_options()
127
- options.extend(packages)
131
+ pip_options = common_pip_options()
132
+ pip_options.extend(packages)
128
133
 
129
134
  for path, content in requirements:
130
135
  if path.split(os.sep)[0] in ('test', 'requirements'):
@@ -136,13 +141,13 @@ def install(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
136
141
  pre_build.execute(pip)
137
142
 
138
143
  write_text_file(os.path.join(tempdir, path), content, True)
139
- options.extend(['-r', path])
144
+ pip_options.extend(['-r', path])
140
145
 
141
146
  for path, content in constraints:
142
147
  write_text_file(os.path.join(tempdir, path), content, True)
143
- options.extend(['-c', path])
148
+ pip_options.extend(['-c', path])
144
149
 
145
- command = [sys.executable, pip, 'install'] + options
150
+ command = [sys.executable, pip, 'install'] + pip_options
146
151
 
147
152
  env = common_pip_environment()
148
153
 
@@ -163,8 +168,8 @@ class PreBuild:
163
168
  tempdir = tempfile.mkdtemp(prefix='ansible-test-', suffix='-pre-build')
164
169
 
165
170
  try:
166
- options = common_pip_options()
167
- options.append(self.requirement)
171
+ pip_options = common_pip_options()
172
+ pip_options.append(self.requirement)
168
173
 
169
174
  constraints = '\n'.join(self.constraints) + '\n'
170
175
  constraints_path = os.path.join(tempdir, 'constraints.txt')
@@ -174,7 +179,7 @@ class PreBuild:
174
179
  env = common_pip_environment()
175
180
  env.update(PIP_CONSTRAINT=constraints_path)
176
181
 
177
- command = [sys.executable, pip, 'wheel'] + options
182
+ command = [sys.executable, pip, 'wheel'] + pip_options
178
183
 
179
184
  execute_command(command, env=env, cwd=tempdir)
180
185
  finally:
@@ -206,15 +211,17 @@ def parse_pre_build_instructions(requirements): # type: (str) -> list[PreBuild]
206
211
  return instructions
207
212
 
208
213
 
209
- def uninstall(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
214
+ def uninstall(pip: str, options: dict[str, t.Any]) -> None:
210
215
  """Perform a pip uninstall."""
211
216
  packages = options['packages']
212
217
  ignore_errors = options['ignore_errors']
213
218
 
214
- options = common_pip_options()
215
- options.extend(packages)
219
+ del options
220
+
221
+ pip_options = common_pip_options()
222
+ pip_options.extend(packages)
216
223
 
217
- command = [sys.executable, pip, 'uninstall', '-y'] + options
224
+ command = [sys.executable, pip, 'uninstall', '-y'] + pip_options
218
225
 
219
226
  env = common_pip_environment()
220
227
 
@@ -226,13 +233,13 @@ def uninstall(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
226
233
 
227
234
 
228
235
  # noinspection PyUnusedLocal
229
- def version(pip, options): # type: (str, t.Dict[str, t.Any]) -> None
236
+ def version(pip: str, options: dict[str, t.Any]) -> None:
230
237
  """Report the pip version."""
231
238
  del options
232
239
 
233
- options = common_pip_options()
240
+ pip_options = common_pip_options()
234
241
 
235
- command = [sys.executable, pip, '-V'] + options
242
+ command = [sys.executable, pip, '-V'] + pip_options
236
243
 
237
244
  env = common_pip_environment()
238
245
 
@@ -264,11 +271,11 @@ def common_pip_options(): # type: () -> t.List[str]
264
271
  def devnull(): # type: () -> t.IO[bytes]
265
272
  """Return a file object that references devnull."""
266
273
  try:
267
- return devnull.file
274
+ return devnull.file # type: ignore[attr-defined]
268
275
  except AttributeError:
269
- devnull.file = open(os.devnull, 'w+b') # pylint: disable=consider-using-with
276
+ devnull.file = open(os.devnull, 'w+b') # type: ignore[attr-defined] # pylint: disable=consider-using-with
270
277
 
271
- return devnull.file
278
+ return devnull.file # type: ignore[attr-defined]
272
279
 
273
280
 
274
281
  def download_file(url, path): # type: (str, str) -> None
@@ -284,6 +291,7 @@ class ApplicationError(Exception):
284
291
 
285
292
  class SubprocessError(ApplicationError):
286
293
  """A command returned a non-zero status."""
294
+
287
295
  def __init__(self, cmd, status, stdout, stderr): # type: (t.List[str], int, str, str) -> None
288
296
  message = 'A command failed with status %d: %s' % (status, shlex.join(cmd))
289
297
 
@@ -1,11 +1,12 @@
1
1
  """Detect the real python interpreter when running in a virtual environment created by the 'virtualenv' module."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
5
6
 
6
7
  try:
7
8
  # virtualenv <20
8
- from sys import real_prefix
9
+ from sys import real_prefix # type: ignore[attr-defined]
9
10
  except ImportError:
10
11
  real_prefix = None
11
12
 
@@ -1,4 +1,5 @@
1
1
  """Show availability of PyYAML and libyaml support."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import json
@@ -11,7 +12,7 @@ except ImportError:
11
12
  try:
12
13
  from yaml import CLoader
13
14
  except ImportError:
14
- CLoader = None
15
+ CLoader = None # type: ignore[misc]
15
16
 
16
17
  print(json.dumps(dict(
17
18
  yaml=bool(yaml),
@@ -1,32 +0,0 @@
1
- # (c) 2014, 2017 Toshio Kuratomi <tkuratomi@ansible.com>
2
- #
3
- # This file is part of Ansible
4
- #
5
- # Ansible is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # Ansible is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
-
18
- from __future__ import annotations
19
-
20
- import sys
21
- import selectors
22
-
23
- from ansible.module_utils.common.warnings import deprecate
24
-
25
-
26
- sys.modules['ansible.compat.selectors'] = selectors
27
-
28
-
29
- deprecate(
30
- msg='The `ansible.module_utils.compat.selectors` module is deprecated.',
31
- version='2.19',
32
- )
@@ -1,138 +0,0 @@
1
- # (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
2
- #
3
- # This file is part of Ansible
4
- #
5
- # Ansible is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # Ansible is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
-
18
- from __future__ import annotations
19
-
20
- __all__ = [
21
- 'YAML_SYNTAX_ERROR',
22
- 'YAML_POSITION_DETAILS',
23
- 'YAML_COMMON_DICT_ERROR',
24
- 'YAML_COMMON_UNQUOTED_VARIABLE_ERROR',
25
- 'YAML_COMMON_UNQUOTED_COLON_ERROR',
26
- 'YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR',
27
- 'YAML_COMMON_UNBALANCED_QUOTES_ERROR',
28
- ]
29
-
30
- YAML_SYNTAX_ERROR = """\
31
- Syntax Error while loading YAML.
32
- %s"""
33
-
34
- YAML_POSITION_DETAILS = """\
35
- The error appears to be in '%s': line %s, column %s, but may
36
- be elsewhere in the file depending on the exact syntax problem.
37
- """
38
-
39
- YAML_COMMON_DICT_ERROR = """\
40
- This one looks easy to fix. YAML thought it was looking for the start of a
41
- hash/dictionary and was confused to see a second "{". Most likely this was
42
- meant to be an ansible template evaluation instead, so we have to give the
43
- parser a small hint that we wanted a string instead. The solution here is to
44
- just quote the entire value.
45
-
46
- For instance, if the original line was:
47
-
48
- app_path: {{ base_path }}/foo
49
-
50
- It should be written as:
51
-
52
- app_path: "{{ base_path }}/foo"
53
- """
54
-
55
- YAML_COMMON_UNQUOTED_VARIABLE_ERROR = """\
56
- We could be wrong, but this one looks like it might be an issue with
57
- missing quotes. Always quote template expression brackets when they
58
- start a value. For instance:
59
-
60
- with_items:
61
- - {{ foo }}
62
-
63
- Should be written as:
64
-
65
- with_items:
66
- - "{{ foo }}"
67
- """
68
-
69
- YAML_COMMON_UNQUOTED_COLON_ERROR = """\
70
- This one looks easy to fix. There seems to be an extra unquoted colon in the line
71
- and this is confusing the parser. It was only expecting to find one free
72
- colon. The solution is just add some quotes around the colon, or quote the
73
- entire line after the first colon.
74
-
75
- For instance, if the original line was:
76
-
77
- copy: src=file.txt dest=/path/filename:with_colon.txt
78
-
79
- It can be written as:
80
-
81
- copy: src=file.txt dest='/path/filename:with_colon.txt'
82
-
83
- Or:
84
-
85
- copy: 'src=file.txt dest=/path/filename:with_colon.txt'
86
- """
87
-
88
- YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR = """\
89
- This one looks easy to fix. It seems that there is a value started
90
- with a quote, and the YAML parser is expecting to see the line ended
91
- with the same kind of quote. For instance:
92
-
93
- when: "ok" in result.stdout
94
-
95
- Could be written as:
96
-
97
- when: '"ok" in result.stdout'
98
-
99
- Or equivalently:
100
-
101
- when: "'ok' in result.stdout"
102
- """
103
-
104
- YAML_COMMON_UNBALANCED_QUOTES_ERROR = """\
105
- We could be wrong, but this one looks like it might be an issue with
106
- unbalanced quotes. If starting a value with a quote, make sure the
107
- line ends with the same set of quotes. For instance this arbitrary
108
- example:
109
-
110
- foo: "bad" "wolf"
111
-
112
- Could be written as:
113
-
114
- foo: '"bad" "wolf"'
115
- """
116
-
117
- YAML_COMMON_LEADING_TAB_ERROR = """\
118
- There appears to be a tab character at the start of the line.
119
-
120
- YAML does not use tabs for formatting. Tabs should be replaced with spaces.
121
-
122
- For example:
123
- - name: update tooling
124
- vars:
125
- version: 1.2.3
126
- # ^--- there is a tab there.
127
-
128
- Should be written as:
129
- - name: update tooling
130
- vars:
131
- version: 1.2.3
132
- # ^--- all spaces here.
133
- """
134
-
135
- YAML_AND_SHORTHAND_ERROR = """\
136
- There appears to be both 'k=v' shorthand syntax and YAML in this task. \
137
- Only one syntax may be used.
138
- """
@@ -1,44 +0,0 @@
1
- # (c) 2016 - Red Hat, Inc. <info@ansible.com>
2
- #
3
- # This file is part of Ansible
4
- #
5
- # Ansible is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # Ansible is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
17
-
18
- from __future__ import annotations
19
-
20
- import multiprocessing.synchronize
21
-
22
- from ansible.utils.multiprocessing import context as multiprocessing_context
23
-
24
- from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
25
-
26
- if 'action_write_locks' not in globals():
27
- # Do not initialize this more than once because it seems to bash
28
- # the existing one. multiprocessing must be reloading the module
29
- # when it forks?
30
- action_write_locks: dict[str | None, multiprocessing.synchronize.Lock] = dict()
31
-
32
- # Below is a Lock for use when we weren't expecting a named module. It gets used when an action
33
- # plugin invokes a module whose name does not match with the action's name. Slightly less
34
- # efficient as all processes with unexpected module names will wait on this lock
35
- action_write_locks[None] = multiprocessing_context.Lock()
36
-
37
- # These plugins are known to be called directly by action plugins with names differing from the
38
- # action plugin name. We precreate them here as an optimization.
39
- # If a list of service managers is created in the future we can do the same for them.
40
- mods = set(p['name'] for p in PKG_MGRS)
41
-
42
- mods.update(('copy', 'file', 'setup', 'slurp', 'stat'))
43
- for mod_name in mods:
44
- action_write_locks[mod_name] = multiprocessing_context.Lock()
@@ -1,47 +0,0 @@
1
- # Copyright: (c) 2018 Ansible Project
2
- # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
3
-
4
- # FUTURE: this could be swapped out for our bundled version of distro to move more complete platform
5
- # logic to the targets, so long as we maintain Py2.6 compat and don't need to do any kind of script assembly
6
-
7
- from __future__ import annotations
8
-
9
- import json
10
- import platform
11
- import io
12
- import os
13
-
14
-
15
- def read_utf8_file(path, encoding='utf-8'):
16
- if not os.access(path, os.R_OK):
17
- return None
18
- with io.open(path, 'r', encoding=encoding) as fd:
19
- content = fd.read()
20
-
21
- return content
22
-
23
-
24
- def get_platform_info():
25
- result = dict(platform_dist_result=[])
26
-
27
- if hasattr(platform, 'dist'):
28
- result['platform_dist_result'] = platform.dist()
29
-
30
- osrelease_content = read_utf8_file('/etc/os-release')
31
- # try to fall back to /usr/lib/os-release
32
- if not osrelease_content:
33
- osrelease_content = read_utf8_file('/usr/lib/os-release')
34
-
35
- result['osrelease_content'] = osrelease_content
36
-
37
- return result
38
-
39
-
40
- def main():
41
- info = get_platform_info()
42
-
43
- print(json.dumps(info))
44
-
45
-
46
- if __name__ == '__main__':
47
- main()