ansible-core 2.18.4rc1__py3-none-any.whl → 2.19.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +160 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +198 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +351 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +153 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +48 -46
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +165 -108
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +136 -76
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +237 -236
- ansible/executor/task_queue_manager.py +62 -38
- ansible/executor/task_result.py +21 -12
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +77 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +154 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +52 -17
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +20 -18
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +7 -7
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +35 -49
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +39 -32
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +36 -339
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +6 -15
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +8 -7
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +141 -123
- ansible/plugins/callback/default.py +30 -23
- ansible/plugins/callback/junit.py +28 -24
- ansible/plugins/callback/minimal.py +17 -14
- ansible/plugins/callback/oneline.py +13 -7
- ansible/plugins/callback/tree.py +10 -6
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +218 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +2 -2
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +94 -113
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +13 -28
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +31 -33
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +54 -20
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +368 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +428 -58
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +28 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +4 -4
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +205 -264
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b1.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b1.dist-info/RECORD +1070 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/utils/jsonify.py +0 -36
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.4rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/COPYING +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.4rc1.dist-info → ansible_core-2.19.0b1.dist-info}/top_level.txt +0 -0
ansible/modules/uri.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: uri
|
12
12
|
short_description: Interacts with webservices
|
@@ -61,6 +61,7 @@ options:
|
|
61
61
|
or list of tuples into an C(application/x-www-form-urlencoded) string. (Added in v2.7)
|
62
62
|
- If O(body_format) is set to V(form-multipart) it will convert a dictionary
|
63
63
|
into C(multipart/form-multipart) body. (Added in v2.10)
|
64
|
+
- If C(body_format) is set to V(form-multipart) the option 'multipart_encoding' allows to change multipart file encoding. (Added in v2.19)
|
64
65
|
type: raw
|
65
66
|
body_format:
|
66
67
|
description:
|
@@ -105,18 +106,6 @@ options:
|
|
105
106
|
- The webservice bans or rate-limits clients that cause any HTTP 401 errors.
|
106
107
|
type: bool
|
107
108
|
default: no
|
108
|
-
follow_redirects:
|
109
|
-
description:
|
110
|
-
- Whether or not the URI module should follow redirects.
|
111
|
-
type: str
|
112
|
-
default: safe
|
113
|
-
choices:
|
114
|
-
all: Will follow all redirects.
|
115
|
-
none: Will not follow any redirects.
|
116
|
-
safe: Only redirects doing GET or HEAD requests will be followed.
|
117
|
-
urllib2: Defer to urllib2 behavior (As of writing this follows HTTP redirects).
|
118
|
-
'no': (DEPRECATED, removed in 2.22) alias of V(none).
|
119
|
-
'yes': (DEPRECATED, removed in 2.22) alias of V(all).
|
120
109
|
creates:
|
121
110
|
description:
|
122
111
|
- A filename, when it already exists, this step will not be run.
|
@@ -234,6 +223,7 @@ options:
|
|
234
223
|
extends_documentation_fragment:
|
235
224
|
- action_common_attributes
|
236
225
|
- files
|
226
|
+
- url.url_redirect
|
237
227
|
attributes:
|
238
228
|
check_mode:
|
239
229
|
support: none
|
@@ -250,9 +240,9 @@ seealso:
|
|
250
240
|
- module: ansible.windows.win_uri
|
251
241
|
author:
|
252
242
|
- Romeo Theriault (@romeotheriault)
|
253
|
-
|
243
|
+
"""
|
254
244
|
|
255
|
-
EXAMPLES = r
|
245
|
+
EXAMPLES = r"""
|
256
246
|
- name: Check that you can connect (GET) to a page and it returns a status 200
|
257
247
|
ansible.builtin.uri:
|
258
248
|
url: http://www.example.com
|
@@ -262,7 +252,7 @@ EXAMPLES = r'''
|
|
262
252
|
url: http://www.example.com
|
263
253
|
return_content: true
|
264
254
|
register: this
|
265
|
-
failed_when: this is failed or
|
255
|
+
failed_when: "this is failed or 'AWESOME' not in this.content"
|
266
256
|
|
267
257
|
- name: Create a JIRA issue
|
268
258
|
ansible.builtin.uri:
|
@@ -308,10 +298,12 @@ EXAMPLES = r'''
|
|
308
298
|
file1:
|
309
299
|
filename: /bin/true
|
310
300
|
mime_type: application/octet-stream
|
301
|
+
multipart_encoding: base64
|
311
302
|
file2:
|
312
303
|
content: text based file content
|
313
304
|
filename: fake.txt
|
314
305
|
mime_type: text/plain
|
306
|
+
multipart_encoding: 7or8bit
|
315
307
|
text_form_field: value
|
316
308
|
|
317
309
|
- name: Connect to website using a previously stored cookie
|
@@ -387,9 +379,9 @@ EXAMPLES = r'''
|
|
387
379
|
uri:
|
388
380
|
url: https://example.org
|
389
381
|
ciphers: '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM'
|
390
|
-
|
382
|
+
"""
|
391
383
|
|
392
|
-
RETURN = r
|
384
|
+
RETURN = r"""
|
393
385
|
# The return information includes all the HTTP headers in lower-case.
|
394
386
|
content:
|
395
387
|
description: The response body content.
|
@@ -438,21 +430,29 @@ url:
|
|
438
430
|
returned: always
|
439
431
|
type: str
|
440
432
|
sample: https://www.ansible.com/
|
441
|
-
|
433
|
+
"""
|
442
434
|
|
435
|
+
import http
|
443
436
|
import json
|
444
437
|
import os
|
445
438
|
import re
|
446
439
|
import shutil
|
447
440
|
import tempfile
|
441
|
+
from datetime import datetime, timezone
|
448
442
|
|
449
443
|
from ansible.module_utils.basic import AnsibleModule, sanitize_keys
|
450
444
|
from ansible.module_utils.six import binary_type, iteritems, string_types
|
451
|
-
from ansible.module_utils.six.moves.urllib.parse import urlencode,
|
445
|
+
from ansible.module_utils.six.moves.urllib.parse import urlencode, urljoin
|
452
446
|
from ansible.module_utils.common.text.converters import to_native, to_text
|
453
|
-
from ansible.module_utils.compat.datetime import utcnow, utcfromtimestamp
|
454
447
|
from ansible.module_utils.six.moves.collections_abc import Mapping, Sequence
|
455
|
-
from ansible.module_utils.urls import
|
448
|
+
from ansible.module_utils.urls import (
|
449
|
+
fetch_url,
|
450
|
+
get_response_filename,
|
451
|
+
parse_content_type,
|
452
|
+
prepare_multipart,
|
453
|
+
url_argument_spec,
|
454
|
+
url_redirect_argument_spec,
|
455
|
+
)
|
456
456
|
|
457
457
|
JSON_CANDIDATES = {'json', 'javascript'}
|
458
458
|
|
@@ -505,29 +505,8 @@ def write_file(module, dest, content, resp):
|
|
505
505
|
os.remove(tmpsrc)
|
506
506
|
|
507
507
|
|
508
|
-
def absolute_location(url, location):
|
509
|
-
"""Attempts to create an absolute URL based on initial URL, and
|
510
|
-
next URL, specifically in the case of a ``Location`` header.
|
511
|
-
"""
|
512
|
-
|
513
|
-
if '://' in location:
|
514
|
-
return location
|
515
|
-
|
516
|
-
elif location.startswith('/'):
|
517
|
-
parts = urlsplit(url)
|
518
|
-
base = url.replace(parts[2], '')
|
519
|
-
return '%s%s' % (base, location)
|
520
|
-
|
521
|
-
elif not location.startswith('/'):
|
522
|
-
base = os.path.dirname(url)
|
523
|
-
return '%s/%s' % (base, location)
|
524
|
-
|
525
|
-
else:
|
526
|
-
return location
|
527
|
-
|
528
|
-
|
529
508
|
def kv_list(data):
|
530
|
-
|
509
|
+
""" Convert data into a list of key-value tuples """
|
531
510
|
if data is None:
|
532
511
|
return None
|
533
512
|
|
@@ -541,7 +520,7 @@ def kv_list(data):
|
|
541
520
|
|
542
521
|
|
543
522
|
def form_urlencoded(body):
|
544
|
-
|
523
|
+
""" Convert data into a form-urlencoded string """
|
545
524
|
if isinstance(body, string_types):
|
546
525
|
return body
|
547
526
|
|
@@ -579,7 +558,10 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
579
558
|
kwargs = {}
|
580
559
|
if dest is not None and os.path.isfile(dest):
|
581
560
|
# if destination file already exist, only download if file newer
|
582
|
-
kwargs['last_mod_time'] =
|
561
|
+
kwargs['last_mod_time'] = datetime.fromtimestamp(
|
562
|
+
os.path.getmtime(dest),
|
563
|
+
tz=timezone.utc,
|
564
|
+
)
|
583
565
|
|
584
566
|
if module.params.get('follow_redirects') in ('no', 'yes'):
|
585
567
|
module.deprecate(
|
@@ -605,6 +587,8 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
605
587
|
|
606
588
|
def main():
|
607
589
|
argument_spec = url_argument_spec()
|
590
|
+
argument_spec['url']['required'] = True
|
591
|
+
argument_spec.update(url_redirect_argument_spec())
|
608
592
|
argument_spec.update(
|
609
593
|
dest=dict(type='path'),
|
610
594
|
url_username=dict(type='str', aliases=['user']),
|
@@ -691,12 +675,12 @@ def main():
|
|
691
675
|
module.exit_json(stdout="skipped, since '%s' does not exist" % removes, changed=False)
|
692
676
|
|
693
677
|
# Make the request
|
694
|
-
start =
|
678
|
+
start = datetime.now(timezone.utc)
|
695
679
|
r, info = uri(module, url, dest, body, body_format, method,
|
696
680
|
dict_headers, socket_timeout, ca_path, unredirected_headers,
|
697
681
|
decompress, ciphers, use_netrc)
|
698
682
|
|
699
|
-
elapsed = (
|
683
|
+
elapsed = (datetime.now(timezone.utc) - start).seconds
|
700
684
|
|
701
685
|
if r and dest is not None and os.path.isdir(dest):
|
702
686
|
filename = get_response_filename(r) or 'index.html'
|
@@ -732,6 +716,8 @@ def main():
|
|
732
716
|
# there was no content, but the error read()
|
733
717
|
# may have been stored in the info as 'body'
|
734
718
|
content = info.pop('body', b'')
|
719
|
+
except http.client.HTTPException as http_err:
|
720
|
+
module.fail_json(msg=f"HTTP Error while fetching {url}: {to_native(http_err)}")
|
735
721
|
elif r:
|
736
722
|
content = r
|
737
723
|
else:
|
@@ -766,7 +752,7 @@ def main():
|
|
766
752
|
uresp[ukey] = value
|
767
753
|
|
768
754
|
if 'location' in uresp:
|
769
|
-
uresp['location'] =
|
755
|
+
uresp['location'] = urljoin(url, uresp['location'])
|
770
756
|
|
771
757
|
# Default content_encoding to try
|
772
758
|
if isinstance(content, binary_type):
|
ansible/modules/user.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
module: user
|
11
11
|
version_added: "0.2"
|
12
12
|
short_description: Manage user accounts
|
@@ -319,9 +319,9 @@ seealso:
|
|
319
319
|
- module: ansible.windows.win_user
|
320
320
|
author:
|
321
321
|
- Stephen Fromm (@sfromm)
|
322
|
-
|
322
|
+
"""
|
323
323
|
|
324
|
-
EXAMPLES = r
|
324
|
+
EXAMPLES = r"""
|
325
325
|
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
|
326
326
|
ansible.builtin.user:
|
327
327
|
name: johnd
|
@@ -385,9 +385,9 @@ EXAMPLES = r'''
|
|
385
385
|
ansible.builtin.user:
|
386
386
|
name: jimholden2016
|
387
387
|
password_expire_account_disable: 15
|
388
|
-
|
388
|
+
"""
|
389
389
|
|
390
|
-
RETURN = r
|
390
|
+
RETURN = r"""
|
391
391
|
append:
|
392
392
|
description: Whether or not to append the user to groups.
|
393
393
|
returned: When O(state) is V(present) and the user exists
|
@@ -486,10 +486,11 @@ uid:
|
|
486
486
|
returned: When O(uid) is passed to the module
|
487
487
|
type: int
|
488
488
|
sample: 1044
|
489
|
-
|
489
|
+
"""
|
490
490
|
|
491
491
|
|
492
492
|
import ctypes.util
|
493
|
+
from datetime import datetime
|
493
494
|
import grp
|
494
495
|
import calendar
|
495
496
|
import os
|
@@ -502,13 +503,13 @@ import socket
|
|
502
503
|
import subprocess
|
503
504
|
import time
|
504
505
|
import math
|
506
|
+
import typing as t
|
505
507
|
|
506
508
|
from ansible.module_utils import distro
|
507
509
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
508
510
|
from ansible.module_utils.basic import AnsibleModule
|
509
511
|
from ansible.module_utils.common.locale import get_best_parsable_locale
|
510
512
|
from ansible.module_utils.common.sys_info import get_platform_subclass
|
511
|
-
import ansible.module_utils.compat.typing as t
|
512
513
|
|
513
514
|
|
514
515
|
class StructSpwdType(ctypes.Structure):
|
@@ -1091,7 +1092,7 @@ class User(object):
|
|
1091
1092
|
return groups
|
1092
1093
|
|
1093
1094
|
def user_group_membership(self, exclude_primary=True):
|
1094
|
-
|
1095
|
+
""" Return a list of groups the user belongs to """
|
1095
1096
|
groups = []
|
1096
1097
|
info = self.get_pwd_info()
|
1097
1098
|
for group in grp.getgrall():
|
@@ -1279,11 +1280,16 @@ class User(object):
|
|
1279
1280
|
env=env)
|
1280
1281
|
out_buffer = b''
|
1281
1282
|
err_buffer = b''
|
1283
|
+
first_prompt = b'Enter passphrase'
|
1284
|
+
second_prompt = b'Enter same passphrase again'
|
1285
|
+
prompt = first_prompt
|
1286
|
+
start = datetime.now()
|
1287
|
+
timeout = 900
|
1282
1288
|
while p.poll() is None:
|
1283
1289
|
r_list = select.select([master_out_fd, master_err_fd], [], [], 1)[0]
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1290
|
+
now = datetime.now()
|
1291
|
+
if (now - start).seconds > timeout:
|
1292
|
+
return (1, '', f'Timeout after {timeout} while reading passphrase for SSH key')
|
1287
1293
|
for fd in r_list:
|
1288
1294
|
if fd == master_out_fd:
|
1289
1295
|
chunk = os.read(master_out_fd, 10240)
|
@@ -1370,16 +1376,24 @@ class User(object):
|
|
1370
1376
|
self.module.exit_json(failed=True, msg="%s" % to_native(e))
|
1371
1377
|
# get umask from /etc/login.defs and set correct home mode
|
1372
1378
|
if os.path.exists(self.LOGIN_DEFS):
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1379
|
+
# fallback if neither HOME_MODE nor UMASK are set;
|
1380
|
+
# follow behaviour of useradd initializing UMASK = 022
|
1381
|
+
mode = 0o755
|
1382
|
+
with open(self.LOGIN_DEFS, 'r') as fh:
|
1383
|
+
for line in fh:
|
1384
|
+
# HOME_MODE has higher precedence as UMASK
|
1385
|
+
match = re.match(r'^HOME_MODE\s+(\d+)$', line)
|
1386
|
+
if match:
|
1387
|
+
mode = int(match.group(1), 8)
|
1388
|
+
break # higher precedence
|
1389
|
+
match = re.match(r'^UMASK\s+(\d+)$', line)
|
1390
|
+
if match:
|
1391
|
+
umask = int(match.group(1), 8)
|
1378
1392
|
mode = 0o777 & ~umask
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1393
|
+
try:
|
1394
|
+
os.chmod(path, mode)
|
1395
|
+
except OSError as e:
|
1396
|
+
self.module.exit_json(failed=True, msg=to_native(e))
|
1383
1397
|
|
1384
1398
|
def chown_homedir(self, uid, gid, path):
|
1385
1399
|
try:
|
@@ -2436,7 +2450,7 @@ class DarwinUser(User):
|
|
2436
2450
|
return groups
|
2437
2451
|
|
2438
2452
|
def _get_user_property(self, property):
|
2439
|
-
|
2453
|
+
"""Return user PROPERTY as given my dscl(1) read or None if not found."""
|
2440
2454
|
cmd = self._get_dscl()
|
2441
2455
|
cmd += ['-read', '/Users/%s' % self.name, property]
|
2442
2456
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
@@ -2456,10 +2470,10 @@ class DarwinUser(User):
|
|
2456
2470
|
return None
|
2457
2471
|
|
2458
2472
|
def _get_next_uid(self, system=None):
|
2459
|
-
|
2473
|
+
"""
|
2460
2474
|
Return the next available uid. If system=True, then
|
2461
2475
|
uid should be below of 500, if possible.
|
2462
|
-
|
2476
|
+
"""
|
2463
2477
|
cmd = self._get_dscl()
|
2464
2478
|
cmd += ['-list', '/Users', 'UniqueID']
|
2465
2479
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
@@ -2485,10 +2499,10 @@ class DarwinUser(User):
|
|
2485
2499
|
return max_uid + 1
|
2486
2500
|
|
2487
2501
|
def _change_user_password(self):
|
2488
|
-
|
2502
|
+
"""Change password for SELF.NAME against SELF.PASSWORD.
|
2489
2503
|
|
2490
2504
|
Please note that password must be cleartext.
|
2491
|
-
|
2505
|
+
"""
|
2492
2506
|
# some documentation on how is stored passwords on OSX:
|
2493
2507
|
# http://blog.lostpassword.com/2012/07/cracking-mac-os-x-lion-accounts-passwords/
|
2494
2508
|
# http://null-byte.wonderhowto.com/how-to/hack-mac-os-x-lion-passwords-0130036/
|
@@ -2507,7 +2521,7 @@ class DarwinUser(User):
|
|
2507
2521
|
return (rc, out, err)
|
2508
2522
|
|
2509
2523
|
def _make_group_numerical(self):
|
2510
|
-
|
2524
|
+
"""Convert SELF.GROUP to is stringed numerical value suitable for dscl."""
|
2511
2525
|
if self.group is None:
|
2512
2526
|
self.group = 'nogroup'
|
2513
2527
|
try:
|
@@ -2518,8 +2532,8 @@ class DarwinUser(User):
|
|
2518
2532
|
self.group = str(self.group)
|
2519
2533
|
|
2520
2534
|
def __modify_group(self, group, action):
|
2521
|
-
|
2522
|
-
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed.
|
2535
|
+
"""Add or remove SELF.NAME to or from GROUP depending on ACTION.
|
2536
|
+
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
|
2523
2537
|
if action == 'add':
|
2524
2538
|
option = '-a'
|
2525
2539
|
else:
|
@@ -2532,8 +2546,8 @@ class DarwinUser(User):
|
|
2532
2546
|
return (rc, out, err)
|
2533
2547
|
|
2534
2548
|
def _modify_group(self):
|
2535
|
-
|
2536
|
-
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed.
|
2549
|
+
"""Add or remove SELF.NAME to or from GROUP depending on ACTION.
|
2550
|
+
ACTION can be 'add' or 'remove' otherwise 'remove' is assumed. """
|
2537
2551
|
|
2538
2552
|
rc = 0
|
2539
2553
|
out = ''
|
@@ -2564,9 +2578,9 @@ class DarwinUser(User):
|
|
2564
2578
|
return (rc, out, err, changed)
|
2565
2579
|
|
2566
2580
|
def _update_system_user(self):
|
2567
|
-
|
2581
|
+
"""Hide or show user on login window according SELF.SYSTEM.
|
2568
2582
|
|
2569
|
-
Returns 0 if a change has been made, None otherwise.
|
2583
|
+
Returns 0 if a change has been made, None otherwise."""
|
2570
2584
|
|
2571
2585
|
plist_file = '/Library/Preferences/com.apple.loginwindow.plist'
|
2572
2586
|
|
@@ -2605,14 +2619,14 @@ class DarwinUser(User):
|
|
2605
2619
|
return 0
|
2606
2620
|
|
2607
2621
|
def user_exists(self):
|
2608
|
-
|
2622
|
+
"""Check is SELF.NAME is a known user on the system."""
|
2609
2623
|
cmd = self._get_dscl()
|
2610
2624
|
cmd += ['-read', '/Users/%s' % self.name, 'UniqueID']
|
2611
2625
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
2612
2626
|
return rc == 0
|
2613
2627
|
|
2614
2628
|
def remove_user(self):
|
2615
|
-
|
2629
|
+
"""Delete SELF.NAME. If SELF.FORCE is true, remove its home directory."""
|
2616
2630
|
info = self.user_info()
|
2617
2631
|
|
2618
2632
|
cmd = self._get_dscl()
|
@@ -3243,6 +3257,11 @@ class Alpine(BusyBox):
|
|
3243
3257
|
distribution = 'Alpine'
|
3244
3258
|
|
3245
3259
|
|
3260
|
+
class Buildroot(BusyBox):
|
3261
|
+
platform = 'Linux'
|
3262
|
+
distribution = 'Buildroot'
|
3263
|
+
|
3264
|
+
|
3246
3265
|
def main():
|
3247
3266
|
ssh_defaults = dict(
|
3248
3267
|
bits=0,
|
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: validate_argument_spec
|
12
12
|
short_description: Validate role argument specs.
|
@@ -16,7 +16,8 @@ version_added: "2.11"
|
|
16
16
|
options:
|
17
17
|
argument_spec:
|
18
18
|
description:
|
19
|
-
- A dictionary like AnsibleModule argument_spec.
|
19
|
+
- A dictionary like AnsibleModule argument_spec.
|
20
|
+
- See the C(options) parameter for the R(specification format,role_argument_spec).
|
20
21
|
required: true
|
21
22
|
provided_arguments:
|
22
23
|
description:
|
@@ -46,9 +47,11 @@ attributes:
|
|
46
47
|
support: none
|
47
48
|
platform:
|
48
49
|
platforms: all
|
49
|
-
|
50
|
+
notes:
|
51
|
+
- It is unnecessary to call this module explicitly if the role contains an R(argument spec,role_argument_spec).
|
52
|
+
"""
|
50
53
|
|
51
|
-
EXAMPLES = r
|
54
|
+
EXAMPLES = r"""
|
52
55
|
- name: verify vars needed for this task file are present when included
|
53
56
|
ansible.builtin.validate_argument_spec:
|
54
57
|
argument_spec: '{{ required_data }}'
|
@@ -82,9 +85,9 @@ EXAMPLES = r'''
|
|
82
85
|
vars:
|
83
86
|
stuff: knows
|
84
87
|
but: nobuts!
|
85
|
-
|
88
|
+
"""
|
86
89
|
|
87
|
-
RETURN = r
|
90
|
+
RETURN = r"""
|
88
91
|
argument_errors:
|
89
92
|
description: A list of arg validation errors.
|
90
93
|
returned: failure
|
@@ -114,4 +117,4 @@ validate_args_context:
|
|
114
117
|
type: role
|
115
118
|
path: /home/user/roles/my_role/
|
116
119
|
argument_spec_name: main
|
117
|
-
|
120
|
+
"""
|
ansible/modules/wait_for.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from __future__ import annotations
|
7
7
|
|
8
8
|
|
9
|
-
DOCUMENTATION = r
|
9
|
+
DOCUMENTATION = r"""
|
10
10
|
---
|
11
11
|
module: wait_for
|
12
12
|
short_description: Waits for a condition before continuing
|
@@ -120,9 +120,9 @@ author:
|
|
120
120
|
- Jeroen Hoekx (@jhoekx)
|
121
121
|
- John Jarvis (@jarv)
|
122
122
|
- Andrii Radyk (@AnderEnder)
|
123
|
-
|
123
|
+
"""
|
124
124
|
|
125
|
-
EXAMPLES = r
|
125
|
+
EXAMPLES = r"""
|
126
126
|
- name: Sleep for 300 seconds and continue with play
|
127
127
|
ansible.builtin.wait_for:
|
128
128
|
timeout: 300
|
@@ -187,20 +187,22 @@ EXAMPLES = r'''
|
|
187
187
|
host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'
|
188
188
|
search_regex: OpenSSH
|
189
189
|
delay: 10
|
190
|
-
|
190
|
+
timeout: 300
|
191
|
+
delegate_to: localhost
|
191
192
|
|
192
|
-
# Same as above but
|
193
|
+
# Same as above but using config lookup for the target,
|
194
|
+
# most plugins use 'remote_addr', but ssh uses 'host'
|
193
195
|
- name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"
|
194
196
|
ansible.builtin.wait_for:
|
195
197
|
port: 22
|
196
|
-
host:
|
198
|
+
host: "{{ lookup('config', 'host', plugin_name='ssh', plugin_type='connection') }}"
|
197
199
|
search_regex: OpenSSH
|
198
200
|
delay: 10
|
199
|
-
|
200
|
-
|
201
|
-
|
201
|
+
timeout: 300
|
202
|
+
delegate_to: localhost
|
203
|
+
"""
|
202
204
|
|
203
|
-
RETURN = r
|
205
|
+
RETURN = r"""
|
204
206
|
elapsed:
|
205
207
|
description: The number of seconds that elapsed while waiting
|
206
208
|
returned: always
|
@@ -220,11 +222,10 @@ match_groupdict:
|
|
220
222
|
{
|
221
223
|
'group': 'match'
|
222
224
|
}
|
223
|
-
|
225
|
+
"""
|
224
226
|
|
225
227
|
import binascii
|
226
228
|
import contextlib
|
227
|
-
import datetime
|
228
229
|
import errno
|
229
230
|
import math
|
230
231
|
import mmap
|
@@ -233,12 +234,12 @@ import re
|
|
233
234
|
import select
|
234
235
|
import socket
|
235
236
|
import time
|
236
|
-
|
237
|
+
|
238
|
+
from datetime import datetime, timedelta, timezone
|
237
239
|
|
238
240
|
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
239
241
|
from ansible.module_utils.common.sys_info import get_platform_subclass
|
240
242
|
from ansible.module_utils.common.text.converters import to_bytes, to_native
|
241
|
-
from ansible.module_utils.compat.datetime import utcnow
|
242
243
|
|
243
244
|
|
244
245
|
HAS_PSUTIL = False
|
@@ -247,8 +248,8 @@ try:
|
|
247
248
|
import psutil
|
248
249
|
HAS_PSUTIL = True
|
249
250
|
# just because we can import it on Linux doesn't mean we will use it
|
250
|
-
except ImportError:
|
251
|
-
PSUTIL_IMP_ERR =
|
251
|
+
except ImportError as ex:
|
252
|
+
PSUTIL_IMP_ERR = ex
|
252
253
|
|
253
254
|
|
254
255
|
class TCPConnectionInfo(object):
|
@@ -532,7 +533,7 @@ def main():
|
|
532
533
|
except Exception:
|
533
534
|
module.fail_json(msg="unknown active_connection_state (%s) defined" % _connection_state, elapsed=0)
|
534
535
|
|
535
|
-
start =
|
536
|
+
start = datetime.now(timezone.utc)
|
536
537
|
|
537
538
|
if delay:
|
538
539
|
time.sleep(delay)
|
@@ -541,9 +542,9 @@ def main():
|
|
541
542
|
time.sleep(timeout)
|
542
543
|
elif state in ['absent', 'stopped']:
|
543
544
|
# first wait for the stop condition
|
544
|
-
end = start +
|
545
|
+
end = start + timedelta(seconds=timeout)
|
545
546
|
|
546
|
-
while
|
547
|
+
while datetime.now(timezone.utc) < end:
|
547
548
|
if path:
|
548
549
|
try:
|
549
550
|
if not os.access(b_path, os.F_OK):
|
@@ -560,7 +561,7 @@ def main():
|
|
560
561
|
# Conditions not yet met, wait and try again
|
561
562
|
time.sleep(module.params['sleep'])
|
562
563
|
else:
|
563
|
-
elapsed =
|
564
|
+
elapsed = datetime.now(timezone.utc) - start
|
564
565
|
if port:
|
565
566
|
module.fail_json(msg=msg or "Timeout when waiting for %s:%s to stop." % (host, port), elapsed=elapsed.seconds)
|
566
567
|
elif path:
|
@@ -568,15 +569,15 @@ def main():
|
|
568
569
|
|
569
570
|
elif state in ['started', 'present']:
|
570
571
|
# wait for start condition
|
571
|
-
end = start +
|
572
|
-
while
|
572
|
+
end = start + timedelta(seconds=timeout)
|
573
|
+
while datetime.now(timezone.utc) < end:
|
573
574
|
if path:
|
574
575
|
try:
|
575
576
|
os.stat(b_path)
|
576
577
|
except OSError as e:
|
577
578
|
# If anything except file not present, throw an error
|
578
579
|
if e.errno != 2:
|
579
|
-
elapsed =
|
580
|
+
elapsed = datetime.now(timezone.utc) - start
|
580
581
|
module.fail_json(msg=msg or "Failed to stat %s, %s" % (path, e.strerror), elapsed=elapsed.seconds)
|
581
582
|
# file doesn't exist yet, so continue
|
582
583
|
else:
|
@@ -611,9 +612,11 @@ def main():
|
|
611
612
|
except IOError:
|
612
613
|
pass
|
613
614
|
elif port:
|
614
|
-
alt_connect_timeout = math.ceil(
|
615
|
+
alt_connect_timeout = math.ceil(
|
616
|
+
_timedelta_total_seconds(end - datetime.now(timezone.utc)),
|
617
|
+
)
|
615
618
|
try:
|
616
|
-
s = socket.create_connection((host, port), min(connect_timeout, alt_connect_timeout))
|
619
|
+
s = socket.create_connection((host, int(port)), min(connect_timeout, alt_connect_timeout))
|
617
620
|
except Exception:
|
618
621
|
# Failed to connect by connect_timeout. wait and try again
|
619
622
|
pass
|
@@ -622,8 +625,12 @@ def main():
|
|
622
625
|
if b_compiled_search_re:
|
623
626
|
b_data = b''
|
624
627
|
matched = False
|
625
|
-
while
|
626
|
-
max_timeout = math.ceil(
|
628
|
+
while datetime.now(timezone.utc) < end:
|
629
|
+
max_timeout = math.ceil(
|
630
|
+
_timedelta_total_seconds(
|
631
|
+
end - datetime.now(timezone.utc),
|
632
|
+
),
|
633
|
+
)
|
627
634
|
readable = select.select([s], [], [], max_timeout)[0]
|
628
635
|
if not readable:
|
629
636
|
# No new data. Probably means our timeout
|
@@ -667,7 +674,7 @@ def main():
|
|
667
674
|
|
668
675
|
else: # while-else
|
669
676
|
# Timeout expired
|
670
|
-
elapsed =
|
677
|
+
elapsed = datetime.now(timezone.utc) - start
|
671
678
|
if port:
|
672
679
|
if search_regex:
|
673
680
|
module.fail_json(msg=msg or "Timeout when waiting for search string %s in %s:%s" % (search_regex, host, port), elapsed=elapsed.seconds)
|
@@ -681,19 +688,19 @@ def main():
|
|
681
688
|
|
682
689
|
elif state == 'drained':
|
683
690
|
# wait until all active connections are gone
|
684
|
-
end = start +
|
691
|
+
end = start + timedelta(seconds=timeout)
|
685
692
|
tcpconns = TCPConnectionInfo(module)
|
686
|
-
while
|
693
|
+
while datetime.now(timezone.utc) < end:
|
687
694
|
if tcpconns.get_active_connections_count() == 0:
|
688
695
|
break
|
689
696
|
|
690
697
|
# Conditions not yet met, wait and try again
|
691
698
|
time.sleep(module.params['sleep'])
|
692
699
|
else:
|
693
|
-
elapsed =
|
700
|
+
elapsed = datetime.now(timezone.utc) - start
|
694
701
|
module.fail_json(msg=msg or "Timeout when waiting for %s:%s to drain" % (host, port), elapsed=elapsed.seconds)
|
695
702
|
|
696
|
-
elapsed =
|
703
|
+
elapsed = datetime.now(timezone.utc) - start
|
697
704
|
module.exit_json(state=state, port=port, search_regex=search_regex, match_groups=match_groups, match_groupdict=match_groupdict, path=path,
|
698
705
|
elapsed=elapsed.seconds)
|
699
706
|
|