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
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)
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)
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())
# 开始解析镜像包文件是否合法 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
def open(self, member): return tarlib.ExFileObject(self.tarfile, member)