Some checks failed
Windows project source guards / test (push) Failing after 38s
Запомненный адрес и доверенный путь доходят до всех способов подключения. - Гибридный режим: имя сервера разрешает общий 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>
26 lines
868 B
Python
26 lines
868 B
Python
"""Сообщения, появившиеся до создания окна и ждущие показа пользователю.
|
||
|
||
Синхронизация шаблонов идёт в 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
|