From 06ffe7b5d898ee147f2600bd3e9ad37bf0d59b2b Mon Sep 17 00:00:00 2001 From: lrrb Date: Mon, 10 Dec 2018 19:15:22 +0100 Subject: [PATCH] fix: Make sure that the files excluded when extracting the archive are not checked (#45122) (#49700) * fix: ensure than all item of a list of excluded files aren't checked (#45122) * fix: ensure than list of excluded files aren't checked * test: exclude a list of files (cherry picked from commit 4f9f1754b44aefd808536aeaf01262c84712659a) * added changelog --- .../45122-fix-unarchive-excluded_files.yaml | 2 ++ lib/ansible/modules/files/unarchive.py | 17 +++++++++++------ .../targets/unarchive/tasks/main.yml | 7 +++++-- 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 changelogs/fragments/45122-fix-unarchive-excluded_files.yaml diff --git a/changelogs/fragments/45122-fix-unarchive-excluded_files.yaml b/changelogs/fragments/45122-fix-unarchive-excluded_files.yaml new file mode 100644 index 00000000000..6b55bf0a21d --- /dev/null +++ b/changelogs/fragments/45122-fix-unarchive-excluded_files.yaml @@ -0,0 +1,2 @@ +bugfixes: +- "Fixed: Make sure that the files excluded when extracting the archive are not checked. https://github.com/ansible/ansible/pull/45122" diff --git a/lib/ansible/modules/files/unarchive.py b/lib/ansible/modules/files/unarchive.py index 8a0bea88494..2e512d1ec76 100644 --- a/lib/ansible/modules/files/unarchive.py +++ b/lib/ansible/modules/files/unarchive.py @@ -264,11 +264,13 @@ class ZipArchive(object): else: try: for member in archive.namelist(): + exclude_flag = False if self.excludes: for exclude in self.excludes: - if not fnmatch.fnmatch(member, exclude): - self._files_in_archive.append(to_native(member)) - else: + if fnmatch.fnmatch(member, exclude): + exclude_flag = True + break + if not exclude_flag: self._files_in_archive.append(to_native(member)) except: archive.close() @@ -664,11 +666,14 @@ class TgzArchive(object): if filename.startswith('/'): filename = filename[1:] + exclude_flag = False if self.excludes: for exclude in self.excludes: - if not fnmatch.fnmatch(filename, exclude): - self._files_in_archive.append(to_native(filename)) - else: + if fnmatch.fnmatch(filename, exclude): + exclude_flag = True + break + + if not exclude_flag: self._files_in_archive.append(to_native(filename)) return self._files_in_archive diff --git a/test/integration/targets/unarchive/tasks/main.yml b/test/integration/targets/unarchive/tasks/main.yml index 12cfcf10af9..2d050f66a3d 100644 --- a/test/integration/targets/unarchive/tasks/main.yml +++ b/test/integration/targets/unarchive/tasks/main.yml @@ -225,11 +225,13 @@ - zip - tar -- name: Unpack archive file excluding glob files. +- name: Unpack archive file excluding regular and glob files. unarchive: src: "{{ output_dir }}/unarchive-00.{{item}}" dest: "{{ output_dir }}/exclude-{{item}}" - exclude: "exclude/exclude-*.txt" + exclude: + - "exclude/exclude-*.txt" + - "other/exclude-1.ext" with_items: - zip - tar @@ -245,6 +247,7 @@ assert: that: - "'exclude/exclude-1.txt' not in item.stdout" + - "'other/exclude-1.ext' not in item.stdout" with_items: - "{{ unarchive00.results }}"