chore: bump version to 2.27.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
James Smith
2026-05-20 22:08:42 +01:00
parent a3f2fa7b88
commit ea8f72f7ff
3 changed files with 149 additions and 118 deletions
+22
View File
@@ -2,6 +2,28 @@
All notable changes to iNTERCEPT will be documented in this file. All notable changes to iNTERCEPT will be documented in this file.
## [2.27.0] - 2026-05-20
### Fixed
- **Two-window hang** — Opening the app in two browser tabs/windows caused it to become completely unresponsive. Root cause: HTTP/1.1 limits browsers to 6 connections per origin (shared across all tabs). VoiceAlerts was automatically opening 3 SSE streams per window on page load, so two windows produced 8 persistent connections and permanently blocked all regular HTTP requests. VoiceAlerts streams are now opt-in (disabled by default); users can enable them in settings.
- **Alert messages split between windows** — The `/alerts/stream` SSE endpoint read from a single queue, so two windows would each receive only half the alerts. Now uses `sse_stream_fanout` so every window gets every alert.
- **Bluetooth v2 stream split between windows** — Same single-queue issue in `/api/bluetooth/stream`. Fixed with fanout via `subscribe_fanout_queue`, preserving named SSE events (`device_update`, `scan_started`, etc.).
- **ICAO lookup cache unbounded growth** — `_looked_up_icaos` set was never evicted; capped at 50 000 entries with LRU eviction to prevent memory growth under sustained ADS-B load.
- **Concurrent ICAO clear race** — `popitem()` on the ICAO dict could raise `RuntimeError` if a clear happened concurrently; guarded with try/except.
- **Bluetooth tracker fingerprint stability** — Tracker signature scan was incorrectly resetting stability counters on unchanged payloads; now skips the scan when the BLE payload fingerprint is unchanged.
### Added
- **UI Tier system** — Three display modes selectable from the nav bar: *Lean* (minimal, no decorative elements), *Standard* (default), and *Enhanced* (full animations and ambient effects). Replaces the old animations toggle.
- **Display mode in first-run setup** — The first-run modal now includes a display mode selection step so new users can pick their preferred visual style during initial setup.
### Performance
- ADS-B SSE snapshot priming moved inside the response generator (avoids blocking before headers are sent).
- WiFi network filter combined into a single list pass instead of chained filters.
- Bluetooth tracker signature scan skips processing when the BLE payload fingerprint is unchanged.
- `DataStore` cleanup minimises lock hold time by collecting expired keys before acquiring the write lock.
---
## [2.26.11] - 2026-03-14 ## [2.26.11] - 2026-03-14
### Fixed ### Fixed
+126 -117
View File
@@ -7,10 +7,23 @@ import os
import sys import sys
# Application version # Application version
VERSION = "2.26.13" VERSION = "2.27.0"
# Changelog - latest release notes (shown on welcome screen) # Changelog - latest release notes (shown on welcome screen)
CHANGELOG = [ CHANGELOG = [
{
"version": "2.27.0",
"date": "May 2026",
"highlights": [
"Fix: two-window hang caused by browser HTTP/1.1 connection pool exhaustion",
"Fix: SSE alert and Bluetooth streams now fan out to all windows (no more split messages)",
"Feat: UI tier system — lean, standard, enhanced display modes via nav toggle",
"Feat: first-run setup modal includes display mode selection",
"Perf: ADS-B SSE snapshot priming moved into generator; WiFi filter combined into single pass",
"Perf: Bluetooth tracker signature scan skips unchanged fingerprints",
"Fix: ICAO lookup cache capped at 50k entries with LRU eviction",
],
},
{ {
"version": "2.26.13", "version": "2.26.13",
"date": "March 2026", "date": "March 2026",
@@ -22,70 +35,70 @@ CHANGELOG = [
"Satellite tracker: TLE auto-refresh, polar plot fixes, pass calculation improvements", "Satellite tracker: TLE auto-refresh, polar plot fixes, pass calculation improvements",
"Fix weather satellite handoff (remove defunct METEOR-M2)", "Fix weather satellite handoff (remove defunct METEOR-M2)",
"Add multi-arch Docker CI workflow (amd64 + arm64)", "Add multi-arch Docker CI workflow (amd64 + arm64)",
] ],
}, },
{ {
"version": "2.26.12", "version": "2.26.12",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"AIS and ADS-B dashboards now use configured observer position from .env", "AIS and ADS-B dashboards now use configured observer position from .env",
] ],
}, },
{ {
"version": "2.26.11", "version": "2.26.11",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"APRS map now centres on configured observer position from .env", "APRS map now centres on configured observer position from .env",
] ],
}, },
{ {
"version": "2.26.8", "version": "2.26.8",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix acarsdec build failure on macOS (HOST_NAME_MAX undefined)", "Fix acarsdec build failure on macOS (HOST_NAME_MAX undefined)",
] ],
}, },
{ {
"version": "2.26.7", "version": "2.26.7",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix health check SDR detection on macOS (timeout command not available)", "Fix health check SDR detection on macOS (timeout command not available)",
] ],
}, },
{ {
"version": "2.26.6", "version": "2.26.6",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix oversized branded 'i' logo on Aircraft & Vessel dashboards", "Fix oversized branded 'i' logo on Aircraft & Vessel dashboards",
] ],
}, },
{ {
"version": "2.26.5", "version": "2.26.5",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix database errors crashing the entire UI — pages now degrade gracefully", "Fix database errors crashing the entire UI — pages now degrade gracefully",
] ],
}, },
{ {
"version": "2.26.4", "version": "2.26.4",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix Environment Configurator crash when .env exists but variable is missing", "Fix Environment Configurator crash when .env exists but variable is missing",
] ],
}, },
{ {
"version": "2.26.3", "version": "2.26.3",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix SatDump AVX2 crash on older CPUs — build now targets baseline x86-64", "Fix SatDump AVX2 crash on older CPUs — build now targets baseline x86-64",
] ],
}, },
{ {
"version": "2.26.2", "version": "2.26.2",
"date": "March 2026", "date": "March 2026",
"highlights": [ "highlights": [
"Fix Docker startup crash — data/ Python package was excluded by .dockerignore", "Fix Docker startup crash — data/ Python package was excluded by .dockerignore",
] ],
}, },
{ {
"version": "2.26.1", "version": "2.26.1",
@@ -93,7 +106,7 @@ CHANGELOG = [
"highlights": [ "highlights": [
"Fix default admin credentials — now matches README (admin:admin)", "Fix default admin credentials — now matches README (admin:admin)",
"Admin password changes in config.py / env vars now sync to DB on restart", "Admin password changes in config.py / env vars now sync to DB on restart",
] ],
}, },
{ {
"version": "2.26.0", "version": "2.26.0",
@@ -101,7 +114,7 @@ CHANGELOG = [
"highlights": [ "highlights": [
"Fix SSE fanout thread crash when source queue is None during shutdown", "Fix SSE fanout thread crash when source queue is None during shutdown",
"Fix branded 'i' logo FOUC (flash of unstyled content) on first page load", "Fix branded 'i' logo FOUC (flash of unstyled content) on first page load",
] ],
}, },
{ {
"version": "2.25.0", "version": "2.25.0",
@@ -112,7 +125,7 @@ CHANGELOG = [
"Destructive action confirmation modals replace native confirm() dialogs", "Destructive action confirmation modals replace native confirm() dialogs",
"CSS variable adoption, inline style extraction, and reduced !important usage", "CSS variable adoption, inline style extraction, and reduced !important usage",
"Loading button states, actionable error reporting, and mobile UX polish", "Loading button states, actionable error reporting, and mobile UX polish",
] ],
}, },
{ {
"version": "2.24.0", "version": "2.24.0",
@@ -122,7 +135,7 @@ CHANGELOG = [
"Mobile navigation reorganized into labeled groups for better usability", "Mobile navigation reorganized into labeled groups for better usability",
"flask-limiter made optional for graceful degradation", "flask-limiter made optional for graceful degradation",
"Radiosonde setup fix — missing semver dependency", "Radiosonde setup fix — missing semver dependency",
] ],
}, },
{ {
"version": "2.23.0", "version": "2.23.0",
@@ -138,7 +151,7 @@ CHANGELOG = [
"GPS mode upgraded to textured 3D globe", "GPS mode upgraded to textured 3D globe",
"Destroy lifecycle added to all mode modules to prevent resource leaks", "Destroy lifecycle added to all mode modules to prevent resource leaks",
"Dozens of bug fixes across ADS-B, APRS, SSE, Morse, waterfall, and more", "Dozens of bug fixes across ADS-B, APRS, SSE, Morse, waterfall, and more",
] ],
}, },
{ {
"version": "2.22.3", "version": "2.22.3",
@@ -149,7 +162,7 @@ CHANGELOG = [
"Waterfall monitor audio no longer takes minutes to start — playback detection now waits for real audio data instead of just the WAV header", "Waterfall monitor audio no longer takes minutes to start — playback detection now waits for real audio data instead of just the WAV header",
"Waterfall monitor stop is now instant — audio pauses and UI updates immediately instead of waiting for backend cleanup", "Waterfall monitor stop is now instant — audio pauses and UI updates immediately instead of waiting for backend cleanup",
"Stopping the waterfall no longer shows a stale 'WebSocket closed before ready' message", "Stopping the waterfall no longer shows a stale 'WebSocket closed before ready' message",
] ],
}, },
{ {
"version": "2.22.1", "version": "2.22.1",
@@ -167,7 +180,7 @@ CHANGELOG = [
"WebSDR major overhaul with improved receiver management and audio streaming", "WebSDR major overhaul with improved receiver management and audio streaming",
"Documentation audit: fixed license, tool names, entry points, and SSTV decoder references", "Documentation audit: fixed license, tool names, entry points, and SSTV decoder references",
"Help modal updated with ACARS and VDL2 mode descriptions", "Help modal updated with ACARS and VDL2 mode descriptions",
] ],
}, },
{ {
"version": "2.21.1", "version": "2.21.1",
@@ -176,7 +189,7 @@ CHANGELOG = [
"BT Locate map first-load fix with render stabilization retries during initial mode open", "BT Locate map first-load fix with render stabilization retries during initial mode open",
"BT Locate trail restore optimization for faster startup when historical GPS points exist", "BT Locate trail restore optimization for faster startup when historical GPS points exist",
"BT Locate mode-switch map invalidation timing fix to prevent delayed/blank map render", "BT Locate mode-switch map invalidation timing fix to prevent delayed/blank map render",
] ],
}, },
{ {
"version": "2.21.0", "version": "2.21.0",
@@ -188,7 +201,7 @@ CHANGELOG = [
"Bluetooth/WiFi runtime health fixes with BT Locate continuity and confidence improvements", "Bluetooth/WiFi runtime health fixes with BT Locate continuity and confidence improvements",
"ADS-B/VDL2 streaming reliability upgrades for multi-client SSE fanout and remote decoding", "ADS-B/VDL2 streaming reliability upgrades for multi-client SSE fanout and remote decoding",
"Analytics enhancements with operational insights and temporal pattern panels", "Analytics enhancements with operational insights and temporal pattern panels",
] ],
}, },
{ {
"version": "2.20.0", "version": "2.20.0",
@@ -199,7 +212,7 @@ CHANGELOG = [
"HF band conditions, D-RAP absorption maps, aurora forecast, and solar imagery", "HF band conditions, D-RAP absorption maps, aurora forecast, and solar imagery",
"NOAA Space Weather Scales (G/S/R), flare probability, and active solar regions", "NOAA Space Weather Scales (G/S/R), flare probability, and active solar regions",
"No SDR hardware required — all data from public APIs with server-side caching", "No SDR hardware required — all data from public APIs with server-side caching",
] ],
}, },
{ {
"version": "2.19.0", "version": "2.19.0",
@@ -212,7 +225,7 @@ CHANGELOG = [
"Setup script overhauled for reliability and macOS compatibility", "Setup script overhauled for reliability and macOS compatibility",
"GPS fix for preserving satellites across DOP-only SKY messages", "GPS fix for preserving satellites across DOP-only SKY messages",
"Fix gpsd deadlock causing GPS connect to hang", "Fix gpsd deadlock causing GPS connect to hang",
] ],
}, },
{ {
"version": "2.18.0", "version": "2.18.0",
@@ -224,7 +237,7 @@ CHANGELOG = [
"ADS-B: stale dump1090 process cleanup via PID file tracking", "ADS-B: stale dump1090 process cleanup via PID file tracking",
"GPS: error state indicator and UI refinements", "GPS: error state indicator and UI refinements",
"Proximity radar and signal card UI improvements", "Proximity radar and signal card UI improvements",
] ],
}, },
{ {
"version": "2.17.0", "version": "2.17.0",
@@ -234,7 +247,7 @@ CHANGELOG = [
"IRK auto-detection: extract Identity Resolving Keys from paired devices (macOS/Linux)", "IRK auto-detection: extract Identity Resolving Keys from paired devices (macOS/Linux)",
"GPS mode: real-time position tracking with live map, speed, altitude, and satellite info", "GPS mode: real-time position tracking with live map, speed, altitude, and satellite info",
"Bluetooth scanner lifecycle fix for bleak scan timeout tracking", "Bluetooth scanner lifecycle fix for bleak scan timeout tracking",
] ],
}, },
{ {
"version": "2.16.0", "version": "2.16.0",
@@ -246,7 +259,7 @@ CHANGELOG = [
"Shared waterfall UI across SDR modes", "Shared waterfall UI across SDR modes",
"Listening post audio stuttering fix and SDR race condition fixes", "Listening post audio stuttering fix and SDR race condition fixes",
"Multi-arch Docker build support (amd64 + arm64)", "Multi-arch Docker build support (amd64 + arm64)",
] ],
}, },
{ {
"version": "2.15.0", "version": "2.15.0",
@@ -258,7 +271,7 @@ CHANGELOG = [
"Real-time signal scope for pager, sensor, and SSTV modes", "Real-time signal scope for pager, sensor, and SSTV modes",
"USB-level device probe to prevent cryptic rtl_fm crashes", "USB-level device probe to prevent cryptic rtl_fm crashes",
"SDR device lock-up fix from unreleased device registry on crash", "SDR device lock-up fix from unreleased device registry on crash",
] ],
}, },
{ {
"version": "2.14.0", "version": "2.14.0",
@@ -269,7 +282,7 @@ CHANGELOG = [
"Listening Post signal scanner and audio pipeline improvements", "Listening Post signal scanner and audio pipeline improvements",
"TSCM sweep resilience, WiFi detection, and correlation fixes", "TSCM sweep resilience, WiFi detection, and correlation fixes",
"APRS rtl_fm startup and SDR device conflict fixes", "APRS rtl_fm startup and SDR device conflict fixes",
] ],
}, },
{ {
"version": "2.13.1", "version": "2.13.1",
@@ -281,7 +294,7 @@ CHANGELOG = [
"WiFi connected clients panel now filters to selected AP", "WiFi connected clients panel now filters to selected AP",
"Global navigation bar across all dashboards", "Global navigation bar across all dashboards",
"Fixed USB device contention when starting audio pipeline", "Fixed USB device contention when starting audio pipeline",
] ],
}, },
{ {
"version": "2.13.0", "version": "2.13.0",
@@ -291,7 +304,7 @@ CHANGELOG = [
"Help modal system with keyboard shortcuts reference", "Help modal system with keyboard shortcuts reference",
"Global navbar and settings modal accessible from all dashboards", "Global navbar and settings modal accessible from all dashboards",
"Probed SSID badges for connected clients", "Probed SSID badges for connected clients",
] ],
}, },
{ {
"version": "2.12.1", "version": "2.12.1",
@@ -302,7 +315,7 @@ CHANGELOG = [
"Real-time Doppler tracking for ISS SSTV reception", "Real-time Doppler tracking for ISS SSTV reception",
"TCP connection support for Meshtastic", "TCP connection support for Meshtastic",
"Shared observer location with auto-start options", "Shared observer location with auto-start options",
] ],
}, },
{ {
"version": "2.12.0", "version": "2.12.0",
@@ -312,7 +325,7 @@ CHANGELOG = [
"GitHub update notifications for new releases", "GitHub update notifications for new releases",
"Meshtastic QR code support and telemetry display", "Meshtastic QR code support and telemetry display",
"New Space category with reorganized UI", "New Space category with reorganized UI",
] ],
}, },
{ {
"version": "2.11.0", "version": "2.11.0",
@@ -322,7 +335,7 @@ CHANGELOG = [
"Ubertooth One BLE scanning support", "Ubertooth One BLE scanning support",
"Offline mode with bundled assets", "Offline mode with bundled assets",
"Settings modal with tile provider configuration", "Settings modal with tile provider configuration",
] ],
}, },
{ {
"version": "2.10.0", "version": "2.10.0",
@@ -332,7 +345,7 @@ CHANGELOG = [
"Spy Stations database (number stations & diplomatic HF)", "Spy Stations database (number stations & diplomatic HF)",
"MMSI country identification and distress alert overlays", "MMSI country identification and distress alert overlays",
"SDR device conflict detection for AIS/DSC", "SDR device conflict detection for AIS/DSC",
] ],
}, },
{ {
"version": "2.9.5", "version": "2.9.5",
@@ -342,7 +355,7 @@ CHANGELOG = [
"Clickable score cards and device detail expansion", "Clickable score cards and device detail expansion",
"RF scanning improvements with status feedback", "RF scanning improvements with status feedback",
"Root privilege check and warning display", "Root privilege check and warning display",
] ],
}, },
{ {
"version": "2.9.0", "version": "2.9.0",
@@ -352,7 +365,7 @@ CHANGELOG = [
"TSCM baseline recording now captures device data", "TSCM baseline recording now captures device data",
"Device identity engine integration for threat detection", "Device identity engine integration for threat detection",
"Welcome screen with mode selection", "Welcome screen with mode selection",
] ],
}, },
{ {
"version": "2.8.0", "version": "2.8.0",
@@ -362,20 +375,20 @@ CHANGELOG = [
"WiFi/Bluetooth device correlation engine", "WiFi/Bluetooth device correlation engine",
"Tracker detection (AirTag, Tile, SmartTag)", "Tracker detection (AirTag, Tile, SmartTag)",
"Risk scoring and threat classification", "Risk scoring and threat classification",
] ],
}, },
] ]
def _get_env(key: str, default: str) -> str: def _get_env(key: str, default: str) -> str:
"""Get environment variable with default.""" """Get environment variable with default."""
return os.environ.get(f'INTERCEPT_{key}', default) return os.environ.get(f"INTERCEPT_{key}", default)
def _get_env_int(key: str, default: int) -> int: def _get_env_int(key: str, default: int) -> int:
"""Get environment variable as integer with default.""" """Get environment variable as integer with default."""
try: try:
return int(os.environ.get(f'INTERCEPT_{key}', str(default))) return int(os.environ.get(f"INTERCEPT_{key}", str(default)))
except ValueError: except ValueError:
return default return default
@@ -383,134 +396,130 @@ def _get_env_int(key: str, default: int) -> int:
def _get_env_float(key: str, default: float) -> float: def _get_env_float(key: str, default: float) -> float:
"""Get environment variable as float with default.""" """Get environment variable as float with default."""
try: try:
return float(os.environ.get(f'INTERCEPT_{key}', str(default))) return float(os.environ.get(f"INTERCEPT_{key}", str(default)))
except ValueError: except ValueError:
return default return default
def _get_env_bool(key: str, default: bool) -> bool: def _get_env_bool(key: str, default: bool) -> bool:
"""Get environment variable as boolean with default.""" """Get environment variable as boolean with default."""
val = os.environ.get(f'INTERCEPT_{key}', '').lower() val = os.environ.get(f"INTERCEPT_{key}", "").lower()
if val in ('true', '1', 'yes', 'on'): if val in ("true", "1", "yes", "on"):
return True return True
if val in ('false', '0', 'no', 'off'): if val in ("false", "0", "no", "off"):
return False return False
return default return default
# Logging configuration # Logging configuration
_log_level_str = _get_env('LOG_LEVEL', 'WARNING').upper() _log_level_str = _get_env("LOG_LEVEL", "WARNING").upper()
LOG_LEVEL = getattr(logging, _log_level_str, logging.WARNING) LOG_LEVEL = getattr(logging, _log_level_str, logging.WARNING)
LOG_FORMAT = _get_env('LOG_FORMAT', '%(asctime)s - %(levelname)s - %(message)s') LOG_FORMAT = _get_env("LOG_FORMAT", "%(asctime)s - %(levelname)s - %(message)s")
# Server settings # Server settings
HOST = _get_env('HOST', '0.0.0.0') HOST = _get_env("HOST", "0.0.0.0")
PORT = _get_env_int('PORT', 5050) PORT = _get_env_int("PORT", 5050)
DEBUG = _get_env_bool('DEBUG', False) DEBUG = _get_env_bool("DEBUG", False)
THREADED = _get_env_bool('THREADED', True) THREADED = _get_env_bool("THREADED", True)
# HTTPS / SSL settings # HTTPS / SSL settings
HTTPS = _get_env_bool('HTTPS', False) HTTPS = _get_env_bool("HTTPS", False)
SSL_CERT = _get_env('SSL_CERT', '') SSL_CERT = _get_env("SSL_CERT", "")
SSL_KEY = _get_env('SSL_KEY', '') SSL_KEY = _get_env("SSL_KEY", "")
# Default RTL-SDR settings # Default RTL-SDR settings
DEFAULT_GAIN = _get_env('DEFAULT_GAIN', '40') DEFAULT_GAIN = _get_env("DEFAULT_GAIN", "40")
DEFAULT_DEVICE = _get_env('DEFAULT_DEVICE', '0') DEFAULT_DEVICE = _get_env("DEFAULT_DEVICE", "0")
# Pager defaults # Pager defaults
DEFAULT_PAGER_FREQ = _get_env('PAGER_FREQ', '929.6125M') DEFAULT_PAGER_FREQ = _get_env("PAGER_FREQ", "929.6125M")
# Timeouts # Timeouts
PROCESS_TIMEOUT = _get_env_int('PROCESS_TIMEOUT', 5) PROCESS_TIMEOUT = _get_env_int("PROCESS_TIMEOUT", 5)
SOCKET_TIMEOUT = _get_env_int('SOCKET_TIMEOUT', 5) SOCKET_TIMEOUT = _get_env_int("SOCKET_TIMEOUT", 5)
SSE_TIMEOUT = _get_env_int('SSE_TIMEOUT', 1) SSE_TIMEOUT = _get_env_int("SSE_TIMEOUT", 1)
# WiFi settings # WiFi settings
WIFI_UPDATE_INTERVAL = _get_env_float('WIFI_UPDATE_INTERVAL', 2.0) WIFI_UPDATE_INTERVAL = _get_env_float("WIFI_UPDATE_INTERVAL", 2.0)
AIRODUMP_HEADER_LINES = _get_env_int('AIRODUMP_HEADER_LINES', 2) AIRODUMP_HEADER_LINES = _get_env_int("AIRODUMP_HEADER_LINES", 2)
# Bluetooth settings # Bluetooth settings
BT_SCAN_TIMEOUT = _get_env_int('BT_SCAN_TIMEOUT', 10) BT_SCAN_TIMEOUT = _get_env_int("BT_SCAN_TIMEOUT", 10)
BT_UPDATE_INTERVAL = _get_env_float('BT_UPDATE_INTERVAL', 2.0) BT_UPDATE_INTERVAL = _get_env_float("BT_UPDATE_INTERVAL", 2.0)
# ADS-B settings # ADS-B settings
ADSB_SBS_PORT = _get_env_int('ADSB_SBS_PORT', 30003) ADSB_SBS_PORT = _get_env_int("ADSB_SBS_PORT", 30003)
ADSB_UPDATE_INTERVAL = _get_env_float('ADSB_UPDATE_INTERVAL', 1.0) ADSB_UPDATE_INTERVAL = _get_env_float("ADSB_UPDATE_INTERVAL", 1.0)
ADSB_AUTO_START = _get_env_bool('ADSB_AUTO_START', False) ADSB_AUTO_START = _get_env_bool("ADSB_AUTO_START", False)
ADSB_HISTORY_ENABLED = _get_env_bool('ADSB_HISTORY_ENABLED', False) ADSB_HISTORY_ENABLED = _get_env_bool("ADSB_HISTORY_ENABLED", False)
ADSB_DB_HOST = _get_env('ADSB_DB_HOST', 'localhost') ADSB_DB_HOST = _get_env("ADSB_DB_HOST", "localhost")
ADSB_DB_PORT = _get_env_int('ADSB_DB_PORT', 5432) ADSB_DB_PORT = _get_env_int("ADSB_DB_PORT", 5432)
ADSB_DB_NAME = _get_env('ADSB_DB_NAME', 'intercept_adsb') ADSB_DB_NAME = _get_env("ADSB_DB_NAME", "intercept_adsb")
ADSB_DB_USER = _get_env('ADSB_DB_USER', 'intercept') ADSB_DB_USER = _get_env("ADSB_DB_USER", "intercept")
ADSB_DB_PASSWORD = _get_env('ADSB_DB_PASSWORD', 'intercept') ADSB_DB_PASSWORD = _get_env("ADSB_DB_PASSWORD", "intercept")
ADSB_HISTORY_BATCH_SIZE = _get_env_int('ADSB_HISTORY_BATCH_SIZE', 500) 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_FLUSH_INTERVAL = _get_env_float("ADSB_HISTORY_FLUSH_INTERVAL", 1.0)
ADSB_HISTORY_QUEUE_SIZE = _get_env_int('ADSB_HISTORY_QUEUE_SIZE', 50000) ADSB_HISTORY_QUEUE_SIZE = _get_env_int("ADSB_HISTORY_QUEUE_SIZE", 50000)
# Observer location settings # Observer location settings
SHARED_OBSERVER_LOCATION_ENABLED = _get_env_bool('SHARED_OBSERVER_LOCATION', True) SHARED_OBSERVER_LOCATION_ENABLED = _get_env_bool("SHARED_OBSERVER_LOCATION", True)
DEFAULT_LATITUDE = _get_env_float('DEFAULT_LAT', 0.0) DEFAULT_LATITUDE = _get_env_float("DEFAULT_LAT", 0.0)
DEFAULT_LONGITUDE = _get_env_float('DEFAULT_LON', 0.0) DEFAULT_LONGITUDE = _get_env_float("DEFAULT_LON", 0.0)
# Satellite settings # Satellite settings
SATELLITE_UPDATE_INTERVAL = _get_env_int('SATELLITE_UPDATE_INTERVAL', 30) SATELLITE_UPDATE_INTERVAL = _get_env_int("SATELLITE_UPDATE_INTERVAL", 30)
SATELLITE_TRAJECTORY_POINTS = _get_env_int('SATELLITE_TRAJECTORY_POINTS', 30) SATELLITE_TRAJECTORY_POINTS = _get_env_int("SATELLITE_TRAJECTORY_POINTS", 30)
SATELLITE_ORBIT_MINUTES = _get_env_int('SATELLITE_ORBIT_MINUTES', 45) SATELLITE_ORBIT_MINUTES = _get_env_int("SATELLITE_ORBIT_MINUTES", 45)
# Weather satellite settings # Weather satellite settings
WEATHER_SAT_DEFAULT_GAIN = _get_env_float('WEATHER_SAT_GAIN', 30.0) WEATHER_SAT_DEFAULT_GAIN = _get_env_float("WEATHER_SAT_GAIN", 30.0)
WEATHER_SAT_SAMPLE_RATE = _get_env_int('WEATHER_SAT_SAMPLE_RATE', 2400000) WEATHER_SAT_SAMPLE_RATE = _get_env_int("WEATHER_SAT_SAMPLE_RATE", 2400000)
WEATHER_SAT_MIN_ELEVATION = _get_env_float('WEATHER_SAT_MIN_ELEVATION', 15.0) WEATHER_SAT_MIN_ELEVATION = _get_env_float("WEATHER_SAT_MIN_ELEVATION", 15.0)
WEATHER_SAT_PREDICTION_HOURS = _get_env_int('WEATHER_SAT_PREDICTION_HOURS', 24) WEATHER_SAT_PREDICTION_HOURS = _get_env_int("WEATHER_SAT_PREDICTION_HOURS", 24)
WEATHER_SAT_SCHEDULE_REFRESH_MINUTES = _get_env_int('WEATHER_SAT_SCHEDULE_REFRESH_MINUTES', 30) WEATHER_SAT_SCHEDULE_REFRESH_MINUTES = _get_env_int("WEATHER_SAT_SCHEDULE_REFRESH_MINUTES", 30)
WEATHER_SAT_CAPTURE_BUFFER_SECONDS = _get_env_int('WEATHER_SAT_CAPTURE_BUFFER_SECONDS', 30) WEATHER_SAT_CAPTURE_BUFFER_SECONDS = _get_env_int("WEATHER_SAT_CAPTURE_BUFFER_SECONDS", 30)
# WeFax (Weather Fax) settings # WeFax (Weather Fax) settings
WEFAX_DEFAULT_GAIN = _get_env_float('WEFAX_GAIN', 40.0) WEFAX_DEFAULT_GAIN = _get_env_float("WEFAX_GAIN", 40.0)
WEFAX_SAMPLE_RATE = _get_env_int('WEFAX_SAMPLE_RATE', 22050) WEFAX_SAMPLE_RATE = _get_env_int("WEFAX_SAMPLE_RATE", 22050)
WEFAX_DEFAULT_IOC = _get_env_int('WEFAX_IOC', 576) WEFAX_DEFAULT_IOC = _get_env_int("WEFAX_IOC", 576)
WEFAX_DEFAULT_LPM = _get_env_int('WEFAX_LPM', 120) WEFAX_DEFAULT_LPM = _get_env_int("WEFAX_LPM", 120)
WEFAX_SCHEDULE_REFRESH_MINUTES = _get_env_int('WEFAX_SCHEDULE_REFRESH_MINUTES', 30) WEFAX_SCHEDULE_REFRESH_MINUTES = _get_env_int("WEFAX_SCHEDULE_REFRESH_MINUTES", 30)
WEFAX_CAPTURE_BUFFER_SECONDS = _get_env_int('WEFAX_CAPTURE_BUFFER_SECONDS', 30) WEFAX_CAPTURE_BUFFER_SECONDS = _get_env_int("WEFAX_CAPTURE_BUFFER_SECONDS", 30)
# SubGHz transceiver settings (HackRF) # SubGHz transceiver settings (HackRF)
SUBGHZ_DEFAULT_FREQUENCY = _get_env_float('SUBGHZ_FREQUENCY', 433.92) SUBGHZ_DEFAULT_FREQUENCY = _get_env_float("SUBGHZ_FREQUENCY", 433.92)
SUBGHZ_DEFAULT_SAMPLE_RATE = _get_env_int('SUBGHZ_SAMPLE_RATE', 2000000) SUBGHZ_DEFAULT_SAMPLE_RATE = _get_env_int("SUBGHZ_SAMPLE_RATE", 2000000)
SUBGHZ_DEFAULT_LNA_GAIN = _get_env_int('SUBGHZ_LNA_GAIN', 32) SUBGHZ_DEFAULT_LNA_GAIN = _get_env_int("SUBGHZ_LNA_GAIN", 32)
SUBGHZ_DEFAULT_VGA_GAIN = _get_env_int('SUBGHZ_VGA_GAIN', 20) SUBGHZ_DEFAULT_VGA_GAIN = _get_env_int("SUBGHZ_VGA_GAIN", 20)
SUBGHZ_DEFAULT_TX_GAIN = _get_env_int('SUBGHZ_TX_GAIN', 20) SUBGHZ_DEFAULT_TX_GAIN = _get_env_int("SUBGHZ_TX_GAIN", 20)
SUBGHZ_MAX_TX_DURATION = _get_env_int('SUBGHZ_MAX_TX_DURATION', 10) SUBGHZ_MAX_TX_DURATION = _get_env_int("SUBGHZ_MAX_TX_DURATION", 10)
SUBGHZ_SWEEP_START_MHZ = _get_env_float('SUBGHZ_SWEEP_START', 300.0) SUBGHZ_SWEEP_START_MHZ = _get_env_float("SUBGHZ_SWEEP_START", 300.0)
SUBGHZ_SWEEP_END_MHZ = _get_env_float('SUBGHZ_SWEEP_END', 928.0) SUBGHZ_SWEEP_END_MHZ = _get_env_float("SUBGHZ_SWEEP_END", 928.0)
# Radiosonde settings # Radiosonde settings
RADIOSONDE_FREQ_MIN = _get_env_float('RADIOSONDE_FREQ_MIN', 400.0) RADIOSONDE_FREQ_MIN = _get_env_float("RADIOSONDE_FREQ_MIN", 400.0)
RADIOSONDE_FREQ_MAX = _get_env_float('RADIOSONDE_FREQ_MAX', 406.0) RADIOSONDE_FREQ_MAX = _get_env_float("RADIOSONDE_FREQ_MAX", 406.0)
RADIOSONDE_DEFAULT_GAIN = _get_env_float('RADIOSONDE_GAIN', 40.0) RADIOSONDE_DEFAULT_GAIN = _get_env_float("RADIOSONDE_GAIN", 40.0)
RADIOSONDE_UDP_PORT = _get_env_int('RADIOSONDE_UDP_PORT', 55673) RADIOSONDE_UDP_PORT = _get_env_int("RADIOSONDE_UDP_PORT", 55673)
# Update checking # Update checking
GITHUB_REPO = _get_env('GITHUB_REPO', 'smittix/intercept') GITHUB_REPO = _get_env("GITHUB_REPO", "smittix/intercept")
UPDATE_CHECK_ENABLED = _get_env_bool('UPDATE_CHECK_ENABLED', True) UPDATE_CHECK_ENABLED = _get_env_bool("UPDATE_CHECK_ENABLED", True)
UPDATE_CHECK_INTERVAL_HOURS = _get_env_int('UPDATE_CHECK_INTERVAL_HOURS', 6) UPDATE_CHECK_INTERVAL_HOURS = _get_env_int("UPDATE_CHECK_INTERVAL_HOURS", 6)
# Alerting # Alerting
ALERT_WEBHOOK_URL = _get_env('ALERT_WEBHOOK_URL', '') ALERT_WEBHOOK_URL = _get_env("ALERT_WEBHOOK_URL", "")
ALERT_WEBHOOK_SECRET = _get_env('ALERT_WEBHOOK_SECRET', '') ALERT_WEBHOOK_SECRET = _get_env("ALERT_WEBHOOK_SECRET", "")
ALERT_WEBHOOK_TIMEOUT = _get_env_int('ALERT_WEBHOOK_TIMEOUT', 5) ALERT_WEBHOOK_TIMEOUT = _get_env_int("ALERT_WEBHOOK_TIMEOUT", 5)
# Admin credentials # Admin credentials
ADMIN_USERNAME = _get_env('ADMIN_USERNAME', 'admin') ADMIN_USERNAME = _get_env("ADMIN_USERNAME", "admin")
ADMIN_PASSWORD = _get_env('ADMIN_PASSWORD', 'admin') ADMIN_PASSWORD = _get_env("ADMIN_PASSWORD", "admin")
def configure_logging() -> None: def configure_logging() -> None:
"""Configure application logging.""" """Configure application logging."""
logging.basicConfig( logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, stream=sys.stderr)
level=LOG_LEVEL,
format=LOG_FORMAT,
stream=sys.stderr
)
# Suppress Flask development server warning # Suppress Flask development server warning
logging.getLogger('werkzeug').setLevel(LOG_LEVEL) logging.getLogger("werkzeug").setLevel(LOG_LEVEL)
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "intercept" name = "intercept"
version = "2.26.11" version = "2.27.0"
description = "Signal Intelligence Platform - Pager/433MHz/ADS-B/Satellite/WiFi/Bluetooth" description = "Signal Intelligence Platform - Pager/433MHz/ADS-B/Satellite/WiFi/Bluetooth"
readme = "README.md" readme = "README.md"
requires-python = ">=3.9" requires-python = ">=3.9"