Make unpacking remove target directory, if it exists from previous failed installation
This commit is contained in:
parent
5f5bad4c20
commit
eeab3cb54c
@ -3,6 +3,7 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import requests
|
import requests
|
||||||
|
import shutil
|
||||||
import tarfile
|
import tarfile
|
||||||
import time
|
import time
|
||||||
from cryptography.exceptions import InvalidSignature
|
from cryptography.exceptions import InvalidSignature
|
||||||
@ -57,9 +58,15 @@ def unpack_archive(archive_path, destination, expected_hash, observer):
|
|||||||
# Verify file object, then seek back and open it as tar without losing handle, preventing possible malicious race conditions
|
# Verify file object, then seek back and open it as tar without losing handle, preventing possible malicious race conditions
|
||||||
verify_fileobj(f, expected_hash)
|
verify_fileobj(f, expected_hash)
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
tar = tarfile.open(fileobj=f)
|
# Remove the target directory, if it exists from previous failed installation
|
||||||
|
dst_dir = os.path.join(destination, os.path.basename(archive_path)[:-7])
|
||||||
|
try:
|
||||||
|
shutil.rmtree(dst_dir)
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
# Extract the tar members while counting their size
|
# Extract the tar members while counting their size
|
||||||
# If this is done as non-root, extractall() from https://github.com/python/cpython/blob/master/Lib/tarfile.py needs to be reimplemented instead
|
# If this is done as non-root, extractall() from https://github.com/python/cpython/blob/master/Lib/tarfile.py needs to be reimplemented instead
|
||||||
|
tar = tarfile.open(fileobj=f)
|
||||||
for tarinfo in tar:
|
for tarinfo in tar:
|
||||||
tar.extract(tarinfo, destination, numeric_owner=True)
|
tar.extract(tarinfo, destination, numeric_owner=True)
|
||||||
observer.units_done += tarinfo.size
|
observer.units_done += tarinfo.size
|
||||||
|
Loading…
Reference in New Issue
Block a user