zapret-kvn/scripts/sync_update_core.py
loop-uh 5d8c27cd47
Some checks failed
Windows project source guards / test (push) Has been cancelled
Обновление: архив ставится только по подписанному списку выпуска
Общее ядро zapret_update (байт-в-байт копия из Zapret 2 GUI, переносится
scripts/sync_update_core.py, тест сверяет сумму копии). Программа
проверяет update-manifest.json и подпись ключами kvn-2026a и запасным и
берёт сумму и размер архива только из списка. Сценарий выпуска
подписывает архив, сверяет подпись с ключами программы этого коммита и
выкладывает список вместе с остальными файлами выпуска.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:02:14 +03:00

52 lines
2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Положить в Zapret KVN байт-в-байт копию общего ядра обновления.
Ядро ``zapret_update`` одно на Zapret 2 GUI и Zapret KVN; исходник — в
репозитории Zapret 2 GUI (``public_zapretgui/src/zapret_update``). Править
копию здесь нельзя: ``tests/test_update_core_identity.py`` сверяет её с
суммой ``CORE_SHA256``, которую пересчитывает только исходный репозиторий.
python3 scripts/sync_update_core.py [--source путь/к/zapret_update]
"""
from __future__ import annotations
import argparse
import hashlib
import shutil
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
TARGET = ROOT / "zapret_update"
DEFAULT_SOURCE = Path("/home/codex-pve/zapretgui/public_zapretgui/src/zapret_update")
HASH_FILE = "CORE_SHA256"
def core_hash(directory: Path) -> str:
digest = hashlib.sha256()
for path in sorted(directory.glob("*.py")):
digest.update(path.name.encode("utf-8") + b"\0")
digest.update(path.read_bytes().replace(b"\r\n", b"\n") + b"\0")
return digest.hexdigest()
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
parser.add_argument("--source", type=Path, default=DEFAULT_SOURCE)
args = parser.parse_args(argv)
source = args.source.resolve()
recorded = (source / HASH_FILE).read_text(encoding="ascii").strip()
if core_hash(source) != recorded:
print("В исходном ядре сумма не пересчитана: сначала scripts/update_core_hash.py там", file=sys.stderr)
return 1
if TARGET.exists():
shutil.rmtree(TARGET)
TARGET.mkdir()
for path in sorted(source.glob("*.py")) + [source / HASH_FILE]:
shutil.copyfile(path, TARGET / path.name)
print(f"zapret_update {recorded[:12]} → {TARGET}")
return 0
if __name__ == "__main__":
sys.exit(main())