Aggiunta correzioni per verificare il MIME-type dei file downloadati.
This commit is contained in:
parent
cc10bff939
commit
ab26e0aa32
|
@ -15,10 +15,11 @@ license = "MIT"
|
||||||
requires-python = ">= 3.6"
|
requires-python = ">= 3.6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"click",
|
"click",
|
||||||
|
"lddcollect",
|
||||||
"lxml",
|
"lxml",
|
||||||
|
"python-magic",
|
||||||
"pyyaml",
|
"pyyaml",
|
||||||
"requests",
|
"requests"
|
||||||
"lddcollect"
|
|
||||||
]
|
]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Development Status :: 5 - Production/Stable",
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"""Classes and functions to build an AppImage."""
|
"""Classes and functions to build an AppImage."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import datetime
|
||||||
import glob
|
import glob
|
||||||
import subprocess
|
import subprocess
|
||||||
import shutil
|
import shutil
|
||||||
|
@ -11,6 +12,7 @@ import shlex
|
||||||
import tempfile
|
import tempfile
|
||||||
import hashlib
|
import hashlib
|
||||||
import requests
|
import requests
|
||||||
|
import magic
|
||||||
import loaih
|
import loaih
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +29,7 @@ class Collection(list):
|
||||||
arch = [ x for x in arch if version.urls[x] != '-' ]
|
arch = [ x for x in arch if version.urls[x] != '-' ]
|
||||||
self.extend([ Build(version, ar) for ar in arch ])
|
self.extend([ Build(version, ar) for ar in arch ])
|
||||||
|
|
||||||
|
class BuildException(Exception): pass
|
||||||
|
|
||||||
class Build():
|
class Build():
|
||||||
"""Builds a single version."""
|
"""Builds a single version."""
|
||||||
|
@ -237,7 +240,7 @@ class Build():
|
||||||
|
|
||||||
# Download the archive
|
# Download the archive
|
||||||
try:
|
try:
|
||||||
self.__download_archive__(archive)
|
self.__download_archive_debug__(archive)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f"Failed to download {archive}: {error}.")
|
print(f"Failed to download {archive}: {error}.")
|
||||||
|
|
||||||
|
@ -453,9 +456,33 @@ class Build():
|
||||||
with open(f"{file}.md5", 'w', encoding='utf-8') as checkfile:
|
with open(f"{file}.md5", 'w', encoding='utf-8') as checkfile:
|
||||||
checkfile.write(f"{retval.hexdigest()} {os.path.basename(file)}")
|
checkfile.write(f"{retval.hexdigest()} {os.path.basename(file)}")
|
||||||
|
|
||||||
def __download_archive__(self, archive):
|
def __download_archive__(self, archive) -> str:
|
||||||
return self.__download__(self.url, archive)
|
return self.__download__(self.url, archive)
|
||||||
|
|
||||||
|
def __download_archive_debug__(self, archive) -> str:
|
||||||
|
"""Analyses the downloaded archive to prevent issues with unpacking."""
|
||||||
|
break_control = 0
|
||||||
|
testedfilename = ""
|
||||||
|
while break_control <= 5:
|
||||||
|
timenow = datetime.datetime.now()
|
||||||
|
testedfilename, resource = self.__download_debug__(self.url, archive)
|
||||||
|
mime = magic.Magic(mime=True)
|
||||||
|
mimetype = mime.from_file(testedfilename)
|
||||||
|
if mimetype == 'application/gzip':
|
||||||
|
return testedfilename
|
||||||
|
|
||||||
|
# On the contrary, we will dump a logfile, remove the download and
|
||||||
|
# redo the download.
|
||||||
|
with open(os.path.join(self.downloadpath, 'downloadfailure.log'), 'wa') as logfile:
|
||||||
|
logfile.write(f"{timenow.isoformat()};{resource.url};{mimetype}")
|
||||||
|
|
||||||
|
file.unlink(testedfilename)
|
||||||
|
break_control += 1
|
||||||
|
|
||||||
|
# If it arrives here, 5 attempts to download the archive have failed.
|
||||||
|
raise BuildException(f"All downloads failed for {archive}. Exiting.")
|
||||||
|
|
||||||
|
|
||||||
def __download__(self, url: str, filename: str):
|
def __download__(self, url: str, filename: str):
|
||||||
basename = filename
|
basename = filename
|
||||||
if '/' in filename:
|
if '/' in filename:
|
||||||
|
@ -473,6 +500,23 @@ class Build():
|
||||||
file.write(chunk)
|
file.write(chunk)
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
|
def __download_debug__(self, url: str, filename: str) -> (str, requests.Response):
|
||||||
|
basename = filename
|
||||||
|
if '/' in filename:
|
||||||
|
basename = filename.split('/')[-1]
|
||||||
|
|
||||||
|
full_url = url
|
||||||
|
if url.endswith('/'):
|
||||||
|
# URL has to be completed with basename of filename
|
||||||
|
full_url = url + basename
|
||||||
|
|
||||||
|
with requests.get(full_url, stream=True, timeout=10) as resource:
|
||||||
|
resource.raise_for_status()
|
||||||
|
with open(filename, 'wb') as file:
|
||||||
|
for chunk in resource.iter_content(chunk_size=8192):
|
||||||
|
file.write(chunk)
|
||||||
|
return (filename, resource)
|
||||||
|
|
||||||
def __select_tarballs__(self):
|
def __select_tarballs__(self):
|
||||||
retval = [ self.tarballs[0] ]
|
retval = [ self.tarballs[0] ]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue