Skip to content

v0.9.0

Choose a tag to compare

@agessaman agessaman released this 03 May 05:20
· 30 commits to main since this release
57eb41d

v0.9.0 Release Notes

v0.9.0 is a release focused on stability and enhancing and refining existing features. It adds features to the web dashboard, rewrites the scheduler on APScheduler for improved reliability, and introduces radio-health monitoring. It also adds versioned database migrations, multi-arch Docker images, .deb packaging, async guard rails, and several new commands. Python 3.9 is no longer supported; the minimum is now 3.10.

Thanks to @KG7QIN for the work on adding tests and working on radio reliability.


Web Viewer

  • Optional authentication for the admin dashboard
  • Updated live streams for packets, commands, messages, and logs.
  • Admin config editor lets operators view and edit config.ini from the browser, with automatic password redaction and CSRF protection.
  • Contact management, DB backup management, maintenance tools, and an API Explorer tab are all available from the viewer.
  • Zombie-radio and radio-offline banners surface hardware status on every page; channel-name validation and live update-feed controls added.
  • The viewer starts with an "initializing" banner during bot startup and polls for live status without blocking the bot.

Radio Reliability

  • Zombie-radio detection periodically probes the radio with a health check; unresponsive radios trigger a configurable alert and banner.
  • Radio-offline fail state suppresses outbound sends until the radio reconnects, then resumes normally.
  • asyncio.wait_for guards wrap send_advert, disconnect_radio, and reboot_radio to prevent event-loop lockups.
  • A debounce guard prevents the packet-capture service from storm-restarting during radio reconnects.
  • Radio debug logging can be toggled from the web UI at runtime without a restart.

Scheduler & Database

  • Scheduler rewritten on APScheduler; a new maintenance module handles housekeeping tasks independently.
  • Graceful shutdown and config reload are signal-driven (SIGTERM / SIGHUP).
  • Database layer migrated to aiosqlite with AsyncDBManager and versioned migrations; ALTER TABLE startup migrations run safely without data loss.
  • Background polling operations (feed polling, channel/radio ops) use fire-and-forget callbacks to avoid blocking the scheduler thread.

Commands

  • !version reports the running bot version; !schedule lists scheduled messages and the current advert interval.
  • !path gains a geographic scoring toggle and corrected multibyte chart rendering.
  • Weather: high/low temperatures, MQTT weather source, Open-Meteo model selection, configurable default city, multi-day forecasts, and location fallback.
  • Airplane results are configurable via max_results.
  • Additional keyword-triggered auto-responses via the RandomLine matcher; a BSD fortune file ships as default data.

Bridges & Integrations

  • Discord bridge now supports multiple webhooks per channel, configurable per channel key.
  • Discord and Telegram outbound helpers added for cross-service notification delivery.
  • Repeater discovery and collision alerts service with optional delivery to mesh or external notification services (Discord/Telegram).
  • Inbound webhook relay accepts external HTTP POST events with bearer-token authentication and forwards them to mesh channels.
  • MQTT packet publishing controls added with configurable path-length decoding.

Security & Rate Limiting

  • SSRF hardening added to all outbound HTTP calls, including an explicit CGN-network check; an allow_local_smtp flag enables opt-in local SMTP relay.
  • Log-injection sanitization applied to all user-supplied log lines; a CI regression check guards against regressions.
  • CSRF protection added to the web viewer admin editor.
  • Per-channel rate limiting and tightened per-user cooldown defaults; thread-safe rate limiter with LRU SNR/RSSI caches.

Packaging & Infrastructure

  • .deb packaging via scripts/build-deb.sh for systemd-based deployments.
  • Multi-arch Docker images with SBOM and provenance attestation published on each release.
  • Ncurses config TUI (scripts/config_tui.py) for interactive configuration setup.
  • Bot admin HTTP server with reload_config.sh for runtime config reloads without a full restart.
  • Initial automated test suite with pytest, coverage gates, and lint gates (ruff, mypy, shellcheck); Makefile bootstrap for local development.

Bug Fixes

  • Upgrading meshcore to >= 2.3.6 fixes a crash on negative out_path_len values (#126) and eliminates KeyError('msg_hash') asyncio parser spam (#83).
  • max_response_hops default lowered from 10 to 7 to reduce mesh congestion (#161).
  • Shutdown sequence hardened: single stop path, viewer cleanup, MQTT log teardown, and scheduler drain before exit.
  • Command aliases moved to per-command aliases = config keys; global [Aliases] section removed.
  • Purging log now records public_key and name fields for full audit trails.
  • Strict modes for restricting upload of corrupt on the wire packets to MQTT servers.
  • Fixes to field persistence in the Feeds service configuration panel.