ansible-core 2.18.7rc1__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.7rc1.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.7rc1.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
ansible/modules/unarchive.py
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
DOCUMENTATION = r
|
|
13
|
+
DOCUMENTATION = r"""
|
|
14
14
|
---
|
|
15
15
|
module: unarchive
|
|
16
16
|
version_added: '1.4'
|
|
@@ -150,9 +150,9 @@ seealso:
|
|
|
150
150
|
- module: community.general.iso_extract
|
|
151
151
|
- module: community.windows.win_unzip
|
|
152
152
|
author: Michael DeHaan
|
|
153
|
-
|
|
153
|
+
"""
|
|
154
154
|
|
|
155
|
-
EXAMPLES = r
|
|
155
|
+
EXAMPLES = r"""
|
|
156
156
|
- name: Extract foo.tgz into /var/lib/foo
|
|
157
157
|
ansible.builtin.unarchive:
|
|
158
158
|
src: foo.tgz
|
|
@@ -177,9 +177,9 @@ EXAMPLES = r'''
|
|
|
177
177
|
extra_opts:
|
|
178
178
|
- --transform
|
|
179
179
|
- s/^xxx/yyy/
|
|
180
|
-
|
|
180
|
+
"""
|
|
181
181
|
|
|
182
|
-
RETURN = r
|
|
182
|
+
RETURN = r"""
|
|
183
183
|
dest:
|
|
184
184
|
description: Path to the destination directory.
|
|
185
185
|
returned: always
|
|
@@ -237,10 +237,11 @@ uid:
|
|
|
237
237
|
returned: always
|
|
238
238
|
type: int
|
|
239
239
|
sample: 1000
|
|
240
|
-
|
|
240
|
+
"""
|
|
241
241
|
|
|
242
242
|
import binascii
|
|
243
243
|
import codecs
|
|
244
|
+
import ctypes
|
|
244
245
|
import fnmatch
|
|
245
246
|
import grp
|
|
246
247
|
import os
|
|
@@ -249,7 +250,6 @@ import pwd
|
|
|
249
250
|
import re
|
|
250
251
|
import stat
|
|
251
252
|
import time
|
|
252
|
-
import traceback
|
|
253
253
|
from functools import partial
|
|
254
254
|
from zipfile import ZipFile
|
|
255
255
|
|
|
@@ -262,6 +262,13 @@ from ansible.module_utils.urls import fetch_file
|
|
|
262
262
|
from shlex import quote
|
|
263
263
|
from zipfile import BadZipFile
|
|
264
264
|
|
|
265
|
+
try:
|
|
266
|
+
from functools import cache
|
|
267
|
+
except ImportError:
|
|
268
|
+
# Python < 3.9
|
|
269
|
+
from functools import lru_cache
|
|
270
|
+
cache = lru_cache(maxsize=None)
|
|
271
|
+
|
|
265
272
|
# String from tar that shows the tar contents are different from the
|
|
266
273
|
# filesystem
|
|
267
274
|
OWNER_DIFF_RE = re.compile(r': Uid differs$')
|
|
@@ -279,8 +286,20 @@ CONTENT_DIFF_RE = re.compile(r': Contents differ$')
|
|
|
279
286
|
SIZE_DIFF_RE = re.compile(r': Size differs$')
|
|
280
287
|
|
|
281
288
|
|
|
289
|
+
@cache
|
|
290
|
+
def _y2038_impacted():
|
|
291
|
+
"""Determine if the system has 64-bit time_t."""
|
|
292
|
+
if hasattr(ctypes, "c_time_t"): # Python >= 3.12
|
|
293
|
+
return ctypes.sizeof(ctypes.c_time_t) < 8
|
|
294
|
+
try:
|
|
295
|
+
time.gmtime(2**31)
|
|
296
|
+
except OverflowError:
|
|
297
|
+
return True
|
|
298
|
+
return False
|
|
299
|
+
|
|
300
|
+
|
|
282
301
|
def crc32(path, buffer_size):
|
|
283
|
-
|
|
302
|
+
""" Return a CRC32 checksum of a file """
|
|
284
303
|
|
|
285
304
|
crc = binascii.crc32(b'')
|
|
286
305
|
with open(path, 'rb') as f:
|
|
@@ -290,7 +309,7 @@ def crc32(path, buffer_size):
|
|
|
290
309
|
|
|
291
310
|
|
|
292
311
|
def shell_escape(string):
|
|
293
|
-
|
|
312
|
+
""" Quote meta-characters in the args for the unix shell """
|
|
294
313
|
return re.sub(r'([^A-Za-z0-9_])', r'\\\1', string)
|
|
295
314
|
|
|
296
315
|
|
|
@@ -321,7 +340,7 @@ class ZipArchive(object):
|
|
|
321
340
|
)
|
|
322
341
|
|
|
323
342
|
def _permstr_to_octal(self, modestr, umask):
|
|
324
|
-
|
|
343
|
+
""" Convert a Unix permission string (rw-r--r--) into a mode (0644) """
|
|
325
344
|
revstr = modestr[::-1]
|
|
326
345
|
mode = 0
|
|
327
346
|
for j in range(0, 3):
|
|
@@ -414,6 +433,8 @@ class ZipArchive(object):
|
|
|
414
433
|
try:
|
|
415
434
|
if int(match.groups()[0]) < 1980:
|
|
416
435
|
date_time = epoch_date_time
|
|
436
|
+
elif int(match.groups()[0]) >= 2038 and _y2038_impacted():
|
|
437
|
+
date_time = (2038, 1, 1, 0, 0, 0, 0, 0, 0)
|
|
417
438
|
elif int(match.groups()[0]) > 2107:
|
|
418
439
|
date_time = (2107, 12, 31, 23, 59, 59, 0, 0, 0)
|
|
419
440
|
else:
|
|
@@ -676,7 +697,7 @@ class ZipArchive(object):
|
|
|
676
697
|
try:
|
|
677
698
|
mode = AnsibleModule._symbolic_mode_to_octal(st, self.file_args['mode'])
|
|
678
699
|
except ValueError as e:
|
|
679
|
-
self.module.fail_json(path=path, msg="%s" % to_native(e)
|
|
700
|
+
self.module.fail_json(path=path, msg="%s" % to_native(e))
|
|
680
701
|
# Only special files require no umask-handling
|
|
681
702
|
elif ztype == '?':
|
|
682
703
|
mode = self._permstr_to_octal(permstr, 0)
|
|
@@ -1111,8 +1132,8 @@ def main():
|
|
|
1111
1132
|
res_args['extract_results'] = handler.unarchive()
|
|
1112
1133
|
if res_args['extract_results']['rc'] != 0:
|
|
1113
1134
|
module.fail_json(msg="failed to unpack %s to %s" % (src, dest), **res_args)
|
|
1114
|
-
except
|
|
1115
|
-
module.fail_json(
|
|
1135
|
+
except OSError as ex:
|
|
1136
|
+
module.fail_json(f"Failed to unpack {src!r} to {dest!r}.", exception=ex, **res_args)
|
|
1116
1137
|
else:
|
|
1117
1138
|
res_args['changed'] = True
|
|
1118
1139
|
|
|
@@ -1129,8 +1150,8 @@ def main():
|
|
|
1129
1150
|
|
|
1130
1151
|
try:
|
|
1131
1152
|
res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
|
|
1132
|
-
except
|
|
1133
|
-
module.fail_json(
|
|
1153
|
+
except OSError as ex:
|
|
1154
|
+
module.fail_json("Unexpected error when accessing exploded file.", exception=ex, **res_args)
|
|
1134
1155
|
|
|
1135
1156
|
if '/' in filename:
|
|
1136
1157
|
top_folder_path = filename.split('/')[0]
|
|
@@ -1144,8 +1165,8 @@ def main():
|
|
|
1144
1165
|
file_args['path'] = "%s/%s" % (dest, f)
|
|
1145
1166
|
try:
|
|
1146
1167
|
res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
|
|
1147
|
-
except
|
|
1148
|
-
module.fail_json(
|
|
1168
|
+
except OSError as ex:
|
|
1169
|
+
module.fail_json("Unexpected error when accessing exploded file.", exception=ex, **res_args)
|
|
1149
1170
|
|
|
1150
1171
|
if module.params['list_files']:
|
|
1151
1172
|
res_args['files'] = handler.files_in_archive
|
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
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
|
|
|
@@ -506,7 +506,7 @@ def write_file(module, dest, content, resp):
|
|
|
506
506
|
|
|
507
507
|
|
|
508
508
|
def kv_list(data):
|
|
509
|
-
|
|
509
|
+
""" Convert data into a list of key-value tuples """
|
|
510
510
|
if data is None:
|
|
511
511
|
return None
|
|
512
512
|
|
|
@@ -520,7 +520,7 @@ def kv_list(data):
|
|
|
520
520
|
|
|
521
521
|
|
|
522
522
|
def form_urlencoded(body):
|
|
523
|
-
|
|
523
|
+
""" Convert data into a form-urlencoded string """
|
|
524
524
|
if isinstance(body, string_types):
|
|
525
525
|
return body
|
|
526
526
|
|
|
@@ -558,7 +558,10 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
|
558
558
|
kwargs = {}
|
|
559
559
|
if dest is not None and os.path.isfile(dest):
|
|
560
560
|
# if destination file already exist, only download if file newer
|
|
561
|
-
kwargs['last_mod_time'] =
|
|
561
|
+
kwargs['last_mod_time'] = datetime.fromtimestamp(
|
|
562
|
+
os.path.getmtime(dest),
|
|
563
|
+
tz=timezone.utc,
|
|
564
|
+
)
|
|
562
565
|
|
|
563
566
|
if module.params.get('follow_redirects') in ('no', 'yes'):
|
|
564
567
|
module.deprecate(
|
|
@@ -584,6 +587,8 @@ def uri(module, url, dest, body, body_format, method, headers, socket_timeout, c
|
|
|
584
587
|
|
|
585
588
|
def main():
|
|
586
589
|
argument_spec = url_argument_spec()
|
|
590
|
+
argument_spec['url']['required'] = True
|
|
591
|
+
argument_spec.update(url_redirect_argument_spec())
|
|
587
592
|
argument_spec.update(
|
|
588
593
|
dest=dict(type='path'),
|
|
589
594
|
url_username=dict(type='str', aliases=['user']),
|
|
@@ -670,12 +675,12 @@ def main():
|
|
|
670
675
|
module.exit_json(stdout="skipped, since '%s' does not exist" % removes, changed=False)
|
|
671
676
|
|
|
672
677
|
# Make the request
|
|
673
|
-
start =
|
|
678
|
+
start = datetime.now(timezone.utc)
|
|
674
679
|
r, info = uri(module, url, dest, body, body_format, method,
|
|
675
680
|
dict_headers, socket_timeout, ca_path, unredirected_headers,
|
|
676
681
|
decompress, ciphers, use_netrc)
|
|
677
682
|
|
|
678
|
-
elapsed = (
|
|
683
|
+
elapsed = (datetime.now(timezone.utc) - start).seconds
|
|
679
684
|
|
|
680
685
|
if r and dest is not None and os.path.isdir(dest):
|
|
681
686
|
filename = get_response_filename(r) or 'index.html'
|
|
@@ -711,6 +716,8 @@ def main():
|
|
|
711
716
|
# there was no content, but the error read()
|
|
712
717
|
# may have been stored in the info as 'body'
|
|
713
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)}")
|
|
714
721
|
elif r:
|
|
715
722
|
content = r
|
|
716
723
|
else:
|
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,7 +486,7 @@ 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
|
|
@@ -503,13 +503,13 @@ import socket
|
|
|
503
503
|
import subprocess
|
|
504
504
|
import time
|
|
505
505
|
import math
|
|
506
|
+
import typing as t
|
|
506
507
|
|
|
507
508
|
from ansible.module_utils import distro
|
|
508
509
|
from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
|
|
509
510
|
from ansible.module_utils.basic import AnsibleModule
|
|
510
511
|
from ansible.module_utils.common.locale import get_best_parsable_locale
|
|
511
512
|
from ansible.module_utils.common.sys_info import get_platform_subclass
|
|
512
|
-
import ansible.module_utils.compat.typing as t
|
|
513
513
|
|
|
514
514
|
|
|
515
515
|
class StructSpwdType(ctypes.Structure):
|
|
@@ -1092,7 +1092,7 @@ class User(object):
|
|
|
1092
1092
|
return groups
|
|
1093
1093
|
|
|
1094
1094
|
def user_group_membership(self, exclude_primary=True):
|
|
1095
|
-
|
|
1095
|
+
""" Return a list of groups the user belongs to """
|
|
1096
1096
|
groups = []
|
|
1097
1097
|
info = self.get_pwd_info()
|
|
1098
1098
|
for group in grp.getgrall():
|
|
@@ -1341,7 +1341,7 @@ class User(object):
|
|
|
1341
1341
|
try:
|
|
1342
1342
|
with open(ssh_public_key_file, 'r') as f:
|
|
1343
1343
|
ssh_public_key = f.read().strip()
|
|
1344
|
-
except
|
|
1344
|
+
except OSError:
|
|
1345
1345
|
return None
|
|
1346
1346
|
return ssh_public_key
|
|
1347
1347
|
|
|
@@ -1376,16 +1376,24 @@ class User(object):
|
|
|
1376
1376
|
self.module.exit_json(failed=True, msg="%s" % to_native(e))
|
|
1377
1377
|
# get umask from /etc/login.defs and set correct home mode
|
|
1378
1378
|
if os.path.exists(self.LOGIN_DEFS):
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
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)
|
|
1384
1392
|
mode = 0o777 & ~umask
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1393
|
+
try:
|
|
1394
|
+
os.chmod(path, mode)
|
|
1395
|
+
except OSError as e:
|
|
1396
|
+
self.module.exit_json(failed=True, msg=to_native(e))
|
|
1389
1397
|
|
|
1390
1398
|
def chown_homedir(self, uid, gid, path):
|
|
1391
1399
|
try:
|
|
@@ -2442,7 +2450,7 @@ class DarwinUser(User):
|
|
|
2442
2450
|
return groups
|
|
2443
2451
|
|
|
2444
2452
|
def _get_user_property(self, property):
|
|
2445
|
-
|
|
2453
|
+
"""Return user PROPERTY as given my dscl(1) read or None if not found."""
|
|
2446
2454
|
cmd = self._get_dscl()
|
|
2447
2455
|
cmd += ['-read', '/Users/%s' % self.name, property]
|
|
2448
2456
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
|
@@ -2462,10 +2470,10 @@ class DarwinUser(User):
|
|
|
2462
2470
|
return None
|
|
2463
2471
|
|
|
2464
2472
|
def _get_next_uid(self, system=None):
|
|
2465
|
-
|
|
2473
|
+
"""
|
|
2466
2474
|
Return the next available uid. If system=True, then
|
|
2467
2475
|
uid should be below of 500, if possible.
|
|
2468
|
-
|
|
2476
|
+
"""
|
|
2469
2477
|
cmd = self._get_dscl()
|
|
2470
2478
|
cmd += ['-list', '/Users', 'UniqueID']
|
|
2471
2479
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
|
@@ -2491,10 +2499,10 @@ class DarwinUser(User):
|
|
|
2491
2499
|
return max_uid + 1
|
|
2492
2500
|
|
|
2493
2501
|
def _change_user_password(self):
|
|
2494
|
-
|
|
2502
|
+
"""Change password for SELF.NAME against SELF.PASSWORD.
|
|
2495
2503
|
|
|
2496
2504
|
Please note that password must be cleartext.
|
|
2497
|
-
|
|
2505
|
+
"""
|
|
2498
2506
|
# some documentation on how is stored passwords on OSX:
|
|
2499
2507
|
# http://blog.lostpassword.com/2012/07/cracking-mac-os-x-lion-accounts-passwords/
|
|
2500
2508
|
# http://null-byte.wonderhowto.com/how-to/hack-mac-os-x-lion-passwords-0130036/
|
|
@@ -2513,7 +2521,7 @@ class DarwinUser(User):
|
|
|
2513
2521
|
return (rc, out, err)
|
|
2514
2522
|
|
|
2515
2523
|
def _make_group_numerical(self):
|
|
2516
|
-
|
|
2524
|
+
"""Convert SELF.GROUP to is stringed numerical value suitable for dscl."""
|
|
2517
2525
|
if self.group is None:
|
|
2518
2526
|
self.group = 'nogroup'
|
|
2519
2527
|
try:
|
|
@@ -2524,8 +2532,8 @@ class DarwinUser(User):
|
|
|
2524
2532
|
self.group = str(self.group)
|
|
2525
2533
|
|
|
2526
2534
|
def __modify_group(self, group, action):
|
|
2527
|
-
|
|
2528
|
-
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. """
|
|
2529
2537
|
if action == 'add':
|
|
2530
2538
|
option = '-a'
|
|
2531
2539
|
else:
|
|
@@ -2538,8 +2546,8 @@ class DarwinUser(User):
|
|
|
2538
2546
|
return (rc, out, err)
|
|
2539
2547
|
|
|
2540
2548
|
def _modify_group(self):
|
|
2541
|
-
|
|
2542
|
-
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. """
|
|
2543
2551
|
|
|
2544
2552
|
rc = 0
|
|
2545
2553
|
out = ''
|
|
@@ -2570,9 +2578,9 @@ class DarwinUser(User):
|
|
|
2570
2578
|
return (rc, out, err, changed)
|
|
2571
2579
|
|
|
2572
2580
|
def _update_system_user(self):
|
|
2573
|
-
|
|
2581
|
+
"""Hide or show user on login window according SELF.SYSTEM.
|
|
2574
2582
|
|
|
2575
|
-
Returns 0 if a change has been made, None otherwise.
|
|
2583
|
+
Returns 0 if a change has been made, None otherwise."""
|
|
2576
2584
|
|
|
2577
2585
|
plist_file = '/Library/Preferences/com.apple.loginwindow.plist'
|
|
2578
2586
|
|
|
@@ -2611,14 +2619,14 @@ class DarwinUser(User):
|
|
|
2611
2619
|
return 0
|
|
2612
2620
|
|
|
2613
2621
|
def user_exists(self):
|
|
2614
|
-
|
|
2622
|
+
"""Check is SELF.NAME is a known user on the system."""
|
|
2615
2623
|
cmd = self._get_dscl()
|
|
2616
2624
|
cmd += ['-read', '/Users/%s' % self.name, 'UniqueID']
|
|
2617
2625
|
(rc, out, err) = self.execute_command(cmd, obey_checkmode=False)
|
|
2618
2626
|
return rc == 0
|
|
2619
2627
|
|
|
2620
2628
|
def remove_user(self):
|
|
2621
|
-
|
|
2629
|
+
"""Delete SELF.NAME. If SELF.FORCE is true, remove its home directory."""
|
|
2622
2630
|
info = self.user_info()
|
|
2623
2631
|
|
|
2624
2632
|
cmd = self._get_dscl()
|
|
@@ -3249,6 +3257,11 @@ class Alpine(BusyBox):
|
|
|
3249
3257
|
distribution = 'Alpine'
|
|
3250
3258
|
|
|
3251
3259
|
|
|
3260
|
+
class Buildroot(BusyBox):
|
|
3261
|
+
platform = 'Linux'
|
|
3262
|
+
distribution = 'Buildroot'
|
|
3263
|
+
|
|
3264
|
+
|
|
3252
3265
|
def main():
|
|
3253
3266
|
ssh_defaults = dict(
|
|
3254
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
|
+
"""
|