Commit graph

24 commits

Author SHA1 Message Date
torlando-tech
e7ee42ddc5 refactor: remove box border from config example for easier copy-paste
The fancy box border (┌─┐│└┘) around the configuration example made it
difficult to copy-paste into the config file. Users had to manually remove
the vertical line characters from each line.

Changes:
- Removed box border characters (┌, ─, ┐, │, └, ┘)
- Kept the same indentation and formatting
- Added "(copy-paste ready)" note to clarify it can be directly pasted
- Maintains visual structure with proper spacing

The configuration example is now directly copy-pasteable into the Reticulum
config file without any manual editing required.

Before:
   ┌─────────────────────────────────────────┐
   │ [[BLE Interface]]                       │
   │   type = BLEInterface                   │
   ...

After:
   [[BLE Interface]]
     type = BLEInterface
     enabled = yes
   ...

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 00:02:11 -04:00
torlando-tech
21c8082dff feat: automatically add ~/.local/bin to PATH when RNS installed there
When pip installs RNS to ~/.local/bin (user-local installation), the rnsd
command is not immediately available because ~/.local/bin is not in PATH.
This required users to manually add it to their .bashrc.

Changes:
- Automatically add ~/.local/bin to PATH in .bashrc after RNS user installation
- Check if .local/bin is already in .bashrc before adding (avoid duplicates)
- Show clear message about reloading shell: "source ~/.bashrc"
- Update final "Next steps" to conditionally show PATH setup
- Only show manual PATH instructions if auto-add didn't happen

This makes installation fully automated - users can run rnsd immediately
after reloading their shell, without manual PATH configuration.

User experience:
✓ Reticulum installed successfully (user installation)
ℹ rnsd location: /home/user/.local/bin/rnsd
ℹ Adding ~/.local/bin to PATH in ~/.bashrc...
✓ Added ~/.local/bin to PATH in ~/.bashrc
⚠ Reload your shell to use rnsd command:
  source ~/.bashrc
  # Or open a new terminal

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 23:58:41 -04:00
torlando-tech
7cd0244e5a fix: resolve Python symlinks and make Bluetooth permissions automatic
The setcap command fails on symlinks with "Invalid file 'setcap' for capability operation".
On many systems (including Raspberry Pi OS), /usr/bin/python3 is a symlink to the versioned
binary (e.g., /usr/bin/python3.13). The interactive prompt also required manual intervention
during installation.

Changes:
- Automatically grant Bluetooth permissions (removed y/N prompt)
- Detect if python3 is a symlink and resolve to actual binary using readlink -f
- Verify resolved path is valid before applying setcap
- Use getcap to verify capabilities were actually set
- Added --skip-bt-permissions flag for users who want to skip this step
- Improved error messages with specific troubleshooting steps
- Show detected and resolved Python paths for transparency

This makes installation fully automated while handling the symlink issue that was
causing setcap failures on Raspberry Pi OS and other Debian-based systems.

Fixes: "Invalid file 'setcap' for capability operation" error
Tested on: Raspberry Pi Zero 2 W with Raspberry Pi OS Lite 64-bit (Debian Trixie)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 23:51:15 -04:00
torlando-tech
c6393994e4 fix: add libcap2-bin/libcap dependency for setcap command
The setcap command (used to grant Bluetooth capabilities to Python)
requires the libcap2-bin package on Debian/Ubuntu or libcap on Arch.
Fresh Raspberry Pi OS Lite installations don't include this by default,
causing "Invalid file 'setcap' for capability operation" errors.

Changes:
- Added libcap2-bin to Debian/Ubuntu/Raspberry Pi OS dependencies
- Added libcap to Arch Linux dependencies
- Added setcap availability check before Bluetooth permissions step
- Auto-install libcap2-bin/libcap if setcap is not found
- Improved error handling with clear error messages
- Verify setcap command succeeded before showing success

This ensures setcap is available before attempting to grant capabilities,
preventing installation failures on minimal OS installations.

Fixes error encountered on: Raspberry Pi Zero 2 W with Raspberry Pi OS Lite 64-bit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 23:43:39 -04:00
torlando-tech
fae8a5c815 fix: improve RNS installation verification for user-local pip installs
When pip installs RNS to ~/.local/bin (user installation), the rnsd
command is not immediately available in PATH, causing the installer
to incorrectly report "Reticulum installation failed" even though
installation succeeded.

