|
| 1 | +import sys |
| 2 | +import requests |
| 3 | +from tools import * |
| 4 | +from typing import Optional |
| 5 | +# from rich.progress import Progress, TaskID |
| 6 | + |
| 7 | + |
| 8 | +saved_hash = get_saved_hash() |
| 9 | +saved_hash_whl = set(saved_hash.keys()) |
| 10 | +pkgs = get_assets_from_html() |
| 11 | +pkg_urls = {pkg['name']: pkg['url'] for pkg in pkgs} |
| 12 | +pkg_names = set(pkg_urls.keys()) |
| 13 | + |
| 14 | + |
| 15 | +def get_pkg_hash( |
| 16 | + filename: str, |
| 17 | + pbar: tqdm, |
| 18 | + # progress: Progress, task: TaskID |
| 19 | +) -> tuple[Optional[str], bool]: |
| 20 | + """ |
| 21 | + sha256sum, verified |
| 22 | + """ |
| 23 | + if filename in saved_hash_whl: |
| 24 | + return saved_hash[filename]['sha256'], saved_hash[filename]['verify'] |
| 25 | + |
| 26 | + # pkg_url = pkg_urls.get(filename) |
| 27 | + # if not pkg_url: |
| 28 | + # return None, False |
| 29 | + # do an assertion |
| 30 | + pkg_url = pkg_urls[filename] |
| 31 | + pkg_url_split = pkg_url.split('#sha256=') |
| 32 | + if len(pkg_url_split) != 2: |
| 33 | + return None, False |
| 34 | + |
| 35 | + saved_hash[filename] = {'sha256': pkg_url_split[1], 'verify': False} |
| 36 | + pbar.set_description(f'{filename[:32]:<32} added to saved_hash') |
| 37 | + # progress.update(task, description=f'{filename[:32]:<32} added to saved_hash') |
| 38 | + return pkg_url_split[1], False |
| 39 | + |
| 40 | + |
| 41 | +# https://gist.github.com/yanqd0/c13ed29e29432e3cf3e7c38467f42f51 |
| 42 | +def download( |
| 43 | + url: str, |
| 44 | + # progress: Progress |
| 45 | +) -> bytes: |
| 46 | + r = requests.get(url, stream=True) |
| 47 | + content = b'' |
| 48 | + total = int(r.headers.get('content-length', 0)) |
| 49 | + |
| 50 | + # dl_task = progress.add_task( |
| 51 | + # '\tDownloading...', |
| 52 | + # total=total |
| 53 | + # ) |
| 54 | + |
| 55 | + with tqdm( |
| 56 | + desc=' DL: ' + '{:<32}'.format(url.split('/')[-1].split('#')[0][:32]), |
| 57 | + total=total, |
| 58 | + unit='iB', |
| 59 | + unit_scale=True, |
| 60 | + unit_divisor=1024, |
| 61 | + file=sys.stdout, |
| 62 | + ) as bar: |
| 63 | + for data in r.iter_content(chunk_size=1024 * 64): |
| 64 | + content += data |
| 65 | + size = len(data) |
| 66 | + # progress.update(dl_task, advance=size) |
| 67 | + bar.update(size) |
| 68 | + # bar.refresh() |
| 69 | + # progress.update(dl_task, completed=True) |
| 70 | + # progress.remove_task(dl_task) |
| 71 | + return content |
| 72 | + |
| 73 | + |
| 74 | +def check_remote_hash( |
| 75 | + url: str, |
| 76 | + # progress: Progress |
| 77 | +): |
| 78 | + cdn_url = f'https://gh.kmtea.eu/{url}' |
| 79 | + # r = requests.get(cdn_url) |
| 80 | + # assert r.status_code == 200, f'{cdn_url} failed ({r.status_code})!' |
| 81 | + # sha256_digest = hashlib.sha256(r.content).hexdigest() |
| 82 | + sha256_digest = hashlib.sha256(download(cdn_url)).hexdigest() |
| 83 | + # sha256_digest = hashlib.sha256(download(cdn_url, progress)).hexdigest() |
| 84 | + return sha256_digest |
| 85 | + |
| 86 | + |
| 87 | +def main(): |
| 88 | + print('\nChecking sha256sum...\n') |
| 89 | + |
| 90 | + pbar = tqdm(pkg_names, file=sys.stdout) |
| 91 | + # with Progress() as progress: |
| 92 | + # progress = Progress() |
| 93 | + # progress.start() |
| 94 | + |
| 95 | + # main_task = progress.add_task('Checking sha256sum...', total=len(pkg_names)) |
| 96 | + i = 0 |
| 97 | + # for pkg in pkg_names: |
| 98 | + for pkg in pbar: |
| 99 | + pbar.set_description(f'Now: {pkg[:48]:<48}') |
| 100 | + # progress.update(main_task, description=f'Now: {pkg[:48]:<48}') |
| 101 | + |
| 102 | + # pkg_sha256, pkg_verified = get_pkg_hash(pkg, progress, main_task) |
| 103 | + pkg_sha256, pkg_verified = get_pkg_hash(pkg, pbar) |
| 104 | + if pkg_verified: |
| 105 | + # progress.update(main_task, advance=1) |
| 106 | + continue |
| 107 | + |
| 108 | + # remote_sha256 = check_remote_hash(pkg_urls[pkg], progress) |
| 109 | + remote_sha256 = check_remote_hash(pkg_urls[pkg]) |
| 110 | + if pkg_sha256: |
| 111 | + # has hash in url, verify it |
| 112 | + if pkg_sha256 == remote_sha256: |
| 113 | + pbar.set_description(f'{pkg[:48]:<48} verified!') |
| 114 | + # progress.update(main_task, description=f'{pkg[:48]:<48} verified!') |
| 115 | + else: |
| 116 | + msg = f'\n{pkg[:48]:<48} sha256sum not match!!!\n' |
| 117 | + pbar.write(msg) |
| 118 | + pbar.set_description(msg) |
| 119 | + # progress.update(main_task, description=msg) |
| 120 | + saved_hash[pkg]['sha256'] = remote_sha256 |
| 121 | + else: |
| 122 | + # no hash in url |
| 123 | + saved_hash[pkg] = { |
| 124 | + 'sha256': remote_sha256 |
| 125 | + } |
| 126 | + msg = f' {pkg[:48]:<48} added to saved_hash' |
| 127 | + # pbar.write(msg) |
| 128 | + pbar.set_description(msg) |
| 129 | + # progress.update(main_task, description=msg) |
| 130 | + |
| 131 | + # progress.update(main_task, advance=1) |
| 132 | + saved_hash[pkg]['verify'] = True |
| 133 | + |
| 134 | + # if pbar.n % 100 == 0: |
| 135 | + # may be skipped |
| 136 | + i += 1 |
| 137 | + if i % 2 == 0: |
| 138 | + # print(f'Saving hash at {i}.') |
| 139 | + pbar.write(f'\nSaving hash at {pbar.n}.\n') |
| 140 | + save_hash(saved_hash) |
| 141 | + else: |
| 142 | + pbar.set_description(f'{2 - i % 2} left to save hash') |
| 143 | + |
| 144 | + # progress.stop() |
| 145 | + return saved_hash |
| 146 | + |
| 147 | + |
| 148 | +if __name__ == '__main__': |
| 149 | + save_hash(main()) |
0 commit comments