from pathlib import Path, PurePosixPath
import json,zipfile,hashlib,unicodedata,stat,subprocess,datetime
base=Path('/mnt/data'); out=base/'work490'; report=[]
expected=json.loads((base/'война-4.8.0-wip-проверка-передачи.json').read_text())
for item in expected['архивы']:
 p=base/item['архив']; h=hashlib.file_digest(p.open('rb'),'sha256').hexdigest(); assert h==item['ша256'] and p.stat().st_size==item['байты'],p
 dest=out/'input'/p.stem; seen=set()
 with zipfile.ZipFile(p) as z:
  for i in z.infolist():
   n=i.filename; q=PurePosixPath(n); fold=unicodedata.normalize('NFC',n).casefold()
   assert not q.is_absolute() and '..' not in q.parts and '\\' not in n and str(q)==n and ':' not in q.parts[0] and fold not in seen,n
   assert n==unicodedata.normalize('NFC',n) and not stat.S_ISLNK(i.external_attr>>16),n
   assert not any(ord(c)<32 or 0x7f<=ord(c)<0xa0 or 0x202a<=ord(c)<=0x202e or 0x2066<=ord(c)<=0x2069 for c in n),n
   seen.add(fold)
   with z.open(i) as f:
    while f.read(1024*1024): pass
  z.extractall(dest)
 r=subprocess.run(['python',str(dest/'ПРОВЕРИТЬ-ПОДПИСЬ.py')],capture_output=True,text=True)
 row={'архив':p.name,'байты':p.stat().st_size,'ша256':h,'CRC':True,'безопасные_пути':True,'файлов':len(seen),'команда':['python',str(dest/'ПРОВЕРИТЬ-ПОДПИСЬ.py')],'код':r.returncode,'результат':r.stdout,'ошибка':r.stderr}
 report.append(row); print(p.name, 'OK' if r.returncode==0 else r.stdout,flush=True); assert r.returncode==0
(out/'run/входные-архивы.json').write_text(json.dumps({'дата':datetime.datetime.now(datetime.timezone.utc).isoformat(),'архивы':report},ensure_ascii=False,indent=2))
