Skip to content

Commit 83a71c4

Browse files
committed
check hash of all uploads
1 parent 8e7e98f commit 83a71c4

File tree

4 files changed

+2059
-1908
lines changed

4 files changed

+2059
-1908
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ This project contains wheels from:
4343

4444
* [pypy-wheels](https://github.com/KumaTea/pypy-wheels)
4545
* [riscv-wheels](https://github.com/KumaTea/riscv-wheels)
46+
* [musl-wheels](https://github.com/KumaTea/musl-wheels)

src/check_hash.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
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())

src/tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def check_dup(assets: list):
4545

4646
def get_assets(saved_hash: dict):
4747
assets = []
48-
releases = os.listdir(f'{WORKDIR}/whl/data')
48+
releases = [file for file in os.listdir(f'{WORKDIR}/whl/data') if file.endswith('json')]
4949
if 'sha256sums.json' in releases:
5050
releases.remove('sha256sums.json')
5151

0 commit comments

Comments
 (0)