"""Configuration settings for intercept application.""" from __future__ import annotations import logging import os import sys # Application version VERSION = "2.22.0" # Changelog - latest release notes (shown on welcome screen) CHANGELOG = [ { "version": "2.22.0", "date": "February 2026", "highlights": [ "Waterfall receiver overhaul: WebSocket I/Q streaming with server-side FFT, click-to-tune, and zoom controls", "Voice alerts for configurable event notifications across modes", "Signal fingerprinting mode for RF device identification and pattern analysis", "RF Heatmap for geographic signal density visualization", "SignalID integration via SigIDWiki API for automatic signal classification", "PWA support: installable web app with service worker and manifest", "Mode stop responsiveness improvements with faster timeout handling", "Navigation performance instrumentation and smoother mode transitions", "Pager, sensor, and SSTV real-time signal scope visualization", "ADS-B MSG2 surface movement parsing for ground vehicle tracking", "WebSDR major overhaul with improved receiver management and audio streaming", "Documentation audit: fixed license, tool names, entry points, and SSTV decoder references", "Help modal updated with ACARS and VDL2 mode descriptions", ] }, { "version": "2.21.1", "date": "February 2026", "highlights": [ "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 mode-switch map invalidation timing fix to prevent delayed/blank map render", ] }, { "version": "2.21.0", "date": "February 2026", "highlights": [ "Global map theme refresh with improved contrast and cross-dashboard consistency", "Cross-app UX updates for accessibility, mode consistency, and render performance", "Weather satellite reliability fixes for auto-scheduler and Mercator pass tracking", "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", "Analytics enhancements with operational insights and temporal pattern panels", ] }, { "version": "2.20.0", "date": "February 2026", "highlights": [ "Space Weather mode: real-time solar and geomagnetic monitoring from NOAA SWPC, NASA SDO, and HamQSL", "Kp index, solar wind, X-ray flux charts with Chart.js visualization", "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", "No SDR hardware required — all data from public APIs with server-side caching", ] }, { "version": "2.19.0", "date": "February 2026", "highlights": [ "VDL2 mode with modal message viewer, consolidated into ADS-B dashboard", "ADS-B: trails enabled by default, radar modes removed, CSV export added", "Bundled Roboto Condensed font for offline mode with SVG icon overhaul", "Help modal updated with all modes and correct SVG icons", "Setup script overhauled for reliability and macOS compatibility", "GPS fix for preserving satellites across DOP-only SKY messages", "Fix gpsd deadlock causing GPS connect to hang", ] }, { "version": "2.18.0", "date": "February 2026", "highlights": [ "Bluetooth: service data inspector, appearance codes, MAC cluster tracking, and behavioral flags", "Bluetooth: IRK badge display, distance estimation with confidence, and signal stability metrics", "ACARS: SoapySDR device support for SDRplay, LimeSDR, Airspy, and other non-RTL backends", "ADS-B: stale dump1090 process cleanup via PID file tracking", "GPS: error state indicator and UI refinements", "Proximity radar and signal card UI improvements", ] }, { "version": "2.17.0", "date": "February 2026", "highlights": [ "BT Locate: SAR Bluetooth device location with GPS-tagged signal trail and proximity alerts", "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", "Bluetooth scanner lifecycle fix for bleak scan timeout tracking", ] }, { "version": "2.16.0", "date": "February 2026", "highlights": [ "Sub-GHz analyzer with real-time RF capture and protocol decoding", "Weather satellite auto-scheduler with polar plot and ground track map", "SatDump support for local (non-Docker) installs via setup.sh", "Shared waterfall UI across SDR modes", "Listening post audio stuttering fix and SDR race condition fixes", "Multi-arch Docker build support (amd64 + arm64)", ] }, { "version": "2.15.0", "date": "February 2026", "highlights": [ "Real-time WebSocket waterfall with I/Q capture and server-side FFT", "Cross-module frequency routing from Listening Post to decoders", "Pure Python SSTV decoder replacing broken slowrx dependency", "Real-time signal scope for pager, sensor, and SSTV modes", "USB-level device probe to prevent cryptic rtl_fm crashes", "SDR device lock-up fix from unreleased device registry on crash", ] }, { "version": "2.14.0", "date": "February 2026", "highlights": [ "HF SSTV general mode with predefined shortwave frequencies", "WebSDR integration for remote HF/shortwave listening", "Listening Post signal scanner and audio pipeline improvements", "TSCM sweep resilience, WiFi detection, and correlation fixes", "APRS rtl_fm startup and SDR device conflict fixes", ] }, { "version": "2.13.1", "date": "February 2026", "highlights": [ "UI overhaul with slate/cyan theme and JetBrains Mono font", "Signal scanner rewritten with rtl_power sweep and SNR filtering", "Listening Post audio streaming via WAV with retry/fallback", "WiFi connected clients panel now filters to selected AP", "Global navigation bar across all dashboards", "Fixed USB device contention when starting audio pipeline", ] }, { "version": "2.13.0", "date": "February 2026", "highlights": [ "WiFi client display in AP detail drawer with real-time SSE updates", "Help modal system with keyboard shortcuts reference", "Global navbar and settings modal accessible from all dashboards", "Probed SSID badges for connected clients", ] }, { "version": "2.12.1", "date": "February 2026", "highlights": [ "SDR device registry to prevent decoder conflicts", "SDR device status panel and ADS-B Bias-T toggle", "Real-time Doppler tracking for ISS SSTV reception", "TCP connection support for Meshtastic", "Shared observer location with auto-start options", ] }, { "version": "2.12.0", "date": "January 2026", "highlights": [ "ISS SSTV decoder with real-time ISS tracking globe", "GitHub update notifications for new releases", "Meshtastic QR code support and telemetry display", "New Space category with reorganized UI", ] }, { "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", "highlights": [ "AIS vessel tracking with VHF DSC distress monitoring", "Spy Stations database (number stations & diplomatic HF)", "MMSI country identification and distress alert overlays", "SDR device conflict detection for AIS/DSC", ] }, { "version": "2.9.5", "date": "January 2026", "highlights": [ "Enhanced TSCM with MAC-randomization resistant detection", "Clickable score cards and device detail expansion", "RF scanning improvements with status feedback", "Root privilege check and warning display", ] }, { "version": "2.9.0", "date": "January 2026", "highlights": [ "New dropdown navigation menus for cleaner UI", "TSCM baseline recording now captures device data", "Device identity engine integration for threat detection", "Welcome screen with mode selection", ] }, { "version": "2.8.0", "date": "December 2025", "highlights": [ "Added TSCM counter-surveillance mode", "WiFi/Bluetooth device correlation engine", "Tracker detection (AirTag, Tile, SmartTag)", "Risk scoring and threat classification", ] }, ] def _get_env(key: str, default: str) -> str: """Get environment variable with default.""" return os.environ.get(f'INTERCEPT_{key}', default) def _get_env_int(key: str, default: int) -> int: """Get environment variable as integer with default.""" try: return int(os.environ.get(f'INTERCEPT_{key}', str(default))) except ValueError: return default def _get_env_float(key: str, default: float) -> float: """Get environment variable as float with default.""" try: return float(os.environ.get(f'INTERCEPT_{key}', str(default))) except ValueError: return default def _get_env_bool(key: str, default: bool) -> bool: """Get environment variable as boolean with default.""" val = os.environ.get(f'INTERCEPT_{key}', '').lower() if val in ('true', '1', 'yes', 'on'): return True if val in ('false', '0', 'no', 'off'): return False return default # Logging configuration _log_level_str = _get_env('LOG_LEVEL', 'WARNING').upper() LOG_LEVEL = getattr(logging, _log_level_str, logging.WARNING) LOG_FORMAT = _get_env('LOG_FORMAT', '%(asctime)s - %(levelname)s - %(message)s') # Server settings HOST = _get_env('HOST', '0.0.0.0') PORT = _get_env_int('PORT', 5050) DEBUG = _get_env_bool('DEBUG', False) THREADED = _get_env_bool('THREADED', True) # Default RTL-SDR settings DEFAULT_GAIN = _get_env('DEFAULT_GAIN', '40') DEFAULT_DEVICE = _get_env('DEFAULT_DEVICE', '0') # Pager defaults DEFAULT_PAGER_FREQ = _get_env('PAGER_FREQ', '929.6125M') # Timeouts PROCESS_TIMEOUT = _get_env_int('PROCESS_TIMEOUT', 5) SOCKET_TIMEOUT = _get_env_int('SOCKET_TIMEOUT', 5) SSE_TIMEOUT = _get_env_int('SSE_TIMEOUT', 1) # WiFi settings WIFI_UPDATE_INTERVAL = _get_env_float('WIFI_UPDATE_INTERVAL', 2.0) AIRODUMP_HEADER_LINES = _get_env_int('AIRODUMP_HEADER_LINES', 2) # Bluetooth settings 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_AUTO_START = _get_env_bool('ADSB_AUTO_START', False) 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) # Observer location settings SHARED_OBSERVER_LOCATION_ENABLED = _get_env_bool('SHARED_OBSERVER_LOCATION', True) DEFAULT_LATITUDE = _get_env_float('DEFAULT_LAT', 0.0) DEFAULT_LONGITUDE = _get_env_float('DEFAULT_LON', 0.0) # Satellite settings SATELLITE_UPDATE_INTERVAL = _get_env_int('SATELLITE_UPDATE_INTERVAL', 30) SATELLITE_TRAJECTORY_POINTS = _get_env_int('SATELLITE_TRAJECTORY_POINTS', 30) SATELLITE_ORBIT_MINUTES = _get_env_int('SATELLITE_ORBIT_MINUTES', 45) # Weather satellite settings WEATHER_SAT_DEFAULT_GAIN = _get_env_float('WEATHER_SAT_GAIN', 40.0) WEATHER_SAT_SAMPLE_RATE = _get_env_int('WEATHER_SAT_SAMPLE_RATE', 1000000) 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_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) # SubGHz transceiver settings (HackRF) SUBGHZ_DEFAULT_FREQUENCY = _get_env_float('SUBGHZ_FREQUENCY', 433.92) SUBGHZ_DEFAULT_SAMPLE_RATE = _get_env_int('SUBGHZ_SAMPLE_RATE', 2000000) SUBGHZ_DEFAULT_LNA_GAIN = _get_env_int('SUBGHZ_LNA_GAIN', 32) SUBGHZ_DEFAULT_VGA_GAIN = _get_env_int('SUBGHZ_VGA_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_SWEEP_START_MHZ = _get_env_float('SUBGHZ_SWEEP_START', 300.0) SUBGHZ_SWEEP_END_MHZ = _get_env_float('SUBGHZ_SWEEP_END', 928.0) # Update checking GITHUB_REPO = _get_env('GITHUB_REPO', 'smittix/intercept') UPDATE_CHECK_ENABLED = _get_env_bool('UPDATE_CHECK_ENABLED', True) UPDATE_CHECK_INTERVAL_HOURS = _get_env_int('UPDATE_CHECK_INTERVAL_HOURS', 6) # Alerting ALERT_WEBHOOK_URL = _get_env('ALERT_WEBHOOK_URL', '') ALERT_WEBHOOK_SECRET = _get_env('ALERT_WEBHOOK_SECRET', '') ALERT_WEBHOOK_TIMEOUT = _get_env_int('ALERT_WEBHOOK_TIMEOUT', 5) # Admin credentials ADMIN_USERNAME = _get_env('ADMIN_USERNAME', 'admin') ADMIN_PASSWORD = _get_env('ADMIN_PASSWORD', 'admin') def configure_logging() -> None: """Configure application logging.""" logging.basicConfig( level=LOG_LEVEL, format=LOG_FORMAT, stream=sys.stderr ) # Suppress Flask development server warning logging.getLogger('werkzeug').setLevel(LOG_LEVEL)