Changes:
- Add ~/.local/bin to PATH at the start of Reticulum check
- Add ~/.local/bin to PATH after pip install rns
- Check multiple locations for rnsd command:
  1. In PATH (command -v rnsd)
  2. In ~/.local/bin directly
  3. As Python package (python3 -c "import RNS")
- Make rnsd executable if found in ~/.local/bin
- Add PATH configuration instructions in final setup steps
- Dynamic step numbering based on whether PATH note is needed

This fixes false installation failures on Raspberry Pi OS and other
systems where pip defaults to user-local installation.

Tested on: Raspberry Pi Zero 2 W with Raspberry Pi OS Lite 64-bit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 23:38:27 -04:00
torlando-tech
0e00fbf2d6 feat: enable BlueZ experimental mode by default to fix BLE connection issues
Fixes #3

BlueZ experimental mode is required for proper BLE connectivity. Without it,
BlueZ attempts Classic Bluetooth (BR/EDR) connections instead of BLE (LE)
connections, causing connection errors like "br-connection-profile-unavailable"
and immediate disconnections after pairing.

Changes:
- install.sh: Automatically enables BlueZ experimental mode during installation
  - Detects BlueZ version (requires >= 5.49)
  - Creates systemd override to add -E flag to bluetoothd
  - Checks if already enabled to avoid duplicate configuration
  - Shows strong warning if user skips with --skip-experimental flag
- Added --skip-experimental flag to opt-out (not recommended)
- Updated help text to document new flag
- tests/test_installer.sh: Added tests for experimental mode configuration
- README.md: Documented BlueZ experimental mode in installation sections
  - Added to automated installation description
  - Added as required step in manual installation
  - Added troubleshooting section for BR/EDR connection errors
- examples/config_example.toml: Added troubleshooting entry for BR/EDR errors

The installer now:
1. Detects BlueZ version >= 5.49 (required for experimental mode)
2. Checks if already enabled (graceful skip)
3. Enables experimental mode by default unless --skip-experimental is used
4. Shows prominent warning if skipped (may cause BLE to break)
5. Handles edge cases (no systemd, old BlueZ, container environments)

This addresses the root cause reported in issue #3 where devices were
connecting then immediately disconnecting with BR/EDR profile errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 23:25:52 -04:00
torlando-tech
37d6302dd2 fix: add gobject-introspection to Arch for PyGObject compilation
PyGObject compilation on Arch requires gobject-introspection package
which provides the development files and .pc files needed by meson.

Error was: Dependency 'gobject-introspection-1.0' is required but not found.

Changes:
- install.sh: Add gobject-introspection to Arch system dependencies
- install.sh: Add comment explaining it's needed for PyGObject compilation
- README.md: Document gobject-introspection requirement for Arch

This completes the Arch Linux dependency chain for PyGObject compilation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:56:21 -04:00
torlando-tech
44752c4d36 fix: skip python-gobject on Arch to avoid PyGObject version conflict
Arch Linux has PyGObject 3.54.5 in python-gobject package, but bluezero
requires PyGObject <3.52.0, causing pip to fail when trying to replace
the system version.

Solution: Don't install python-gobject system package on Arch. Let pip
compile the compatible PyGObject version (3.50.2) instead.

Changes:
- install.sh: Remove python-gobject from Arch pacman install
- install.sh: Add explanatory warning about PyGObject compilation
- tests/test_installer.sh: Don't check for python-gobject on Arch
- tests/test_installer.sh: Add comment explaining why it's skipped
- tests/test_installer.sh: Update summary for Arch (PyGObject compiled)
- README.md: Remove python-gobject from Arch instructions
- README.md: Explain version incompatibility and compilation requirement

Result:
- Debian/Ubuntu: All system packages, zero compilation (~1 min)
- Arch Linux: System packages + PyGObject compilation (~2-3 min)

Trade-off accepted: Arch users get longer install time in exchange for
compatibility with bluezero's PyGObject version requirement.

Fixes: error: uninstall-no-record-file (PyGObject 3.54.5 conflict)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:52:08 -04:00
torlando-tech
ee01132ea1 fix: add base-devel to Arch Linux for PyGObject compilation
Arch Linux has unique pip/system package integration where pip doesn't
recognize system python-gobject as satisfying PyGObject dependency,
causing bluezero to try compiling PyGObject from source.

