Весь разговор с ядром steer — в одном блоке функций stl_* (слой steer):
бекенд отдаёт ему свою модель (выход WARP или VPN, сервисы и их списки,
подписка с узлом и маркерами) и спрашивает состояние на своём языке, а слой
пишет спеку v2 в /etc/steer/spec.json и зовёт клиент steer, который отдаёт
команды демону steerd.
- Ядро: steer-core и только нужные модули (VLESS — когда есть подписка)
вместо steer-extended; версия — stable 2.x из splify2/releases
(version.json, с проверкой sha256), не ниже 2.0.0. Переход с 1.x:
apk — одной транзакцией, opkg — снятием прежнего пакета; спека остаётся.
Удаляются только пакеты, которые ставил Zapret Manager.
- Применение: проверка демоном (ctl check), затем steer apply через демона —
он сам трогает только изменившееся. Убраны костыли 1.5.9: srs-read и
перевод .srs в текст, сумма спеки и сверка outputs, выбор между reload и
restart, перезапуск при fail-open, kmod-tun руками, чтение набора nft.
- WARP — группа pick: latency из туннелей (один туннель — выход-устройство),
без IPv6, как и прежде. VPN — tunnel vless: маркеры узлов уходят в
exclude_name, скрытые и закреплённый узел — в nodes без предела 16.
- Состояние — из steer status (failed, device, probe), diag и explain — через
слой. Блокер: ядро ведёт steer-box-connector (podkop, forkop) или чужая
спека v1/v2/yaml.
- Прежняя спека ZM (v1) ядро 2.0 читает как есть; при первом применении
слой пишет её заново в v2. Автоперезапуск по cron и обновление панели
идут через backend.sh.
- Фронтенд: три подсказки про steer-extended переписаны под ядро 2.0.
- docs/autobypass: перестановка туннелей рвёт соединения сменой туннеля, а
не перезапуском ядра.
Committed-by: agy-cli (autonomous, run #96)