27 lines
1.5 KiB
Python
27 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Verify the official archive and transfer only required runtime files."""
|
|
import hashlib,json,re,tarfile
|
|
from pathlib import Path
|
|
root=Path(__file__).resolve().parents[1]/'.local/uat-deploy'
|
|
archive=root/'mysql-5.7.44.tar.gz'
|
|
def hashfile(p, alg):
|
|
h=hashlib.new(alg)
|
|
with p.open('rb') as f:
|
|
for block in iter(lambda:f.read(1024*1024),b''):h.update(block)
|
|
return h.hexdigest()
|
|
expected=re.search(r'\b[0-9a-fA-F]{32}\b',(root/'mysql-5.7.44.tar.gz.md5').read_text()).group().lower()
|
|
assert hashfile(archive,'md5')==expected
|
|
out=root/'mysql-5.7.44-runtime.tar.gz'
|
|
files=[]
|
|
with tarfile.open(archive,'r|gz') as src,tarfile.open(out,'w:gz',compresslevel=6) as dst:
|
|
for m in src:
|
|
rel=m.name.split('/',1)[1] if '/' in m.name else ''
|
|
take=rel in ['bin/mysqld','bin/mysql','bin/mysqladmin','bin/mysqldump'] or rel.startswith(('lib/','share/'))
|
|
if take and '/debug/' not in rel and not rel.endswith('.a'):
|
|
assert '..' not in Path(rel).parts
|
|
dst.addfile(m,src.extractfile(m) if m.isfile() else None)
|
|
files.append({'path':rel,'bytes':m.size})
|
|
manifest={'source_url':'https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz','source_md5_verified':expected,'source_sha256':hashfile(archive,'sha256'),'runtime_sha256':hashfile(out,'sha256'),'runtime_bytes':out.stat().st_size,'files':files}
|
|
(root/'mysql-runtime-manifest.json').write_text(json.dumps(manifest,indent=2))
|
|
print(json.dumps({k:v for k,v in manifest.items() if k!='files'},indent=2))
|