ansible-core 2.18.4rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +160 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +198 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +351 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +153 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +48 -46
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +165 -108
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +136 -76
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +237 -236
- ansible/executor/task_queue_manager.py +62 -38
- ansible/executor/task_result.py +21 -12
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +77 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +154 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +52 -17
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +20 -18
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +7 -7
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +35 -49
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +39 -32
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +36 -339
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +6 -15
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +8 -7
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +141 -123
- ansible/plugins/callback/default.py +30 -23
- ansible/plugins/callback/junit.py +28 -24
- ansible/plugins/callback/minimal.py +17 -14
- ansible/plugins/callback/oneline.py +13 -7
- ansible/plugins/callback/tree.py +10 -6
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +218 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +2 -2
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +94 -113
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +13 -28
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +31 -33
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +54 -20
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +368 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +428 -58
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +28 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +4 -4
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +205 -264
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/utils/jsonify.py +0 -36
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.4rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.4rc1.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,
|
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(
|
100
|
-
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
101
|
-
|
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' % (
|
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(
|
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:
|
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
|
-
|
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}" > "${
|
33
|
-
chmod 0600 "${
|
32
|
+
cat "${public_key_path}" > "${authorized_keys_path}"
|
33
|
+
chmod 0600 "${authorized_keys_path}"
|
34
34
|
|
35
|
-
# add localhost
|
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}-
|
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
|
-
|
172
|
-
# defaults
|
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 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
|
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
|
-
|
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
|
-
|
104
|
-
|
106
|
+
pip_options = common_pip_options()
|
107
|
+
pip_options.extend(packages)
|
105
108
|
|
106
109
|
if not setuptools:
|
107
|
-
|
110
|
+
pip_options.append('--no-setuptools')
|
108
111
|
|
109
112
|
if not wheel:
|
110
|
-
|
113
|
+
pip_options.append('--no-wheel')
|
111
114
|
|
112
|
-
command = [sys.executable, pip] +
|
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
|
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
|
-
|
127
|
-
|
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
|
-
|
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
|
-
|
148
|
+
pip_options.extend(['-c', path])
|
144
149
|
|
145
|
-
command = [sys.executable, pip, 'install'] +
|
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
|
-
|
167
|
-
|
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'] +
|
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
|
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
|
215
|
-
|
219
|
+
del options
|
220
|
+
|
221
|
+
pip_options = common_pip_options()
|
222
|
+
pip_options.extend(packages)
|
216
223
|
|
217
|
-
command = [sys.executable, pip, 'uninstall', '-y'] +
|
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
|
236
|
+
def version(pip: str, options: dict[str, t.Any]) -> None:
|
230
237
|
"""Report the pip version."""
|
231
238
|
del options
|
232
239
|
|
233
|
-
|
240
|
+
pip_options = common_pip_options()
|
234
241
|
|
235
|
-
command = [sys.executable, pip, '-V'] +
|
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),
|
ansible/compat/selectors.py
DELETED
@@ -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
|
-
)
|
ansible/errors/yaml_strings.py
DELETED
@@ -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()
|