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
This commit is contained in:
Ryan Petrello
2020-09-01 15:55:33 -04:00
parent 30616c1fce
commit 798f6371af

View File

@@ -2,15 +2,21 @@ from __future__ import absolute_import, division, print_function
__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 @@ class ActionModule(ActionBase):
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 @@ class ActionModule(ActionBase):
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)