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.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_collection_proxy.py +47 -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 +203 -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 +197 -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 +345 -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 +159 -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 +62 -53
- 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 +166 -112
- 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 +161 -96
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +268 -258
- ansible/executor/task_queue_manager.py +124 -90
- ansible/executor/task_result.py +183 -78
- 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 +78 -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 +152 -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 +39 -13
- 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 +19 -17
- 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 +6 -6
- 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 +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- 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/jsonify.py +5 -1
- 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 +43 -335
- 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 +31 -27
- 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 +7 -6
- 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 +284 -179
- ansible/plugins/callback/default.py +99 -92
- ansible/plugins/callback/junit.py +44 -39
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +28 -21
- ansible/plugins/callback/tree.py +16 -11
- 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 +225 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- 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 +159 -184
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +55 -21
- 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 +370 -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 +433 -63
- 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 +51 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +206 -282
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.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/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.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
@@ -1,86 +0,0 @@
|
|
1
|
-
# (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
|
-
param(
|
5
|
-
[Parameter(Mandatory = $true)][System.Collections.IDictionary]$Payload
|
6
|
-
)
|
7
|
-
|
8
|
-
#AnsibleRequires -Wrapper module_wrapper
|
9
|
-
|
10
|
-
$ErrorActionPreference = "Stop"
|
11
|
-
|
12
|
-
Write-AnsibleLog "INFO - starting module_powershell_wrapper" "module_powershell_wrapper"
|
13
|
-
|
14
|
-
$module_name = $Payload.module_args["_ansible_module_name"]
|
15
|
-
Write-AnsibleLog "INFO - building module payload for '$module_name'" "module_powershell_wrapper"
|
16
|
-
|
17
|
-
# compile any C# module utils passed in from the controller, Add-CSharpType is
|
18
|
-
# automatically added to the payload manifest if any csharp util is set
|
19
|
-
$csharp_utils = [System.Collections.ArrayList]@()
|
20
|
-
foreach ($csharp_util in $Payload.csharp_utils_module) {
|
21
|
-
Write-AnsibleLog "INFO - adding $csharp_util to list of C# references to compile" "module_powershell_wrapper"
|
22
|
-
$util_code = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Payload.csharp_utils[$csharp_util]))
|
23
|
-
$csharp_utils.Add($util_code) > $null
|
24
|
-
}
|
25
|
-
if ($csharp_utils.Count -gt 0) {
|
26
|
-
$add_type_b64 = $Payload.powershell_modules["Ansible.ModuleUtils.AddType"]
|
27
|
-
$add_type = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($add_type_b64))
|
28
|
-
New-Module -Name Ansible.ModuleUtils.AddType -ScriptBlock ([ScriptBlock]::Create($add_type)) | Import-Module > $null
|
29
|
-
|
30
|
-
# add any C# references so the module does not have to do so
|
31
|
-
$new_tmp = [System.Environment]::ExpandEnvironmentVariables($Payload.module_args["_ansible_remote_tmp"])
|
32
|
-
|
33
|
-
# We use a fake module object to capture warnings
|
34
|
-
$fake_module = [PSCustomObject]@{
|
35
|
-
Tmpdir = $new_tmp
|
36
|
-
Verbosity = 3
|
37
|
-
}
|
38
|
-
$warning_func = New-Object -TypeName System.Management.Automation.PSScriptMethod -ArgumentList Warn, {
|
39
|
-
param($message)
|
40
|
-
$Payload.module_args._ansible_exec_wrapper_warnings.Add($message)
|
41
|
-
}
|
42
|
-
$fake_module.PSObject.Members.Add($warning_func)
|
43
|
-
Add-CSharpType -References $csharp_utils -AnsibleModule $fake_module
|
44
|
-
}
|
45
|
-
|
46
|
-
if ($Payload.ContainsKey("coverage") -and $null -ne $host.Runspace -and $null -ne $host.Runspace.Debugger) {
|
47
|
-
$entrypoint = $payload.coverage_wrapper
|
48
|
-
|
49
|
-
$params = @{
|
50
|
-
Payload = $Payload
|
51
|
-
}
|
52
|
-
}
|
53
|
-
else {
|
54
|
-
# get the common module_wrapper code and invoke that to run the module
|
55
|
-
$module = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Payload.module_entry))
|
56
|
-
$variables = [System.Collections.ArrayList]@(@{ Name = "complex_args"; Value = $Payload.module_args; Scope = "Global" })
|
57
|
-
$entrypoint = $Payload.module_wrapper
|
58
|
-
|
59
|
-
$params = @{
|
60
|
-
Scripts = @($script:common_functions, $module)
|
61
|
-
Variables = $variables
|
62
|
-
Environment = $Payload.environment
|
63
|
-
Modules = $Payload.powershell_modules
|
64
|
-
ModuleName = $module_name
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
$entrypoint = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($entrypoint))
|
69
|
-
$entrypoint = [ScriptBlock]::Create($entrypoint)
|
70
|
-
|
71
|
-
try {
|
72
|
-
&$entrypoint @params
|
73
|
-
}
|
74
|
-
catch {
|
75
|
-
# failed to invoke the PowerShell module, capture the exception and
|
76
|
-
# output a pretty error for Ansible to parse
|
77
|
-
$result = @{
|
78
|
-
msg = "Failed to invoke PowerShell module: $($_.Exception.Message)"
|
79
|
-
failed = $true
|
80
|
-
exception = (Format-AnsibleException -ErrorRecord $_)
|
81
|
-
}
|
82
|
-
Write-Output -InputObject (ConvertTo-Json -InputObject $result -Depth 99 -Compress)
|
83
|
-
$host.SetShouldExit(1)
|
84
|
-
}
|
85
|
-
|
86
|
-
Write-AnsibleLog "INFO - ending module_powershell_wrapper" "module_powershell_wrapper"
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# (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
|
-
param(
|
5
|
-
[Parameter(Mandatory = $true)][System.Collections.IDictionary]$Payload
|
6
|
-
)
|
7
|
-
|
8
|
-
#AnsibleRequires -Wrapper module_wrapper
|
9
|
-
|
10
|
-
$ErrorActionPreference = "Stop"
|
11
|
-
|
12
|
-
Write-AnsibleLog "INFO - starting module_script_wrapper" "module_script_wrapper"
|
13
|
-
|
14
|
-
$script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Payload.module_entry))
|
15
|
-
|
16
|
-
# get the common module_wrapper code and invoke that to run the module
|
17
|
-
$entrypoint = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload.module_wrapper))
|
18
|
-
$entrypoint = [ScriptBlock]::Create($entrypoint)
|
19
|
-
|
20
|
-
&$entrypoint -Scripts $script -Environment $Payload.environment -ModuleName "script"
|
21
|
-
|
22
|
-
Write-AnsibleLog "INFO - ending module_script_wrapper" "module_script_wrapper"
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# Copyright (c) 2020 Matt Martz <matt@sivel.net>
|
2
|
-
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
|
3
|
-
|
4
|
-
from __future__ import annotations
|
5
|
-
|
6
|
-
from ansible.module_utils.common.warnings import deprecate
|
7
|
-
|
8
|
-
|
9
|
-
def __getattr__(importable_name):
|
10
|
-
"""Inject import-time deprecation warnings.
|
11
|
-
|
12
|
-
Specifically, for ``import_module()``.
|
13
|
-
"""
|
14
|
-
if importable_name == 'import_module':
|
15
|
-
deprecate(
|
16
|
-
msg=f'The `ansible.module_utils.compat.importlib.'
|
17
|
-
f'{importable_name}` function is deprecated.',
|
18
|
-
version='2.19',
|
19
|
-
)
|
20
|
-
from importlib import import_module
|
21
|
-
return import_module
|
22
|
-
|
23
|
-
raise AttributeError(
|
24
|
-
f'cannot import name {importable_name !r} '
|
25
|
-
f'has no attribute ({__file__ !s})',
|
26
|
-
)
|
@@ -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 selectors
|
21
|
-
import sys
|
22
|
-
|
23
|
-
from ansible.module_utils.common.warnings import deprecate
|
24
|
-
|
25
|
-
|
26
|
-
sys.modules['ansible.module_utils.compat.selectors'] = selectors
|
27
|
-
|
28
|
-
|
29
|
-
deprecate(
|
30
|
-
msg='The `ansible.module_utils.compat.selectors` module is deprecated.',
|
31
|
-
version='2.19',
|
32
|
-
)
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# This code is part of Ansible, but is an independent component.
|
2
|
-
# This particular file snippet, and this file snippet only, is BSD licensed.
|
3
|
-
# Modules you write using this snippet, which is embedded dynamically by Ansible
|
4
|
-
# still belong to the author of the module, and may assign their own license
|
5
|
-
# to the complete work.
|
6
|
-
#
|
7
|
-
# Copyright (c) 2016, Toshio Kuratomi <tkuratomi@ansible.com>
|
8
|
-
# Copyright (c) 2015, Marius Gedminas
|
9
|
-
#
|
10
|
-
# Redistribution and use in source and binary forms, with or without modification,
|
11
|
-
# are permitted provided that the following conditions are met:
|
12
|
-
#
|
13
|
-
# * Redistributions of source code must retain the above copyright
|
14
|
-
# notice, this list of conditions and the following disclaimer.
|
15
|
-
# * Redistributions in binary form must reproduce the above copyright notice,
|
16
|
-
# this list of conditions and the following disclaimer in the documentation
|
17
|
-
# and/or other materials provided with the distribution.
|
18
|
-
#
|
19
|
-
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
20
|
-
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21
|
-
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
22
|
-
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
23
|
-
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
24
|
-
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
25
|
-
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
26
|
-
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
27
|
-
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
-
|
29
|
-
from __future__ import annotations
|
30
|
-
|
31
|
-
import sys
|
32
|
-
|
33
|
-
from ansible.module_utils.common.warnings import deprecate
|
34
|
-
|
35
|
-
|
36
|
-
def get_exception():
|
37
|
-
"""Get the current exception.
|
38
|
-
|
39
|
-
This code needs to work on Python 2.4 through 3.x, so we cannot use
|
40
|
-
"except Exception, e:" (SyntaxError on Python 3.x) nor
|
41
|
-
"except Exception as e:" (SyntaxError on Python 2.4-2.5).
|
42
|
-
Instead we must use ::
|
43
|
-
|
44
|
-
except Exception:
|
45
|
-
e = get_exception()
|
46
|
-
|
47
|
-
"""
|
48
|
-
deprecate(
|
49
|
-
msg='The `ansible.module_utils.pycompat24.get_exception` '
|
50
|
-
'function is deprecated.',
|
51
|
-
version='2.19',
|
52
|
-
)
|
53
|
-
return sys.exc_info()[1]
|
54
|
-
|
55
|
-
|
56
|
-
def __getattr__(importable_name):
|
57
|
-
"""Inject import-time deprecation warning for ``literal_eval()``."""
|
58
|
-
if importable_name == 'literal_eval':
|
59
|
-
deprecate(
|
60
|
-
msg=f'The `ansible.module_utils.pycompat24.'
|
61
|
-
f'{importable_name}` function is deprecated.',
|
62
|
-
version='2.19',
|
63
|
-
)
|
64
|
-
from ast import literal_eval
|
65
|
-
return literal_eval
|
66
|
-
|
67
|
-
raise AttributeError(
|
68
|
-
f'cannot import name {importable_name !r} '
|
69
|
-
f'has no attribute ({__file__ !s})',
|
70
|
-
)
|
71
|
-
|
72
|
-
|
73
|
-
__all__ = ('get_exception', 'literal_eval') # pylint: disable=undefined-all-variable
|
@@ -1,178 +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
|
-
from yaml.constructor import SafeConstructor, ConstructorError
|
21
|
-
from yaml.nodes import MappingNode
|
22
|
-
|
23
|
-
from ansible import constants as C
|
24
|
-
from ansible.module_utils.common.text.converters import to_bytes, to_native
|
25
|
-
from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleSequence, AnsibleUnicode, AnsibleVaultEncryptedUnicode
|
26
|
-
from ansible.parsing.vault import VaultLib
|
27
|
-
from ansible.utils.display import Display
|
28
|
-
from ansible.utils.unsafe_proxy import wrap_var
|
29
|
-
|
30
|
-
display = Display()
|
31
|
-
|
32
|
-
|
33
|
-
class AnsibleConstructor(SafeConstructor):
|
34
|
-
def __init__(self, file_name=None, vault_secrets=None):
|
35
|
-
self._ansible_file_name = file_name
|
36
|
-
super(AnsibleConstructor, self).__init__()
|
37
|
-
self._vaults = {}
|
38
|
-
self.vault_secrets = vault_secrets or []
|
39
|
-
self._vaults['default'] = VaultLib(secrets=self.vault_secrets)
|
40
|
-
|
41
|
-
def construct_yaml_map(self, node):
|
42
|
-
data = AnsibleMapping()
|
43
|
-
yield data
|
44
|
-
value = self.construct_mapping(node)
|
45
|
-
data.update(value)
|
46
|
-
data.ansible_pos = self._node_position_info(node)
|
47
|
-
|
48
|
-
def construct_mapping(self, node, deep=False):
|
49
|
-
# Most of this is from yaml.constructor.SafeConstructor. We replicate
|
50
|
-
# it here so that we can warn users when they have duplicate dict keys
|
51
|
-
# (pyyaml silently allows overwriting keys)
|
52
|
-
if not isinstance(node, MappingNode):
|
53
|
-
raise ConstructorError(None, None,
|
54
|
-
"expected a mapping node, but found %s" % node.id,
|
55
|
-
node.start_mark)
|
56
|
-
self.flatten_mapping(node)
|
57
|
-
mapping = AnsibleMapping()
|
58
|
-
|
59
|
-
# Add our extra information to the returned value
|
60
|
-
mapping.ansible_pos = self._node_position_info(node)
|
61
|
-
|
62
|
-
for key_node, value_node in node.value:
|
63
|
-
key = self.construct_object(key_node, deep=deep)
|
64
|
-
try:
|
65
|
-
hash(key)
|
66
|
-
except TypeError as exc:
|
67
|
-
raise ConstructorError("while constructing a mapping", node.start_mark,
|
68
|
-
"found unacceptable key (%s)" % exc, key_node.start_mark)
|
69
|
-
|
70
|
-
if key in mapping:
|
71
|
-
msg = (u'While constructing a mapping from {1}, line {2}, column {3}, found a duplicate dict key ({0}).'
|
72
|
-
u' Using last defined value only.'.format(key, *mapping.ansible_pos))
|
73
|
-
if C.DUPLICATE_YAML_DICT_KEY == 'warn':
|
74
|
-
display.warning(msg)
|
75
|
-
elif C.DUPLICATE_YAML_DICT_KEY == 'error':
|
76
|
-
raise ConstructorError(context=None, context_mark=None,
|
77
|
-
problem=to_native(msg),
|
78
|
-
problem_mark=node.start_mark,
|
79
|
-
note=None)
|
80
|
-
else:
|
81
|
-
# when 'ignore'
|
82
|
-
display.debug(msg)
|
83
|
-
|
84
|
-
value = self.construct_object(value_node, deep=deep)
|
85
|
-
mapping[key] = value
|
86
|
-
|
87
|
-
return mapping
|
88
|
-
|
89
|
-
def construct_yaml_str(self, node):
|
90
|
-
# Override the default string handling function
|
91
|
-
# to always return unicode objects
|
92
|
-
value = self.construct_scalar(node)
|
93
|
-
ret = AnsibleUnicode(value)
|
94
|
-
|
95
|
-
ret.ansible_pos = self._node_position_info(node)
|
96
|
-
|
97
|
-
return ret
|
98
|
-
|
99
|
-
def construct_vault_encrypted_unicode(self, node):
|
100
|
-
value = self.construct_scalar(node)
|
101
|
-
b_ciphertext_data = to_bytes(value)
|
102
|
-
# could pass in a key id here to choose the vault to associate with
|
103
|
-
# TODO/FIXME: plugin vault selector
|
104
|
-
vault = self._vaults['default']
|
105
|
-
if vault.secrets is None:
|
106
|
-
raise ConstructorError(context=None, context_mark=None,
|
107
|
-
problem="found !vault but no vault password provided",
|
108
|
-
problem_mark=node.start_mark,
|
109
|
-
note=None)
|
110
|
-
ret = AnsibleVaultEncryptedUnicode(b_ciphertext_data)
|
111
|
-
ret.vault = vault
|
112
|
-
ret.ansible_pos = self._node_position_info(node)
|
113
|
-
return ret
|
114
|
-
|
115
|
-
def construct_yaml_seq(self, node):
|
116
|
-
data = AnsibleSequence()
|
117
|
-
yield data
|
118
|
-
data.extend(self.construct_sequence(node))
|
119
|
-
data.ansible_pos = self._node_position_info(node)
|
120
|
-
|
121
|
-
def construct_yaml_unsafe(self, node):
|
122
|
-
try:
|
123
|
-
constructor = getattr(node, 'id', 'object')
|
124
|
-
if constructor is not None:
|
125
|
-
constructor = getattr(self, 'construct_%s' % constructor)
|
126
|
-
except AttributeError:
|
127
|
-
constructor = self.construct_object
|
128
|
-
|
129
|
-
value = constructor(node)
|
130
|
-
|
131
|
-
return wrap_var(value)
|
132
|
-
|
133
|
-
def _node_position_info(self, node):
|
134
|
-
# the line number where the previous token has ended (plus empty lines)
|
135
|
-
# Add one so that the first line is line 1 rather than line 0
|
136
|
-
column = node.start_mark.column + 1
|
137
|
-
line = node.start_mark.line + 1
|
138
|
-
|
139
|
-
# in some cases, we may have pre-read the data and then
|
140
|
-
# passed it to the load() call for YAML, in which case we
|
141
|
-
# want to override the default datasource (which would be
|
142
|
-
# '<string>') to the actual filename we read in
|
143
|
-
datasource = self._ansible_file_name or node.start_mark.name
|
144
|
-
|
145
|
-
return (datasource, line, column)
|
146
|
-
|
147
|
-
|
148
|
-
AnsibleConstructor.add_constructor(
|
149
|
-
u'tag:yaml.org,2002:map',
|
150
|
-
AnsibleConstructor.construct_yaml_map) # type: ignore[type-var]
|
151
|
-
|
152
|
-
AnsibleConstructor.add_constructor(
|
153
|
-
u'tag:yaml.org,2002:python/dict',
|
154
|
-
AnsibleConstructor.construct_yaml_map) # type: ignore[type-var]
|
155
|
-
|
156
|
-
AnsibleConstructor.add_constructor(
|
157
|
-
u'tag:yaml.org,2002:str',
|
158
|
-
AnsibleConstructor.construct_yaml_str) # type: ignore[type-var]
|
159
|
-
|
160
|
-
AnsibleConstructor.add_constructor(
|
161
|
-
u'tag:yaml.org,2002:python/unicode',
|
162
|
-
AnsibleConstructor.construct_yaml_str) # type: ignore[type-var]
|
163
|
-
|
164
|
-
AnsibleConstructor.add_constructor(
|
165
|
-
u'tag:yaml.org,2002:seq',
|
166
|
-
AnsibleConstructor.construct_yaml_seq) # type: ignore[type-var]
|
167
|
-
|
168
|
-
AnsibleConstructor.add_constructor(
|
169
|
-
u'!unsafe',
|
170
|
-
AnsibleConstructor.construct_yaml_unsafe) # type: ignore[type-var]
|
171
|
-
|
172
|
-
AnsibleConstructor.add_constructor(
|
173
|
-
u'!vault',
|
174
|
-
AnsibleConstructor.construct_vault_encrypted_unicode) # type: ignore[type-var]
|
175
|
-
|
176
|
-
AnsibleConstructor.add_constructor(
|
177
|
-
u'!vault-encrypted',
|
178
|
-
AnsibleConstructor.construct_vault_encrypted_unicode) # type: ignore[type-var]
|
@@ -1,251 +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
|
-
from __future__ import annotations
|
5
|
-
|
6
|
-
|
7
|
-
import ast
|
8
|
-
from collections.abc import Mapping
|
9
|
-
from itertools import islice, chain
|
10
|
-
from types import GeneratorType
|
11
|
-
|
12
|
-
from ansible.module_utils.common.collections import is_sequence
|
13
|
-
from ansible.module_utils.common.text.converters import to_text
|
14
|
-
from ansible.module_utils.six import string_types
|
15
|
-
from ansible.parsing.yaml.objects import AnsibleVaultEncryptedUnicode
|
16
|
-
from ansible.utils.native_jinja import NativeJinjaText
|
17
|
-
from ansible.utils.unsafe_proxy import wrap_var
|
18
|
-
import ansible.module_utils.compat.typing as t
|
19
|
-
|
20
|
-
from jinja2.runtime import StrictUndefined
|
21
|
-
|
22
|
-
|
23
|
-
_JSON_MAP = {
|
24
|
-
"true": True,
|
25
|
-
"false": False,
|
26
|
-
"null": None,
|
27
|
-
}
|
28
|
-
|
29
|
-
|
30
|
-
class Json2Python(ast.NodeTransformer):
|
31
|
-
def visit_Name(self, node):
|
32
|
-
if node.id not in _JSON_MAP:
|
33
|
-
return node
|
34
|
-
return ast.Constant(value=_JSON_MAP[node.id])
|
35
|
-
|
36
|
-
|
37
|
-
def _is_unsafe(value: t.Any) -> bool:
|
38
|
-
"""
|
39
|
-
Our helper function, which will also recursively check dict and
|
40
|
-
list entries due to the fact that they may be repr'd and contain
|
41
|
-
a key or value which contains jinja2 syntax and would otherwise
|
42
|
-
lose the AnsibleUnsafe value.
|
43
|
-
"""
|
44
|
-
to_check = [value]
|
45
|
-
seen = set()
|
46
|
-
|
47
|
-
while True:
|
48
|
-
if not to_check:
|
49
|
-
break
|
50
|
-
|
51
|
-
val = to_check.pop(0)
|
52
|
-
val_id = id(val)
|
53
|
-
|
54
|
-
if val_id in seen:
|
55
|
-
continue
|
56
|
-
seen.add(val_id)
|
57
|
-
|
58
|
-
if isinstance(val, AnsibleUndefined):
|
59
|
-
continue
|
60
|
-
if isinstance(val, Mapping):
|
61
|
-
to_check.extend(val.keys())
|
62
|
-
to_check.extend(val.values())
|
63
|
-
elif is_sequence(val):
|
64
|
-
to_check.extend(val)
|
65
|
-
elif getattr(val, '__UNSAFE__', False):
|
66
|
-
return True
|
67
|
-
|
68
|
-
return False
|
69
|
-
|
70
|
-
|
71
|
-
def ansible_eval_concat(nodes):
|
72
|
-
"""Return a string of concatenated compiled nodes. Throw an undefined error
|
73
|
-
if any of the nodes is undefined.
|
74
|
-
|
75
|
-
If the result of concat appears to be a dictionary, list or bool,
|
76
|
-
try and convert it to such using literal_eval, the same mechanism as used
|
77
|
-
in jinja2_native.
|
78
|
-
|
79
|
-
Used in Templar.template() when jinja2_native=False and convert_data=True.
|
80
|
-
"""
|
81
|
-
head = list(islice(nodes, 2))
|
82
|
-
|
83
|
-
if not head:
|
84
|
-
return ''
|
85
|
-
|
86
|
-
unsafe = False
|
87
|
-
|
88
|
-
if len(head) == 1:
|
89
|
-
out = head[0]
|
90
|
-
|
91
|
-
if isinstance(out, NativeJinjaText):
|
92
|
-
return out
|
93
|
-
|
94
|
-
unsafe = _is_unsafe(out)
|
95
|
-
out = to_text(out)
|
96
|
-
else:
|
97
|
-
if isinstance(nodes, GeneratorType):
|
98
|
-
nodes = chain(head, nodes)
|
99
|
-
|
100
|
-
out_values = []
|
101
|
-
for v in nodes:
|
102
|
-
if not unsafe and _is_unsafe(v):
|
103
|
-
unsafe = True
|
104
|
-
|
105
|
-
out_values.append(to_text(v))
|
106
|
-
|
107
|
-
out = ''.join(out_values)
|
108
|
-
|
109
|
-
# if this looks like a dictionary, list or bool, convert it to such
|
110
|
-
if out.startswith(('{', '[')) or out in ('True', 'False'):
|
111
|
-
try:
|
112
|
-
out = ast.literal_eval(
|
113
|
-
ast.fix_missing_locations(
|
114
|
-
Json2Python().visit(
|
115
|
-
ast.parse(out, mode='eval')
|
116
|
-
)
|
117
|
-
)
|
118
|
-
)
|
119
|
-
except (TypeError, ValueError, SyntaxError, MemoryError):
|
120
|
-
pass
|
121
|
-
|
122
|
-
if unsafe:
|
123
|
-
out = wrap_var(out)
|
124
|
-
|
125
|
-
return out
|
126
|
-
|
127
|
-
|
128
|
-
def ansible_concat(nodes):
|
129
|
-
"""Return a string of concatenated compiled nodes. Throw an undefined error
|
130
|
-
if any of the nodes is undefined. Other than that it is equivalent to
|
131
|
-
Jinja2's default concat function.
|
132
|
-
|
133
|
-
Used in Templar.template() when jinja2_native=False and convert_data=False.
|
134
|
-
"""
|
135
|
-
unsafe = False
|
136
|
-
values = []
|
137
|
-
for v in nodes:
|
138
|
-
if not unsafe and _is_unsafe(v):
|
139
|
-
unsafe = True
|
140
|
-
|
141
|
-
values.append(to_text(v))
|
142
|
-
|
143
|
-
out = ''.join(values)
|
144
|
-
if unsafe:
|
145
|
-
out = wrap_var(out)
|
146
|
-
|
147
|
-
return out
|
148
|
-
|
149
|
-
|
150
|
-
def ansible_native_concat(nodes):
|
151
|
-
"""Return a native Python type from the list of compiled nodes. If the
|
152
|
-
result is a single node, its value is returned. Otherwise, the nodes are
|
153
|
-
concatenated as strings. If the result can be parsed with
|
154
|
-
:func:`ast.literal_eval`, the parsed value is returned. Otherwise, the
|
155
|
-
string is returned.
|
156
|
-
|
157
|
-
https://github.com/pallets/jinja/blob/master/src/jinja2/nativetypes.py
|
158
|
-
"""
|
159
|
-
head = list(islice(nodes, 2))
|
160
|
-
|
161
|
-
if not head:
|
162
|
-
return None
|
163
|
-
|
164
|
-
unsafe = False
|
165
|
-
|
166
|
-
if len(head) == 1:
|
167
|
-
out = head[0]
|
168
|
-
|
169
|
-
# TODO send unvaulted data to literal_eval?
|
170
|
-
if isinstance(out, AnsibleVaultEncryptedUnicode):
|
171
|
-
return out.data
|
172
|
-
|
173
|
-
if isinstance(out, NativeJinjaText):
|
174
|
-
# Sometimes (e.g. ``| string``) we need to mark variables
|
175
|
-
# in a special way so that they remain strings and are not
|
176
|
-
# passed into literal_eval.
|
177
|
-
# See:
|
178
|
-
# https://github.com/ansible/ansible/issues/70831
|
179
|
-
# https://github.com/pallets/jinja/issues/1200
|
180
|
-
# https://github.com/ansible/ansible/issues/70831#issuecomment-664190894
|
181
|
-
return out
|
182
|
-
|
183
|
-
# short-circuit literal_eval for anything other than strings
|
184
|
-
if not isinstance(out, string_types):
|
185
|
-
return out
|
186
|
-
|
187
|
-
unsafe = _is_unsafe(out)
|
188
|
-
|
189
|
-
else:
|
190
|
-
if isinstance(nodes, GeneratorType):
|
191
|
-
nodes = chain(head, nodes)
|
192
|
-
|
193
|
-
out_values = []
|
194
|
-
for v in nodes:
|
195
|
-
if not unsafe and _is_unsafe(v):
|
196
|
-
unsafe = True
|
197
|
-
|
198
|
-
out_values.append(to_text(v))
|
199
|
-
|
200
|
-
out = ''.join(out_values)
|
201
|
-
|
202
|
-
try:
|
203
|
-
evaled = ast.literal_eval(
|
204
|
-
# In Python 3.10+ ast.literal_eval removes leading spaces/tabs
|
205
|
-
# from the given string. For backwards compatibility we need to
|
206
|
-
# parse the string ourselves without removing leading spaces/tabs.
|
207
|
-
ast.parse(out, mode='eval')
|
208
|
-
)
|
209
|
-
except (TypeError, ValueError, SyntaxError, MemoryError):
|
210
|
-
if unsafe:
|
211
|
-
out = wrap_var(out)
|
212
|
-
|
213
|
-
return out
|
214
|
-
|
215
|
-
if isinstance(evaled, string_types):
|
216
|
-
quote = out[0]
|
217
|
-
evaled = f'{quote}{evaled}{quote}'
|
218
|
-
|
219
|
-
if unsafe:
|
220
|
-
evaled = wrap_var(evaled)
|
221
|
-
|
222
|
-
return evaled
|
223
|
-
|
224
|
-
|
225
|
-
class AnsibleUndefined(StrictUndefined):
|
226
|
-
"""
|
227
|
-
A custom Undefined class, which returns further Undefined objects on access,
|
228
|
-
rather than throwing an exception.
|
229
|
-
"""
|
230
|
-
def __getattr__(self, name):
|
231
|
-
if name == '__UNSAFE__':
|
232
|
-
# AnsibleUndefined should never be assumed to be unsafe
|
233
|
-
# This prevents ``hasattr(val, '__UNSAFE__')`` from evaluating to ``True``
|
234
|
-
raise AttributeError(name)
|
235
|
-
# Return original Undefined object to preserve the first failure context
|
236
|
-
return self
|
237
|
-
|
238
|
-
def __getitem__(self, key):
|
239
|
-
# Return original Undefined object to preserve the first failure context
|
240
|
-
return self
|
241
|
-
|
242
|
-
def __repr__(self):
|
243
|
-
return 'AnsibleUndefined(hint={0!r}, obj={1!r}, name={2!r})'.format(
|
244
|
-
self._undefined_hint,
|
245
|
-
self._undefined_obj,
|
246
|
-
self._undefined_name
|
247
|
-
)
|
248
|
-
|
249
|
-
def __contains__(self, item):
|
250
|
-
# Return original Undefined object to preserve the first failure context
|
251
|
-
return self
|