Solution: Install base-devel on Arch to provide build tools (gcc, make, meson)

Changes:
- install.sh: Add base-devel to Arch system dependencies
- install.sh: Add note explaining why build tools needed on Arch
- install.sh: Use --needed flag to skip already installed packages
- README.md: Document base-devel requirement for Arch users
- README.md: Explain Arch vs Debian/Ubuntu compilation differences
- tests/test_installer.sh: Expect build tools on Arch (verify base-devel installed)
- tests/test_installer.sh: Update summary to reflect Arch compilation

Rationale:
- AUR python-bluezero is outdated (v0.9.0 vs pip v0.9.1)
- AUR package has 0 votes (rarely used by community)
- base-devel commonly installed on Arch systems anyway
- Keeps latest bluezero version
- Simpler than full AUR integration

Impact:
- Debian/Ubuntu: No compilation (< 1 min install)
- Arch Linux: Some compilation (~3 min install)
- Still faster than compiling everything on Debian

Fixes Arch Linux CI failure: "Unknown compiler(s): gcc not found"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:39:57 -04:00
torlando-tech
3ad8ffffcf fix: Arch Linux package database sync and dpkg pattern matching
Fix two issues preventing installer tests from passing:

1. Arch Linux: Sync package database before installing packages
   - Fresh Arch containers have no package database (core, extra)
   - Added pacman -Sy before pacman -S in both basic prereqs and system deps
   - Error was: "warning: database file for 'core' does not exist"
   - Applied to both root and non-root installation paths

2. Debian/Ubuntu: Fix package check pattern for architecture suffixes
   - dpkg shows packages as "python3-cairo:amd64" not "python3-cairo "
   - Changed grep pattern from "^ii  $pkg " to "^ii  $pkg"
   - Now matches packages with or without :amd64/:arm64 suffixes
   - Error was: "FAIL: python3-cairo not installed" (even though it was)

Changes:
- install.sh lines 132-134, 233-234: Add pacman -Sy sync before install
- tests/test_installer.sh line 41: Fix dpkg grep pattern

This allows all 5 OS versions to pass:
- Debian 12 (Bookworm)
- Debian Trixie (testing)
- Ubuntu 22.04 LTS
- Ubuntu 24.04 LTS
- Arch Linux (rolling) [NEW]

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:07:08 -04:00
torlando-tech
d08a613ac8 feat: add Arch Linux to CI test matrix
Add comprehensive Arch Linux testing to installer-test job.

Changes to .github/workflows/test.yml:
- Add archlinux:latest to test matrix (5 OS versions tested now)
- Set continue-on-error for Arch (rolling release can expose bleeding-edge issues)
- Arch tests run in parallel with Debian/Ubuntu tests

Changes to tests/test_installer.sh:
- Refactored to be OS-agnostic (supports Debian/Ubuntu AND Arch Linux)
- Added OS type detection (apt-get vs pacman)
- Added check_package() helper function (uses dpkg or pacman based on OS)
- Conditional Debian environment setup (DEBIAN_FRONTEND only for Debian/Ubuntu)
- OS-specific package name verification:
  - Debian/Ubuntu: python3-gi, python3-dbus, python3-cairo, bluez
  - Arch Linux: python-gobject, python-dbus, python-cairo, bluez, bluez-utils
- OS-specific build tool checks (dpkg -l vs pacman -Q)
- Updated summary output to show correct packages per OS

install.sh changes:
- NONE - Arch Linux support already complete and correct!

CI Matrix now tests:
- Debian 12 (Bookworm - current stable)
- Debian Trixie (testing - next release) [non-blocking]
- Ubuntu 22.04 LTS (Jammy)
- Ubuntu 24.04 LTS (Noble)
- Arch Linux (rolling release) [non-blocking] [NEW]

Benefits:
- Validates install.sh Arch support works in practice
- Tests with newer BlueZ/Python versions (rolling release)
- Forward compatibility testing
- Broader Linux distribution coverage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 21:00:58 -04:00
torlando-tech
b9bb393fdc fix: remove bleak.__version__ check that fails on some versions
bleak doesn't always expose __version__ attribute, causing test failures.
Changed to just verify the module can be imported successfully.

