feat: add automated pipx support to install.sh
Enhances the installation script to automatically detect and handle pipx installations of RNS, eliminating the need for manual dependency injection in most cases. Changes to install.sh: - Add pipx detection logic that checks for RNS in pipx paths - Verify pipx command availability and RNS listing - Install build dependencies (build-essential, python3-dev, libdbus-dev) for Debian/Ubuntu and (base-devel, gobject-introspection) for Arch - Implement automated pipx inject for all BLE dependencies (bleak, bluezero, dbus-python) - Add progress messages for long-running dbus-python compilation - Verify all dependencies after injection - Use correct Python executable for setcap based on install mode Changes to README.md: - Update Option A description to mention pipx detection - Add note to Option C that install.sh now handles pipx automatically - Keep manual instructions for troubleshooting/fallback Benefits: - Consistent "one-command installation" experience for all users - Reduces user errors from manual pipx injection - Provides clear error messages with recovery instructions - Maintains manual documentation as fallback Related to #11 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
15618df04b
commit
0ead1fecb5
2 changed files with 91 additions and 9 deletions
92
install.sh
92
install.sh
|
|
@ -237,6 +237,7 @@ print_header "Checking for Reticulum"
|
|||
RNS_VENV=""
|
||||
RNS_PYTHON=""
|
||||
INSTALL_MODE=""
|
||||
PIPX_RNS_PATH=""
|
||||
|
||||
# Add user's local bin to PATH if it exists (common pip install location)
|
||||
if [ -d "$HOME/.local/bin" ]; then
|
||||
|
|
@ -253,8 +254,41 @@ if command -v rnsd &> /dev/null; then
|
|||
if [ -n "$RNS_LOCATION" ]; then
|
||||
print_success "Found RNS Python package at: $RNS_LOCATION"
|
||||
|
||||
# Check if it's a pipx installation (most specific, check first)
|
||||
if [[ "$RNS_LOCATION" == *"/pipx/venvs/"* ]]; then
|
||||
print_info "RNS appears to be installed via pipx"
|
||||
|
||||
# Verify pipx command is available
|
||||
if ! command -v pipx &> /dev/null; then
|
||||
print_error "RNS is in a pipx path, but pipx command not found!"
|
||||
echo
|
||||
echo "Please install pipx:"
|
||||
echo " python3 -m pip install --user pipx"
|
||||
echo " python3 -m pipx ensurepath"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify RNS is listed in pipx
|
||||
if pipx list 2>/dev/null | grep -q "package rns"; then
|
||||
INSTALL_MODE="pipx"
|
||||
|
||||
# Extract pipx venv path (e.g., ~/.local/pipx/venvs/rns)
|
||||
PIPX_RNS_PATH=$(echo "$RNS_LOCATION" | grep -oP '^.*?/pipx/venvs/rns')
|
||||
RNS_PYTHON="$PIPX_RNS_PATH/bin/python3"
|
||||
|
||||
if [ ! -f "$RNS_PYTHON" ]; then
|
||||
print_error "pipx Python not found at: $RNS_PYTHON"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "Detected pipx installation at: $PIPX_RNS_PATH"
|
||||
else
|
||||
print_error "RNS appears to be in pipx path, but 'pipx list' doesn't show it"
|
||||
echo "Run 'pipx list' to verify your pipx installations"
|
||||
exit 1
|
||||
fi
|
||||
# Check if it's in a virtual environment
|
||||
if [[ "$RNS_LOCATION" == *"/venv/"* ]] || [[ "$RNS_LOCATION" == *"/env/"* ]] || [[ "$VIRTUAL_ENV" != "" ]]; then
|
||||
elif [[ "$RNS_LOCATION" == *"/venv/"* ]] || [[ "$RNS_LOCATION" == *"/env/"* ]] || [[ "$VIRTUAL_ENV" != "" ]]; then
|
||||
# RNS is in a venv
|
||||
if [ -n "$VIRTUAL_ENV" ]; then
|
||||
RNS_VENV="$VIRTUAL_ENV"
|
||||
|
|
@ -365,9 +399,47 @@ if [[ "$ARCH" == "armhf" ]] || [[ "$(uname -m)" =~ ^(armv6l|armv7l)$ ]]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
print_info "Installing pip packages (PyGObject, dbus-python, pycairo provided by system packages)"
|
||||
if [ "$INSTALL_MODE" = "pipx" ]; then
|
||||
print_info "Installing dependencies via pipx inject..."
|
||||
print_warning "dbus-python will be compiled from source (may take 2-3 minutes)"
|
||||
echo
|
||||
|
||||
if [ "$INSTALL_MODE" = "venv" ]; then
|
||||
# Define dependencies (must match requirements.txt)
|
||||
DEPS=("bleak==1.1.1" "bluezero" "dbus-python")
|
||||
|
||||
# Inject each dependency individually
|
||||
for dep in "${DEPS[@]}"; do
|
||||
print_info "Injecting $dep into RNS environment..."
|
||||
|
||||
if pipx inject rns "$dep"; then
|
||||
print_success "Injected $dep"
|
||||
else
|
||||
print_error "Failed to inject $dep"
|
||||
echo
|
||||
echo "Common causes:"
|
||||
echo " - Missing system build dependencies (see above)"
|
||||
echo " - Network connectivity issues"
|
||||
echo
|
||||
echo "Try manually:"
|
||||
echo " pipx inject rns $dep --verbose"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
done
|
||||
|
||||
# Verify all modules can be imported
|
||||
print_info "Verifying dependencies..."
|
||||
if "$RNS_PYTHON" -c "import bleak, bluezero, dbus" 2>/dev/null; then
|
||||
print_success "All dependencies verified and working"
|
||||
else
|
||||
print_error "Dependency verification failed"
|
||||
echo
|
||||
echo "Test imports manually:"
|
||||
echo " $RNS_PYTHON -c 'import bleak, bluezero, dbus'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
elif [ "$INSTALL_MODE" = "venv" ]; then
|
||||
print_info "Installing to virtual environment: $RNS_VENV"
|
||||
|
||||
if [ ! -f "$RNS_PYTHON" ]; then
|
||||
|
|
@ -494,9 +566,17 @@ else
|
|||
print_info "Running as root - skipping capability grant (not needed)"
|
||||
print_info "Root user already has all required Bluetooth permissions"
|
||||
elif command -v setcap &> /dev/null; then
|
||||
# Get python3 path
|
||||
PYTHON_PATH=$(which python3)
|
||||
print_info "Detected Python at: $PYTHON_PATH"
|
||||
# Determine correct Python path based on installation mode
|
||||
if [ "$INSTALL_MODE" = "pipx" ]; then
|
||||
PYTHON_PATH="$PIPX_RNS_PATH/bin/python3"
|
||||
print_info "Using pipx Python: $PYTHON_PATH"
|
||||
elif [ "$INSTALL_MODE" = "venv" ]; then
|
||||
PYTHON_PATH="$RNS_VENV/bin/python3"
|
||||
print_info "Using venv Python: $PYTHON_PATH"
|
||||
else
|
||||
PYTHON_PATH=$(which python3)
|
||||
print_info "Using system Python: $PYTHON_PATH"
|
||||
fi
|
||||
|
||||
# Check if it's a symlink and resolve it
|
||||
if [ -L "$PYTHON_PATH" ]; then
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue