diff --git a/daemon/packaging/install.sh b/daemon/packaging/install.sh index e033f0c..67349ce 100755 --- a/daemon/packaging/install.sh +++ b/daemon/packaging/install.sh @@ -76,6 +76,15 @@ else fail_line "not available. Install it (e.g. apt install python3-venv)." || PREFLIGHT_FAIL=1 fi +# pip or ensurepip (venv will get pip via ensurepip or get-pip.py) +PREFLIGHT_LABEL="pip / ensurepip" +preflight_check "$PREFLIGHT_LABEL" +if python3 -m pip --version >/dev/null 2>&1 || python3 -c 'import ensurepip' 2>/dev/null; then + ok_line "available" +else + fail_line "pip not found. Install python3-pip or python3-venv (e.g. apt install python3-venv python3-pip)." || PREFLIGHT_FAIL=1 +fi + # systemd PREFLIGHT_LABEL="systemd" preflight_check "$PREFLIGHT_LABEL" @@ -140,19 +149,48 @@ do_install() { install -m 644 "$BRIDGE_ROOT/daemon/main.py" "$INSTALL_PREFIX/" install -m 644 "$BRIDGE_ROOT/daemon/requirements.txt" "$INSTALL_PREFIX/" chown -R "$SERVICE_USER:$SERVICE_GROUP" "$INSTALL_PREFIX" - # Python venv (pip quiet to keep log small) + + # Python venv: ensure pip is available, then install deps and verify uvicorn if [[ ! -x "$INSTALL_PREFIX/venv/bin/uvicorn" ]]; then python3 -m venv "$INSTALL_PREFIX/venv" - "$INSTALL_PREFIX/venv/bin/pip" install --disable-pip-version-check -q -r "$INSTALL_PREFIX/requirements.txt" + VENV_PYTHON="$INSTALL_PREFIX/venv/bin/python" + + # Ensure pip in venv (some minimal python3-venv installs create venv without pip) + if ! "$VENV_PYTHON" -m pip --version >/dev/null 2>&1; then + if "$VENV_PYTHON" -m ensurepip --upgrade 2>/dev/null; then + : # pip now available + else + GET_PIP="$(mktemp)" + if curl -sSf -o "$GET_PIP" "https://bootstrap.pypa.io/get-pip.py" && "$VENV_PYTHON" "$GET_PIP"; then + rm -f "$GET_PIP" + else + rm -f "$GET_PIP" + echo "FATAL: Could not install pip into venv (ensurepip failed and get-pip.py failed or unavailable)." >&2 + exit 1 + fi + fi + fi + + "$VENV_PYTHON" -m pip install --disable-pip-version-check -q -r "$INSTALL_PREFIX/requirements.txt" || { + echo "FATAL: pip install -r requirements.txt failed." >&2 + exit 1 + } + + if [[ ! -x "$INSTALL_PREFIX/venv/bin/uvicorn" ]]; then + echo "FATAL: uvicorn not found after pip install. Check requirements.txt and network." >&2 + exit 1 + fi + chown -R "$SERVICE_USER:$SERVICE_GROUP" "$INSTALL_PREFIX/venv" fi + # systemd unit install -m 644 "$BRIDGE_ROOT/daemon/systemd/orderpy-bridge.service" /etc/systemd/system/ systemctl daemon-reload exit 0 } -( do_install; echo $? > "$INSTALL_EXIT_FILE" ) >> "$INSTALL_LOG" 2>&1 & +( do_install; r=$?; echo $r > "$INSTALL_EXIT_FILE"; exit $r ) >> "$INSTALL_LOG" 2>&1 & INSTALL_PID=$! # Progress bar (indeterminate: moving cursor)