auth: ROUTER_HOST как список + диагностика причин в логе

На Keenetic админка часто не слушает loopback — биндится только на
LAN-интерфейсах. Делаем ROUTER_HOST списком (через запятую), пробуем
все по порядку.

- auth.py: keenetic_validate_any() — обходит список, на каждом шаге
  пишет в лог конкретную причину отказа: unreachable / нет realm /
  POST HTTP <code> / неверный логин-пароль
- app.py: парсит ROUTER_HOST как список (csv); login fail логируется
- install.sh: при создании свежего .env подставляет в ROUTER_HOST
  обнаруженный LAN-IP, my.keenetic.net и loopback (через запятую)
- .env.example: тот же дефолт, комментарии обновлены
This commit is contained in:
Андрей Бобырев
2026-04-26 01:32:34 +03:00
parent 282f205759
commit d8ee078ef5
4 changed files with 56 additions and 16 deletions

View File

@@ -20,7 +20,17 @@ if [ ! -f "$INST/data/store.json" ]; then
fi
if [ ! -f "$INST/.env" ]; then
cp -f "$ROOT/.env.example" "$INST/.env"
echo "!!! Создан $INST/.env — задайте WEB_PASSWORD и при необходимости ALLOWED_IPS"
# Подставляем в свежий .env обнаруженный LAN-IP роутера в ROUTER_HOST,
# чтобы клиент не оставался на одном лишь loopback (часто закрыт у Keenetic).
LAN_IP_GUESS="$(
ip -4 -o addr show 2>/dev/null \
| awk '$4 ~ /^(192\.168|10|172\.(1[6-9]|2[0-9]|3[01]))\..*\.1\// {sub("/.*","",$4); print $4; exit}'
)"
if [ -n "$LAN_IP_GUESS" ]; then
sed -i "s|^ROUTER_HOST=.*|ROUTER_HOST=http://${LAN_IP_GUESS},http://my.keenetic.net,http://127.0.0.1|" "$INST/.env" 2>/dev/null || true
echo "==> .env: ROUTER_HOST подставлен LAN-IP $LAN_IP_GUESS (можно изменить в $INST/.env)"
fi
echo "!!! Создан $INST/.env — при необходимости задайте WEB_PASSWORD/ALLOWED_IPS"
fi
chmod +x "$INST/run.sh"