예제 #1
0
 def search(self, filepattern):
     pathlist = []
     for member in self.tar_file.getmembers():
         if fnmatch.fnmatch(member.name, filepattern):
             try:
                 clean_name = sanitize_file_path(member.name)
                 full_path = os.path.join(self.temp_folder,
                                          Path(clean_name))
                 if member.isdir():
                     os.makedirs(full_path)
                 else:
                     parent_dir = os.path.dirname(full_path)
                     if not os.path.exists(parent_dir):
                         os.makedirs(parent_dir)
                     with open(full_path, "wb") as fout:
                         fout.write(
                             tarfile.ExFileObject(self.tar_file,
                                                  member).read())
                         fout.close()
                     os.utime(full_path, (member.mtime, member.mtime))
                 pathlist.append(full_path)
             except Exception as ex:
                 logfunc(
                     f'Could not write file to filesystem, path was {member.name}'
                     + str(ex))
     return pathlist
예제 #2
0
def tar_extract_win(tar_obj, dest_dir):
    win_illegal = ':<>|"?*\n'
    table = str.maketrans(win_illegal, '_' * len(win_illegal))
    for member in tar_obj.getmembers():
        if member.isdir():
            new_dir = dest_dir.joinpath(member.path.translate(table))
            new_dir.mkdir(parents=True, exist_ok=True)
        else:
            dest_file = dest_dir.joinpath(member.path.translate(table))
            try:
                with open(dest_file, "wb") as fout:
                    fout.write(tarfile.ExFileObject(tar_obj, member).read())
            except FileNotFoundError:
                logging.warning('unable to extract %s', dest_file)
예제 #3
0
 def __init__(self, name, fileobj):
     source = make_seekable(fileobj)
     self.tarfile = tarlib.TarFile.open(fileobj=source)
     first_member = self.tarfile.next()
     if first_member is None:
         raise OSError("can not read first member of the tar archive")
     self._single = (self.tarfile.next() is None)
     if self._single:
         stream = tarlib.ExFileObject(self.tarfile, first_member)
         stream_name = first_member.name
         self._compression += ':' + stream_name
     else:
         stream_name = name
         stream = source
         stream.seek(0)
     ArchivePack.__init__(self, stream_name, source=source, fileobj=stream)
예제 #4
0
def extractTarGz(tarGzBase64, basePath):
    try:
        shutil.rmtree(TMP_PATH)
    except FileNotFoundError:
        pass

    targzBin = base64.b64decode(tarGzBase64)
    tf = tarfile.open(fileobj=BytesIO(targzBin))
    print(tf.getmembers())
    os.makedirs(basePath)
    for member in tf.getmembers():
        print(member.path)
        if member.isdir():
            os.makedirs(changeRootFolder(member.path, basePath))
        else:
            with open(changeRootFolder(member.path, basePath), "wb") as fout:
                fout.write(tarfile.ExFileObject(tf, member).read())
예제 #5
0
        # 开始解析镜像包文件是否合法
        try:
            tf = tarfile.open(fileobj=upload_file.file, mode='r:%s' % filetype)
        except tarfile.ReadError, e:
            return '未知格式的镜像包,%s' % str(e)
        except Exception as e:
            return '解析镜像包出错,%s' % str(e)

        try:
            manifest = tf.getmember('manifest.json')
        except KeyError:
            return '镜像包中没有manifest.json文件,这是一个容器镜像包?'
        except Exception as e:
            return '无法获取镜像包文件manifest.json,%s' % str(e)

        manifest_file = tarfile.ExFileObject(tf,
                                             manifest)  # 从包中获取manifest.json文件
        txt = manifest_file.read()  # manifest.json文件内容
        print txt, 333
        try:
            image_name = json.loads(txt)[0]['RepoTags'][0]  # busybox:latest
        except Exception as e:
            return '镜像包文件manifest.json内容解析提取镜像(名称:版本)出错,请联系反映BUG. \r\n%s出错信息:%s' % (
                txt, str(e))

        name, ver = image_name.split(':')
        file = '%s(%s).upload.tar' % (name.replace('/', '#'), ver)
        size = upload_file.size

        filepath = os.path.join(ImgDir, file)
        if os.path.exists(filepath):
            if DockerImageFile.objects.filter(file=file):
    def run(self, tmp=None, task_vars=None):
        self._supports_check_mode = False

        result = super(ActionModule, self).run(tmp, task_vars)

        src = self._task.args.get("src")
        proj_path = self._task.args.get("project_path")
        force = self._task.args.get("force", False)

        try:
            archive = zipfile.ZipFile(src)
            get_filenames = archive.namelist
            get_members = archive.infolist
        except zipfile.BadZipFile:
            archive = tarfile.open(src)
            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.
        start_index = 0
        root_contents = set(
            [filename.split(os.path.sep)[0] for filename in get_filenames()])
        if len(root_contents) == 1:
            start_index = len(list(root_contents)[0]) + 1

        for member in get_members():
            try:
                filename = member.filename
            except AttributeError:
                filename = member.name

            # Skip the archive base directory
            if not filename[start_index:]:
                continue

            dest = os.path.join(proj_path, filename[start_index:])

            if not force and os.path.exists(dest):
                continue

            try:
                is_dir = member.is_dir()
            except AttributeError:
                is_dir = member.isdir()

            if is_dir:
                os.makedirs(dest, exist_ok=True)
            else:
                try:
                    member_f = archive.open(member)
                except TypeError:
                    member_f = tarfile.ExFileObject(archive, member)

                with open(dest, "wb") as f:
                    f.write(member_f.read())
                    member_f.close()

        archive.close()

        result["changed"] = True
        return result
예제 #7
0
 def open(self, member):
     return tarlib.ExFileObject(self.tarfile, member)