ansible-core 2.18.7__py3-none-any.whl → 2.19.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz/__init__.py +0 -0
- ansible/_internal/_ansiballz/_builder.py +101 -0
- ansible/_internal/_ansiballz/_wrapper.py +262 -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/_alarm_timeout.py +66 -0
- ansible/_internal/_errors/_captured.py +123 -0
- ansible/_internal/_errors/_error_factory.py +89 -0
- ansible/_internal/_errors/_error_utils.py +240 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_task_timeout.py +28 -0
- ansible/_internal/_event_formatting.py +127 -0
- ansible/_internal/_json/__init__.py +214 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +189 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_ssh/__init__.py +0 -0
- ansible/_internal/_ssh/_agent_launch.py +91 -0
- ansible/_internal/_ssh/_ssh_agent.py +619 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +12 -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 +592 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1106 -0
- ansible/_internal/_templating/_jinja_common.py +323 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +375 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_template_vars.py +72 -0
- ansible/_internal/_templating/_transform.py +70 -0
- ansible/_internal/_templating/_utils.py +108 -0
- ansible/_internal/_testing.py +26 -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 +70 -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 +27 -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 +93 -104
- ansible/cli/_ssh_askpass.py +54 -0
- ansible/cli/adhoc.py +20 -10
- ansible/cli/arguments/option_helpers.py +163 -10
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +13 -11
- ansible/cli/doc.py +134 -77
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -28
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +6 -3
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/compat/importlib_resources.py +9 -12
- ansible/config/base.yml +218 -133
- ansible/config/manager.py +220 -159
- ansible/constants.py +2 -65
- ansible/errors/__init__.py +350 -256
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +480 -514
- 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 +204 -153
- ansible/executor/powershell/become_wrapper.ps1 +107 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
- ansible/executor/powershell/exec_wrapper.ps1 +675 -196
- ansible/executor/powershell/module_manifest.py +469 -265
- ansible/executor/powershell/module_wrapper.ps1 +195 -186
- ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
- ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
- 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 +139 -149
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +270 -297
- ansible/executor/task_queue_manager.py +135 -137
- ansible/executor/task_result.py +182 -79
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +26 -25
- ansible/galaxy/collection/__init__.py +6 -14
- ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +4 -4
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +6 -10
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +50 -73
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +37 -54
- ansible/inventory/manager.py +79 -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/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
- ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
- ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
- ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +961 -0
- ansible/module_utils/_internal/_datatag/_tags.py +16 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_deprecator.py +157 -0
- ansible/module_utils/_internal/_errors.py +101 -0
- ansible/module_utils/_internal/_event_utils.py +61 -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 +428 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -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 +52 -0
- ansible/module_utils/_internal/_messages.py +130 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -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_info.py +38 -0
- ansible/module_utils/_internal/_stack.py +22 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_text_utils.py +6 -0
- ansible/module_utils/_internal/_traceback.py +92 -0
- ansible/module_utils/_internal/_validation.py +14 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +303 -202
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/arg_spec.py +8 -3
- ansible/module_utils/common/collections.py +7 -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/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -3
- ansible/module_utils/common/respawn.py +11 -33
- 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 +143 -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 +10 -13
- ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +49 -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 +2 -2
- 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 +5 -5
- 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 +2 -3
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/sysctl.py +4 -6
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +3 -3
- 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 +27 -13
- 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 +2 -3
- 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/linux.py +3 -3
- 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 +7 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
- ansible/module_utils/service.py +21 -31
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +64 -35
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +69 -49
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +32 -51
- ansible/modules/assemble.py +16 -14
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +24 -24
- ansible/modules/async_wrapper.py +20 -25
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +13 -20
- ansible/modules/copy.py +60 -147
- ansible/modules/cron.py +24 -21
- 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 +13 -15
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +184 -144
- ansible/modules/find.py +22 -20
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +77 -54
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +38 -38
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +15 -32
- 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 +22 -24
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +10 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +21 -26
- ansible/modules/raw.py +6 -6
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +10 -14
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +10 -17
- 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 +16 -19
- ansible/modules/stat.py +15 -31
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +7 -7
- ansible/modules/systemd_service.py +7 -7
- ansible/modules/sysvinit.py +9 -9
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +38 -17
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +45 -32
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +70 -60
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +10 -9
- ansible/parsing/ajson.py +17 -37
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +62 -60
- 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 +327 -99
- 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 +187 -134
- 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 +32 -26
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +14 -17
- ansible/playbook/playbook_include.py +27 -62
- ansible/playbook/role/__init__.py +64 -49
- 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 +28 -12
- ansible/playbook/task.py +192 -121
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +58 -26
- ansible/plugins/action/__init__.py +188 -186
- ansible/plugins/action/add_host.py +2 -2
- ansible/plugins/action/assemble.py +11 -18
- ansible/plugins/action/assert.py +55 -67
- ansible/plugins/action/async_status.py +7 -2
- ansible/plugins/action/copy.py +14 -17
- 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 +7 -8
- ansible/plugins/action/gather_facts.py +13 -14
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +8 -14
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +27 -38
- ansible/plugins/action/service.py +9 -18
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +47 -67
- ansible/plugins/action/unarchive.py +6 -16
- ansible/plugins/action/uri.py +9 -20
- 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 +52 -63
- 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 +294 -201
- ansible/plugins/callback/default.py +99 -95
- ansible/plugins/callback/junit.py +44 -43
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +34 -21
- ansible/plugins/callback/tree.py +27 -16
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +156 -60
- ansible/plugins/connection/paramiko_ssh.py +34 -24
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +326 -86
- ansible/plugins/connection/winrm.py +62 -141
- 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 +8 -4
- 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 +245 -120
- ansible/plugins/filter/encryption.py +42 -34
- 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/pow.yml +1 -1
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/root.yml +1 -1
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/strftime.yml +3 -3
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_uuid.yml +1 -1
- 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 +107 -86
- 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 +190 -120
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +72 -19
- ansible/plugins/loader.py +383 -198
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +19 -73
- 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 +87 -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 +47 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +4 -10
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +58 -4
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +106 -31
- ansible/plugins/shell/sh.py +13 -7
- ansible/plugins/strategy/__init__.py +168 -193
- 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 +75 -35
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/finished.yml +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +5 -8
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +353 -943
- ansible/utils/__init__.py +0 -18
- ansible/utils/collection_loader/__init__.py +54 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +82 -96
- ansible/utils/collection_loader/_collection_meta.py +15 -8
- ansible/utils/display.py +485 -73
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/galaxy.py +2 -2
- ansible/utils/hashing.py +8 -10
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +10 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +10 -12
- ansible/utils/plugin_docs.py +16 -14
- ansible/utils/py3compat.py +2 -7
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +6 -2
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +55 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +220 -285
- ansible/vars/plugins.py +4 -4
- ansible/vars/reserved.py +13 -12
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
- ansible_core-2.19.0.dist-info/RECORD +1097 -0
- ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
- 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 +2 -2
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pep8.txt +1 -1
- ansible_test/_data/requirements/sanity.pylint.txt +5 -5
- 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 +6 -0
- ansible_test/_internal/ansible_util.py +3 -1
- 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 -5
- 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 +52 -5
- 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 +3 -2
- 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 +22 -5
- 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 +3 -2
- 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 +8 -2
- 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 +19 -2
- 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 +12 -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 +25 -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 +44 -4
- ansible_test/_internal/commands/units/__init__.py +5 -1
- 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 +23 -13
- 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/debugging.py +166 -0
- ansible_test/_internal/delegation.py +22 -13
- 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 +260 -16
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +39 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +95 -4
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/processes.py +80 -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 +11 -4
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +28 -0
- ansible_test/_internal/ssh.py +2 -5
- ansible_test/_internal/target.py +9 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +3 -1
- ansible_test/_internal/timeout.py +2 -1
- ansible_test/_internal/util.py +41 -12
- ansible_test/_internal/util_common.py +18 -5
- 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 +8 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
- 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/injector/python.py +8 -0
- 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 +38 -36
- 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.7.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
ansible/utils/encrypt.py
CHANGED
|
@@ -5,25 +5,31 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import random
|
|
7
7
|
import string
|
|
8
|
+
import warnings
|
|
8
9
|
|
|
9
10
|
from collections import namedtuple
|
|
10
11
|
|
|
11
12
|
from ansible import constants as C
|
|
12
13
|
from ansible.errors import AnsibleError, AnsibleAssertionError
|
|
13
|
-
from ansible.module_utils.six import text_type
|
|
14
14
|
from ansible.module_utils.common.text.converters import to_text, to_bytes
|
|
15
15
|
from ansible.utils.display import Display
|
|
16
16
|
|
|
17
17
|
PASSLIB_E = None
|
|
18
18
|
PASSLIB_AVAILABLE = False
|
|
19
|
+
|
|
19
20
|
try:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
from passlib.utils import
|
|
21
|
+
# deprecated: description='warning suppression only required for Python 3.12 and earlier' python_version='3.12'
|
|
22
|
+
with warnings.catch_warnings():
|
|
23
|
+
warnings.filterwarnings('ignore', message="'crypt' is deprecated and slated for removal in Python 3.13", category=DeprecationWarning)
|
|
24
|
+
|
|
25
|
+
import passlib
|
|
26
|
+
import passlib.hash
|
|
27
|
+
from passlib.utils.handlers import HasRawSalt, PrefixWrapper
|
|
28
|
+
try:
|
|
29
|
+
from passlib.utils.binary import bcrypt64
|
|
30
|
+
except ImportError:
|
|
31
|
+
from passlib.utils import bcrypt64
|
|
32
|
+
|
|
27
33
|
PASSLIB_AVAILABLE = True
|
|
28
34
|
except Exception as e:
|
|
29
35
|
PASSLIB_E = e
|
|
@@ -37,14 +43,14 @@ DEFAULT_PASSWORD_LENGTH = 20
|
|
|
37
43
|
|
|
38
44
|
|
|
39
45
|
def random_password(length=DEFAULT_PASSWORD_LENGTH, chars=C.DEFAULT_PASSWORD_CHARS, seed=None):
|
|
40
|
-
|
|
46
|
+
"""Return a random password string of length containing only chars
|
|
41
47
|
|
|
42
48
|
:kwarg length: The number of characters in the new password. Defaults to 20.
|
|
43
49
|
:kwarg chars: The characters to choose from. The default is all ascii
|
|
44
50
|
letters, ascii digits, and these symbols ``.,:-_``
|
|
45
|
-
|
|
46
|
-
if not isinstance(chars,
|
|
47
|
-
raise AnsibleAssertionError('
|
|
51
|
+
"""
|
|
52
|
+
if not isinstance(chars, str):
|
|
53
|
+
raise AnsibleAssertionError(f'{chars=!r} ({type(chars)}) is not a {type(str)}.')
|
|
48
54
|
|
|
49
55
|
if seed is None:
|
|
50
56
|
random_generator = random.SystemRandom()
|
|
@@ -80,13 +86,14 @@ class PasslibHash(BaseHash):
|
|
|
80
86
|
super(PasslibHash, self).__init__(algorithm)
|
|
81
87
|
|
|
82
88
|
if not PASSLIB_AVAILABLE:
|
|
83
|
-
raise AnsibleError("passlib must be installed
|
|
89
|
+
raise AnsibleError(f"The passlib Python package must be installed to hash with the {algorithm!r} algorithm.") from PASSLIB_E
|
|
90
|
+
|
|
84
91
|
display.vv("Using passlib to hash input with '%s'" % algorithm)
|
|
85
92
|
|
|
86
93
|
try:
|
|
87
94
|
self.crypt_algo = getattr(passlib.hash, algorithm)
|
|
88
95
|
except Exception:
|
|
89
|
-
raise AnsibleError("passlib does not support
|
|
96
|
+
raise AnsibleError(f"Installed passlib version {passlib.__version__} does not support the {algorithm!r} algorithm.") from None
|
|
90
97
|
|
|
91
98
|
def hash(self, secret, salt=None, salt_size=None, rounds=None, ident=None):
|
|
92
99
|
salt = self._clean_salt(salt)
|
|
@@ -150,15 +157,15 @@ class PasslibHash(BaseHash):
|
|
|
150
157
|
elif hasattr(self.crypt_algo, 'encrypt'):
|
|
151
158
|
result = self.crypt_algo.encrypt(secret, **settings)
|
|
152
159
|
else:
|
|
153
|
-
raise
|
|
154
|
-
except ValueError as
|
|
155
|
-
raise AnsibleError("Could not hash the secret."
|
|
160
|
+
raise ValueError(f"Installed passlib version {passlib.__version__} is not supported.")
|
|
161
|
+
except ValueError as ex:
|
|
162
|
+
raise AnsibleError("Could not hash the secret.") from ex
|
|
156
163
|
|
|
157
164
|
# passlib.hash should always return something or raise an exception.
|
|
158
165
|
# Still ensure that there is always a result.
|
|
159
166
|
# Otherwise an empty password might be assumed by some modules, like the user module.
|
|
160
167
|
if not result:
|
|
161
|
-
raise AnsibleError("
|
|
168
|
+
raise AnsibleError(f"Failed to hash with passlib using the {self.algorithm!r} algorithm.")
|
|
162
169
|
|
|
163
170
|
# Hashes from passlib.hash should be represented as ascii strings of hex
|
|
164
171
|
# digits so this should not traceback. If it's not representable as such
|
|
@@ -175,4 +182,5 @@ def passlib_or_crypt(secret, algorithm, salt=None, salt_size=None, rounds=None,
|
|
|
175
182
|
def do_encrypt(result, encrypt, salt_size=None, salt=None, ident=None, rounds=None):
|
|
176
183
|
if PASSLIB_AVAILABLE:
|
|
177
184
|
return PasslibHash(encrypt).hash(result, salt=salt, salt_size=salt_size, rounds=rounds, ident=ident)
|
|
178
|
-
|
|
185
|
+
|
|
186
|
+
raise AnsibleError("Unable to encrypt nor hash, passlib must be installed.") from PASSLIB_E
|
ansible/utils/fqcn.py
CHANGED
|
@@ -18,11 +18,11 @@ from __future__ import annotations
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def add_internal_fqcns(names):
|
|
21
|
-
|
|
21
|
+
"""
|
|
22
22
|
Given a sequence of action/module names, returns a list of these names
|
|
23
23
|
with the same names with the prefixes `ansible.builtin.` and
|
|
24
24
|
`ansible.legacy.` added for all names that are not already FQCNs.
|
|
25
|
-
|
|
25
|
+
"""
|
|
26
26
|
result = []
|
|
27
27
|
for name in names:
|
|
28
28
|
result.append(name)
|
ansible/utils/galaxy.py
CHANGED
|
@@ -57,8 +57,8 @@ def scm_archive_resource(src, scm='git', name=None, version='HEAD', keep_scm_met
|
|
|
57
57
|
|
|
58
58
|
try:
|
|
59
59
|
scm_path = get_bin_path(scm)
|
|
60
|
-
except (ValueError, OSError
|
|
61
|
-
raise AnsibleError("
|
|
60
|
+
except (ValueError, OSError) as ex:
|
|
61
|
+
raise AnsibleError(f"Could not find/use {scm!r}, it is required to continue with installing {src!r}.") from ex
|
|
62
62
|
|
|
63
63
|
tempdir = tempfile.mkdtemp(dir=C.DEFAULT_LOCAL_TMP)
|
|
64
64
|
clone_cmd = [scm_path, 'clone']
|
ansible/utils/hashing.py
CHANGED
|
@@ -32,7 +32,7 @@ from ansible.module_utils.common.text.converters import to_bytes
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def secure_hash_s(data, hash_func=sha1):
|
|
35
|
-
|
|
35
|
+
""" Return a secure hash hex digest of data. """
|
|
36
36
|
|
|
37
37
|
digest = hash_func()
|
|
38
38
|
data = to_bytes(data, errors='surrogate_or_strict')
|
|
@@ -41,25 +41,23 @@ def secure_hash_s(data, hash_func=sha1):
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def secure_hash(filename, hash_func=sha1):
|
|
44
|
-
|
|
44
|
+
""" Return a secure hash hex digest of local file, None if file is not present or a directory. """
|
|
45
45
|
|
|
46
46
|
if not os.path.exists(to_bytes(filename, errors='surrogate_or_strict')) or os.path.isdir(to_bytes(filename, errors='strict')):
|
|
47
47
|
return None
|
|
48
48
|
digest = hash_func()
|
|
49
49
|
blocksize = 64 * 1024
|
|
50
50
|
try:
|
|
51
|
-
|
|
52
|
-
block = infile.read(blocksize)
|
|
53
|
-
while block:
|
|
54
|
-
digest.update(block)
|
|
51
|
+
with open(filename, 'rb') as infile:
|
|
55
52
|
block = infile.read(blocksize)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
while block:
|
|
54
|
+
digest.update(block)
|
|
55
|
+
block = infile.read(blocksize)
|
|
56
|
+
except OSError as ex:
|
|
57
|
+
raise AnsibleError(f"Error while accessing the file {filename!r}.") from ex
|
|
59
58
|
return digest.hexdigest()
|
|
60
59
|
|
|
61
60
|
|
|
62
|
-
# The checksum algorithm must match with the algorithm in ShellModule.checksum() method
|
|
63
61
|
checksum = secure_hash
|
|
64
62
|
checksum_s = secure_hash_s
|
|
65
63
|
|
ansible/utils/helpers.py
CHANGED
|
@@ -21,10 +21,10 @@ from ansible.module_utils.six import string_types
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def pct_to_int(value, num_items, min_value=1):
|
|
24
|
-
|
|
24
|
+
"""
|
|
25
25
|
Converts a given value to a percentage if specified as "x%",
|
|
26
26
|
otherwise converts the given value to an integer.
|
|
27
|
-
|
|
27
|
+
"""
|
|
28
28
|
if isinstance(value, string_types) and value.endswith('%'):
|
|
29
29
|
value_pct = int(value.replace("%", ""))
|
|
30
30
|
return int((value_pct / 100.0) * num_items) or min_value
|
ansible/utils/listify.py
CHANGED
|
@@ -14,12 +14,10 @@
|
|
|
14
14
|
#
|
|
15
15
|
# You should have received a copy of the GNU General Public License
|
|
16
16
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
18
17
|
from __future__ import annotations
|
|
19
18
|
|
|
20
19
|
from collections.abc import Iterable
|
|
21
20
|
|
|
22
|
-
from ansible.module_utils.six import string_types
|
|
23
21
|
from ansible.utils.display import Display
|
|
24
22
|
|
|
25
23
|
display = Display()
|
|
@@ -27,14 +25,18 @@ display = Display()
|
|
|
27
25
|
__all__ = ['listify_lookup_plugin_terms']
|
|
28
26
|
|
|
29
27
|
|
|
30
|
-
def listify_lookup_plugin_terms(terms, templar, fail_on_undefined=True
|
|
28
|
+
def listify_lookup_plugin_terms(terms, templar=None, fail_on_undefined=True):
|
|
29
|
+
# deprecated: description="Calling listify_lookup_plugin_terms function is not necessary; the function should be deprecated." core_version="2.23"
|
|
30
|
+
# display.deprecated(
|
|
31
|
+
# msg='The "listify_lookup_plugin_terms" function is not required for lookup terms to be templated.',
|
|
32
|
+
# version='2.27',
|
|
33
|
+
# help_text='If needed, implement custom `strip` or list-wrapping in the caller.',
|
|
34
|
+
# )
|
|
31
35
|
|
|
32
|
-
if isinstance(terms,
|
|
33
|
-
terms =
|
|
34
|
-
else:
|
|
35
|
-
terms = templar.template(terms, fail_on_undefined=fail_on_undefined)
|
|
36
|
+
if isinstance(terms, str):
|
|
37
|
+
terms = terms.strip()
|
|
36
38
|
|
|
37
|
-
if isinstance(terms,
|
|
39
|
+
if isinstance(terms, str) or not isinstance(terms, Iterable):
|
|
38
40
|
terms = [terms]
|
|
39
41
|
|
|
40
42
|
return terms
|
ansible/utils/lock.py
CHANGED
|
@@ -7,7 +7,7 @@ from functools import wraps
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def lock_decorator(attr='missing_lock_attr', lock=None):
|
|
10
|
-
|
|
10
|
+
"""This decorator is a generic implementation that allows you
|
|
11
11
|
to either use a pre-defined instance attribute as the location
|
|
12
12
|
of the lock, or to explicitly pass a lock object.
|
|
13
13
|
|
|
@@ -25,7 +25,7 @@ def lock_decorator(attr='missing_lock_attr', lock=None):
|
|
|
25
25
|
|
|
26
26
|
@lock_decorator(lock=threading.Lock())
|
|
27
27
|
def some_method(...):
|
|
28
|
-
|
|
28
|
+
"""
|
|
29
29
|
def outer(func):
|
|
30
30
|
@wraps(func)
|
|
31
31
|
def inner(*args, **kwargs):
|
ansible/utils/path.py
CHANGED
|
@@ -19,16 +19,15 @@ from __future__ import annotations
|
|
|
19
19
|
import os
|
|
20
20
|
import shutil
|
|
21
21
|
|
|
22
|
-
from errno import EEXIST
|
|
23
22
|
from ansible.errors import AnsibleError
|
|
24
|
-
from ansible.module_utils.common.text.converters import to_bytes,
|
|
23
|
+
from ansible.module_utils.common.text.converters import to_bytes, to_text
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
__all__ = ['unfrackpath', 'makedirs_safe']
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
def unfrackpath(path, follow=True, basedir=None):
|
|
31
|
-
|
|
30
|
+
"""
|
|
32
31
|
Returns a path that is free of symlinks (if follow=True), environment variables, relative path traversals and symbols (~)
|
|
33
32
|
|
|
34
33
|
:arg path: A byte or text string representing a path to be canonicalized
|
|
@@ -44,7 +43,7 @@ def unfrackpath(path, follow=True, basedir=None):
|
|
|
44
43
|
|
|
45
44
|
example::
|
|
46
45
|
'$HOME/../../var/mail' becomes '/var/spool/mail'
|
|
47
|
-
|
|
46
|
+
"""
|
|
48
47
|
|
|
49
48
|
b_basedir = to_bytes(basedir, errors='surrogate_or_strict', nonstring='passthru')
|
|
50
49
|
|
|
@@ -65,7 +64,7 @@ def unfrackpath(path, follow=True, basedir=None):
|
|
|
65
64
|
|
|
66
65
|
|
|
67
66
|
def makedirs_safe(path, mode=None):
|
|
68
|
-
|
|
67
|
+
"""
|
|
69
68
|
A *potentially insecure* way to ensure the existence of a directory chain. The "safe" in this function's name
|
|
70
69
|
refers only to its ability to ignore `EEXIST` in the case of multiple callers operating on the same part of
|
|
71
70
|
the directory chain. This function is not safe to use under world-writable locations when the first level of the
|
|
@@ -77,19 +76,18 @@ def makedirs_safe(path, mode=None):
|
|
|
77
76
|
:kwarg mode: If given, the mode to set the directory to
|
|
78
77
|
:raises AnsibleError: If the directory cannot be created and does not already exist.
|
|
79
78
|
:raises UnicodeDecodeError: if the path is not decodable in the utf-8 encoding.
|
|
80
|
-
|
|
79
|
+
"""
|
|
81
80
|
|
|
82
81
|
rpath = unfrackpath(path)
|
|
83
82
|
b_rpath = to_bytes(rpath)
|
|
84
83
|
if not os.path.exists(b_rpath):
|
|
85
84
|
try:
|
|
86
85
|
if mode:
|
|
87
|
-
os.makedirs(b_rpath, mode)
|
|
86
|
+
os.makedirs(b_rpath, mode, exist_ok=True)
|
|
88
87
|
else:
|
|
89
|
-
os.makedirs(b_rpath)
|
|
90
|
-
except OSError as
|
|
91
|
-
|
|
92
|
-
raise AnsibleError("Unable to create local directories(%s): %s" % (to_native(rpath), to_native(e)))
|
|
88
|
+
os.makedirs(b_rpath, exist_ok=True)
|
|
89
|
+
except OSError as ex:
|
|
90
|
+
raise AnsibleError(f"Unable to create local directories {rpath!r}.") from ex
|
|
93
91
|
|
|
94
92
|
|
|
95
93
|
def basedir(source):
|
|
@@ -104,7 +102,7 @@ def basedir(source):
|
|
|
104
102
|
dname = os.path.dirname(source)
|
|
105
103
|
|
|
106
104
|
if dname:
|
|
107
|
-
# don't follow symlinks for basedir, enables source
|
|
105
|
+
# don't follow symlinks for basedir, enables source reuse
|
|
108
106
|
dname = os.path.abspath(dname)
|
|
109
107
|
|
|
110
108
|
return to_text(dname, errors='surrogate_or_strict')
|
ansible/utils/plugin_docs.py
CHANGED
|
@@ -6,6 +6,8 @@ from __future__ import annotations
|
|
|
6
6
|
from collections.abc import MutableMapping, MutableSet, MutableSequence
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
+
import yaml
|
|
10
|
+
|
|
9
11
|
from ansible import constants as C
|
|
10
12
|
from ansible.release import __version__ as ansible_version
|
|
11
13
|
from ansible.errors import AnsibleError, AnsibleParserError, AnsiblePluginNotFound
|
|
@@ -14,6 +16,7 @@ from ansible.module_utils.common.text.converters import to_native
|
|
|
14
16
|
from ansible.parsing.plugin_docs import read_docstring
|
|
15
17
|
from ansible.parsing.yaml.loader import AnsibleLoader
|
|
16
18
|
from ansible.utils.display import Display
|
|
19
|
+
from ansible._internal._datatag import _tags
|
|
17
20
|
|
|
18
21
|
display = Display()
|
|
19
22
|
|
|
@@ -151,7 +154,8 @@ def add_fragments(doc, filename, fragment_loader, is_module=False):
|
|
|
151
154
|
unknown_fragments.append(fragment_slug)
|
|
152
155
|
continue
|
|
153
156
|
|
|
154
|
-
|
|
157
|
+
# trust-tagged source propagates to loaded values; expressions and templates in config require trust
|
|
158
|
+
fragment_yaml = _tags.TrustedAsTemplate().tag(getattr(fragment_class, fragment_var, None))
|
|
155
159
|
if fragment_yaml is None:
|
|
156
160
|
if fragment_var != 'DOCUMENTATION':
|
|
157
161
|
# if it's asking for something specific that's missing, that's an error
|
|
@@ -160,7 +164,7 @@ def add_fragments(doc, filename, fragment_loader, is_module=False):
|
|
|
160
164
|
else:
|
|
161
165
|
fragment_yaml = '{}' # TODO: this is still an error later since we require 'options' below...
|
|
162
166
|
|
|
163
|
-
fragment =
|
|
167
|
+
fragment = yaml.load(_tags.Origin(path=filename).tag(fragment_yaml), Loader=AnsibleLoader)
|
|
164
168
|
|
|
165
169
|
real_fragment_name = getattr(fragment_class, 'ansible_name')
|
|
166
170
|
real_collection_name = '.'.join(real_fragment_name.split('.')[0:2]) if '.' in real_fragment_name else ''
|
|
@@ -292,7 +296,7 @@ def _find_adjacent(path, plugin, extensions):
|
|
|
292
296
|
|
|
293
297
|
|
|
294
298
|
def find_plugin_docfile(plugin, plugin_type, loader):
|
|
295
|
-
|
|
299
|
+
""" if the plugin lives in a non-python file (eg, win_X.ps1), require the corresponding 'sidecar' file for docs """
|
|
296
300
|
|
|
297
301
|
context = loader.find_plugin_with_context(plugin, ignore_deprecated=False, check_aliases=True)
|
|
298
302
|
if (not context or not context.resolved) and plugin_type in ('filter', 'test'):
|
|
@@ -318,8 +322,6 @@ def find_plugin_docfile(plugin, plugin_type, loader):
|
|
|
318
322
|
|
|
319
323
|
def get_plugin_docs(plugin, plugin_type, loader, fragment_loader, verbose):
|
|
320
324
|
|
|
321
|
-
docs = []
|
|
322
|
-
|
|
323
325
|
# find plugin doc file, if it doesn't exist this will throw error, we let it through
|
|
324
326
|
# can raise exception and short circuit when 'not found'
|
|
325
327
|
filename, context = find_plugin_docfile(plugin, plugin_type, loader)
|
|
@@ -327,8 +329,8 @@ def get_plugin_docs(plugin, plugin_type, loader, fragment_loader, verbose):
|
|
|
327
329
|
|
|
328
330
|
try:
|
|
329
331
|
docs = get_docstring(filename, fragment_loader, verbose=verbose, collection_name=collection_name, plugin_type=plugin_type)
|
|
330
|
-
except Exception as
|
|
331
|
-
raise AnsibleParserError('
|
|
332
|
+
except Exception as ex:
|
|
333
|
+
raise AnsibleParserError(f'{plugin_type} plugin {plugin!r} did not contain a DOCUMENTATION attribute in {filename!r}.') from ex
|
|
332
334
|
|
|
333
335
|
# no good? try adjacent
|
|
334
336
|
if not docs[0]:
|
|
@@ -338,15 +340,15 @@ def get_plugin_docs(plugin, plugin_type, loader, fragment_loader, verbose):
|
|
|
338
340
|
filename = newfile
|
|
339
341
|
if docs[0] is not None:
|
|
340
342
|
break
|
|
341
|
-
except Exception as
|
|
342
|
-
raise AnsibleParserError('
|
|
343
|
+
except Exception as ex:
|
|
344
|
+
raise AnsibleParserError(f'{plugin_type} plugin {plugin!r} adjacent file did not contain a DOCUMENTATION attribute in {filename!r}.') from ex
|
|
343
345
|
|
|
344
346
|
# add extra data to docs[0] (aka 'DOCUMENTATION')
|
|
345
347
|
if docs[0] is None:
|
|
346
|
-
raise AnsibleParserError('No documentation available for
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
348
|
+
raise AnsibleParserError(f'No documentation available for {plugin_type} plugin {plugin!r} in {filename!r}.')
|
|
349
|
+
|
|
350
|
+
docs[0]['filename'] = filename
|
|
351
|
+
docs[0]['collection'] = collection_name
|
|
352
|
+
docs[0]['plugin_name'] = context.resolved_fqcn
|
|
351
353
|
|
|
352
354
|
return docs
|
ansible/utils/py3compat.py
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
import inspect
|
|
10
9
|
import os
|
|
11
10
|
|
|
12
11
|
from ansible.utils.display import Display
|
|
@@ -19,14 +18,10 @@ def __getattr__(name):
|
|
|
19
18
|
if name != 'environ':
|
|
20
19
|
raise AttributeError(name)
|
|
21
20
|
|
|
22
|
-
caller = inspect.stack()[1]
|
|
23
|
-
|
|
24
21
|
display.deprecated(
|
|
25
|
-
|
|
26
|
-
'ansible.utils.py3compat.environ is deprecated in favor of os.environ. '
|
|
27
|
-
f'Accessed by {caller.filename} line number {caller.lineno}'
|
|
28
|
-
),
|
|
22
|
+
msg='`ansible.utils.py3compat.environ` is deprecated.',
|
|
29
23
|
version='2.20',
|
|
24
|
+
help_text='Use `os.environ` from the Python standard library instead.',
|
|
30
25
|
)
|
|
31
26
|
|
|
32
27
|
return os.environ
|
ansible/utils/sentinel.py
CHANGED
|
@@ -1,66 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright: Contributors to the Ansible project
|
|
2
3
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
3
4
|
|
|
4
5
|
from __future__ import annotations
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
Object which can be used to mark whether an entry as being special
|
|
10
|
-
|
|
11
|
-
A sentinel value demarcates a value or marks an entry as having a special meaning. In C, the
|
|
12
|
-
Null byte is used as a sentinel for the end of a string. In Python, None is often used as
|
|
13
|
-
a Sentinel in optional parameters to mean that the parameter was not set by the user.
|
|
14
|
-
|
|
15
|
-
You should use None as a Sentinel value any Python code where None is not a valid entry. If
|
|
16
|
-
None is a valid entry, though, then you need to create a different value, which is the purpose
|
|
17
|
-
of this class.
|
|
18
|
-
|
|
19
|
-
Example of using Sentinel as a default parameter value::
|
|
20
|
-
|
|
21
|
-
def confirm_big_red_button(tristate=Sentinel):
|
|
22
|
-
if tristate is Sentinel:
|
|
23
|
-
print('You must explicitly press the big red button to blow up the base')
|
|
24
|
-
elif tristate is True:
|
|
25
|
-
print('Countdown to destruction activated')
|
|
26
|
-
elif tristate is False:
|
|
27
|
-
print('Countdown stopped')
|
|
28
|
-
elif tristate is None:
|
|
29
|
-
print('Waiting for more input')
|
|
30
|
-
|
|
31
|
-
Example of using Sentinel to tell whether a dict which has a default value has been changed::
|
|
32
|
-
|
|
33
|
-
values = {'one': Sentinel, 'two': Sentinel}
|
|
34
|
-
defaults = {'one': 1, 'two': 2}
|
|
35
|
-
|
|
36
|
-
# [.. Other code which does things including setting a new value for 'one' ..]
|
|
37
|
-
values['one'] = None
|
|
38
|
-
# [..]
|
|
39
|
-
|
|
40
|
-
print('You made changes to:')
|
|
41
|
-
for key, value in values.items():
|
|
42
|
-
if value is Sentinel:
|
|
43
|
-
continue
|
|
44
|
-
print('%s: %s' % (key, value)
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
def __new__(cls):
|
|
48
|
-
"""
|
|
49
|
-
Return the cls itself. This makes both equality and identity True for comparing the class
|
|
50
|
-
to an instance of the class, preventing common usage errors.
|
|
51
|
-
|
|
52
|
-
Preferred usage::
|
|
53
|
-
|
|
54
|
-
a = Sentinel
|
|
55
|
-
if a is Sentinel:
|
|
56
|
-
print('Sentinel value')
|
|
57
|
-
|
|
58
|
-
However, these are True as well, eliminating common usage errors::
|
|
59
|
-
|
|
60
|
-
if Sentinel is Sentinel():
|
|
61
|
-
print('Sentinel value')
|
|
62
|
-
|
|
63
|
-
if Sentinel == Sentinel():
|
|
64
|
-
print('Sentinel value')
|
|
65
|
-
"""
|
|
66
|
-
return cls
|
|
7
|
+
# For Backward compatibility
|
|
8
|
+
from ansible.module_utils.common.sentinel import Sentinel # pylint: disable=unused-import
|
ansible/utils/singleton.py
CHANGED
|
@@ -11,6 +11,8 @@ class Singleton(type):
|
|
|
11
11
|
functionality. If an instance of the class exists, it's returned,
|
|
12
12
|
otherwise a single instance is instantiated and returned.
|
|
13
13
|
"""
|
|
14
|
+
|
|
15
|
+
# FIXME: object identity/singleton-ness does not appear to survive pickle roundtrip (eg, copy.copy, copy.deepcopy), implement __reduce_ex__ and __copy__?
|
|
14
16
|
def __init__(cls, name, bases, dct):
|
|
15
17
|
super(Singleton, cls).__init__(name, bases, dct)
|
|
16
18
|
cls.__instance = None
|
ansible/utils/ssh_functions.py
CHANGED
|
@@ -22,7 +22,7 @@ import subprocess
|
|
|
22
22
|
|
|
23
23
|
from ansible import constants as C
|
|
24
24
|
from ansible.module_utils.common.text.converters import to_bytes
|
|
25
|
-
from ansible.module_utils.compat.paramiko import paramiko
|
|
25
|
+
from ansible.module_utils.compat.paramiko import _paramiko as paramiko
|
|
26
26
|
from ansible.utils.display import Display
|
|
27
27
|
|
|
28
28
|
display = Display()
|
|
@@ -56,7 +56,11 @@ def set_default_transport():
|
|
|
56
56
|
|
|
57
57
|
# deal with 'smart' connection .. one time ..
|
|
58
58
|
if C.DEFAULT_TRANSPORT == 'smart':
|
|
59
|
-
display.deprecated(
|
|
59
|
+
display.deprecated(
|
|
60
|
+
msg="The `smart` option for connections is deprecated.",
|
|
61
|
+
version="2.20",
|
|
62
|
+
help_text="Set the connection plugin directly instead.",
|
|
63
|
+
)
|
|
60
64
|
|
|
61
65
|
# see if SSH can support ControlPersist if not use paramiko
|
|
62
66
|
if not check_for_controlpersist('ssh') and paramiko is not None:
|