UPD. Погонял ИИ ещё по кругу, накопилось достаточно изменений.
Что поменялось:
Безопасность, много чего пофикшено
Стабильность
Вынес всю логику в lib.php, чтобы веб-интерфейс и крон-скрипты не расходились между собой (up дублировался код, где-то уже начало отличаться);
Добавил busyTimeout на SQLite - крон и веб могли одновременно писать в базу и получать "database is locked";
PHP warning/notice больше не ломает JSON-ответ на фронте (было такое - падало с "Unexpected token '<'" если DNS резолв где-то споткнулся);
Убрал filter_var() - на минимальных сборках PHP для Entware этого расширения может не быть, падало с "undefined function".
Функционал
Теперь можно добавлять не только домен, а ещё голый IP или CIDR (10.0.0.0/24) - если это IP/подсеть, DNS не резолвится, оно сразу идёт в таблицу маршрутизации как есть;
Кнопки переделал: Sync policies / Check & apply (резолв + применение одним кликом, то же что крон делает) / Apply routes (на всякий случай, без резолва, просто переприменить то что есть в базе);
Уведомления по-человечески - тосты с реальными цифрами (сколько политик добавилось/обновилось, сколько маршрутов применилось), вместо системных alert/confirm.
Морда
Перерисовал полностью - тёмная тема, статусы доменов через LED-индикаторы (как на самом кинетике), стало гораздо контрастнее. Заодно починил вёрстку под телефон - раньше на мобиле всё в кашу превращалось, теперь нормальные карточки, и в ландшафтной ориентации таблица не обрезается за край экрана.
В архиве теперь ещё и README с шагами установки и отдельно config.example.php - переименуйте в config.php и впишите свой пароль, реальный конфиг с паролем я из архива убрал, чтоб случайно не расшарить.
Как и в прошлый раз - тестил только на своей связке, глюки не исключены, если что не заводится - пишите, разберёмся.
keenetic-dns-router.zip