From af1981cf0c34153681f34f2ba2fe81d886441060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Sun, 26 Apr 2026 00:26:29 +0300 Subject: [PATCH] =?UTF-8?q?install:=20=D1=84=D0=BE=D0=BB=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=20pip=20--target=3Dlib,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B2=20?= =?UTF-8?q?python3=20=D0=BD=D0=B5=D1=82=20venv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На многих сборках Entware (включая aarch64-k3.10) пакет python3-venv недоступен и `python3 -m venv` падает с `No module named venv`. Делаем установку без venv: - если venv создаётся — используем его (как раньше) - иначе ставим зависимости в $INST/lib через `pip install --target=lib` - run.sh и init-скрипт автоопределяют режим (PYTHONPATH=lib для второго) Также: opkg install python3-venv стал опциональным (как и был, но без обязательного завершения цепочки). --- README.md | 4 ++-- install.sh | 50 ++++++++++++++++++++++++++++++++++++++++---------- run.sh | 22 +++++++++++++++++++--- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 93bd827..768fc98 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,9 @@ chmod +x install.sh uninstall.sh run.sh bootstrap.sh Скрипт: - копирует файлы в **`/opt/share/keenetic_ssh-web`** -- создаёт **`venv`**, ставит **Flask** и **Waitress** +- ставит **Flask** и **Waitress**: предпочтительно в `venv/`; если модуль `venv` в Python отсутствует (типично для `aarch64-k3.10`), то — в локальный `lib/` через `pip install --target` - создаёт **`data/store.json`** и **`.env`** из примеров -- устанавливает **`/opt/etc/init.d/S99keenetic-ssh-web`** +- устанавливает **`/opt/etc/init.d/S99keenetic-ssh-web`** (автоопределяет venv/lib режим) ### Первый запуск diff --git a/install.sh b/install.sh index 2730379..b60e98c 100644 --- a/install.sh +++ b/install.sh @@ -25,20 +25,42 @@ fi chmod +x "$INST/run.sh" -echo "==> Entware: python3 + venv" +echo "==> Entware: python3 + pip" if command -v opkg >/dev/null 2>&1; then opkg update || echo "(opkg update: частичные ошибки источников — продолжаем)" - opkg install python3 python3-pip python3-light python3-venv >/dev/null 2>&1 \ - || opkg install python3 python3-pip >/dev/null 2>&1 \ - || echo "(opkg install python3: пропуск — пакеты возможно уже стоят)" + # python3 + pip обязательны; python3-venv — желателен, но в некоторых сборках отсутствует + opkg install python3 python3-pip >/dev/null 2>&1 || true + opkg install python3-venv python3-light >/dev/null 2>&1 || true fi cd "$INST" -if [ ! -x venv/bin/python3 ]; then - "$PY" -m venv venv || { echo "Не удалось создать venv. Установите: opkg install python3-venv"; exit 1; } + +# 1) пробуем venv +USE_VENV=0 +if [ -x venv/bin/python3 ]; then + USE_VENV=1 +elif "$PY" -m venv venv >/tmp/kssh-venv.log 2>&1; then + USE_VENV=1 + echo "==> venv: $INST/venv" +else + echo "==> venv недоступен (нет модуля venv в python3) — ставим зависимости в $INST/lib" + rm -rf venv +fi + +if [ "$USE_VENV" = "1" ]; then + ./venv/bin/pip install -q --upgrade pip 2>/dev/null || true + ./venv/bin/pip install -q -r requirements.txt +else + # 2) фолбэк: pip install --target=lib (без venv, рабочий путь для старых Entware) + if ! "$PY" -m pip --version >/dev/null 2>&1; then + echo "ОШИБКА: ни venv, ни pip недоступны. Установите вручную: opkg install python3-pip" + exit 1 + fi + rm -rf lib + mkdir -p lib + "$PY" -m pip install -q --target=lib --upgrade pip 2>/dev/null || true + "$PY" -m pip install -q --target=lib -r requirements.txt fi -./venv/bin/pip install -q --upgrade pip -./venv/bin/pip install -q -r requirements.txt INIT="/opt/etc/init.d/S99keenetic-ssh-web" echo "==> Init-скрипт $INIT" @@ -60,14 +82,22 @@ case "$1" in echo "already running" exit 0 fi - [ -x "$DIR/venv/bin/python3" ] || { echo "no venv in $DIR"; exit 1; } cd "$DIR" || exit 1 + if [ -x "$DIR/venv/bin/python3" ]; then + PYBIN="$DIR/venv/bin/python3" + elif [ -d "$DIR/lib" ] && [ -x /opt/bin/python3 ]; then + PYBIN="/opt/bin/python3" + export PYTHONPATH="$DIR/lib:${PYTHONPATH:-}" + else + echo "Нет ни $DIR/venv, ни $DIR/lib — установите заново: $DIR/install.sh" + exit 1 + fi set -a [ -f .env ] && . ./.env set +a export PYTHONUNBUFFERED=1 PORT="${PORT:-2001}" - nohup "$DIR/venv/bin/python3" -m waitress --listen="0.0.0.0:$PORT" app:app \ + nohup "$PYBIN" -m waitress --listen="0.0.0.0:$PORT" app:app \ >>/opt/var/log/keenetic-ssh-web.log 2>&1 & echo $! > "$PID" echo "keenetic_ssh-web started pid=$(cat "$PID") port=$PORT" diff --git a/run.sh b/run.sh index 062861a..1737069 100644 --- a/run.sh +++ b/run.sh @@ -1,8 +1,24 @@ #!/bin/sh -# Запуск через Waitress (рекомендуется на роутере) -cd "$(dirname "$0")" || exit 1 +# Запуск через Waitress (рекомендуется на роутере). Поддерживает оба режима: +# - venv: $DIR/venv/bin/python3 +# - lib/: /opt/bin/python3 + PYTHONPATH=$DIR/lib (если venv недоступен) +DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$DIR" || exit 1 set -a [ -f .env ] && . ./.env set +a export PYTHONUNBUFFERED=1 -exec /opt/bin/python3 -m waitress --listen="0.0.0.0:${PORT:-2001}" app:app + +if [ -x "$DIR/venv/bin/python3" ]; then + PYBIN="$DIR/venv/bin/python3" +elif [ -d "$DIR/lib" ] && [ -x /opt/bin/python3 ]; then + PYBIN="/opt/bin/python3" + export PYTHONPATH="$DIR/lib:${PYTHONPATH:-}" +elif command -v python3 >/dev/null 2>&1; then + PYBIN="$(command -v python3)" +else + echo "Нет python3. Установите: opkg install python3 python3-pip" >&2 + exit 1 +fi + +exec "$PYBIN" -m waitress --listen="0.0.0.0:${PORT:-2001}" app:app