From 798f6371af3f0164737604330ab2eae791391360 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Tue, 1 Sep 2020 15:55:33 -0400 Subject: [PATCH] update the project archive sync support for py2 compatability playbook runs in AWX are still supported in python2, so this adds support for archive-based project syncs in py2 --- .../action_plugins/project_archive.py | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/awx/playbooks/action_plugins/project_archive.py b/awx/playbooks/action_plugins/project_archive.py index 753650d12b39..d5dff804a64e 100644 --- a/awx/playbooks/action_plugins/project_archive.py +++ b/awx/playbooks/action_plugins/project_archive.py @@ -2,15 +2,21 @@ __metaclass__ = type -import zipfile -import tarfile +import errno import os +import tarfile +import zipfile from ansible.plugins.action import ActionBase from ansible.utils.display import Display display = Display() +try: + from zipfile import BadZipFile +except ImportError: + from zipfile import BadZipfile as BadZipFile # py2 compat + class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): @@ -26,14 +32,15 @@ def run(self, tmp=None, task_vars=None): archive = zipfile.ZipFile(src) get_filenames = archive.namelist get_members = archive.infolist - except zipfile.BadZipFile: - archive = tarfile.open(src) + except BadZipFile: + try: + archive = tarfile.open(src) + except tarfile.ReadError: + result["failed"] = True + result["msg"] = "{0} is not a valid archive".format(src) + return result get_filenames = archive.getnames get_members = archive.getmembers - except tarfile.ReadError: - result["failed"] = True - result["msg"] = "{0} is not a valid archive".format(src) - return result # Most well formed archives contain a single root directory, typically named # project-name-1.0.0. The project contents should be inside that directory. @@ -62,10 +69,19 @@ def run(self, tmp=None, task_vars=None): try: is_dir = member.is_dir() except AttributeError: - is_dir = member.isdir() + try: + is_dir = member.isdir() + except AttributeError: + is_dir = member.filename[-1] == '/' # py2 compat for ZipInfo if is_dir: - os.makedirs(dest, exist_ok=True) + try: + os.makedirs(dest) + except OSError as exc: # Python >= 2.5 + if exc.errno == errno.EEXIST and os.path.isdir(dest): + pass + else: + raise else: try: member_f = archive.open(member)