Files
syly2/ops/uat-deploy/package-mysql.py
T

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))