Fixes: AttributeError: module 'bleak' has no attribute '__version__'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:43:24 -04:00
torlando-tech
da05e9c602 fix: handle sudo absence in fresh Debian containers
Debian containers run as root without sudo installed by default.
The script was trying to use sudo to install packages (including sudo itself),
which failed with "sudo: command not found".

Changes:
- Check if running as root ($EUID -eq 0) before using sudo
- If root: use package managers directly (apt-get, pacman)
- If not root: use sudo as before

Applied to:
- Basic prerequisites installation (lines 108-113)
- Arch prerequisites installation (lines 131-135)
- System dependencies installation (lines 215-221)
- Arch system dependencies (lines 228-232)

This fixes installation in:
- Fresh Debian containers (root, no sudo)
- Fresh Ubuntu containers (root, has sudo but not needed)
- User Debian/Ubuntu systems (not root, uses sudo)
- User Arch systems (not root, uses sudo)

Fixes Debian 12 CI failure: "sudo: command not found"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:39:00 -04:00
torlando-tech
00bad9c706 refactor: make install.sh fully self-contained
Major architectural improvement: install.sh now handles all prerequisites,
eliminating duplicate logic and making CI test exactly what users run.

## Changes to install.sh:

**1. Added pip_install() helper function (lines 37-49)**
- Detects pip version capabilities
- Uses --break-system-packages flag on pip 23.0+ (Debian 12+, Ubuntu 24.04+)
- Falls back to no flag on pip 22.x (Ubuntu 22.04)
- Single source of truth for all pip operations
- Fixes compatibility across all OS versions

**2. Added basic system package installation (lines 91-128)**
- Checks and installs: python3, python3-pip, git, sudo
- Supports both Debian/Ubuntu (apt-get) and Arch (pacman)
- Only installs missing packages (idempotent)

**3. Changed Reticulum check to auto-install (lines 171-190)**
- Previously: exited with error if Reticulum not found
- Now: automatically installs Reticulum using pip_install()
- Verifies installation succeeded
- Falls back to manual instructions if auto-install fails

**4. Updated all pip install commands to use helper (lines 242, 251)**
- Consistent --break-system-packages handling
- Works on Ubuntu 22.04, Debian 12, Trixie, Ubuntu 24.04

**5. Updated header comment**
- Reflects that script is now self-contained
- Documents all responsibilities

## Changes to tests/test_installer.sh:

**Simplified from 127 lines to 126 lines, but more importantly:**

**Removed (no longer needed):**
- Manual apt-get install of base packages
- Manual pip install of Reticulum
- Duplicate pip compatibility logic

**Kept:**
- Non-interactive environment setup
- Verification tests
- BLE interface import test

**Added:**
- Reticulum verification check
- Updated summary to reflect self-contained nature

## Benefits:

1.  **Single source of truth** - No duplicate pip logic
2.  **CI tests real workflow** - Exactly what users run
3.  **Better user experience** - One command does everything
4.  **Cross-version compatibility** - Works on all OS/pip versions
5.  **Easier maintenance** - Changes in one place
6.  **Self-contained** - install.sh has zero external dependencies

## Testing:

Works across all CI matrix OS versions:
- Ubuntu 22.04 (pip 22.0.2 - no --break-system-packages)
- Debian 12 (pip 23.0+ - requires --break-system-packages)
- Debian Trixie (pip 23.0+ - requires --break-system-packages)
- Ubuntu 24.04 (pip 24.0+ - supports --break-system-packages)

Fixes #4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:27:34 -04:00
torlando-tech
a43cbacb62 fix: Ubuntu 22.04 compatibility in test_installer.sh
Fix two issues preventing Ubuntu 22.04 CI from passing:

1. Remove --break-system-packages flag from pip install
   - Ubuntu 22.04 has pip 22.0.2 (flag added in pip 22.3)
   - Container runs as root, so no permission issues
   - Flag not needed for compatibility

2. Fix /workspace absolute path to use relative path
   - GitHub Actions containers use different workspace structure
   - Changed to: cd "$(dirname "$0")/.." to navigate from tests/ to repo root
   - More portable across CI environments

These changes make the test script compatible with:
- Ubuntu 22.04 (pip 22.0.2)
- Ubuntu 24.04 (pip 24.0+)
- Debian 12 and Trixie
- Any environment where script location may vary

