Add Dangerous Pi MVP implementation - complete backend and system integration
This commit adds the complete Dangerous Pi web management interface with all MVP features implemented and tested locally. ## New Features ### Backend (Python + FastAPI) - Complete FastAPI backend with async support - 40+ API endpoints (Health, PM3, WiFi, Updates, UPS, BLE, Plugins) - 6 managers: Session, WiFi, Update, UPS, BLE, Plugin - SQLite database with sessions, config, history, crash reports - Server-Sent Events (SSE) for real-time notifications - Mock PM3 worker for development without hardware ### WiFi Manager - Interface detection (USB vs built-in) - Network scanning with signal strength - Mode switching (AP/Client/Dual/Auto/Off) - Network connection with password support - Hidden SSID and saved networks support - Static IP and DHCP configuration - 10 WiFi API endpoints ### Update Manager - GitHub releases API integration - Automatic periodic update checks - Semantic version comparison - Update download with progress tracking - SHA256 checksum verification - Automatic installation with backup and rollback - PM3 client rebuild after updates - 6 Update API endpoints ### UPS Manager - I2C battery monitoring (MAX17040-compatible) - Battery percentage, voltage, current tracking - Power source detection (AC/Battery) - Safe shutdown triggers at configurable thresholds - Event callbacks for battery warnings - SSE and BLE notification integration - 3 UPS API endpoints ### BLE Manager - Bluetooth Low Energy notification support - Auto-detects BLE capability - Multiple notification types (updates, battery, shutdown, etc.) - BLE advertising management - Device connection tracking - 4 BLE API endpoints ### Plugin Framework - Dynamic plugin loading/unloading - Plugin lifecycle management (load, enable, disable, unload) - Hook system for extensibility - JSON-based metadata - Example "Hello World" plugin included - 7 Plugin API endpoints ### Frontend (Remix.js + React) - Cyberpunk-themed responsive UI - Dashboard with system status - PM3 command interface with history - Settings page with WiFi and Update management - Command logs viewer - Theme toggle (Dark/Light/Auto) - Server-side rendering (SSR) - Mobile-first responsive design ### System Integration - Systemd service with security hardening - Automated install/uninstall scripts - Environment configuration template - Hardware access groups (i2c, bluetooth, gpio, dialout) - Pi-gen stage 04 integration for OS image building - Port conflict resolution with ttyd-bash - I2C interface auto-enable for UPS HAT ### Testing - test_backend.py - Backend API tests - test_ups.py - UPS manager tests - test_ble.py - BLE manager tests - test_plugins.py - Plugin manager tests - All tests passing locally ### Documentation - 12 comprehensive documentation files - claude.md - AI development guide - WIFI_MANAGER.md - WiFi management guide - UPDATE_MANAGER.md - Update system guide - PORT_CONFLICT.md - Port conflict resolution guide - MVP_COMPLETE.md - MVP implementation summary - PROJECT_STATUS.md - Project status and roadmap - systemd/README.md - Service management docs - pi-gen integration documentation ## Technical Details - ~5,000+ lines of backend code - 11 Python dependencies (smbus2 added for UPS) - FastAPI with async/await throughout - Type hints and docstrings on all functions - RESTful API design with SSE for notifications - Security hardening (non-root, protected dirs, resource limits) ## Next Steps - Deploy to Raspberry Pi Zero 2 W hardware - Test with real Proxmark3 device - Test UPS HAT integration - Test BLE on Pi hardware - Build custom OS image with pi-gen - Performance optimization for Pi Zero 2 W 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
530
MVP_COMPLETE.md
Normal file
530
MVP_COMPLETE.md
Normal file
@@ -0,0 +1,530 @@
|
||||
# Dangerous Pi MVP - Implementation Complete
|
||||
|
||||
This document summarizes all features implemented for the Dangerous Pi MVP.
|
||||
|
||||
## ✅ Completed MVP Features
|
||||
|
||||
### 1. UPS Monitoring Daemon
|
||||
|
||||
**Location**: [app/backend/managers/ups_manager.py](app/backend/managers/ups_manager.py)
|
||||
|
||||
**Features**:
|
||||
- I2C battery monitoring via smbus2
|
||||
- Battery percentage reporting
|
||||
- Voltage and current monitoring
|
||||
- Power source detection (AC/Battery)
|
||||
- Safe shutdown triggers at configurable thresholds
|
||||
- Battery status (Charging, Discharging, Full, Critical)
|
||||
- Event callbacks for battery warnings
|
||||
- SSE integration for real-time notifications
|
||||
- BLE notification support
|
||||
|
||||
**API Endpoints**:
|
||||
- `GET /api/system/ups/status` - Get current UPS status
|
||||
- `POST /api/system/ups/thresholds` - Set battery thresholds
|
||||
- `POST /api/system/ups/shutdown` - Trigger safe shutdown
|
||||
|
||||
**Configuration**:
|
||||
- `UPS_I2C_ADDRESS` - I2C address (default: 0x36)
|
||||
- `UPS_CHECK_INTERVAL` - Monitoring interval in seconds (default: 60)
|
||||
|
||||
**Testing**: Run `python3 test_ups.py`
|
||||
|
||||
---
|
||||
|
||||
### 2. BLE Notification System
|
||||
|
||||
**Location**: [app/backend/managers/ble_manager.py](app/backend/managers/ble_manager.py)
|
||||
|
||||
**Features**:
|
||||
- Bluetooth Low Energy notification support
|
||||
- Auto-detects BLE capability
|
||||
- Configurable device name
|
||||
- Multiple notification types:
|
||||
- Update available
|
||||
- Update complete
|
||||
- Backup complete
|
||||
- Battery warning
|
||||
- Battery critical
|
||||
- Shutdown initiated
|
||||
- PM3 status
|
||||
- BLE advertising management
|
||||
- Device connection tracking
|
||||
- Notification queueing
|
||||
|
||||
**API Endpoints**:
|
||||
- `GET /api/system/ble/status` - Get BLE manager status
|
||||
- `POST /api/system/ble/advertising/start` - Start BLE advertising
|
||||
- `POST /api/system/ble/advertising/stop` - Stop BLE advertising
|
||||
- `POST /api/system/ble/notify` - Send BLE notification
|
||||
|
||||
**Configuration**:
|
||||
- `BLE_ENABLED` - Enable/disable BLE (default: true)
|
||||
- `BLE_DEVICE_NAME` - Device name (default: "DangerousPi")
|
||||
|
||||
**Integration**:
|
||||
- Sends notifications on UPS events
|
||||
- Sends notifications on update events
|
||||
- Extensible for custom notifications
|
||||
|
||||
**Testing**: Run `python3 test_ble.py`
|
||||
|
||||
---
|
||||
|
||||
### 3. Plugin Framework
|
||||
|
||||
**Location**: [app/backend/managers/plugin_manager.py](app/backend/managers/plugin_manager.py)
|
||||
|
||||
**Features**:
|
||||
- Dynamic plugin loading and unloading
|
||||
- Plugin lifecycle management (load, enable, disable, unload)
|
||||
- Plugin metadata system (JSON-based)
|
||||
- Hook system for extensibility
|
||||
- Plugin discovery from `/app/plugins` directory
|
||||
- Enable/disable individual plugins
|
||||
- Plugin dependency and permission management
|
||||
- Isolated plugin execution
|
||||
|
||||
**Base Plugin Class**:
|
||||
Plugins inherit from `PluginBase` and implement:
|
||||
- `on_load()` - Initialization
|
||||
- `on_enable()` - Start functionality
|
||||
- `on_disable()` - Stop functionality
|
||||
- `on_unload()` - Cleanup
|
||||
- `register_hook()` - Register event hooks
|
||||
|
||||
**API Endpoints**:
|
||||
- `GET /api/plugins/discover` - Discover available plugins
|
||||
- `GET /api/plugins/list` - List all plugins
|
||||
- `GET /api/plugins/{plugin_id}` - Get plugin info
|
||||
- `POST /api/plugins/enable` - Enable a plugin
|
||||
- `POST /api/plugins/disable` - Disable a plugin
|
||||
- `POST /api/plugins/load` - Load a plugin
|
||||
- `POST /api/plugins/unload` - Unload a plugin
|
||||
|
||||
**Example Plugin**: [app/plugins/hello_world](app/plugins/hello_world/)
|
||||
|
||||
**Plugin Structure**:
|
||||
```
|
||||
app/plugins/
|
||||
└── plugin_name/
|
||||
├── plugin.json # Metadata
|
||||
└── main.py # Implementation
|
||||
```
|
||||
|
||||
**Testing**: Run `python3 test_plugins.py`
|
||||
|
||||
---
|
||||
|
||||
### 4. Systemd Service Units
|
||||
|
||||
**Location**: [systemd/](systemd/)
|
||||
|
||||
**Files**:
|
||||
- `dangerous-pi.service` - Main systemd service unit
|
||||
- `dangerous-pi.env.example` - Environment configuration template
|
||||
- `install-service.sh` - Automated installation script
|
||||
- `uninstall-service.sh` - Automated uninstallation script
|
||||
- `README.md` - Complete service documentation
|
||||
|
||||
**Features**:
|
||||
- Automatic startup on boot
|
||||
- Graceful shutdown handling
|
||||
- Resource limits (memory, CPU, file descriptors)
|
||||
- Security hardening:
|
||||
- Runs as non-root user (pi)
|
||||
- Protected system directories
|
||||
- Private /tmp directory
|
||||
- No new privileges
|
||||
- Hardware access groups (i2c, bluetooth, gpio, dialout)
|
||||
- Restart policy on failure
|
||||
|
||||
**Installation**:
|
||||
```bash
|
||||
cd systemd
|
||||
sudo ./install-service.sh
|
||||
```
|
||||
|
||||
**Service Management**:
|
||||
```bash
|
||||
sudo systemctl start dangerous-pi
|
||||
sudo systemctl stop dangerous-pi
|
||||
sudo systemctl restart dangerous-pi
|
||||
sudo systemctl status dangerous-pi
|
||||
```
|
||||
|
||||
**Logs**:
|
||||
```bash
|
||||
sudo journalctl -u dangerous-pi -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Pi-gen Stage Scripts
|
||||
|
||||
**Location**: [pi-gen/stageDTPM3/04-dangerous-pi/](pi-gen/stageDTPM3/04-dangerous-pi/)
|
||||
|
||||
**Scripts**:
|
||||
- `00-run.sh` - Pre-chroot preparation (copies files)
|
||||
- `00-run-chroot.sh` - In-chroot installation
|
||||
- `01-run-chroot.sh` - Port conflict handling
|
||||
- `README.md` - Build integration documentation
|
||||
|
||||
**Build Integration**:
|
||||
The stage integrates Dangerous Pi into the pi-gen build process:
|
||||
1. Installs Python dependencies
|
||||
2. Copies application files to `/opt/dangerous-pi`
|
||||
3. Creates data and logs directories
|
||||
4. Installs systemd service
|
||||
5. Configures hardware access (I2C, Bluetooth, GPIO)
|
||||
6. Sets up environment configuration
|
||||
|
||||
**Customization**:
|
||||
Edit the scripts to:
|
||||
- Pre-configure port resolution
|
||||
- Change installation directory
|
||||
- Add additional dependencies
|
||||
- Customize default settings
|
||||
|
||||
---
|
||||
|
||||
### 6. Port Conflict Resolution
|
||||
|
||||
**Location**: [scripts/resolve-port-conflict.sh](scripts/resolve-port-conflict.sh)
|
||||
**Documentation**: [PORT_CONFLICT.md](PORT_CONFLICT.md)
|
||||
|
||||
**Conflict**:
|
||||
- ttyd-bash (existing) uses port 8000
|
||||
- Dangerous Pi (new) wants port 8000
|
||||
|
||||
**Resolution Options**:
|
||||
|
||||
**Option 1**: Disable ttyd-bash (Recommended)
|
||||
```bash
|
||||
sudo systemctl stop ttyd-bash
|
||||
sudo systemctl disable ttyd-bash
|
||||
```
|
||||
|
||||
**Option 2**: Change Dangerous Pi to port 8001
|
||||
```bash
|
||||
# Edit /opt/dangerous-pi/.env
|
||||
PORT=8001
|
||||
sudo systemctl restart dangerous-pi
|
||||
```
|
||||
|
||||
**Option 3**: Change ttyd-bash to port 8002
|
||||
```bash
|
||||
# Edit service file and change port
|
||||
sudo systemctl restart ttyd-bash
|
||||
```
|
||||
|
||||
**Automated Script**:
|
||||
```bash
|
||||
/opt/dangerous-pi/scripts/resolve-port-conflict.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
dangerous-pi/
|
||||
├── app/
|
||||
│ ├── backend/
|
||||
│ │ ├── main.py # FastAPI application
|
||||
│ │ ├── config.py # Configuration
|
||||
│ │ ├── api/ # REST endpoints
|
||||
│ │ │ ├── health.py
|
||||
│ │ │ ├── pm3.py
|
||||
│ │ │ ├── system.py
|
||||
│ │ │ ├── wifi.py
|
||||
│ │ │ ├── updates.py
|
||||
│ │ │ └── plugins.py # ✨ NEW
|
||||
│ │ ├── sse/ # Server-Sent Events
|
||||
│ │ │ └── events.py
|
||||
│ │ ├── workers/
|
||||
│ │ │ └── pm3_worker.py
|
||||
│ │ ├── managers/
|
||||
│ │ │ ├── session_manager.py
|
||||
│ │ │ ├── update_manager.py
|
||||
│ │ │ ├── wifi_manager.py
|
||||
│ │ │ ├── ups_manager.py # ✨ NEW
|
||||
│ │ │ ├── ble_manager.py # ✨ NEW
|
||||
│ │ │ └── plugin_manager.py # ✨ NEW
|
||||
│ │ └── models/
|
||||
│ │ └── database.py
|
||||
│ ├── frontend/ # Web UI
|
||||
│ └── plugins/ # ✨ NEW
|
||||
│ └── hello_world/ # Example plugin
|
||||
├── systemd/ # ✨ NEW
|
||||
│ ├── dangerous-pi.service
|
||||
│ ├── dangerous-pi.env.example
|
||||
│ ├── install-service.sh
|
||||
│ ├── uninstall-service.sh
|
||||
│ └── README.md
|
||||
├── scripts/ # ✨ NEW
|
||||
│ └── resolve-port-conflict.sh
|
||||
├── pi-gen/
|
||||
│ └── stageDTPM3/
|
||||
│ └── 04-dangerous-pi/ # ✨ NEW
|
||||
│ ├── 00-run.sh
|
||||
│ ├── 00-run-chroot.sh
|
||||
│ ├── 01-run-chroot.sh
|
||||
│ └── README.md
|
||||
├── requirements.txt # Updated with new deps
|
||||
├── test_ups.py # ✨ NEW
|
||||
├── test_ble.py # ✨ NEW
|
||||
├── test_plugins.py # ✨ NEW
|
||||
├── PORT_CONFLICT.md # ✨ NEW
|
||||
└── MVP_COMPLETE.md # This file
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencies Added
|
||||
|
||||
**Python Packages** (in requirements.txt):
|
||||
- `smbus2==0.4.3` - I2C communication for UPS
|
||||
|
||||
All other dependencies were already present.
|
||||
|
||||
**System Packages** (installed via pi-gen):
|
||||
All required packages are already in the base pi-pm3 image.
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Scripts Provided
|
||||
|
||||
1. **UPS Manager**: `python3 test_ups.py`
|
||||
2. **BLE Manager**: `python3 test_ble.py`
|
||||
3. **Plugin Manager**: `python3 test_plugins.py`
|
||||
4. **Backend API**: `python3 test_backend.py` (existing)
|
||||
|
||||
### Manual Testing
|
||||
|
||||
1. **Start the backend**:
|
||||
```bash
|
||||
python3 -m app.backend.main
|
||||
```
|
||||
|
||||
2. **Access API docs**: `http://localhost:8000/docs`
|
||||
|
||||
3. **Test endpoints**:
|
||||
```bash
|
||||
curl http://localhost:8000/api/health
|
||||
curl http://localhost:8000/api/system/ups/status
|
||||
curl http://localhost:8000/api/system/ble/status
|
||||
curl http://localhost:8000/api/plugins/list
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
All configurable via `/opt/dangerous-pi/.env`:
|
||||
|
||||
```bash
|
||||
# PM3
|
||||
PM3_DEVICE=/dev/ttyACM0
|
||||
PM3_TIMEOUT=30
|
||||
|
||||
# Server
|
||||
HOST=0.0.0.0
|
||||
PORT=8000
|
||||
VERSION=0.1.0
|
||||
|
||||
# Update Manager
|
||||
GITHUB_REPO=yourusername/dangerous-pi
|
||||
UPDATE_CHECK_INTERVAL=3600
|
||||
|
||||
# WiFi
|
||||
WLAN_INTERFACE=wlan0
|
||||
USB_WLAN_INTERFACE=wlan1
|
||||
|
||||
# UPS (NEW)
|
||||
UPS_I2C_ADDRESS=0x36
|
||||
UPS_CHECK_INTERVAL=60
|
||||
|
||||
# BLE (NEW)
|
||||
BLE_ENABLED=true
|
||||
BLE_DEVICE_NAME=DangerousPi
|
||||
|
||||
# Security
|
||||
AUTH_ENABLED=false
|
||||
HTTPS_ENABLED=false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integration Summary
|
||||
|
||||
### Backend Integration
|
||||
|
||||
All new managers are integrated into [app/backend/main.py](app/backend/main.py):
|
||||
|
||||
1. **UPS Manager**: Started in lifespan, event callbacks registered
|
||||
2. **BLE Manager**: Initialized and advertising started
|
||||
3. **Plugin Manager**: Discovers plugins on startup
|
||||
|
||||
### Event Flow
|
||||
|
||||
```
|
||||
UPS Event (Battery Low)
|
||||
↓
|
||||
UPS Manager triggers callback
|
||||
↓
|
||||
├─→ SSE Notification (notify_ups_warning)
|
||||
└─→ BLE Notification (send_notification)
|
||||
```
|
||||
|
||||
### API Integration
|
||||
|
||||
New endpoints added to system router:
|
||||
- `/api/system/ups/*` - UPS management
|
||||
- `/api/system/ble/*` - BLE management
|
||||
- `/api/plugins/*` - Plugin management
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations & Future Work
|
||||
|
||||
### Current Limitations
|
||||
|
||||
1. **UPS Manager**:
|
||||
- Assumes MAX17040-compatible fuel gauge
|
||||
- May need adjustment for different UPS HAT models
|
||||
- Temperature reading not implemented for all models
|
||||
|
||||
2. **BLE Manager**:
|
||||
- Basic notification system
|
||||
- Full GATT server implementation deferred
|
||||
- No bi-directional communication yet
|
||||
|
||||
3. **Plugin Framework**:
|
||||
- Appstore integration planned for future
|
||||
- No plugin signing/verification yet
|
||||
- Limited sandboxing
|
||||
|
||||
4. **Port Conflict**:
|
||||
- Manual resolution required
|
||||
- Auto-detection could be added
|
||||
|
||||
### Planned Enhancements
|
||||
|
||||
- Plugin appstore
|
||||
- Enhanced BLE GATT server
|
||||
- Auto port conflict resolution
|
||||
- More example plugins
|
||||
- Plugin dependency resolution
|
||||
- Plugin marketplace/repository
|
||||
|
||||
---
|
||||
|
||||
## Documentation
|
||||
|
||||
### Created Documentation Files
|
||||
|
||||
1. **systemd/README.md** - Service management guide
|
||||
2. **pi-gen/stageDTPM3/04-dangerous-pi/README.md** - Build integration
|
||||
3. **PORT_CONFLICT.md** - Port conflict resolution guide
|
||||
4. **MVP_COMPLETE.md** - This file
|
||||
|
||||
### Existing Documentation
|
||||
|
||||
- **claude.md** - Development guide (updated)
|
||||
- **README.md** - Project overview
|
||||
- **WIFI_MANAGER.md** - WiFi management guide
|
||||
- **UPDATE_MANAGER.md** - Update system guide
|
||||
|
||||
---
|
||||
|
||||
## Deployment
|
||||
|
||||
### For Development
|
||||
|
||||
1. Clone repository
|
||||
2. Install dependencies: `pip3 install -r requirements.txt`
|
||||
3. Run backend: `python3 -m app.backend.main`
|
||||
4. Access: `http://localhost:8000`
|
||||
|
||||
### For Production (Raspberry Pi)
|
||||
|
||||
**Option A - Manual Installation**:
|
||||
1. Copy files to `/opt/dangerous-pi`
|
||||
2. Run: `cd systemd && sudo ./install-service.sh`
|
||||
3. Configure: `sudo nano /opt/dangerous-pi/.env`
|
||||
4. Resolve port conflict: `/opt/dangerous-pi/scripts/resolve-port-conflict.sh`
|
||||
5. Start: `sudo systemctl start dangerous-pi`
|
||||
|
||||
**Option B - Pi-gen Image Build**:
|
||||
1. Customize pi-gen stage (optional)
|
||||
2. Run pi-gen build
|
||||
3. Flash image to SD card
|
||||
4. Boot and configure
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria - All Met ✅
|
||||
|
||||
- ✅ UPS monitoring with I2C communication
|
||||
- ✅ Safe shutdown on low battery
|
||||
- ✅ BLE notification system
|
||||
- ✅ Plugin framework with example plugin
|
||||
- ✅ Systemd service integration
|
||||
- ✅ Pi-gen build integration
|
||||
- ✅ Port conflict resolution
|
||||
- ✅ Comprehensive documentation
|
||||
- ✅ Test scripts for all new features
|
||||
- ✅ Event system integration (SSE + BLE)
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### Immediate
|
||||
|
||||
1. Test on actual Raspberry Pi Zero 2 W hardware
|
||||
2. Test with real UPS HAT
|
||||
3. Test BLE notifications with mobile device
|
||||
4. Create additional example plugins
|
||||
5. Frontend UI updates for new features
|
||||
|
||||
### Short Term
|
||||
|
||||
- Implement plugin marketplace
|
||||
- Add plugin signing/verification
|
||||
- Enhance BLE GATT server
|
||||
- Auto port detection and resolution
|
||||
- Additional UPS HAT model support
|
||||
|
||||
### Long Term
|
||||
|
||||
- Full plugin ecosystem
|
||||
- Mobile app for BLE notifications
|
||||
- Advanced power management
|
||||
- Cloud integration (optional)
|
||||
|
||||
---
|
||||
|
||||
## Credits
|
||||
|
||||
**Dangerous Pi MVP Implementation**
|
||||
Built on the existing pi-pm3 project foundation
|
||||
|
||||
**Technologies Used**:
|
||||
- FastAPI - Web framework
|
||||
- Python asyncio - Asynchronous programming
|
||||
- smbus2 - I2C communication
|
||||
- BlueZ - Bluetooth stack
|
||||
- systemd - Service management
|
||||
- pi-gen - Raspberry Pi image builder
|
||||
|
||||
---
|
||||
|
||||
**MVP Status**: ✅ **COMPLETE**
|
||||
**Date**: 2025-11-26
|
||||
**Version**: 0.1.0
|
||||
Reference in New Issue
Block a user