zapret-kvn/xray_fluent/application/startup_notices.py
loop-uh bdb3169961
Some checks failed
Windows project source guards / test (push) Failing after 38s
DNS: доверенный адрес сервера для гибридного режима и WG/AWG, диагностика подмены
Запомненный адрес и доверенный путь доходят до всех способов подключения.

- Гибридный режим: имя сервера разрешает общий outbound direct, чей резолвер
  менять нельзя. Для имён с запомненным адресом перед app-правилом
  protect-inbound ставится app-правило resolve с цепочкой direct-doh ->
  запомненный адрес. Проверено на закреплённом ядре: при недостижимом DoH
  соединение проходит с правилом и не проходит без него.
- WireGuard/AmneziaWG: имя пира разрешается до запуска ядра доверенным путём,
  ядро получает адрес и не ходит открытым запросом к DNS адаптера. При неудаче
  имя остаётся, прежняя попытка ядра сохраняется.
- Диагностика: предупреждение при переходе на запомненный адрес; один раз за
  сеанс — сообщение, что системный DNS отрицает существующее имя сервера;
  после обновления — подсказка тем, у кого раздел dns изменён вручную и
  поэтому новая версия раздела не применена. Сам раздел не переписывается.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 01:56:33 +03:00

26 lines
868 B
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.

"""Сообщения, появившиеся до создания окна и ждущие показа пользователю.
Синхронизация шаблонов идёт в bootstrap, когда интерфейса ещё нет. То, что
пользователю нужно узнать о её итогах, складывается сюда и показывается
главным окном один раз после запуска.
"""
from __future__ import annotations
import threading
_lock = threading.Lock()
_pending: list[tuple[str, str]] = []
def add(level: str, message: str) -> None:
with _lock:
if (level, message) not in _pending:
_pending.append((level, message))
def drain() -> list[tuple[str, str]]:
with _lock:
notices = list(_pending)
_pending.clear()
return notices