Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/workflows/luci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: LuCI Studio
on:
push:
paths: ['luci/**', '.github/workflows/luci.yml']
pull_request:
paths: ['luci/**', '.github/workflows/luci.yml']
workflow_dispatch:
permissions:
contents: read
jobs:
test-and-package:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install browser test dependencies
run: |
python -m pip install playwright==1.55.0
python -m playwright install --with-deps chromium
- name: Check syntax and package metadata
run: |
for file in $(find luci -name '*.js'); do node --check "$file"; done
for file in $(find luci -type f -path '*/root/*' ! -name '*.json' ! -path '*/etc/config/*'); do sh -n "$file"; done
python -c 'import json,pathlib; [json.loads(p.read_text()) for p in pathlib.Path("luci").rglob("*.json")]'
- name: Check backend, watchdog and browser contracts
run: |
python luci/tests/backend.py
python luci/tests/sentinel.py
python luci/tests/theme_restore.py
python luci/tests/browser.py
- name: Build candidate IPK and source archive
run: python luci/scripts/build.py
- uses: actions/upload-artifact@v4
with:
name: OpenWrtStudio-LuCI-v1.0.0-rc1
path: |
luci/dist/*
luci/artifacts/*.png
luci/README.md
luci/RELEASE_NOTES.md
3 changes: 3 additions & 0 deletions luci/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dist/
artifacts/
__pycache__/
125 changes: 125 additions & 0 deletions luci/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
# OpenWrt Studio для LuCI — 1.0.0-rc1

Тема оформления роутера и приложение-компаньон. Работают непосредственно на OpenWrt через сессию LuCI: Windows, .NET, SSH-профили и внешний сервер для этого не нужны.

Это **кандидат для проверки**, а не подтверждённый на оборудовании стабильный выпуск и не полный перенос настольного приложения. Оформление использует Bootstrap из LuCI OpenWrt 24.10, commit `0e6537981036ea221a73e497920192179e9f74c3`, Apache-2.0. Footstrap изучался как пример; его код не копировался. Код приложения Studio — MIT.

## Что работает

| Возможность Studio | Реализация LuCI |
| --- | --- |
| Обзор, память, загрузка, overlay, uptime | Собственные карточки, RPC-опрос каждые 25 секунд, очистка при ошибке связи |
| Отчёт для поддержки | Экспорт модели, прошивки и ресурсов; без профилей, адресов клиентов, hostname, паролей и ключей |
| Клиенты | IPv4 DHCP-аренды; статические адреса и ограничения — через штатные формы DHCP/Firewall |
| Карта VPN и сервисов | Наличие init-скрипта и статус служб, запуск/остановка/перезапуск после подтверждения |
| Диагностика | WAN, ICMP, локальный/публичный DNS, интерфейсы и маршруты; журналы и nftables — через штатные страницы |
| Sentinel | Ручная диагностика и отдельный фоновый демон: классификация локального DNS, WAN, внешней сети и остановленного прокси; восстановление DNS/выбранного ядра после повторных сбоев с паузой |
| Mihomo | HTTPS-подписка, два пресета, редактирование JSON/YAML, проверка ядром, резервная копия, применение |
| Wi-Fi, WAN/LAN, DHCP, проброс портов, hostname, пароль, backup | Штатные конфигураторы LuCI в оформлении Studio |
| WireGuard / AmneziaWG | Импорт .conf с DNS, несколькими peer, IPv6 endpoint и параметрами обфускации; отложенные изменения UCI и штатная форма интерфейсов |
| Sing-box | Генератор VLESS Reality, Hysteria 2 и TUIC с TUN; проверка ядром перед заменой файла |
| OpenVPN | Импорт клиентского .ovpn со встроенными сертификатами и ключами, создание секции UCI и запуск |
| Tailscale / ZeroTier | Auth key, Exit Node, анонс подсетей и принятие маршрутов Tailscale; вступление в сеть ZeroTier |
| PassWall 2 и другие службы | Запуск/остановка/перезапуск; настройка через дополнительно установленные LuCI-модули |
| Планировщик | Системный редактор cron и примеры расписаний |
| Пакеты / ForkOP | Системный каталог, предложение адреса ForkOP по архитектуре, штатный редактор источников |
| USB | Штатная страница точек монтирования при наличии `luci-app-mount` |

Не перенесены: расширенные экраны узлов/задержек ForkOP, точное воспроизведение всех правил настольного Mihomo, конфигуратор Argon и собственный редактор USB. Эти настройки можно выполнять через дополнительные LuCI-модули. Трей Windows и SSH-профили не имеют прямого аналога в интерфейсе на самом роутере. Ссылки на необязательные LuCI-модули могут вести на отсутствующую страницу, пока модуль не установлен. Новость должна называть этот выпуск кандидатом и перечислять его фактические возможности.

## VPN и Sentinel

В разделе «Конструкторы VPN» импорт `.conf` не перезаписывает существующий интерфейс. После импорта проверьте зону брандмауэра и маршрутизацию в штатной форме LuCI и примените изменения с откатом. Требуется установленный протокол WireGuard/AmneziaWG; неизвестные параметры файла отклоняются.

Для Sing-box используется `/etc/sing-box/config.json`, проверка `sing-box check -c`, резервная копия `config.json.studio-backup` и служба `/etc/init.d/sing-box`. Генератор создаёт современный TUN-конфиг; его совместимость проверяет установленное ядро. Настройка DNS и дополнительных правил остаётся доступной в редакторе JSON.

OpenVPN сохраняется в `/etc/openvpn/studio.conf` и секции `openvpn.studio`. Поддерживаются клиентские профили со встроенным ключевым материалом. Внешние файлы, сценарии, плагины и неизвестные директивы отклоняются. Эта проверка не подтверждает доступность VPN-сервера. Профили с логином/паролем и отдельными сертификатами настраивайте в `luci-app-openvpn`.

Tailscale передаёт ключ через временный файл с правами 0600 и удаляет его после команды. Анонсы подсетей/Exit Node требуют разрешения администратора tailnet. Участник ZeroTier должен быть разрешён в контроллере сети.

Sentinel **выключен по умолчанию**. Настройки хранятся в `/etc/config/studio`, журнал доступен через `logread -e studio-sentinel`. Он проверяет ICMP и DNS каждые 60 секунд, по умолчанию ждёт 3 последовательных сбоя и 300 секунд между восстановлениями. Сбой WAN/внешней сети сам по себе не вызывает перезапуск всей сети. Автовосстановление ограничено dnsmasq и явно выбранным ядром прокси.

Горячие клавиши темы: Ctrl+1 — обзор, Ctrl+2 — клиенты, Ctrl+3 — диагностика, Ctrl+, — инструменты. Кнопка ◐ переключает светлую/тёмную палитру и запоминает выбор в браузере.

## Установка на OpenWrt 24.10 с opkg

Пакеты не устанавливались на реальный роутер в рамках этой работы. Сначала проверьте на тестовом устройстве с резервной копией и доступом по SSH. IPK рассчитаны на современные ucode-шаблоны LuCI OpenWrt 24.10. Для старого Lua LuCI и apk-прошивок эти IPK не предназначены.

Скопируйте оба IPK и SHA256SUMS.txt из `dist/` на роутер, затем:

```sh
cd /tmp/studio-release
sha256sum -c SHA256SUMS.txt --ignore-missing
opkg update
opkg install ./luci-theme-studio_1.0.0~rc1-1_all.ipk ./luci-app-studio_1.0.0~rc1-1_all.ipk
/etc/init.d/rpcd restart
```

Если BusyBox `sha256sum` не поддерживает `--ignore-missing`, сравните `sha256sum *.ipk` с соответствующими строками SHA256SUMS.txt.

Откройте **Система → Система → Язык и стиль**, выберите **OpenWrtStudio**, примените изменения и обновите страницу браузера. Установка регистрирует тему, но не переключает её принудительно. Раздел **OpenWrt Studio** появляется в основном меню. При необходимости:

```sh
uci set luci.main.mediaurlbase='/luci-static/studio'
uci commit luci
```

Тема поддерживает светлую и тёмную палитры по настройке браузера/ОС. Приложение работает и с другой темой, но карточки Studio оформляются при выборе темы Studio.

## Mihomo

Поддерживается служба `/etc/init.d/mihomo`, использующая `/etc/mihomo/config.yaml`. Для OpenClash и других схем запуска автоматическое применение не предназначено. Нужны установленное ядро Mihomo, поддержка TUN и геобазы для соответствующих правил. Подписка должна возвращать узлы в формате Mihomo, не base64-список URI.

Перед заменой конфигурация проверяется `mihomo -t`; предыдущий файл копируется в `/etc/mihomo/config.yaml.studio-backup`. Файлы с подпиской создаются с правами 0600. Пресет «RU напрямую» отправляет остальной внешний трафик в прокси и не обещает точный список заблокированных сайтов. Генератор не публикует контроллер Mihomo в LAN.

Восстановление прежнего файла по SSH:

```sh
cp /etc/mihomo/config.yaml.studio-backup /etc/mihomo/config.yaml
/etc/init.d/mihomo restart
```

## Права

Чтение ресурсов разрешено ACL `luci-app-studio`. Запись отделена от чтения: только перечисленные действия над перечисленными сервисами, сохранение VPN в фиксированные пути и подключение mesh VPN. Импорт WireGuard требует права чтения/записи UCI network; настройки Sentinel — UCI studio. RPC не принимает произвольные команды или пути. Стандартные формы настроек используют собственные ACL LuCI. Наличие init-скрипта показывает наличие службы, а не полную совместимость протокола с прошивкой.

## Сборка и проверка

```sh
python3 luci/scripts/build.py
python3 luci/tests/backend.py
python3 luci/tests/sentinel.py
python3 luci/tests/theme_restore.py
python3 luci/tests/browser.py
```

Сборка IPK использует Python 3 без сторонних библиотек. Тест обработчика требует `jq`; браузерный тест требует Python Playwright и Chromium в `/usr/bin/chromium`. Тесты используют фиктивные RPC-ответы и изолированные заглушки команд OpenWrt. Они не проверяют реальный rpcd/jshn, установку opkg, ucode-рендеринг и маршрутизацию на устройстве.

Для сборки штатными средствами OpenWrt SDK с установленным feeds/luci скопируйте `luci-theme-studio` и `luci-app-studio` в каталог `package/`, затем:

```sh
make defconfig
make package/luci-theme-studio/compile V=s
make package/luci-app-studio/compile V=s
```

## Проверка на роутере с возвратом прежней темы

После копирования IPK на тестовый OpenWrt 24.10 можно выполнить:

```sh
sh smoke-router.sh /tmp/luci-theme-studio_1.0.0~rc1-1_all.ipk /tmp/luci-app-studio_1.0.0~rc1-1_all.ipk
```

Сценарий `scripts/smoke-router.sh` проверяет отсутствие отложенных настроек LuCI, установку, регистрацию RPC и рендеринг страницы входа с темой Studio. Обработчик завершения восстанавливает и проверяет прежнее значение темы, включая случай ошибки. Пакеты остаются установленными. Сценарий не меняет VPN, WAN, Wi-Fi или firewall; он пока не выполнялся на реальном оборудовании.

## Удаление и возврат темы

```sh
uci set luci.main.mediaurlbase='/luci-static/bootstrap'
uci commit luci
opkg remove luci-app-studio luci-theme-studio
/etc/init.d/rpcd restart
```

Удаление темы также переключает выбранную Studio на Bootstrap. Сохранённые конфигурации роутера и Mihomo при удалении не очищаются.
20 changes: 20 additions & 0 deletions luci/RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# OpenWrt Studio LuCI v1.0.0-rc1

Первый кандидат темы и приложения OpenWrt Studio для веб-интерфейса роутера. Это отдельный комплект для LuCI, а не обновление Windows-приложения v2.5.19.

- Светлая/тёмная тема с адаптивными карточками и горячими клавишами.
- Обзор загрузки, RAM, overlay, времени работы и DHCP-клиентов; отчёт для поддержки без адресов клиентов, паролей и ключей.
- Карта возможностей, управление установленными службами и диагностика WAN/DNS/маршрутов.
- Импорт WireGuard/AmneziaWG: несколько peer, DNS, IPv6 endpoint и параметры обфускации. Изменения проверяются и применяются через LuCI.
- Конструктор Mihomo с подпиской и двумя пресетами; конфигурация проверяется ядром и сохраняется с резервной копией.
- Генератор Sing-box для VLESS Reality, Hysteria 2 и TUIC с проверкой ядром.
- Импорт клиентского OpenVPN со встроенными сертификатами; сценарии и плагины из импортируемого профиля не выполняются.
- Подключение Tailscale (Auth key, Exit Node, подсети) и ZeroTier.
- Фоновый Sentinel с повторными проверками и паузой между восстановлениями. По умолчанию выключен.
- Доступ к штатным настройкам Wi-Fi, WAN/LAN, DHCP, брандмауэра, cron, пакетов, резервного копирования и USB; предложение источника ForkOP по архитектуре.

IPK предназначены для проверки на OpenWrt 24.10 с современным LuCI и opkg. Для apk-прошивок используйте исходники и SDK своей версии. Пакеты протоколов и ядра VPN устанавливаются отдельно.

Прошли проверки синтаксиса, браузерные сценарии на фиктивных RPC-ответах, изолированные проверки RPC-обработчика и Sentinel, сборка и проверка структуры IPK. На реальном роутере установка, работа ucode-шаблонов, протоколов и маршрутизации пока не проверены. Полная идентичность всех функций настольной программы не заявляется. Подробности установки и ограничения — в README комплекта.

Файлы: `luci-theme-studio_1.0.0~rc1-1_all.ipk`, `luci-app-studio_1.0.0~rc1-1_all.ipk`, архив исходников и SHA256SUMS.txt.
Loading
Loading