From a56428de11ead49bb172f78fb7d8c971deb8e0e5 Mon Sep 17 00:00:00 2001 From: Sam Doran Date: Wed, 1 Mar 2023 10:54:00 -0500 Subject: [PATCH] unarchive - properly handle relative path for `dest` (#75267) * unarchive - properly handle relative path for dest * Add integration test * Return output of underlying commands with increased verbosity * Revert "Return output of underlying commands with increased verbosity" This reverts commit a2790c8275cdc5697b65670a0beffdc74b741bf6. * Warn when a relative destination path was provided --- .../64612-unarchive-relative-path-dest.yml | 2 ++ lib/ansible/modules/unarchive.py | 7 ++++- .../targets/unarchive/tasks/main.yml | 1 + .../unarchive/tasks/test_relative_dest.yml | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/64612-unarchive-relative-path-dest.yml create mode 100644 test/integration/targets/unarchive/tasks/test_relative_dest.yml diff --git a/changelogs/fragments/64612-unarchive-relative-path-dest.yml b/changelogs/fragments/64612-unarchive-relative-path-dest.yml new file mode 100644 index 00000000000..5026ad068ca --- /dev/null +++ b/changelogs/fragments/64612-unarchive-relative-path-dest.yml @@ -0,0 +1,2 @@ +bugfixes: + - unarchive - allow relative path for ``dest`` (https://github.com/ansible/ansible/issues/64612) diff --git a/lib/ansible/modules/unarchive.py b/lib/ansible/modules/unarchive.py index 03edec5a49b..ceb8ca2a6b5 100644 --- a/lib/ansible/modules/unarchive.py +++ b/lib/ansible/modules/unarchive.py @@ -1022,7 +1022,12 @@ def main(): src = module.params['src'] dest = module.params['dest'] - b_dest = to_bytes(dest, errors='surrogate_or_strict') + abs_dest = os.path.abspath(dest) + b_dest = to_bytes(abs_dest, errors='surrogate_or_strict') + + if not os.path.isabs(dest): + module.warn("Relative destination path '{dest}' was resolved to absolute path '{abs_dest}'.".format(dest=dest, abs_dest=abs_dest)) + remote_src = module.params['remote_src'] file_args = module.load_file_common_arguments(module.params) diff --git a/test/integration/targets/unarchive/tasks/main.yml b/test/integration/targets/unarchive/tasks/main.yml index 148e583f2b0..b07c2fe7fbe 100644 --- a/test/integration/targets/unarchive/tasks/main.yml +++ b/test/integration/targets/unarchive/tasks/main.yml @@ -20,3 +20,4 @@ - import_tasks: test_different_language_var.yml - import_tasks: test_invalid_options.yml - import_tasks: test_ownership_top_folder.yml +- import_tasks: test_relative_dest.yml diff --git a/test/integration/targets/unarchive/tasks/test_relative_dest.yml b/test/integration/targets/unarchive/tasks/test_relative_dest.yml new file mode 100644 index 00000000000..aae31fb6637 --- /dev/null +++ b/test/integration/targets/unarchive/tasks/test_relative_dest.yml @@ -0,0 +1,26 @@ +- name: Create relative test directory + file: + path: test-unarchive-relative + state: directory + +- name: Unarchive a file using a relative destination path + unarchive: + src: "{{ remote_tmp_dir }}/test-unarchive.tar" + dest: test-unarchive-relative + remote_src: yes + register: relative_dest_1 + +- name: Unarchive a file using a relative destination path again + unarchive: + src: "{{ remote_tmp_dir }}/test-unarchive.tar" + dest: test-unarchive-relative + remote_src: yes + register: relative_dest_2 + +- name: Ensure changes were made correctly + assert: + that: + - relative_dest_1 is changed + - relative_dest_1.warnings | length > 0 + - relative_dest_1.warnings[0] is search('absolute path') + - relative_dest_2 is not changed