103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
import hashlib
|
|
import os
|
|
from pathlib import Path
|
|
import platform
|
|
import subprocess
|
|
|
|
import requests
|
|
from tqdm import tqdm
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
OFFLINE_ROOT = REPO_ROOT / "offline"
|
|
DOWNLOAD_ROOT = OFFLINE_ROOT / "downloads"
|
|
IMAGE_ROOT = OFFLINE_ROOT / "images"
|
|
|
|
|
|
def ensure_dir(path):
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
return str(path)
|
|
|
|
def get_download_dir():
|
|
return ensure_dir(DOWNLOAD_ROOT)
|
|
|
|
|
|
def get_image_dir():
|
|
return ensure_dir(IMAGE_ROOT)
|
|
|
|
|
|
def file_md5(path, block_size=1024 * 1024):
|
|
hasher = hashlib.md5()
|
|
with open(path, "rb") as handle:
|
|
for chunk in iter(lambda: handle.read(block_size), b""):
|
|
hasher.update(chunk)
|
|
return hasher.hexdigest()
|
|
|
|
|
|
def run(args):
|
|
result = subprocess.run(args=args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
if result.stderr:
|
|
print(result.stderr.decode("utf-8"))
|
|
raise subprocess.CalledProcessError(
|
|
returncode = result.returncode,
|
|
cmd = result.args,
|
|
stderr = result.stderr
|
|
)
|
|
return result
|
|
|
|
|
|
def download_file(url, f_name, timeout=60):
|
|
response = requests.get(url, stream=True, timeout=timeout)
|
|
response.raise_for_status()
|
|
|
|
total_size_in_bytes = int(response.headers.get("content-length", 0))
|
|
block_size = 1024 * 1024
|
|
progress_bar = tqdm(total=total_size_in_bytes, unit="iB", unit_scale=True)
|
|
hasher = hashlib.md5()
|
|
|
|
try:
|
|
with open(f_name, "wb") as file:
|
|
for data in response.iter_content(block_size):
|
|
if not data:
|
|
continue
|
|
progress_bar.update(len(data))
|
|
file.write(data)
|
|
hasher.update(data)
|
|
finally:
|
|
progress_bar.close()
|
|
response.close()
|
|
|
|
if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
|
|
raise ValueError("Something went wrong while downloading")
|
|
return hasher.hexdigest()
|
|
|
|
def host():
|
|
machine = platform.machine().lower()
|
|
|
|
mapping = {
|
|
"i686": ("x86", 32),
|
|
"x86_64": ("x86_64", 64),
|
|
"amd64": ("x86_64", 64),
|
|
"aarch64": ("arm64", 64),
|
|
"armv7l": ("arm", 32),
|
|
"armv8l": ("arm", 32)
|
|
}
|
|
if machine in mapping:
|
|
# if mapping[machine] == "x86_64":
|
|
# with open("/proc/cpuinfo") as f:
|
|
# if "sse4_2" not in f.read():
|
|
# print("x86_64 CPU does not support SSE4.2, falling back to x86...")
|
|
# return ("x86", 32)
|
|
return mapping[machine]
|
|
raise ValueError("platform.machine '" + machine + "'"
|
|
" architecture is not supported")
|
|
|
|
class bcolors:
|
|
RED = '\033[31m'
|
|
YELLOW = '\033[33m'
|
|
GREEN = '\033[32m'
|
|
ENDC = '\033[0m'
|
|
|
|
def print_color(str, color):
|
|
print(color+str+bcolors.ENDC)
|