Don't re-download already verified packages after interrupted installations

This commit is contained in:
Disassembler 2019-02-26 20:59:50 +01:00
parent d64e57ba69
commit 27cb356d92
No known key found for this signature in database
GPG Key ID: 524BD33A0EE29499

View File

@ -79,20 +79,28 @@ class PkgMgr:
def download_package(self, name, item): def download_package(self, name, item):
# Download tar.xz package and verify its hash. Can raise InvalidSignature # Download tar.xz package and verify its hash. Can raise InvalidSignature
pkg_filename = '{}_{}-{}.tar.xz'.format(name, self.online_packages[name]['version'], self.online_packages[name]['release']) pkg_archive = '{}_{}-{}.tar.xz'.format(name, self.online_packages[name]['version'], self.online_packages[name]['release'])
res = self.get_repo_resource(pkg_filename, True) tmp_archive = os.path.join('/tmp', pkg_archive)
tmp_archive = os.path.join('/tmp', pkg_filename) # If the archive already exists in temp (presumably because the previous installation was interrupted), it was already verified and can be reused
with open(tmp_archive, 'wb') as f: if os.path.exists(tmp_archive):
item.bytes_downloaded += os.path.getsize(tmp_archive)
return
# Download the archive
partial_archive = '{}.partial'.format(tmp_archive)
res = self.get_repo_resource(pkg_archive, True)
with open(partial_archive, 'wb') as f:
for chunk in res.iter_content(chunk_size=65536): for chunk in res.iter_content(chunk_size=65536):
if chunk: if chunk:
item.bytes_downloaded += f.write(chunk) item.bytes_downloaded += f.write(chunk)
# Verify hash # Verify hash
crypto.verify_hash(tmp_archive, self.online_packages[name]['sha512']) crypto.verify_hash(partial_archive, self.online_packages[name]['sha512'])
# Remove ".partial" extension
os.rename(partial_archive, tmp_archive)
def unpack_package(self, name): def unpack_package(self, name):
# Unpack archive # Unpack archive
pkg_filename = '{}_{}-{}.tar.xz'.format(name, self.online_packages[name]['version'], self.online_packages[name]['release']) pkg_archive = '{}_{}-{}.tar.xz'.format(name, self.online_packages[name]['version'], self.online_packages[name]['release'])
tmp_archive = os.path.join('/tmp', pkg_filename) tmp_archive = os.path.join('/tmp', pkg_archive)
subprocess.run(['tar', 'xJf', tmp_archive], cwd='/', check=True) subprocess.run(['tar', 'xJf', tmp_archive], cwd='/', check=True)
os.unlink(tmp_archive) os.unlink(tmp_archive)