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
6b980a6a14
commit
17445e97f3
2 changed files with 91 additions and 9 deletions
|
|
@ -39,9 +39,9 @@ chmod +x install.sh
|
|||
```
|
||||
|
||||
The script will:
|
||||
1. ✓ Detect if Reticulum is in a venv or system-wide
|
||||
2. ✓ Install system dependencies (BlueZ, dbus)
|
||||
3. ✓ Install Python packages in the correct environment
|
||||
1. ✓ Detect if Reticulum is in a venv, pipx, or system-wide
|
||||
2. ✓ Install system dependencies (BlueZ, dbus, build tools if needed)
|
||||
3. ✓ Install Python packages in the correct environment (via pipx inject if needed)
|
||||
4. ✓ Copy BLE interface files to `~/.reticulum/interfaces/` (or custom config directory if specified)
|
||||
5. ✓ Enable BlueZ experimental mode (required for proper BLE connectivity)
|
||||
6. ✓ Optionally set up Bluetooth permissions
|
||||
|
|
@ -154,6 +154,8 @@ sudo setcap 'cap_net_raw,cap_net_admin+eip' /path/to/venv/bin/python3
|
|||
|
||||
If you installed Reticulum via `pipx install rns`, the BLE interface requires additional setup because pipx creates isolated virtual environments that cannot access system-installed packages.
|
||||
|
||||
**Note:** The automated installation script (Option A: `./install.sh`) now detects and handles pipx installations automatically. The instructions below are for manual installation or troubleshooting.
|
||||
|
||||
#### 1. Install System Dependencies
|
||||
|
||||
**Arch Linux:**
|
||||
|
|
|
|||
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