ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__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 (710) hide show
  1. ansible/_internal/__init__.py +53 -0
  2. ansible/_internal/_ansiballz.py +265 -0
  3. ansible/_internal/_collection_proxy.py +47 -0
  4. ansible/_internal/_datatag/__init__.py +0 -0
  5. ansible/_internal/_datatag/_tags.py +130 -0
  6. ansible/_internal/_datatag/_utils.py +19 -0
  7. ansible/_internal/_datatag/_wrappers.py +33 -0
  8. ansible/_internal/_errors/__init__.py +0 -0
  9. ansible/_internal/_errors/_captured.py +128 -0
  10. ansible/_internal/_errors/_handler.py +91 -0
  11. ansible/_internal/_errors/_utils.py +310 -0
  12. ansible/_internal/_json/__init__.py +203 -0
  13. ansible/_internal/_json/_legacy_encoder.py +34 -0
  14. ansible/_internal/_json/_profiles/__init__.py +0 -0
  15. ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
  16. ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
  17. ansible/_internal/_json/_profiles/_legacy.py +197 -0
  18. ansible/_internal/_locking.py +21 -0
  19. ansible/_internal/_plugins/__init__.py +0 -0
  20. ansible/_internal/_plugins/_cache.py +57 -0
  21. ansible/_internal/_task.py +78 -0
  22. ansible/_internal/_templating/__init__.py +10 -0
  23. ansible/_internal/_templating/_access.py +86 -0
  24. ansible/_internal/_templating/_chain_templar.py +63 -0
  25. ansible/_internal/_templating/_datatag.py +95 -0
  26. ansible/_internal/_templating/_engine.py +588 -0
  27. ansible/_internal/_templating/_errors.py +28 -0
  28. ansible/_internal/_templating/_jinja_bits.py +1066 -0
  29. ansible/_internal/_templating/_jinja_common.py +332 -0
  30. ansible/_internal/_templating/_jinja_patches.py +44 -0
  31. ansible/_internal/_templating/_jinja_plugins.py +345 -0
  32. ansible/_internal/_templating/_lazy_containers.py +633 -0
  33. ansible/_internal/_templating/_marker_behaviors.py +103 -0
  34. ansible/_internal/_templating/_transform.py +63 -0
  35. ansible/_internal/_templating/_utils.py +107 -0
  36. ansible/_internal/_wrapt.py +1052 -0
  37. ansible/_internal/_yaml/__init__.py +0 -0
  38. ansible/_internal/_yaml/_constructor.py +240 -0
  39. ansible/_internal/_yaml/_dumper.py +62 -0
  40. ansible/_internal/_yaml/_errors.py +166 -0
  41. ansible/_internal/_yaml/_loader.py +66 -0
  42. ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
  43. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
  44. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
  45. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
  46. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
  47. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
  48. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
  49. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
  50. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
  51. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
  52. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
  53. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
  54. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
  55. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
  56. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
  57. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
  58. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
  59. ansible/cli/__init__.py +159 -89
  60. ansible/cli/_ssh_askpass.py +47 -0
  61. ansible/cli/adhoc.py +14 -7
  62. ansible/cli/arguments/option_helpers.py +154 -7
  63. ansible/cli/config.py +43 -68
  64. ansible/cli/console.py +10 -8
  65. ansible/cli/doc.py +62 -53
  66. ansible/cli/galaxy.py +27 -20
  67. ansible/cli/inventory.py +28 -26
  68. ansible/cli/playbook.py +4 -12
  69. ansible/cli/pull.py +51 -11
  70. ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
  71. ansible/cli/vault.py +12 -11
  72. ansible/compat/__init__.py +2 -2
  73. ansible/config/base.yml +166 -112
  74. ansible/config/manager.py +52 -49
  75. ansible/constants.py +3 -4
  76. ansible/errors/__init__.py +277 -235
  77. ansible/executor/interpreter_discovery.py +28 -149
  78. ansible/executor/module_common.py +426 -493
  79. ansible/executor/play_iterator.py +22 -27
  80. ansible/executor/playbook_executor.py +11 -11
  81. ansible/executor/powershell/async_watchdog.ps1 +97 -102
  82. ansible/executor/powershell/async_wrapper.ps1 +202 -151
  83. ansible/executor/powershell/become_wrapper.ps1 +89 -144
  84. ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
  85. ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
  86. ansible/executor/powershell/exec_wrapper.ps1 +462 -196
  87. ansible/executor/powershell/module_manifest.py +417 -265
  88. ansible/executor/powershell/module_wrapper.ps1 +169 -186
  89. ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
  90. ansible/executor/powershell/psrp_put_file.ps1 +122 -0
  91. ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
  92. ansible/executor/powershell/winrm_put_file.ps1 +36 -0
  93. ansible/executor/process/worker.py +161 -96
  94. ansible/executor/stats.py +5 -5
  95. ansible/executor/task_executor.py +268 -258
  96. ansible/executor/task_queue_manager.py +124 -90
  97. ansible/executor/task_result.py +183 -78
  98. ansible/galaxy/__init__.py +2 -2
  99. ansible/galaxy/api.py +22 -18
  100. ansible/galaxy/collection/__init__.py +1 -1
  101. ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
  102. ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
  103. ansible/galaxy/dependency_resolution/providers.py +1 -1
  104. ansible/galaxy/dependency_resolution/reporters.py +81 -0
  105. ansible/galaxy/role.py +4 -8
  106. ansible/galaxy/token.py +28 -21
  107. ansible/inventory/data.py +47 -57
  108. ansible/inventory/group.py +44 -72
  109. ansible/inventory/helpers.py +9 -0
  110. ansible/inventory/host.py +32 -54
  111. ansible/inventory/manager.py +78 -34
  112. ansible/keyword_desc.yml +1 -1
  113. ansible/module_utils/_internal/__init__.py +55 -0
  114. ansible/module_utils/_internal/_ambient_context.py +58 -0
  115. ansible/module_utils/_internal/_ansiballz.py +133 -0
  116. ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
  117. ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
  118. ansible/module_utils/_internal/_dataclass_validation.py +217 -0
  119. ansible/module_utils/_internal/_datatag/__init__.py +928 -0
  120. ansible/module_utils/_internal/_datatag/_tags.py +38 -0
  121. ansible/module_utils/_internal/_debugging.py +31 -0
  122. ansible/module_utils/_internal/_errors.py +30 -0
  123. ansible/module_utils/_internal/_json/__init__.py +63 -0
  124. ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
  125. ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
  126. ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
  127. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
  128. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
  129. ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
  130. ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
  131. ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
  132. ansible/module_utils/_internal/_patches/__init__.py +66 -0
  133. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
  134. ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
  135. ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
  136. ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
  137. ansible/module_utils/_internal/_testing.py +0 -0
  138. ansible/module_utils/_internal/_traceback.py +89 -0
  139. ansible/module_utils/ansible_release.py +2 -2
  140. ansible/module_utils/api.py +1 -2
  141. ansible/module_utils/basic.py +152 -120
  142. ansible/module_utils/common/_utils.py +24 -28
  143. ansible/module_utils/common/collections.py +1 -2
  144. ansible/module_utils/common/dict_transformations.py +2 -2
  145. ansible/module_utils/common/file.py +2 -2
  146. ansible/module_utils/common/json.py +90 -84
  147. ansible/module_utils/common/locale.py +2 -2
  148. ansible/module_utils/common/messages.py +108 -0
  149. ansible/module_utils/common/parameters.py +27 -24
  150. ansible/module_utils/common/process.py +2 -2
  151. ansible/module_utils/common/respawn.py +41 -19
  152. ansible/module_utils/common/sentinel.py +66 -0
  153. ansible/module_utils/common/sys_info.py +8 -8
  154. ansible/module_utils/common/text/converters.py +16 -37
  155. ansible/module_utils/common/validation.py +35 -24
  156. ansible/module_utils/common/warnings.py +86 -25
  157. ansible/module_utils/common/yaml.py +29 -3
  158. ansible/module_utils/compat/datetime.py +33 -21
  159. ansible/module_utils/compat/paramiko.py +21 -10
  160. ansible/module_utils/compat/typing.py +6 -5
  161. ansible/module_utils/connection.py +2 -2
  162. ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
  163. ansible/module_utils/csharp/Ansible.Become.cs +1 -0
  164. ansible/module_utils/csharp/Ansible._Async.cs +517 -0
  165. ansible/module_utils/datatag.py +46 -0
  166. ansible/module_utils/distro/__init__.py +2 -2
  167. ansible/module_utils/facts/ansible_collector.py +4 -5
  168. ansible/module_utils/facts/collector.py +13 -14
  169. ansible/module_utils/facts/compat.py +4 -4
  170. ansible/module_utils/facts/default_collectors.py +1 -1
  171. ansible/module_utils/facts/hardware/aix.py +34 -0
  172. ansible/module_utils/facts/hardware/base.py +1 -1
  173. ansible/module_utils/facts/hardware/darwin.py +1 -3
  174. ansible/module_utils/facts/hardware/freebsd.py +2 -2
  175. ansible/module_utils/facts/hardware/linux.py +4 -4
  176. ansible/module_utils/facts/namespace.py +1 -1
  177. ansible/module_utils/facts/network/base.py +1 -1
  178. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  179. ansible/module_utils/facts/network/iscsi.py +1 -2
  180. ansible/module_utils/facts/network/nvme.py +1 -2
  181. ansible/module_utils/facts/other/facter.py +1 -2
  182. ansible/module_utils/facts/other/ohai.py +2 -3
  183. ansible/module_utils/facts/system/apparmor.py +1 -2
  184. ansible/module_utils/facts/system/caps.py +1 -1
  185. ansible/module_utils/facts/system/chroot.py +1 -2
  186. ansible/module_utils/facts/system/cmdline.py +1 -2
  187. ansible/module_utils/facts/system/date_time.py +5 -3
  188. ansible/module_utils/facts/system/distribution.py +9 -8
  189. ansible/module_utils/facts/system/dns.py +1 -1
  190. ansible/module_utils/facts/system/env.py +1 -2
  191. ansible/module_utils/facts/system/fips.py +7 -20
  192. ansible/module_utils/facts/system/loadavg.py +1 -2
  193. ansible/module_utils/facts/system/local.py +1 -2
  194. ansible/module_utils/facts/system/lsb.py +1 -2
  195. ansible/module_utils/facts/system/pkg_mgr.py +1 -2
  196. ansible/module_utils/facts/system/platform.py +1 -2
  197. ansible/module_utils/facts/system/python.py +1 -2
  198. ansible/module_utils/facts/system/selinux.py +1 -1
  199. ansible/module_utils/facts/system/service_mgr.py +1 -2
  200. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
  201. ansible/module_utils/facts/system/systemd.py +1 -1
  202. ansible/module_utils/facts/system/user.py +1 -2
  203. ansible/module_utils/facts/utils.py +3 -3
  204. ansible/module_utils/facts/virtual/base.py +1 -1
  205. ansible/module_utils/facts/virtual/sunos.py +3 -15
  206. ansible/module_utils/facts/virtual/sysctl.py +3 -16
  207. ansible/module_utils/json_utils.py +2 -2
  208. ansible/module_utils/parsing/convert_bool.py +1 -1
  209. ansible/module_utils/service.py +18 -21
  210. ansible/module_utils/splitter.py +7 -7
  211. ansible/module_utils/testing.py +31 -0
  212. ansible/module_utils/urls.py +60 -31
  213. ansible/modules/add_host.py +4 -4
  214. ansible/modules/apt.py +60 -46
  215. ansible/modules/apt_key.py +19 -12
  216. ansible/modules/apt_repository.py +19 -16
  217. ansible/modules/assemble.py +6 -6
  218. ansible/modules/assert.py +4 -4
  219. ansible/modules/async_status.py +10 -12
  220. ansible/modules/async_wrapper.py +8 -3
  221. ansible/modules/blockinfile.py +6 -7
  222. ansible/modules/command.py +10 -17
  223. ansible/modules/copy.py +57 -144
  224. ansible/modules/cron.py +20 -15
  225. ansible/modules/deb822_repository.py +8 -9
  226. ansible/modules/debconf.py +5 -5
  227. ansible/modules/debug.py +4 -4
  228. ansible/modules/dnf.py +8 -8
  229. ansible/modules/dnf5.py +39 -13
  230. ansible/modules/dpkg_selections.py +4 -4
  231. ansible/modules/expect.py +8 -10
  232. ansible/modules/fail.py +4 -4
  233. ansible/modules/fetch.py +4 -4
  234. ansible/modules/file.py +174 -133
  235. ansible/modules/find.py +19 -17
  236. ansible/modules/gather_facts.py +3 -3
  237. ansible/modules/get_url.py +59 -53
  238. ansible/modules/getent.py +7 -9
  239. ansible/modules/git.py +28 -25
  240. ansible/modules/group.py +6 -6
  241. ansible/modules/group_by.py +4 -4
  242. ansible/modules/hostname.py +13 -29
  243. ansible/modules/import_playbook.py +6 -6
  244. ansible/modules/import_role.py +6 -6
  245. ansible/modules/import_tasks.py +6 -6
  246. ansible/modules/include_role.py +6 -6
  247. ansible/modules/include_tasks.py +6 -6
  248. ansible/modules/include_vars.py +6 -6
  249. ansible/modules/iptables.py +86 -73
  250. ansible/modules/known_hosts.py +10 -10
  251. ansible/modules/lineinfile.py +5 -5
  252. ansible/modules/meta.py +4 -4
  253. ansible/modules/mount_facts.py +2 -2
  254. ansible/modules/package.py +4 -4
  255. ansible/modules/package_facts.py +22 -10
  256. ansible/modules/pause.py +6 -6
  257. ansible/modules/ping.py +6 -6
  258. ansible/modules/pip.py +10 -11
  259. ansible/modules/raw.py +4 -4
  260. ansible/modules/reboot.py +6 -6
  261. ansible/modules/replace.py +9 -13
  262. ansible/modules/rpm_key.py +7 -8
  263. ansible/modules/script.py +4 -4
  264. ansible/modules/service.py +7 -8
  265. ansible/modules/service_facts.py +87 -10
  266. ansible/modules/set_fact.py +5 -5
  267. ansible/modules/set_stats.py +4 -4
  268. ansible/modules/setup.py +2 -2
  269. ansible/modules/shell.py +6 -6
  270. ansible/modules/slurp.py +6 -6
  271. ansible/modules/stat.py +9 -23
  272. ansible/modules/subversion.py +15 -15
  273. ansible/modules/systemd.py +6 -6
  274. ansible/modules/systemd_service.py +6 -6
  275. ansible/modules/sysvinit.py +6 -6
  276. ansible/modules/tempfile.py +5 -6
  277. ansible/modules/template.py +6 -6
  278. ansible/modules/unarchive.py +32 -11
  279. ansible/modules/uri.py +33 -26
  280. ansible/modules/user.py +53 -34
  281. ansible/modules/validate_argument_spec.py +10 -7
  282. ansible/modules/wait_for.py +32 -27
  283. ansible/modules/wait_for_connection.py +6 -6
  284. ansible/modules/yum_repository.py +6 -6
  285. ansible/parsing/ajson.py +14 -32
  286. ansible/parsing/dataloader.py +99 -54
  287. ansible/parsing/mod_args.py +28 -44
  288. ansible/parsing/plugin_docs.py +21 -86
  289. ansible/parsing/quoting.py +1 -1
  290. ansible/parsing/splitter.py +27 -12
  291. ansible/parsing/utils/addresses.py +24 -24
  292. ansible/parsing/utils/jsonify.py +5 -1
  293. ansible/parsing/utils/yaml.py +32 -61
  294. ansible/parsing/vault/__init__.py +319 -87
  295. ansible/parsing/yaml/__init__.py +0 -18
  296. ansible/parsing/yaml/dumper.py +6 -120
  297. ansible/parsing/yaml/loader.py +6 -39
  298. ansible/parsing/yaml/objects.py +43 -335
  299. ansible/playbook/__init__.py +1 -1
  300. ansible/playbook/attribute.py +8 -3
  301. ansible/playbook/base.py +182 -132
  302. ansible/playbook/block.py +26 -24
  303. ansible/playbook/collectionsearch.py +1 -15
  304. ansible/playbook/conditional.py +3 -77
  305. ansible/playbook/handler.py +8 -2
  306. ansible/playbook/helpers.py +41 -53
  307. ansible/playbook/included_file.py +31 -27
  308. ansible/playbook/loop_control.py +2 -2
  309. ansible/playbook/play.py +85 -44
  310. ansible/playbook/play_context.py +12 -17
  311. ansible/playbook/playbook_include.py +14 -15
  312. ansible/playbook/role/__init__.py +24 -26
  313. ansible/playbook/role/definition.py +15 -17
  314. ansible/playbook/role/include.py +2 -4
  315. ansible/playbook/role/metadata.py +10 -11
  316. ansible/playbook/role_include.py +3 -3
  317. ansible/playbook/taggable.py +13 -8
  318. ansible/playbook/task.py +188 -118
  319. ansible/playbook/task_include.py +5 -5
  320. ansible/plugins/__init__.py +68 -21
  321. ansible/plugins/action/__init__.py +209 -176
  322. ansible/plugins/action/add_host.py +1 -1
  323. ansible/plugins/action/assemble.py +1 -1
  324. ansible/plugins/action/assert.py +54 -66
  325. ansible/plugins/action/copy.py +7 -11
  326. ansible/plugins/action/debug.py +37 -31
  327. ansible/plugins/action/dnf.py +3 -4
  328. ansible/plugins/action/fail.py +1 -1
  329. ansible/plugins/action/fetch.py +4 -5
  330. ansible/plugins/action/gather_facts.py +7 -6
  331. ansible/plugins/action/group_by.py +1 -1
  332. ansible/plugins/action/include_vars.py +10 -11
  333. ansible/plugins/action/package.py +3 -6
  334. ansible/plugins/action/pause.py +2 -2
  335. ansible/plugins/action/script.py +15 -8
  336. ansible/plugins/action/service.py +6 -11
  337. ansible/plugins/action/set_fact.py +3 -12
  338. ansible/plugins/action/set_stats.py +3 -8
  339. ansible/plugins/action/template.py +35 -59
  340. ansible/plugins/action/unarchive.py +1 -1
  341. ansible/plugins/action/validate_argument_spec.py +5 -5
  342. ansible/plugins/action/wait_for_connection.py +1 -1
  343. ansible/plugins/become/__init__.py +31 -8
  344. ansible/plugins/become/runas.py +71 -0
  345. ansible/plugins/become/su.py +13 -8
  346. ansible/plugins/become/sudo.py +19 -0
  347. ansible/plugins/cache/__init__.py +35 -44
  348. ansible/plugins/cache/base.py +8 -0
  349. ansible/plugins/cache/jsonfile.py +10 -16
  350. ansible/plugins/cache/memory.py +6 -12
  351. ansible/plugins/callback/__init__.py +284 -179
  352. ansible/plugins/callback/default.py +99 -92
  353. ansible/plugins/callback/junit.py +44 -39
  354. ansible/plugins/callback/minimal.py +28 -25
  355. ansible/plugins/callback/oneline.py +28 -21
  356. ansible/plugins/callback/tree.py +16 -11
  357. ansible/plugins/connection/__init__.py +47 -34
  358. ansible/plugins/connection/local.py +150 -54
  359. ansible/plugins/connection/paramiko_ssh.py +21 -18
  360. ansible/plugins/connection/psrp.py +76 -165
  361. ansible/plugins/connection/ssh.py +301 -78
  362. ansible/plugins/connection/winrm.py +58 -140
  363. ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
  364. ansible/plugins/doc_fragments/action_core.py +6 -6
  365. ansible/plugins/doc_fragments/backup.py +2 -2
  366. ansible/plugins/doc_fragments/checksum_common.py +27 -0
  367. ansible/plugins/doc_fragments/constructed.py +6 -2
  368. ansible/plugins/doc_fragments/decrypt.py +2 -2
  369. ansible/plugins/doc_fragments/default_callback.py +2 -2
  370. ansible/plugins/doc_fragments/files.py +2 -2
  371. ansible/plugins/doc_fragments/inventory_cache.py +2 -2
  372. ansible/plugins/doc_fragments/result_format_callback.py +2 -2
  373. ansible/plugins/doc_fragments/return_common.py +2 -2
  374. ansible/plugins/doc_fragments/template_common.py +4 -4
  375. ansible/plugins/doc_fragments/url.py +17 -1
  376. ansible/plugins/doc_fragments/url_windows.py +2 -2
  377. ansible/plugins/doc_fragments/validate.py +2 -2
  378. ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
  379. ansible/plugins/filter/__init__.py +6 -2
  380. ansible/plugins/filter/b64decode.yml +22 -0
  381. ansible/plugins/filter/b64encode.yml +22 -0
  382. ansible/plugins/filter/bool.yml +11 -4
  383. ansible/plugins/filter/core.py +225 -108
  384. ansible/plugins/filter/encryption.py +32 -32
  385. ansible/plugins/filter/flatten.yml +3 -2
  386. ansible/plugins/filter/human_to_bytes.yml +1 -1
  387. ansible/plugins/filter/mathstuff.py +30 -37
  388. ansible/plugins/filter/password_hash.yml +8 -0
  389. ansible/plugins/filter/regex_search.yml +1 -4
  390. ansible/plugins/filter/split.yml +1 -1
  391. ansible/plugins/filter/to_nice_yaml.yml +0 -4
  392. ansible/plugins/filter/to_yaml.yml +0 -4
  393. ansible/plugins/filter/unvault.yml +1 -1
  394. ansible/plugins/filter/urls.py +1 -1
  395. ansible/plugins/filter/urlsplit.py +8 -9
  396. ansible/plugins/filter/vault.yml +14 -9
  397. ansible/plugins/filter/win_basename.yml +6 -1
  398. ansible/plugins/filter/win_dirname.yml +5 -0
  399. ansible/plugins/inventory/__init__.py +97 -77
  400. ansible/plugins/inventory/advanced_host_list.py +7 -5
  401. ansible/plugins/inventory/auto.py +11 -4
  402. ansible/plugins/inventory/constructed.py +21 -24
  403. ansible/plugins/inventory/generator.py +16 -11
  404. ansible/plugins/inventory/host_list.py +7 -5
  405. ansible/plugins/inventory/ini.py +78 -44
  406. ansible/plugins/inventory/script.py +189 -119
  407. ansible/plugins/inventory/toml.py +16 -126
  408. ansible/plugins/inventory/yaml.py +10 -8
  409. ansible/plugins/list.py +3 -3
  410. ansible/plugins/loader.py +197 -82
  411. ansible/plugins/lookup/__init__.py +21 -4
  412. ansible/plugins/lookup/config.py +21 -35
  413. ansible/plugins/lookup/csvfile.py +3 -2
  414. ansible/plugins/lookup/dict.py +1 -6
  415. ansible/plugins/lookup/env.py +12 -9
  416. ansible/plugins/lookup/file.py +5 -8
  417. ansible/plugins/lookup/first_found.py +86 -55
  418. ansible/plugins/lookup/indexed_items.py +1 -10
  419. ansible/plugins/lookup/ini.py +14 -13
  420. ansible/plugins/lookup/items.py +1 -1
  421. ansible/plugins/lookup/lines.py +8 -1
  422. ansible/plugins/lookup/list.py +1 -1
  423. ansible/plugins/lookup/nested.py +2 -18
  424. ansible/plugins/lookup/password.py +5 -5
  425. ansible/plugins/lookup/pipe.py +5 -7
  426. ansible/plugins/lookup/sequence.py +18 -8
  427. ansible/plugins/lookup/subelements.py +1 -4
  428. ansible/plugins/lookup/template.py +42 -36
  429. ansible/plugins/lookup/together.py +0 -12
  430. ansible/plugins/lookup/unvault.py +1 -5
  431. ansible/plugins/lookup/url.py +2 -8
  432. ansible/plugins/lookup/vars.py +16 -24
  433. ansible/plugins/shell/__init__.py +2 -2
  434. ansible/plugins/shell/cmd.py +2 -2
  435. ansible/plugins/shell/powershell.py +39 -22
  436. ansible/plugins/shell/sh.py +3 -2
  437. ansible/plugins/strategy/__init__.py +159 -184
  438. ansible/plugins/strategy/debug.py +2 -2
  439. ansible/plugins/strategy/free.py +16 -31
  440. ansible/plugins/strategy/host_pinned.py +2 -2
  441. ansible/plugins/strategy/linear.py +41 -41
  442. ansible/plugins/terminal/__init__.py +4 -4
  443. ansible/plugins/test/__init__.py +7 -2
  444. ansible/plugins/test/core.py +55 -21
  445. ansible/plugins/test/files.py +1 -1
  446. ansible/plugins/test/mathstuff.py +3 -3
  447. ansible/plugins/test/uri.py +3 -3
  448. ansible/plugins/vars/host_group_vars.py +7 -14
  449. ansible/release.py +2 -2
  450. ansible/template/__init__.py +370 -944
  451. ansible/utils/__init__.py +0 -18
  452. ansible/utils/_ssh_agent.py +657 -0
  453. ansible/utils/collection_loader/__init__.py +52 -5
  454. ansible/utils/collection_loader/_collection_config.py +5 -6
  455. ansible/utils/collection_loader/_collection_finder.py +79 -93
  456. ansible/utils/collection_loader/_collection_meta.py +13 -8
  457. ansible/utils/display.py +433 -63
  458. ansible/utils/encrypt.py +27 -19
  459. ansible/utils/fqcn.py +2 -2
  460. ansible/utils/hashing.py +2 -2
  461. ansible/utils/helpers.py +2 -2
  462. ansible/utils/listify.py +8 -8
  463. ansible/utils/lock.py +2 -2
  464. ansible/utils/path.py +4 -4
  465. ansible/utils/plugin_docs.py +14 -13
  466. ansible/utils/sentinel.py +4 -62
  467. ansible/utils/singleton.py +2 -0
  468. ansible/utils/ssh_functions.py +1 -1
  469. ansible/utils/unsafe_proxy.py +23 -332
  470. ansible/utils/vars.py +51 -8
  471. ansible/utils/version.py +2 -2
  472. ansible/vars/clean.py +5 -5
  473. ansible/vars/hostvars.py +60 -90
  474. ansible/vars/manager.py +206 -282
  475. ansible/vars/reserved.py +8 -9
  476. ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
  477. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
  478. ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
  479. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
  480. ansible_test/_data/completion/docker.txt +7 -7
  481. ansible_test/_data/completion/remote.txt +6 -6
  482. ansible_test/_data/completion/windows.txt +1 -0
  483. ansible_test/_data/requirements/ansible.txt +2 -2
  484. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  485. ansible_test/_data/requirements/sanity.changelog.txt +1 -1
  486. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  487. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  488. ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
  489. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  490. ansible_test/_data/requirements/units.txt +1 -0
  491. ansible_test/_internal/__init__.py +1 -0
  492. ansible_test/_internal/ansible_util.py +2 -0
  493. ansible_test/_internal/become.py +1 -0
  494. ansible_test/_internal/bootstrap.py +1 -0
  495. ansible_test/_internal/cache.py +1 -0
  496. ansible_test/_internal/cgroup.py +1 -0
  497. ansible_test/_internal/ci/__init__.py +1 -0
  498. ansible_test/_internal/ci/azp.py +1 -0
  499. ansible_test/_internal/ci/local.py +1 -0
  500. ansible_test/_internal/classification/__init__.py +1 -0
  501. ansible_test/_internal/classification/common.py +1 -0
  502. ansible_test/_internal/classification/csharp.py +1 -0
  503. ansible_test/_internal/classification/powershell.py +1 -0
  504. ansible_test/_internal/classification/python.py +1 -0
  505. ansible_test/_internal/cli/__init__.py +1 -0
  506. ansible_test/_internal/cli/actions.py +1 -0
  507. ansible_test/_internal/cli/argparsing/__init__.py +1 -0
  508. ansible_test/_internal/cli/argparsing/actions.py +1 -0
  509. ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
  510. ansible_test/_internal/cli/argparsing/parsers.py +1 -0
  511. ansible_test/_internal/cli/commands/__init__.py +11 -0
  512. ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
  513. ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
  514. ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
  515. ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
  516. ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
  517. ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
  518. ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
  519. ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
  520. ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
  521. ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
  522. ansible_test/_internal/cli/commands/coverage/html.py +1 -0
  523. ansible_test/_internal/cli/commands/coverage/report.py +1 -0
  524. ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
  525. ansible_test/_internal/cli/commands/env.py +1 -0
  526. ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
  527. ansible_test/_internal/cli/commands/integration/network.py +1 -0
  528. ansible_test/_internal/cli/commands/integration/posix.py +1 -0
  529. ansible_test/_internal/cli/commands/integration/windows.py +1 -0
  530. ansible_test/_internal/cli/commands/sanity.py +9 -0
  531. ansible_test/_internal/cli/commands/shell.py +1 -0
  532. ansible_test/_internal/cli/commands/units.py +1 -0
  533. ansible_test/_internal/cli/compat.py +1 -0
  534. ansible_test/_internal/cli/completers.py +1 -0
  535. ansible_test/_internal/cli/converters.py +1 -0
  536. ansible_test/_internal/cli/environments.py +1 -0
  537. ansible_test/_internal/cli/epilog.py +1 -0
  538. ansible_test/_internal/cli/parsers/__init__.py +1 -0
  539. ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
  540. ansible_test/_internal/cli/parsers/helpers.py +1 -0
  541. ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
  542. ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
  543. ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
  544. ansible_test/_internal/commands/__init__.py +1 -0
  545. ansible_test/_internal/commands/coverage/__init__.py +2 -1
  546. ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
  547. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
  548. ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
  549. ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
  550. ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
  551. ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
  552. ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
  553. ansible_test/_internal/commands/coverage/combine.py +2 -1
  554. ansible_test/_internal/commands/coverage/erase.py +1 -0
  555. ansible_test/_internal/commands/coverage/html.py +1 -0
  556. ansible_test/_internal/commands/coverage/report.py +1 -0
  557. ansible_test/_internal/commands/coverage/xml.py +1 -0
  558. ansible_test/_internal/commands/env/__init__.py +2 -0
  559. ansible_test/_internal/commands/integration/__init__.py +4 -0
  560. ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
  561. ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
  562. ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
  563. ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
  564. ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
  565. ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
  566. ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
  567. ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
  568. ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
  569. ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
  570. ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
  571. ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
  572. ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
  573. ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
  574. ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
  575. ansible_test/_internal/commands/integration/coverage.py +1 -0
  576. ansible_test/_internal/commands/integration/filters.py +1 -0
  577. ansible_test/_internal/commands/integration/network.py +1 -0
  578. ansible_test/_internal/commands/integration/posix.py +1 -0
  579. ansible_test/_internal/commands/integration/windows.py +1 -0
  580. ansible_test/_internal/commands/sanity/__init__.py +16 -1
  581. ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
  582. ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
  583. ansible_test/_internal/commands/sanity/compile.py +1 -0
  584. ansible_test/_internal/commands/sanity/ignores.py +1 -0
  585. ansible_test/_internal/commands/sanity/import.py +1 -0
  586. ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
  587. ansible_test/_internal/commands/sanity/pep8.py +1 -0
  588. ansible_test/_internal/commands/sanity/pslint.py +1 -0
  589. ansible_test/_internal/commands/sanity/pylint.py +24 -26
  590. ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
  591. ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
  592. ansible_test/_internal/commands/sanity/yamllint.py +1 -0
  593. ansible_test/_internal/commands/shell/__init__.py +1 -0
  594. ansible_test/_internal/commands/units/__init__.py +1 -0
  595. ansible_test/_internal/compat/__init__.py +1 -0
  596. ansible_test/_internal/compat/packaging.py +1 -0
  597. ansible_test/_internal/compat/yaml.py +1 -0
  598. ansible_test/_internal/completion.py +1 -0
  599. ansible_test/_internal/config.py +2 -0
  600. ansible_test/_internal/connections.py +1 -0
  601. ansible_test/_internal/constants.py +1 -0
  602. ansible_test/_internal/containers.py +1 -0
  603. ansible_test/_internal/content_config.py +1 -0
  604. ansible_test/_internal/core_ci.py +1 -0
  605. ansible_test/_internal/coverage_util.py +11 -10
  606. ansible_test/_internal/data.py +1 -0
  607. ansible_test/_internal/delegation.py +1 -0
  608. ansible_test/_internal/dev/__init__.py +1 -0
  609. ansible_test/_internal/dev/container_probe.py +1 -0
  610. ansible_test/_internal/diff.py +3 -2
  611. ansible_test/_internal/docker_util.py +2 -1
  612. ansible_test/_internal/encoding.py +1 -0
  613. ansible_test/_internal/executor.py +1 -0
  614. ansible_test/_internal/git.py +1 -0
  615. ansible_test/_internal/host_configs.py +1 -0
  616. ansible_test/_internal/host_profiles.py +1 -0
  617. ansible_test/_internal/http.py +1 -0
  618. ansible_test/_internal/init.py +1 -0
  619. ansible_test/_internal/inventory.py +35 -3
  620. ansible_test/_internal/io.py +1 -0
  621. ansible_test/_internal/metadata.py +1 -0
  622. ansible_test/_internal/payload.py +1 -0
  623. ansible_test/_internal/provider/__init__.py +1 -0
  624. ansible_test/_internal/provider/layout/__init__.py +1 -0
  625. ansible_test/_internal/provider/layout/ansible.py +1 -0
  626. ansible_test/_internal/provider/layout/collection.py +1 -0
  627. ansible_test/_internal/provider/layout/unsupported.py +1 -0
  628. ansible_test/_internal/provider/source/__init__.py +1 -0
  629. ansible_test/_internal/provider/source/git.py +1 -0
  630. ansible_test/_internal/provider/source/installed.py +1 -0
  631. ansible_test/_internal/provider/source/unsupported.py +1 -0
  632. ansible_test/_internal/provider/source/unversioned.py +1 -0
  633. ansible_test/_internal/provisioning.py +1 -0
  634. ansible_test/_internal/pypi_proxy.py +6 -5
  635. ansible_test/_internal/python_requirements.py +1 -0
  636. ansible_test/_internal/ssh.py +1 -0
  637. ansible_test/_internal/target.py +1 -0
  638. ansible_test/_internal/test.py +3 -2
  639. ansible_test/_internal/thread.py +1 -0
  640. ansible_test/_internal/timeout.py +1 -0
  641. ansible_test/_internal/util.py +1 -0
  642. ansible_test/_internal/util_common.py +5 -2
  643. ansible_test/_internal/venv.py +1 -0
  644. ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
  645. ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
  646. ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
  647. ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
  648. ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
  649. ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
  650. ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
  651. ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
  652. ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
  653. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
  654. ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
  655. ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
  656. ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
  657. ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
  658. ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
  659. ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
  660. ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
  661. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
  662. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
  663. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
  664. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
  665. ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
  666. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
  667. ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
  668. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
  669. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
  670. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
  671. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
  672. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
  673. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
  674. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
  675. ansible_test/_util/controller/tools/collection_detail.py +1 -0
  676. ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
  677. ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
  678. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
  679. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
  680. ansible_test/_util/target/sanity/compile/compile.py +1 -0
  681. ansible_test/_util/target/sanity/import/importer.py +15 -16
  682. ansible_test/_util/target/setup/bootstrap.sh +9 -20
  683. ansible_test/_util/target/setup/probe_cgroups.py +1 -0
  684. ansible_test/_util/target/setup/quiet_pip.py +1 -0
  685. ansible_test/_util/target/setup/requirements.py +35 -27
  686. ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
  687. ansible_test/_util/target/tools/yamlcheck.py +2 -1
  688. ansible/compat/selectors.py +0 -32
  689. ansible/errors/yaml_strings.py +0 -138
  690. ansible/executor/action_write_locks.py +0 -44
  691. ansible/executor/discovery/python_target.py +0 -47
  692. ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
  693. ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
  694. ansible/module_utils/compat/importlib.py +0 -26
  695. ansible/module_utils/compat/selectors.py +0 -32
  696. ansible/module_utils/pycompat24.py +0 -73
  697. ansible/parsing/yaml/constructor.py +0 -178
  698. ansible/template/native_helpers.py +0 -251
  699. ansible/template/template.py +0 -43
  700. ansible/template/vars.py +0 -77
  701. ansible/utils/native_jinja.py +0 -11
  702. ansible/vars/fact_cache.py +0 -71
  703. ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
  704. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
  705. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
  706. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
  707. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
  708. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
  709. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
  710. {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -31,20 +31,19 @@ from __future__ import annotations
31
31
  from collections import defaultdict
32
32
 
33
33
  import platform
34
-
35
- import ansible.module_utils.compat.typing as t
34
+ import typing as t
36
35
 
37
36
  from ansible.module_utils.facts import timeout
38
37
 
39
38
 
40
39
  class CycleFoundInFactDeps(Exception):
41
- '''Indicates there is a cycle in fact collector deps
40
+ """Indicates there is a cycle in fact collector deps
42
41
 
43
42
  If collector-B requires collector-A, and collector-A requires
44
43
  collector-B, that is a cycle. In that case, there is no ordering
45
44
  that will satisfy B before A and A and before B. That will cause this
46
45
  error to be raised.
47
- '''
46
+ """
48
47
  pass
49
48
 
50
49
 
@@ -64,9 +63,9 @@ class BaseFactCollector:
64
63
  required_facts = set() # type: t.Set[str]
65
64
 
66
65
  def __init__(self, collectors=None, namespace=None):
67
- '''Base class for things that collect facts.
66
+ """Base class for things that collect facts.
68
67
 
69
- 'collectors' is an optional list of other FactCollectors for composing.'''
68
+ 'collectors' is an optional list of other FactCollectors for composing."""
70
69
  self.collectors = collectors or []
71
70
 
72
71
  # self.namespace is a object with a 'transform' method that transforms
@@ -88,7 +87,7 @@ class BaseFactCollector:
88
87
  return key_name
89
88
 
90
89
  def _transform_dict_keys(self, fact_dict):
91
- '''update a dicts keys to use new names as transformed by self._transform_name'''
90
+ """update a dicts keys to use new names as transformed by self._transform_name"""
92
91
 
93
92
  if fact_dict is None:
94
93
  return {}
@@ -107,7 +106,7 @@ class BaseFactCollector:
107
106
  return facts_dict
108
107
 
109
108
  def collect(self, module=None, collected_facts=None):
110
- '''do the fact collection
109
+ """do the fact collection
111
110
 
112
111
  'collected_facts' is a object (a dict, likely) that holds all previously
113
112
  facts. This is intended to be used if a FactCollector needs to reference
@@ -115,7 +114,7 @@ class BaseFactCollector:
115
114
 
116
115
  Returns a dict of facts.
117
116
 
118
- '''
117
+ """
119
118
  facts_dict = {}
120
119
  return facts_dict
121
120
 
@@ -125,12 +124,12 @@ def get_collector_names(valid_subsets=None,
125
124
  gather_subset=None,
126
125
  aliases_map=None,
127
126
  platform_info=None):
128
- '''return a set of FactCollector names based on gather_subset spec.
127
+ """return a set of FactCollector names based on gather_subset spec.
129
128
 
130
129
  gather_subset is a spec describing which facts to gather.
131
130
  valid_subsets is a frozenset of potential matches for gather_subset ('all', 'network') etc
132
131
  minimal_gather_subsets is a frozenset of matches to always use, even for gather_subset='!all'
133
- '''
132
+ """
134
133
 
135
134
  # Retrieve module parameters
136
135
  gather_subset = gather_subset or ['all']
@@ -267,11 +266,11 @@ def _get_requires_by_collector_name(collector_name, all_fact_subsets):
267
266
 
268
267
 
269
268
  def find_unresolved_requires(collector_names, all_fact_subsets):
270
- '''Find any collector names that have unresolved requires
269
+ """Find any collector names that have unresolved requires
271
270
 
272
271
  Returns a list of collector names that correspond to collector
273
272
  classes whose .requires_facts() are not in collector_names.
274
- '''
273
+ """
275
274
  unresolved = set()
276
275
 
277
276
  for collector_name in collector_names:
@@ -351,7 +350,7 @@ def collector_classes_from_gather_subset(all_collector_classes=None,
351
350
  gather_subset=None,
352
351
  gather_timeout=None,
353
352
  platform_info=None):
354
- '''return a list of collector classes that match the args'''
353
+ """return a list of collector classes that match the args"""
355
354
 
356
355
  # use gather_name etc to get the list of collectors
357
356
 
@@ -34,19 +34,19 @@ from ansible.module_utils.facts import ansible_collector
34
34
 
35
35
 
36
36
  def get_all_facts(module):
37
- '''compat api for ansible 2.2/2.3 module_utils.facts.get_all_facts method
37
+ """compat api for ansible 2.2/2.3 module_utils.facts.get_all_facts method
38
38
 
39
39
  Expects module to be an instance of AnsibleModule, with a 'gather_subset' param.
40
40
 
41
41
  returns a dict mapping the bare fact name ('default_ipv4' with no 'ansible_' namespace) to
42
- the fact value.'''
42
+ the fact value."""
43
43
 
44
44
  gather_subset = module.params['gather_subset']
45
45
  return ansible_facts(module, gather_subset=gather_subset)
46
46
 
47
47
 
48
48
  def ansible_facts(module, gather_subset=None):
49
- '''Compat api for ansible 2.0/2.2/2.3 module_utils.facts.ansible_facts method
49
+ """Compat api for ansible 2.0/2.2/2.3 module_utils.facts.ansible_facts method
50
50
 
51
51
  2.3/2.3 expects a gather_subset arg.
52
52
  2.0/2.1 does not except a gather_subset arg
@@ -57,7 +57,7 @@ def ansible_facts(module, gather_subset=None):
57
57
 
58
58
  returns a dict mapping the bare fact name ('default_ipv4' with no 'ansible_' namespace) to
59
59
  the fact value.
60
- '''
60
+ """
61
61
 
62
62
  gather_subset = gather_subset or module.params.get('gather_subset', ['all'])
63
63
  gather_timeout = module.params.get('gather_timeout', 10)
@@ -27,7 +27,7 @@
27
27
  #
28
28
  from __future__ import annotations
29
29
 
30
- import ansible.module_utils.compat.typing as t
30
+ import typing as t
31
31
 
32
32
  from ansible.module_utils.facts.collector import BaseFactCollector
33
33
 
@@ -45,6 +45,7 @@ class AIXHardware(Hardware):
45
45
  vgs_facts = self.get_vgs_facts()
46
46
  mount_facts = self.get_mount_facts()
47
47
  devices_facts = self.get_device_facts()
48
+ uptime_facts = self.get_uptime_facts()
48
49
 
49
50
  hardware_facts.update(cpu_facts)
50
51
  hardware_facts.update(memory_facts)
@@ -52,6 +53,7 @@ class AIXHardware(Hardware):
52
53
  hardware_facts.update(vgs_facts)
53
54
  hardware_facts.update(mount_facts)
54
55
  hardware_facts.update(devices_facts)
56
+ hardware_facts.update(uptime_facts)
55
57
 
56
58
  return hardware_facts
57
59
 
@@ -123,6 +125,38 @@ class AIXHardware(Hardware):
123
125
 
124
126
  return memory_facts
125
127
 
128
+ def get_uptime_facts(self):
129
+ uptime_facts = {}
130
+ # On AIX, there are no options to get the uptime directly in seconds.
131
+ # Your options are to parse the output of "who", "uptime", or "ps".
132
+ # Only "ps" always provides a field with seconds.
133
+ ps_bin = self.module.get_bin_path("ps")
134
+ if ps_bin is None:
135
+ return uptime_facts
136
+
137
+ ps_cmd = [ps_bin, "-p", "1", "-o", "etime="]
138
+
139
+ rc, out, err = self.module.run_command(ps_cmd)
140
+ if rc != 0:
141
+ return uptime_facts
142
+
143
+ # Parse out
144
+ if out:
145
+ lines = out.splitlines()
146
+ data = lines[0].replace(':', '-').split('-')
147
+ try:
148
+ days = int(data[0])
149
+ hours = int(data[1])
150
+ minutes = int(data[2])
151
+ seconds = int(data[3])
152
+ except (IndexError, ValueError):
153
+ return uptime_facts
154
+ # Calculate uptime in seconds
155
+ uptime_seconds = (days * 86400) + (hours * 3600) + (minutes * 60) + seconds
156
+ uptime_facts['uptime_seconds'] = int(uptime_seconds)
157
+
158
+ return uptime_facts
159
+
126
160
  def get_dmi_facts(self):
127
161
  dmi_facts = {}
128
162
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  from __future__ import annotations
30
30
 
31
- import ansible.module_utils.compat.typing as t
31
+ import typing as t
32
32
 
33
33
  from ansible.module_utils.facts.collector import BaseFactCollector
34
34
 
@@ -93,9 +93,7 @@ class DarwinHardware(Hardware):
93
93
  }
94
94
 
95
95
  total_used = 0
96
- page_size = 4096
97
- if 'hw.pagesize' in self.sysctl:
98
- page_size = int(self.sysctl['hw.pagesize'])
96
+ page_size = int(self.sysctl.get('hw.pagesize', 4096))
99
97
 
100
98
  vm_stat_command = self.module.get_bin_path('vm_stat')
101
99
  if vm_stat_command is None:
@@ -224,9 +224,9 @@ class FreeBSDHardware(Hardware):
224
224
  return device_facts
225
225
 
226
226
  def get_dmi_facts(self):
227
- ''' learn dmi facts from system
227
+ """ learn dmi facts from system
228
228
 
229
- Use dmidecode executable if available'''
229
+ Use dmidecode executable if available"""
230
230
 
231
231
  dmi_facts = {}
232
232
 
@@ -311,10 +311,10 @@ class LinuxHardware(Hardware):
311
311
  return cpu_facts
312
312
 
313
313
  def get_dmi_facts(self):
314
- ''' learn dmi facts from system
314
+ """ learn dmi facts from system
315
315
 
316
316
  Try /sys first for dmi related facts.
317
- If that is not available, fall back to dmidecode executable '''
317
+ If that is not available, fall back to dmidecode executable """
318
318
 
319
319
  dmi_facts = {}
320
320
 
@@ -423,13 +423,13 @@ class LinuxHardware(Hardware):
423
423
  'NA'
424
424
  )
425
425
  sysinfo_re = re.compile(
426
- r'''
426
+ r"""
427
427
  ^
428
428
  (?:Manufacturer:\s+(?P<system_vendor>.+))|
429
429
  (?:Type:\s+(?P<product_name>.+))|
430
430
  (?:Sequence\ Code:\s+0+(?P<product_serial>.+))
431
431
  $
432
- ''',
432
+ """,
433
433
  re.VERBOSE | re.MULTILINE
434
434
  )
435
435
  data = get_file_content('/proc/sysinfo')
@@ -33,7 +33,7 @@ class FactNamespace:
33
33
  self.namespace_name = namespace_name
34
34
 
35
35
  def transform(self, name):
36
- '''Take a text name, and transforms it as needed (add a namespace prefix, etc)'''
36
+ """Take a text name, and transforms it as needed (add a namespace prefix, etc)"""
37
37
  return name
38
38
 
39
39
  def _underscore(self, name):
@@ -15,7 +15,7 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- import ansible.module_utils.compat.typing as t
18
+ import typing as t
19
19
 
20
20
  from ansible.module_utils.facts.collector import BaseFactCollector
21
21
 
@@ -19,8 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  import sys
21
21
  import glob
22
-
23
- import ansible.module_utils.compat.typing as t
22
+ import typing as t
24
23
 
25
24
  from ansible.module_utils.facts.utils import get_file_lines
26
25
  from ansible.module_utils.facts.collector import BaseFactCollector
@@ -18,8 +18,7 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import sys
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.utils import get_file_content
25
24
  from ansible.module_utils.facts.network.base import NetworkCollector
@@ -18,8 +18,7 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import sys
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.utils import get_file_content
25
24
  from ansible.module_utils.facts.network.base import NetworkCollector
@@ -4,8 +4,7 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import json
7
-
8
- import ansible.module_utils.compat.typing as t
7
+ import typing as t
9
8
 
10
9
  from ansible.module_utils.facts.namespace import PrefixFactNamespace
11
10
  from ansible.module_utils.facts.collector import BaseFactCollector
@@ -16,8 +16,7 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import json
19
-
20
- import ansible.module_utils.compat.typing as t
19
+ import typing as t
21
20
 
22
21
  from ansible.module_utils.facts.namespace import PrefixFactNamespace
23
22
 
@@ -25,7 +24,7 @@ from ansible.module_utils.facts.collector import BaseFactCollector
25
24
 
26
25
 
27
26
  class OhaiFactCollector(BaseFactCollector):
28
- '''This is a subclass of Facts for including information gathered from Ohai.'''
27
+ """This is a subclass of Facts for including information gathered from Ohai."""
29
28
  name = 'ohai'
30
29
  _fact_ids = set() # type: t.Set[str]
31
30
 
@@ -18,8 +18,7 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import os
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.collector import BaseFactCollector
25
24
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- import ansible.module_utils.compat.typing as t
20
+ import typing as t
21
21
 
22
22
  from ansible.module_utils.facts.collector import BaseFactCollector
23
23
 
@@ -3,8 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
-
7
- import ansible.module_utils.compat.typing as t
6
+ import typing as t
8
7
 
9
8
  from ansible.module_utils.facts.collector import BaseFactCollector
10
9
 
@@ -16,8 +16,7 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import shlex
19
-
20
- import ansible.module_utils.compat.typing as t
19
+ import typing as t
21
20
 
22
21
  from ansible.module_utils.facts.utils import get_file_content
23
22
 
@@ -19,10 +19,9 @@ from __future__ import annotations
19
19
 
20
20
  import datetime
21
21
  import time
22
+ import typing as t
22
23
 
23
- import ansible.module_utils.compat.typing as t
24
24
  from ansible.module_utils.facts.collector import BaseFactCollector
25
- from ansible.module_utils.compat.datetime import utcfromtimestamp
26
25
 
27
26
 
28
27
  class DateTimeFactCollector(BaseFactCollector):
@@ -36,7 +35,10 @@ class DateTimeFactCollector(BaseFactCollector):
36
35
  # Store the timestamp once, then get local and UTC versions from that
37
36
  epoch_ts = time.time()
38
37
  now = datetime.datetime.fromtimestamp(epoch_ts)
39
- utcnow = utcfromtimestamp(epoch_ts).replace(tzinfo=None)
38
+ utcnow = datetime.datetime.fromtimestamp(
39
+ epoch_ts,
40
+ tz=datetime.timezone.utc,
41
+ )
40
42
 
41
43
  date_time_facts['year'] = now.strftime('%Y')
42
44
  date_time_facts['month'] = now.strftime('%m')
@@ -8,8 +8,7 @@ from __future__ import annotations
8
8
  import os
9
9
  import platform
10
10
  import re
11
-
12
- import ansible.module_utils.compat.typing as t
11
+ import typing as t
13
12
 
14
13
  from ansible.module_utils.common.sys_info import get_distribution, get_distribution_version, \
15
14
  get_distribution_codename
@@ -46,7 +45,7 @@ def _file_exists(path, allow_empty=False):
46
45
 
47
46
 
48
47
  class DistributionFiles:
49
- '''has-a various distro file parsers (os-release, etc) and logic for finding the right one.'''
48
+ """has-a various distro file parsers (os-release, etc) and logic for finding the right one."""
50
49
  # every distribution name mentioned here, must have one of
51
50
  # - allowempty == True
52
51
  # - be listed in SEARCH_STRING
@@ -208,7 +207,7 @@ class DistributionFiles:
208
207
 
209
208
  return dist_file_facts
210
209
 
211
- # TODO: FIXME: split distro file parsing into its own module or class
210
+ # FIXME: split distro file parsing into its own module or class
212
211
  def parse_distribution_file_Slackware(self, name, data, path, collected_facts):
213
212
  slackware_facts = {}
214
213
  if 'Slackware' not in data:
@@ -319,7 +318,7 @@ class DistributionFiles:
319
318
 
320
319
  def parse_distribution_file_Debian(self, name, data, path, collected_facts):
321
320
  debian_facts = {}
322
- if 'Debian' in data or 'Raspbian' in data:
321
+ if any(distro in data for distro in ('Debian', 'Raspbian')):
323
322
  debian_facts['distribution'] = 'Debian'
324
323
  release = re.search(r"PRETTY_NAME=[^(]+ \(?([^)]+?)\)", data)
325
324
  if release:
@@ -398,6 +397,8 @@ class DistributionFiles:
398
397
  if version:
399
398
  debian_facts['distribution_version'] = version.group(1)
400
399
  debian_facts['distribution_major_version'] = version.group(1).split('.')[0]
400
+ elif 'LMDE' in data:
401
+ debian_facts['distribution'] = 'Linux Mint Debian Edition'
401
402
  else:
402
403
  return False, debian_facts
403
404
 
@@ -515,9 +516,10 @@ class Distribution(object):
515
516
  'EuroLinux', 'Kylin Linux Advanced Server', 'MIRACLE'],
516
517
  'Debian': ['Debian', 'Ubuntu', 'Raspbian', 'Neon', 'KDE neon',
517
518
  'Linux Mint', 'SteamOS', 'Devuan', 'Kali', 'Cumulus Linux',
518
- 'Pop!_OS', 'Parrot', 'Pardus GNU/Linux', 'Uos', 'Deepin', 'OSMC'],
519
+ 'Pop!_OS', 'Parrot', 'Pardus GNU/Linux', 'Uos', 'Deepin', 'OSMC', 'Linux Mint Debian Edition'],
519
520
  'Suse': ['SuSE', 'SLES', 'SLED', 'openSUSE', 'openSUSE Tumbleweed',
520
- 'SLES_SAP', 'SUSE_LINUX', 'openSUSE Leap', 'ALP-Dolomite', 'SL-Micro'],
521
+ 'SLES_SAP', 'SUSE_LINUX', 'openSUSE Leap', 'ALP-Dolomite', 'SL-Micro',
522
+ 'openSUSE MicroOS'],
521
523
  'Archlinux': ['Archlinux', 'Antergos', 'Manjaro'],
522
524
  'Mandrake': ['Mandrake', 'Mandriva'],
523
525
  'Solaris': ['Solaris', 'Nexenta', 'OmniOS', 'OpenIndiana', 'SmartOS'],
@@ -570,7 +572,6 @@ class Distribution(object):
570
572
  distribution_facts.update(dist_file_facts)
571
573
 
572
574
  distro = distribution_facts['distribution']
573
-
574
575
  # look for a os family alias for the 'distribution', if there isnt one, use 'distribution'
575
576
  distribution_facts['os_family'] = self.OS_FAMILY.get(distro, None) or distro
576
577
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- import ansible.module_utils.compat.typing as t
18
+ import typing as t
19
19
 
20
20
  from ansible.module_utils.facts.utils import get_file_content
21
21
 
@@ -16,8 +16,7 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import os
19
-
20
- import ansible.module_utils.compat.typing as t
19
+ import typing as t
21
20
 
22
21
  from ansible.module_utils.six import iteritems
23
22
 
@@ -1,23 +1,10 @@
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)
1
3
  # Determine if a system is in 'fips' mode
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
4
 
18
5
  from __future__ import annotations
19
6
 
20
- import ansible.module_utils.compat.typing as t
7
+ import typing as t
21
8
 
22
9
  from ansible.module_utils.facts.utils import get_file_content
23
10
 
@@ -30,9 +17,9 @@ class FipsFactCollector(BaseFactCollector):
30
17
 
31
18
  def collect(self, module=None, collected_facts=None):
32
19
  # NOTE: this is populated even if it is not set
33
- fips_facts = {}
34
- fips_facts['fips'] = False
35
- data = get_file_content('/proc/sys/crypto/fips_enabled')
36
- if data and data == '1':
20
+ fips_facts = {
21
+ 'fips': False
22
+ }
23
+ if get_file_content('/proc/sys/crypto/fips_enabled') == '1':
37
24
  fips_facts['fips'] = True
38
25
  return fips_facts
@@ -4,8 +4,7 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import os
7
-
8
- import ansible.module_utils.compat.typing as t
7
+ import typing as t
9
8
 
10
9
  from ansible.module_utils.facts.collector import BaseFactCollector
11
10
 
@@ -7,8 +7,7 @@ import glob
7
7
  import json
8
8
  import os
9
9
  import stat
10
-
11
- import ansible.module_utils.compat.typing as t
10
+ import typing as t
12
11
 
13
12
  from ansible.module_utils.common.text.converters import to_text
14
13
  from ansible.module_utils.facts.utils import get_file_content
@@ -18,8 +18,7 @@
18
18
  from __future__ import annotations
19
19
 
20
20
  import os
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.utils import get_file_lines
25
24
  from ansible.module_utils.facts.collector import BaseFactCollector
@@ -6,8 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  import os
8
8
  import subprocess
9
-
10
- import ansible.module_utils.compat.typing as t
9
+ import typing as t
11
10
 
12
11
  from ansible.module_utils.facts.collector import BaseFactCollector
13
12
 
@@ -18,8 +18,7 @@ from __future__ import annotations
18
18
  import re
19
19
  import socket
20
20
  import platform
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.utils import get_file_content
25
24
 
@@ -16,8 +16,7 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import sys
19
-
20
- import ansible.module_utils.compat.typing as t
19
+ import typing as t
21
20
 
22
21
  from ansible.module_utils.facts.collector import BaseFactCollector
23
22
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- import ansible.module_utils.compat.typing as t
20
+ import typing as t
21
21
 
22
22
  from ansible.module_utils.facts.collector import BaseFactCollector
23
23
 
@@ -20,8 +20,7 @@ from __future__ import annotations
20
20
  import os
21
21
  import platform
22
22
  import re
23
-
24
- import ansible.module_utils.compat.typing as t
23
+ import typing as t
25
24
 
26
25
  from ansible.module_utils.common.text.converters import to_native
27
26
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- import ansible.module_utils.compat.typing as t
18
+ import typing as t
19
19
 
20
20
  from ansible.module_utils.facts.utils import get_file_content
21
21
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- import ansible.module_utils.compat.typing as t
20
+ import typing as t
21
21
 
22
22
  from ansible.module_utils.facts.collector import BaseFactCollector
23
23
  from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector
@@ -18,8 +18,7 @@ from __future__ import annotations
18
18
  import getpass
19
19
  import os
20
20
  import pwd
21
-
22
- import ansible.module_utils.compat.typing as t
21
+ import typing as t
23
22
 
24
23
  from ansible.module_utils.facts.collector import BaseFactCollector
25
24