def get_pkg_info(self): """Extract the contents of the pkg_info file from the binary package.""" with tarfile.open(self.filename) as tar: for member in tar: if member.name != 'pkg_info': raise error.PkgFormatError('pkg_info not first member in archive') return tar.extractfile(member).read()
def verify_archive_format(self): if not os.path.exists(self.filename): raise error.Error('package archive not found: %s' % self.filename) basename, extension = os.path.splitext(os.path.basename(self.filename)) basename = os.path.splitext(basename)[0] if extension != '.bz2': raise error.Error('invalid file extension: %s' % extension) try: with tarfile.open(self.filename): pass except tarfile.TarError as e: raise error.PkgFormatError(e)
def _install_files(self, force): dest = util.get_install_root(self.config) dest_tmp = os.path.join(dest, 'install_tmp') if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) if self.is_any_version_installed(): raise error.Error('package already installed: %s' % self.info_string()) self.log_status('Installing') util.log_verbose('installing from: %s' % self.filename) util.makedirs(dest_tmp) names = [] try: with tarfile.open(self.filename) as tar: for info in tar: if info.isdir(): continue name = posixpath.normpath(info.name) if name == 'pkg_info': continue if not name.startswith(PAYLOAD_DIR + '/'): raise error.PkgFormatError( 'invalid file in package: %s' % name) name = name[len(PAYLOAD_DIR) + 1:] names.append(name) if not force: for name in names: full_name = os.path.join(dest, name) if os.path.exists(full_name): raise error.Error('file already exists: %s' % full_name) tar.extractall(dest_tmp) payload_tree = os.path.join(dest_tmp, PAYLOAD_DIR) names = filter_out_executables(names, payload_tree) for name in names: install_file(name, payload_tree, dest) finally: shutil.rmtree(dest_tmp) for name in names: relocate_file(name, dest) self.write_file_list(names)
def _InstallFiles(self, force): dest = util.GetInstallRoot(self.config) dest_tmp = os.path.join(dest, 'install_tmp') if os.path.exists(dest_tmp): shutil.rmtree(dest_tmp) if self.IsAnyVersionInstalled(): raise error.Error('package already installed: %s' % self.InfoString()) self.LogStatus('Installing') util.LogVerbose('installing from: %s' % self.filename) util.Makedirs(dest_tmp) names = [] try: with tarfile.open(self.filename) as tar: for info in tar: if info.isdir(): continue name = posixpath.normpath(info.name) if name == 'pkg_info': continue if not name.startswith(PAYLOAD_DIR + '/'): raise error.PkgFormatError('invalid file in package: %s' % name) name = name[len(PAYLOAD_DIR) + 1:] names.append(name) if not force: for name in names: full_name = os.path.join(dest, name) if os.path.exists(full_name): raise error.Error('file already exists: %s' % full_name) tar.extractall(dest_tmp) payload_tree = os.path.join(dest_tmp, PAYLOAD_DIR) names = FilterOutExecutables(names, payload_tree) for name in names: InstallFile(name, payload_tree, dest) finally: shutil.rmtree(dest_tmp) for name in names: RelocateFile(name, dest) self.WriteFileList(names)