Fixes Ubuntu 22.04 installer-test CI failure.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:11:28 -04:00
torlando-tech
1aa0327bec feat: add Debian Trixie (testing) to CI test matrix
Add forward compatibility testing with Debian 13 "Trixie" (testing release).

Changes:
- Add debian:trixie to installer-test matrix
- Set continue-on-error for Trixie (testing can be unstable)
- Add fail-fast: false to run all OS tests even if one fails
- Update comments to clarify Debian/Ubuntu versions

Benefits:
- Early detection of BlueZ/DBus API changes
- Test compatibility with newer system packages
- Forward compatibility assurance before Trixie stable release
- Non-blocking (Trixie failures won't block merges)

Matrix now tests:
- Debian 12 (Bookworm - current stable)
- Debian Trixie (testing - next release) [NEW]
- Ubuntu 22.04 LTS (Jammy)
- Ubuntu 24.04 LTS (Noble)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:08:56 -04:00
torlando-tech
c3c8bdd81c fix: configure non-interactive mode for CI apt-get installs
Ubuntu 24.04 CI was hanging on tzdata interactive timezone prompt.

Changes:
- tests/test_installer.sh: Set DEBIAN_FRONTEND=noninteractive, pre-configure timezone
- tests/test_installer.sh: Add apt-get options to suppress prompts
- .github/workflows/test.yml: Set environment variables in installer-test container
- install.sh: Auto-detect CI environment and enable non-interactive mode

This follows Debian/Ubuntu best practices for containerized environments and
prevents interactive prompts from blocking CI runs.

Fixes Ubuntu 24.04 installer-test CI failure.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 20:05:59 -04:00
torlando-tech
7a350ec0e1 fix: use system packages to avoid compilation (fixes #4)
Strategy 1: Use pre-compiled system packages instead of building from source
- install.sh: Add python3-gi, python3-cairo to apt-get install
- install.sh: Add python-gobject, python-cairo to pacman install
- install.sh: Install only bleak and bluezero via pip (skip compiled packages)
- README.md: Update dependency instructions with system packages
- README.md: Add explanation of why system packages are preferred

Strategy 2: Add CI integration test for fresh Debian/Ubuntu systems
- tests/test_installer.sh: New integration test script
- .github/workflows/test.yml: Add installer-test job with matrix for Debian 12, Ubuntu 22.04, 24.04
- Tests reproduce real user experience and catch missing dependencies

Benefits:
- Zero compilation time (seconds vs minutes)
- No build tools needed (meson, cmake)
- No dev headers needed (libglib2.0-dev, libcairo2-dev, etc.)
- Faster installation on resource-constrained devices (Raspberry Pi)
- Prevents future dependency documentation issues

Fixes #4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 19:59:26 -04:00
torlando-tech
4b7a255950 feat: add --config flag to install.sh for custom config directories
The install.sh script now supports an optional --config flag to specify
a custom Reticulum config directory during installation.

Changes:
- Add command-line argument parsing for --config flag
- Add --help flag to display usage information
- Update installation path logic to use custom or default directory
- Update final instructions to show correct rnsd command with --config flag
- Document the new --config flag in README.md

Usage:
  ./install.sh                           # Install to ~/.reticulum (default)
  ./install.sh --config /custom/path     # Install to custom directory

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 19:34:40 -04:00
torlando-tech
80d8ff7c24 fix: support custom config directories via RNS.Reticulum.configdir
The BLE interface now dynamically resolves the interface directory
by checking RNS.Reticulum.configdir when loaded via exec() by Reticulum.
This allows users to specify custom config directories using the
--config flag without encountering import errors.

Changes:
- Update BLEInterface.py to use RNS.Reticulum.configdir when available
- Add fallback to default ~/.reticulum/interfaces for backward compatibility
- Add comprehensive test coverage for config directory resolution
- Update documentation to mention custom config directory support

Fixes #2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 19:09:48 -04:00
torlando-tech
42c2ab701f add missing integration test script 2025-10-27 00:33:57 -04:00
torlando-tech
93baf5c0bb fix: add system dependencies for CI 2025-10-26 23:58:36 -04:00
torlando-tech
91a3c89521 docs: add ko-fi widget 2025-10-26 19:35:59 -04:00
torlando-tech
486f210ae4 Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00