ha(H1): исправления по ревью — жизненный цикл сессии, самодостаточный wheel

- C1: единственный владелец stop+destroy — reader-поток; close() только
  выставляет флаг и ждёт; повторный close и close из колбэка безопасны
  (регресс-тесты; TSan на close с мёртвым модулем — 0 гонок)
- M1: wheel собирается с bundled mbedtls (нет внешней soname mbedcrypto);
  попутно исправлена bundled-ветка CMake (-lSTATIC)
- C-API: счётчики потерянных событий/логов, лог-кольцо без union-балласта,
  атомарные fn/ctx лог-синка
- provision: валидация формата облачных ответов; CLI: человеческие ошибки
  (exit 2), --out с правами 0600, console_script pyfglair
- упаковка: MANIFEST.in (sdist с C++-исходниками), очистка stale .so,
  readme в метаданных; find_library без ложных .bak
- тесты: close-сценарии, доставка логов, ошибки CLI/provision, C-API очередь
This commit is contained in:
2026-09-29 11:48:32 +03:00
parent 0292404756
commit b84bd8d555
18 changed files with 356 additions and 56 deletions
+10 -7
View File
@@ -15,7 +15,7 @@ import sys
from typing import Any, Optional
from .const import State, Template, ValueKind
from .provision import REGIONS
from .provision import REGIONS, ProvisionError
def _build_parser() -> argparse.ArgumentParser:
@@ -200,13 +200,16 @@ async def _run_monitor(args: argparse.Namespace) -> int:
def main(argv: Optional[list[str]] = None) -> int:
args = _build_parser().parse_args(argv)
if args.command == "discover":
return asyncio.run(_run_discover(args))
if args.command == "monitor":
try:
try:
if args.command == "discover":
return asyncio.run(_run_discover(args))
if args.command == "monitor":
return asyncio.run(_run_monitor(args))
except KeyboardInterrupt:
return 130
except ProvisionError as err:
print(f"pyfglair: {err}", file=sys.stderr)
return 2
except KeyboardInterrupt:
return 130
return 2