Новые опции config schedule:
- blocked_domains: домены для блокировки (full:/keyword:/regex: префиксы)
- mode: block (список) | allow (whitelist — всё кроме списка)
- dns_level: блокировка на DNS-уровне (NXDOMAIN через dns-block-in)
- notify: уведомление в Telegram при попытке доступа
Механизм:
- sing-box: новый dns-block-in inbound (127.0.0.43:1053) с reject-правилами
для заблокированных доменов; source_ip_cidr для IP-устройств;
invert для whitelist-режима
- nftables: nat chain dns_block — REDIRECT DNS-запросов устройств на
dns-block-in; time-based через meta hour для расписаний; MAC-устройства
матчатся по ether saddr (DHCP-динамические IP поддерживаются)
- route rules reject для always-on расписаний (fallback при обходе DNS)
- telegram worker: проверка nft counters каждые 60s, уведомление о
заблокированной активности
UI (parental.js):
- колонка Blocked Sites в таблице
- textarea с пресетами: соцсети, видео, игры, взрослый контент,
мессенджеры, магазины
- mode / dns_level / notify переключатели
Валидация: домены, mode, dns_level, notify в validator.uc
Тесты: tests/content_blocking.sh (98/98 backend, 522/522 frontend)
Backend: telegram_diagnose returns JSON with 8 checks (token, admin_ids,
sing-box, port, DNS with FakeIP support, direct API, proxy API, send
test message). Registered in CLI dispatcher.
Frontend: Test Connection button in Telegram settings calls
telegram_diagnose and renders results with check/cross icons.
DNS check accepts sing-box FakeIP range (198.18.x.x/198.19.x.x).
The progress modal faked its steps on a timer because the worker only wrote to syslog. Now every updates_log line is appended to <job>.log (UPDATES_JOB_LOG), the running state advertises log_path, the log survives job completion until the TTL sweep, and the new component_action_log CLI mode serves it from a byte offset. The UI polls it into a monospace panel with auto-scroll, exposes a Copy log button, and the modal cannot be closed while the job runs (only the disabled progress button is shown).
- get_proxy_args() теперь поддерживает опцию UCI bot_proxy_section:
если sing-box запущен и секция указана, переключает GLOBAL outbound через REST API
- Исправлен краш 'left-hand side expression is null' при обработке
callback_query без поля from (например channel_post callbacks)
- В LuCI settings.js добавлен ListValue 'bot_proxy_section' с выпадающим
списком активных секций (паттерн аналогичен download_via_proxy_section)
- Локализация: ru/tachyon.po и templates/tachyon.pot синхронизированы
- Пересборка main.js через npm run build
opkg считает пакет уже установленным при равенстве версий, поэтому
пересборка под тем же тегом молча не применялась: задание завершалось
успехом, билд оставался старым. Добавлен --force-reinstall в
pkg_install_files_command (opkg) и в install.sh; apk не тронут, он
всегда пишет переданный файл.
Детект пересборки больше не зависит только от SHA, которого нет в
релизах старше f974e4a0: добавлен отпечаток билда по published_at и
метаданным ipk-ассета, решение вынесено в tachyon_build_differs с
префиксным сравнением SHA разной длины. Отпечаток установленного
билда пишется в state-файл и попадает в extra.
Telegram уведомляет о пересборках: check_notified_updates пропускает
outdated_same_release, дедуп идёт по версии и SHA, текст показывает
короткие SHA вместо пары одинаковых версий.
Кэш проверки обновлений сохраняет current_sha из результата действия
вместо безусловного latest, иначе неудачная установка выглядела как
"актуально".
Фронт пересобран из TS, ручная правка main.js снята. Добавлен
describeSameReleaseBuild с фолбэк-текстом, когда SHA недоступен.
Дашборд:
- Добавлены карточки статуса Zapret, Zapret2, ByeDpi на панель мониторинга
- Показывают статус (работает/остановлен), количество перезапусков, предупреждения
- Баг: API возвращает boolean а не число — исправлено сравнение
Секция Hosts:
- Перенесены опции hosts из глобальных настроек в отдельный тип секции (action=hosts)
- Опции: пользовательские DNS записи, удалённые списки хостов, автообновление, интервал
- Миграция: автоматический перенос глобальных настроек hosts в секцию
- Вкладка «Условия» скрыта для секций типа Hosts (hosts записи применяются глобально)
- Возвращена кнопка «Import Hosts File» с модальным окном загрузки из файла
- Убраны неиспользуемые опции из settings.js (~280 строк)
Локализация:
- Переведены 6 новых строк для превью импорта hosts
Backend:
- constants.uc: add TACHYON_COMMIT_SHA constant (placeholder __COMPILED_COMMIT_SHA__)
- build.sh: capture git rev-parse HEAD and sed-replace commit SHA placeholder
- Makefile: same commit SHA sed replacement for OpenWrt builds
- action.uc: modify check_tachyon() to compare installed commit SHA with
target_commitish from GitHub release, new status 'outdated_same_release'
- action.uc: reuse release_json for both version and commit SHA extraction
- updater.uc: add release_commit_sha helper to extract target_commitish
- updates.uc: extend cacheable status to include outdated_same_release
Frontend:
- main.js: handle outdated_same_release status in renderComponentCard
- main.js: include outdated_same_release in shouldShowInstallAfterCheck
- main.js: include outdated_same_release in applyCachedCheckResults
i18n:
- Add 'Update is available for current release' and 'Update is available
for current release:' to .pot and .ru.po files
78 tests pass.
- Both ru po files now byte-for-byte identical (cmp -s passes)
- Fixed Unicode corruption: u0411... literals replaced with actual UTF-8
- Unified description msgid between settings.js (LuCI) and fe-app
- Added Enable DNS Turbo Cache + Saving ellipsis entries to both files
- Updated pot files to match new description string
- Дашборд: Добавлена таблица 'Активные клиенты' с отображением имен устройств, IP, соединений и трафика.
- Дашборд: Исправлена ширина интерфейса при свернутом блоке подписки.
- Дашборд: В заголовке свернутой подписки теперь отображается пинг выбранного сервера.
- Дашборд: Для AWG и VPN соединений в таблице отображается пинг вместо статуса 'Connected'.
- Диагностика: Исправлена кнопка генерации отчета об ошибках (bugreport) и добавлена маскировка приватных данных.
- Локализация: Обновлены файлы переводов .po, исправлен парсинг кавычек в генераторе.
- 'Domain and IP lists' → 'Списки доменов и IP'
- '.lst lists containing domains and subnets' → 'с доменами и подсетями'
- '.lst lists containing domains. IP entries are ignored' → 'IP игнорируются'
- '.srs/.json lists. Subnets are ignored by default' → 'Подсети по умолчанию игнорируются'