Commit Graph

20 Commits

Author SHA1 Message Date
Андрей Бобырев
21e35494ae fix: RCI — динамический поиск LAN IP через ip addr (убрали 192.168.1.1) 2026-04-28 20:38:30 +03:00
Андрей Бобырев
e41c1359d4 fix: RCI auth — перебираем 127.0.0.1/localhost/192.168.1.1/br0 IP
Keenetic слушает на LAN IP, а не на localhost из SSH-контекста.
Теперь пробуем каждый адрес с таймаутом 2с, используем первый
что вернёт JSON с realm.
2026-04-28 20:37:03 +03:00
Андрей Бобырев
ca10ef1b44 fix: authorized_keys обновляется при каждом нажатии «⇄ Тоннель»
Раньше ключ добавлялся только при первой генерации.
Если его удалили вручную — повторное нажатие ⇄ не помогало.
Теперь authorized_keys синхронизируется каждый раз (dedup встроен).
2026-04-28 20:30:28 +03:00
Андрей Бобырев
269017c50a fix: автоочистка зависшего туннеля на VPS при переподключении
При повторном нажатии «⇄ Тоннель» — если порт уже занят старым
sshd-соединением — теперь автоматически убиваем его через fuser/ss+kill
на VPS до того как роутер запустит autossh.
2026-04-28 20:25:25 +03:00
Андрей Бобырев
108cf22daa feat: кнопка «Снести с роутера» — удаляет VPN/туннель через SSH
POST /api/routers/{name}/wireguard/uninstall:
  - killall autossh
  - rm init.d S50hydravpn, S99hydra_tun
  - rm hydra_tun, hydra_tk, wg0.conf, wg0.key
  - ip link delete nwg50-70
Confirm-диалог с описанием что будет удалено.
2026-04-28 20:13:54 +03:00
Андрей Бобырев
b41e5c7dc8 feat: кнопка «Скачать .conf» в модале WireGuard конфига
Добавлена кнопка «⬇ Скачать .conf» рядом с «Копировать».
Имя файла: wg0-server.conf для VPS, hydravpn-{name}.conf для роутера.
Hint роутера обновлён: «Загрузить из файла» вместо «Вставить из буфера».
2026-04-28 20:06:29 +03:00
Андрей Бобырев
1f55b09e09 fix: RCI — allowed-address/keepalive + диагностика существующего Wireguard0
Исправлены имена полей Keenetic RCI:
  allowed-ips → allowed-address
  persistent-keepalive → keepalive
Добавлен GET существующего Wireguard0 в лог для проверки формата.
2026-04-28 19:56:45 +03:00
Андрей Бобырев
fea56f52fc fix: WireGuard RCI — последовательная нумерация интерфейсов (max+1)
Keenetic требует последовательную нумерацию WireguardN (0,1,2...).
Теперь сканируем существующие nwg0..nwg20, берём max+1 — гарантированно
свободный индекс без конфликтов с Polsh/AM/etc.
Fallback ip-link по-прежнему использует nwg50+ для разделения.
2026-04-28 16:16:26 +03:00
Андрей Бобырев
31c3883ebd fix: WireGuard deploy — RCI API с правильным парсингом auth и nwg50+ нумерацией
- Парсим realm+challenge из JSON-тела GET /auth (не из HTTP-заголовков)
- Вычисляем хеш: MD5("admin:realm:pass") → MD5(hash+challenge)
- Нумерация интерфейсов начинается с 50 (nwg50, nwg51...) чтобы не затирать существующие
- Fallback: ip link add nwgN + wg set + init.d S50hydravpn при неудаче RCI
2026-04-28 16:10:25 +03:00
Андрей Бобырев
c00830f61a fix: WireGuard deploy через Keenetic RCI API вместо ndmc
ndmc без PTY принимает stdin но не применяет конфигурационные команды
(system failed 0xcffd00cc) — это не баг синтаксиса, а ограничение TTY.

RCI HTTP API — то же что использует веб-интерфейс:
- Auth: MD5(admin:realm:pass) + MD5(hash+challenge) через /auth
- Конфиги Wireguard0-5 собираются в Python (json.dumps, без escaping)
  и встраиваются в скрипт как heredoc-файлы
- Автоподбор свободного индекса Wireguard0-5 через /rci/show/interface/
- Fallback: raw wg+ip (wg0, работает но не виден в Keenetic UI)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 15:40:50 +03:00
Андрей Бобырев
7d30e55f0d fix: WireGuard deploy — убрать kmod-wireguard, ndmc первым, fallback через wg+ip
- Убрать kmod-wireguard из opkg (не существует, ядро Keenetic уже имеет WireGuard)
- ndmc теперь основной путь (нативная интеграция в Keenetic UI), а не fallback
- Fallback: raw wg set + ip link/addr (без wg-quick, которого нет в Entware)
- init.d S50wg0 использует wg + ip вместо wg-quick
- Приватный ключ пишется в отдельный файл wg0.key для wg set private-key
- Убрать set -e — чтобы fallback-пути не прерывали скрипт

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 14:35:31 +03:00
Андрей Бобырев
e63138eca0 feat: WireGuard VPN генератор
- Новая вкладка «🔒 WireGuard VPN» в панели
- Авто-установка WireGuard сервера на VPS (apt + systemd wg-quick@wg0)
- Генерация ключевых пар (сервер + клиент на каждый роутер)
- Выдача IP из подсети 10.8.0.0/24
- Деплой на роутер по SSH: opkg install wireguard-tools + wg-quick + init.d
- Попытка нативной интеграции через Keenetic CLI (ndmc) — роутер появится
  в «Приоритетах подключений»; fallback на wg-quick если ndmc недоступен
- Просмотр и копирование конфигов (wg0.conf для VPS и для каждого роутера)
- Добавление/удаление пиров с авто-обновлением wg0.conf на VPS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 14:30:03 +03:00
Андрей Бобырев
cc20329798 fix: use start-stop-daemon for autossh background launch + add close button
- Replace setsid/nohup with start-stop-daemon -S -b as primary daemon
  method (setsid fails silently when script runs inside curl|sh pipe)
- Same fix in init.d S99hydra_tun start/restart cases
- Add "✓ Готово" button to tunnel modal to close it after setup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 10:22:19 +03:00
Андрей Бобырев
708b4b04dc feat: reverse SSH tunnel для роутеров без белого IP + README переработан
- server/config.py: VPS_SSH_HOST, VPS_SSH_PORT, VPS_SSH_USER, TUNNEL_PORT_START
- server/.env.example: секция тоннеля
- server/main.py: _gen_ed25519_keypair, _add_pubkey_to_authorized_keys;
  _ssh_on_router и _push_one_router поддерживают tunnel_port;
  эндпоинты tunnel-cmd, tunnel-script (одноразовый токен 10 мин),
  tunnel-status, DELETE tunnel
- index.html: кнопка ⇄ у каждого роутера + подсветка тоннельного порта,
  кнопка ⇄ Тоннель в форме добавления, модалка с curl-командой,
  копирование (clipboard + execCommand fallback), проверка связи
- README: полная переработка — туннель, логины/пароли, ошибки, советы

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 09:57:48 +03:00
Андрей Бобырев
61205df0cb feat: footer support links; POST /api/routers/{name}/push for single-router update
Made-with: Cursor
2026-04-25 22:10:32 +03:00
Андрей Бобырев
34d5f66bc2 fix(ui): router Test/Pull/Del — broken onclick from JSON quotes; use data-* delegation
Made-with: Cursor
2026-04-25 19:30:42 +03:00
Андрей Бобырев
b5a109639b feat(routers): SSH test, fetch domain.conf/ip.list to import; normalize URL in IP field; clearer push errors
Made-with: Cursor
2026-04-25 19:19:55 +03:00
Андрей Бобырев
4e97268541 feat: server/uninstall.sh and README one-command removal
Made-with: Cursor
2026-04-25 18:30:11 +03:00
Андрей Бобырев
c40072fdbf docs(install): default .env template and README table; systemd reads HOST/PORT from .env
Made-with: Cursor
2026-04-25 13:36:05 +03:00
Андрей Бобырев
a63329af81 Add HydraRoute Manager web server — standalone domain management UI
Made-with: Cursor
2026-04-24 11:37:24 +03:00