diff --git a/CHANGELOG.md b/CHANGELOG.md index 74c07be..1f2c177 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,56 @@ All notable changes to iNTERCEPT will be documented in this file. +## [2.11.0] - 2026-01-28 + +### Added +- **Meshtastic Mesh Network Integration** - LoRa mesh communication support + - Connect to Meshtastic devices (Heltec, T-Beam, RAK) via USB/Serial + - Real-time message streaming via SSE + - Channel configuration with encryption key support + - Node information display with signal metrics (RSSI, SNR) + - Message history with up to 500 messages +- **Ubertooth One BLE Scanner** - Advanced Bluetooth scanning + - Passive BLE packet capture across all 40 BLE channels + - Raw advertising payload access + - Integration with existing Bluetooth scanning modes + - Automatic detection of Ubertooth hardware +- **Offline Mode** - Run iNTERCEPT without internet connectivity + - Bundled Leaflet 1.9.4 (JS, CSS, marker images) + - Bundled Chart.js 4.4.1 + - Bundled Inter and JetBrains Mono fonts (woff2) + - Local asset status checking and validation +- **Settings Modal** - New configuration interface accessible from navigation + - Offline tab: Toggle offline mode, configure asset sources + - Display tab: Theme and animation preferences + - About tab: Version info and links +- **Multiple Map Tile Providers** - Choose from: + - OpenStreetMap (default) + - CartoDB Dark + - CartoDB Positron (light) + - ESRI World Imagery + - Custom tile server URL + +### Changed +- **Dashboard Templates** - Conditional asset loading based on offline settings +- **Bluetooth Scanner** - Added Ubertooth backend alongside BlueZ/DBus +- **Dependencies** - Added meshtastic SDK to requirements.txt + +### Technical +- Added `routes/meshtastic.py` for Meshtastic API endpoints +- Added `utils/meshtastic.py` for device management +- Added `utils/bluetooth/ubertooth_scanner.py` for Ubertooth support +- Added `routes/offline.py` for offline mode API +- Added `static/js/core/settings-manager.js` for client-side settings +- Added `static/css/settings.css` for settings modal styles +- Added `static/css/modes/meshtastic.css` for Meshtastic UI +- Added `static/js/modes/meshtastic.js` for Meshtastic frontend +- Added `templates/partials/modes/meshtastic.html` for Meshtastic mode +- Added `templates/partials/settings-modal.html` for settings UI +- Added `static/vendor/` directory structure for bundled assets + +--- + ## [2.10.0] - 2026-01-25 ### Added diff --git a/README.md b/README.md index e1d6292..787d5c1 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,11 @@ Support the developer of this open-source project - **Satellite Tracking** - Pass prediction using TLE data - **ADS-B History** - Persistent aircraft history with reporting dashboard (Postgres optional) - **WiFi Scanning** - Monitor mode reconnaissance via aircrack-ng -- **Bluetooth Scanning** - Device discovery and tracker detection +- **Bluetooth Scanning** - Device discovery and tracker detection (with Ubertooth support) +- **Meshtastic** - LoRa mesh network integration - **Spy Stations** - Number stations and diplomatic HF network database - **Remote Agents** - Distributed SIGINT with remote sensor nodes +- **Offline Mode** - Bundled assets for air-gapped/field deployments --- diff --git a/app.py b/app.py index 01ca753..f78ad50 100644 --- a/app.py +++ b/app.py @@ -91,6 +91,25 @@ def add_security_headers(response): return response +# ============================================ +# CONTEXT PROCESSORS +# ============================================ + +@app.context_processor +def inject_offline_settings(): + """Inject offline settings into all templates.""" + from utils.database import get_setting + return { + 'offline_settings': { + 'enabled': get_setting('offline.enabled', False), + 'assets_source': get_setting('offline.assets_source', 'cdn'), + 'fonts_source': get_setting('offline.fonts_source', 'cdn'), + 'tile_provider': get_setting('offline.tile_provider', 'openstreetmap'), + 'tile_server_url': get_setting('offline.tile_server_url', '') + } + } + + # ============================================ # GLOBAL PROCESS MANAGEMENT # ============================================ diff --git a/config.py b/config.py index 3fc19fe..18c9280 100644 --- a/config.py +++ b/config.py @@ -7,10 +7,20 @@ import os import sys # Application version -VERSION = "2.10.0" +VERSION = "2.11.0" # Changelog - latest release notes (shown on welcome screen) CHANGELOG = [ + { + "version": "2.11.0", + "date": "January 2026", + "highlights": [ + "Meshtastic LoRa mesh network integration", + "Ubertooth One BLE scanning support", + "Offline mode with bundled assets", + "Settings modal with tile provider configuration", + ] + }, { "version": "2.10.0", "date": "January 2026", @@ -126,18 +136,18 @@ AIRODUMP_HEADER_LINES = _get_env_int('AIRODUMP_HEADER_LINES', 2) BT_SCAN_TIMEOUT = _get_env_int('BT_SCAN_TIMEOUT', 10) BT_UPDATE_INTERVAL = _get_env_float('BT_UPDATE_INTERVAL', 2.0) -# ADS-B settings -ADSB_SBS_PORT = _get_env_int('ADSB_SBS_PORT', 30003) -ADSB_UPDATE_INTERVAL = _get_env_float('ADSB_UPDATE_INTERVAL', 1.0) -ADSB_HISTORY_ENABLED = _get_env_bool('ADSB_HISTORY_ENABLED', False) -ADSB_DB_HOST = _get_env('ADSB_DB_HOST', 'localhost') -ADSB_DB_PORT = _get_env_int('ADSB_DB_PORT', 5432) -ADSB_DB_NAME = _get_env('ADSB_DB_NAME', 'intercept_adsb') -ADSB_DB_USER = _get_env('ADSB_DB_USER', 'intercept') -ADSB_DB_PASSWORD = _get_env('ADSB_DB_PASSWORD', 'intercept') -ADSB_HISTORY_BATCH_SIZE = _get_env_int('ADSB_HISTORY_BATCH_SIZE', 500) -ADSB_HISTORY_FLUSH_INTERVAL = _get_env_float('ADSB_HISTORY_FLUSH_INTERVAL', 1.0) -ADSB_HISTORY_QUEUE_SIZE = _get_env_int('ADSB_HISTORY_QUEUE_SIZE', 50000) +# ADS-B settings +ADSB_SBS_PORT = _get_env_int('ADSB_SBS_PORT', 30003) +ADSB_UPDATE_INTERVAL = _get_env_float('ADSB_UPDATE_INTERVAL', 1.0) +ADSB_HISTORY_ENABLED = _get_env_bool('ADSB_HISTORY_ENABLED', False) +ADSB_DB_HOST = _get_env('ADSB_DB_HOST', 'localhost') +ADSB_DB_PORT = _get_env_int('ADSB_DB_PORT', 5432) +ADSB_DB_NAME = _get_env('ADSB_DB_NAME', 'intercept_adsb') +ADSB_DB_USER = _get_env('ADSB_DB_USER', 'intercept') +ADSB_DB_PASSWORD = _get_env('ADSB_DB_PASSWORD', 'intercept') +ADSB_HISTORY_BATCH_SIZE = _get_env_int('ADSB_HISTORY_BATCH_SIZE', 500) +ADSB_HISTORY_FLUSH_INTERVAL = _get_env_float('ADSB_HISTORY_FLUSH_INTERVAL', 1.0) +ADSB_HISTORY_QUEUE_SIZE = _get_env_int('ADSB_HISTORY_QUEUE_SIZE', 50000) # Satellite settings SATELLITE_UPDATE_INTERVAL = _get_env_int('SATELLITE_UPDATE_INTERVAL', 30) diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 5c53cdb..690cbfb 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -165,6 +165,49 @@ Technical Surveillance Countermeasures (TSCM) screening for detecting wireless s - No cryptographic de-randomization - Passive screening only (no active probing by default) +## Meshtastic Mesh Networks + +Integration with Meshtastic LoRa mesh networking devices for decentralized communication. + +### Device Support +- **Heltec** - LoRa32 series +- **T-Beam** - TTGO T-Beam with GPS +- **RAK** - WisBlock series +- Any Meshtastic-compatible device via USB/Serial + +### Features +- **Real-time messaging** - Stream messages as they arrive +- **Channel configuration** - Set encryption keys and channel names +- **Node information** - View connected nodes with signal metrics +- **Message history** - Up to 500 messages retained +- **Signal quality** - RSSI and SNR for each message +- **Hop tracking** - See message hop count + +### Requirements +- Physical Meshtastic device connected via USB +- Meshtastic Python SDK (`pip install meshtastic`) + +## Ubertooth One BLE Scanning + +Advanced Bluetooth Low Energy scanning using Ubertooth One hardware. + +### Capabilities +- **40-channel scanning** - Capture BLE advertisements across all channels +- **Raw payload access** - Full advertising data for analysis +- **Passive sniffing** - No active scanning required +- **MAC address extraction** - Public and random address types +- **RSSI measurement** - Signal strength for proximity estimation + +### Integration +- Works alongside standard BlueZ/DBus Bluetooth scanning +- Automatically detected when ubertooth-btle is available +- Falls back to standard adapter if Ubertooth not present + +### Requirements +- Ubertooth One hardware +- ubertooth-btle command-line tool installed +- libubertooth library + ## Remote Agents (Distributed SIGINT) Deploy lightweight sensor nodes across multiple locations and aggregate data to a central controller. @@ -215,6 +258,42 @@ Deploy lightweight sensor nodes across multiple locations and aggregate data to | ? | Open help (when not typing) | | Escape | Close help/modals | +## Offline Mode + +Run iNTERCEPT without internet connectivity by using bundled local assets. + +### Bundled Assets +- **Leaflet 1.9.4** - Map library with marker images +- **Chart.js 4.4.1** - Signal strength graphs +- **Inter font** - Primary UI font (400, 500, 600, 700 weights) +- **JetBrains Mono font** - Monospace/code font (400, 500, 600, 700 weights) + +### Settings Modal +Access via the gear icon in the navigation bar: +- **Offline Tab** - Toggle offline mode, configure asset sources (CDN vs local) +- **Display Tab** - Theme and animation preferences +- **About Tab** - Version info and links + +### Map Tile Providers +Choose from multiple tile sources for maps: +- **OpenStreetMap** - Default, general purpose +- **CartoDB Dark** - Dark themed, matches UI +- **CartoDB Positron** - Light themed +- **ESRI World Imagery** - Satellite imagery +- **Custom URL** - Connect to your own tile server (e.g., local OpenStreetMap tile cache) + +### Local Asset Status +The settings modal shows availability status for each bundled asset: +- Green "Available" badge when asset is present +- Red "Missing" badge when asset is not found +- Click "Check Assets" to refresh status + +### Use Cases +- **Air-gapped environments** - Run on isolated networks +- **Field deployments** - Operate without reliable internet +- **Local tile servers** - Use pre-cached map tiles for specific regions +- **Reduced latency** - Faster loading with local assets + ## General - **Web-based interface** - no desktop app needed diff --git a/docs/index.html b/docs/index.html index e501c9b..6733fbc 100644 --- a/docs/index.html +++ b/docs/index.html @@ -130,6 +130,18 @@
Distributed signal intelligence with remote sensor nodes. Deploy agents across multiple locations and aggregate data to a central controller.
+ +Run without internet using bundled assets. Choose from multiple map tile providers or use your own local tile server.
+LoRa mesh network integration. Connect to Meshtastic devices for decentralized, long-range communication monitoring.
+No channels configured
'; + return; + } + + container.innerHTML = channels.map(ch => { + const isDisabled = !ch.name && ch.role === 'DISABLED'; + const roleBadge = ch.role === 'PRIMARY' ? 'mesh-badge-primary' : 'mesh-badge-secondary'; + const encBadge = ch.encrypted ? 'mesh-badge-encrypted' : 'mesh-badge-unencrypted'; + const encText = ch.encrypted ? (ch.psk_length === 32 ? 'AES-256' : ch.psk_length === 16 ? 'AES-128' : 'ENCRYPTED') : 'NONE'; + + return ` +