diff --git a/CHANGELOG.md b/CHANGELOG.md index 295c9d4..50a8262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## [0.09.00] - 2026-02-20 + +### Summary +Release 0.9 konsolidiert alle seit v0.08.15 eingeführten Erweiterungen und bündelt +sie als neues Minor-Release. Schwerpunkte: neues Rollensystem (Mitarbeiter), +Konfigurationsseite im Dashboard, erweitertes Paket-Log, strukturelle Bereinigungen. + +### Added +- **Rollensystem Mitarbeiter** (closes #7): Neue Rolle `mitarbeiter` ersetzt `user` + vollständig. Einladungs-Workflow per E-Mail mit auto-generiertem Passwort und + Pflicht-Passwortwechsel beim ersten Login. Neue Seite `/auth/change-password`. +- **Konfigurationsseite `/config`** (closes #4): Bearbeitbare Bot-, Meshtastic-, + Web- und Links-Einstellungen direkt im Dashboard (Admin). `config.py`: `save()`. +- **Paket-Log: Erweiterte Filterzeile** (closes #6): Von, An, Kanal-Dropdown, + Hops-Maximum und Freitext – alle Filter kombiniert (AND-Logik). +- **Initialer Admin-User**: Erster Start ohne Datenbank legt automatisch + `admin@localhost` / `changeme` an (verifiziert, Passwort-Änderung empfohlen). +- **Sidebar: Konfigurationen-Gruppe**: Gruppenüberschrift mit eingerückten + Untereinträgen (Scheduler, NINA, Einstellungen) für Staff-Mitglieder. + +### Changed +- **Umbenennung MeshDD-Bot → MeshDD-Dashboard** (closes #4): Alle Seiten-Titel + und Navbar-Texte aktualisiert. +- **NINA-Verbesserungen** (closes #2): Quellenkennung (`[DWD@NINA]` etc.), + Schalter nebeneinander, Intervalle in Minuten, `last_sent`-Anzeige. +- **Konfiguration konsolidiert**: Alle Config-Dateien in `config/`, `.env` in + `config.yaml` integriert – keine separate Secrets-Datei mehr nötig. +- **Datenbank in `data/`**: SQLite-Datei nach `data/meshdd.db` verschoben; + WAL-Checkpoint beim Schließen; isolierter Shutdown (jeder Schritt try/except). +- **API-Auth**: `/api/send`, `/api/node/config`, `/api/nina/*`, `GET /api/scheduler/jobs` + nutzen `require_staff_api` (Mitarbeiter + Admin). +- **Scheduler/NINA read-only für Mitarbeiter**: Schaltflächen und Eingaben gesperrt, + Badge „Nur Lesezugriff". +- **Docker entfernt**: `Dockerfile`, `docker-compose.yml`, `.dockerignore` gelöscht; + Deployment ausschließlich per systemd-Service. + +### Fixed +- **Karte: Legende theme-aware** (closes #5): CSS-Variablen + JS-Inline-Styles + für zuverlässige Light/Dark-Umschaltung im Leaflet-Control-Kontext. +- **Dashboard**: `channelBreakdown`-Card entfernt; Nachrichten-Trenner stärker + (closes #1). +- **`upsert_node` Race-Condition**: `INSERT OR IGNORE` + `UPDATE` statt + SELECT → INSERT – kein `UNIQUE constraint failed` mehr bei gleichzeitigen Updates. + ## [0.08.26] - 2026-02-20 ### Added diff --git a/config/config.yaml b/config/config.yaml index 22d912d..6f922a2 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,4 +1,4 @@ -version: "0.08.26" +version: "0.09.00" bot: name: "MeshDD-Bot" diff --git a/docs/whats-new-0.9.md b/docs/whats-new-0.9.md new file mode 100644 index 0000000..39186f3 --- /dev/null +++ b/docs/whats-new-0.9.md @@ -0,0 +1,198 @@ +# Was ist neu in MeshDD-Dashboard 0.9.x + +> Aktueller Stand: **v0.09.00** · Release-Datum: 2026-02-20 + +--- + +## Übersicht + +Release 0.9 bündelt alle seit v0.08.15 eingeführten Erweiterungen. Schwerpunkte sind +das neue **Rollensystem** (Mitarbeiter statt User), eine vollständige +**Konfigurationsseite** im Dashboard, eine erweiterte **Paket-Log-Filterzeile** +sowie eine Reihe struktureller Bereinigungen (Konfiguration, Datenbank, Benennung). + +--- + +## Neues Rollensystem: Mitarbeiter + +### Rollenhierarchie + +``` +Public → Mitarbeiter → Admin +``` + +Die bisherige Rolle `user` entfällt vollständig. Alle bestehenden `user`-Accounts +werden automatisch per DB-Migration zu `mitarbeiter` umgeschrieben. + +| Bereich | Public | Mitarbeiter | Admin | +|---|---|---|---| +| Dashboard, Karte, Pakete, Nachrichten | Ja | Ja | Ja | +| Nachrichten senden | Nein | Ja | Ja | +| Scheduler, NINA, Einstellungen lesen | Nein | Ja | Ja | +| Scheduler, NINA, Einstellungen bearbeiten | Nein | Nein | Ja | +| Benutzerverwaltung `/admin` | Nein | Nein | Ja | + +### Einladungs-Workflow + +1. Admin öffnet `/admin` → „Mitarbeiter einladen" +2. Modal: Name + E-Mail eingeben +3. Backend generiert automatisch ein 12-stelliges Passwort +4. Einladungsmail mit Login-URL und Passwort wird versendet +5. Erster Login: Weiterleitung zu `/auth/change-password` (Pflichtänderung) +6. Nach dem Passwortwechsel: normaler Zugang + +### Sidebar: staff-sichtbare Einträge + +Scheduler, NINA und Einstellungen sind jetzt in einer Gruppe **„Konfigurationen"** +zusammengefasst und für alle Mitarbeiter (und Admins) sichtbar. Reine Admin-Links +(Benutzerverwaltung) sind davon getrennt. + +### Read-only-Modus für Mitarbeiter + +Mitarbeiter sehen Scheduler-Jobs und NINA-Konfiguration, können aber nicht bearbeiten: +- **Scheduler**: Schaltflächen „Neuer Job", „Bearbeiten", „Löschen" deaktiviert; + Badge „Nur Lesezugriff" in der Aktionen-Spalte. +- **NINA**: Alle Eingabefelder und der Speichern-Button sind disabled. + +--- + +## Neue Konfigurationsseite (`/config`) + +Eine neue Admin-Seite ermöglicht die Bearbeitung der Bot-Konfiguration direkt +im Dashboard — ohne SSH-Zugriff auf den Server. + +### Bearbeitbare Bereiche + +| Abschnitt | Felder | +|---|---| +| **Bot** | Name, Kommando-Präfix | +| **Meshtastic** | Host, Port | +| **Web** | Port, Online-Schwellwert (s) | +| **Links** | Liste mit URL + Bezeichnung (hinzufügen/entfernen) | + +Die Konfiguration wird direkt in `config/config.yaml` geschrieben. +Der Live-Reload-Mechanismus übernimmt Änderungen ohne Neustart. + +--- + +## Paket-Log: Erweiterte Filterzeile + +Unterhalb des bestehenden Typ-Filter-Balkens steht jetzt eine zweite Filterzeile: + +``` +[ Von: __ ] [ An: __ ] [ Kanal: [Alle ▾] ] [ Hops ≤: __ ] [ 🔍 Freitext ] [ ✕ ] +``` + +| Filter | Funktion | +|---|---| +| **Von** | Teilstring auf Node-ID, Langname oder Kurzname | +| **An** | Teilstring; `alle`/`broadcast` für Broadcast-Pakete | +| **Kanal** | Dropdown mit bekannten Kanälen (aus WS-`channels`-Event) | +| **Hops ≤** | Zahl; filtert auf berechneten Hop-Wert (`hop_start − hop_limit`) | +| **Freitext** | Suche über alle Spalten (Von, An, Typ, Kanal, Info) | +| **✕** | Alle Zusatzfilter zurücksetzen | + +Alle Filter wirken kombiniert (AND-Logik). Typ-Filter und Zusatzfilter greifen +unabhängig voneinander. + +Die Filterung erfolgt rein im DOM – `buildRow()` befüllt beim Rendern +`data-from/to/channel/hops/search` für maximale Performance ohne Re-Render. + +--- + +## NINA-Verbesserungen + +### Quellenkennung im Mesh + +Meldungen tragen jetzt die Quelle als Präfix: + +``` +[DWD@NINA] Schwerwiegend: Sturmböen (Dresden, Stadt) +[KATWARN@NINA] Mäßig: Starkregen (Meißen) +[NINA] Aufgehoben: ... +``` + +### UI-Verbesserungen + +- **Schalter nebeneinander**: „Aktiviert" und „Ins Mesh senden" in einer Zeile +- **Intervalle in Minuten**: Eingabe und Anzeige in Minuten (intern weiter Sekunden) +- **Zuletzt gesendet**: Zeitstempel der letzten Mesh-Aussendung sichtbar + +--- + +## Konfiguration: Strukturelle Bereinigung + +### Verzeichnisstruktur + +``` +config/ + config.yaml ← zentrale Konfiguration (Bot, Web, Auth, SMTP, Links) + scheduler.yaml ← Scheduler-Jobs + nina.yaml ← NINA-Konfiguration +data/ + meshdd.db ← SQLite-Datenbank + *.db-wal ← WAL-Journal (gitignored) + *.db-shm ← Shared Memory (gitignored) +``` + +### `.env` abgeschafft + +Alle Konfigurationswerte (`auth.secret_key`, `smtp.*`) sind direkt in +`config/config.yaml` – keine separate Secrets-Datei mehr nötig. + +### Datenbank robuster + +- WAL-Checkpoint (`PRAGMA wal_checkpoint(FULL)`) vor dem Schließen – + keine Daten bleiben im Journal +- Jeder Shutdown-Schritt ist einzeln mit `try/except` gekapselt – + `db.close()` wird auch bei Fehlern in anderen Komponenten immer ausgeführt + +--- + +## Umbenennung: MeshDD-Bot → MeshDD-Dashboard + +Alle Seiten-Titel (``) und Navbar-Texte wurden von „MeshDD-Bot" auf +„MeshDD-Dashboard" umgestellt. + +--- + +## API-Änderungen + +### Neue Endpunkte + +| Methode | Pfad | Beschreibung | Auth | +|---|---|---|---| +| `GET` | `/api/config` | Bot-/Web-/Link-Konfiguration lesen | Admin | +| `PUT` | `/api/config` | Konfiguration speichern | Admin | +| `POST` | `/api/admin/invite` | Mitarbeiter einladen (Passwort auto-generiert) | Admin | +| `GET` | `/auth/change-password` | Pflicht-Passwortänderungs-Seite | — | +| `POST` | `/auth/change-password` | Neues Passwort setzen | Login | + +### Auth-Änderungen bestehender Endpunkte + +| Endpunkt | Vorher | Jetzt | +|---|---|---| +| `POST /api/send` | `require_user_api` | `require_staff_api` | +| `GET /api/node/config` | `require_admin_api` | `require_staff_api` | +| `GET /api/nina/config` | `require_admin_api` | `require_staff_api` | +| `GET /api/nina/alerts` | `require_admin_api` | `require_staff_api` | +| `GET /api/scheduler/jobs` | ohne Auth | `require_staff_api` | + +--- + +## Sonstige Fixes + +- **`upsert_node` Race-Condition** behoben: `INSERT OR IGNORE` + `UPDATE` statt + SELECT → INSERT – kein `UNIQUE constraint failed` mehr bei parallelen Node-Updates. +- **Karte: Legende theme-aware** (closes #5): CSS-Variablen + JS-Inline-Styles + für zuverlässige Light/Dark-Umschaltung im Leaflet-Control-Kontext. +- **Dashboard**: `channelBreakdown`-Card entfernt; Nachrichten-Trenner stärker + (Padding + Border-Breite), closes #1. + +--- + +## Versionshistorie 0.9.x + +| Version | Datum | Schwerpunkt | +|---|---|---| +| 0.09.00 | 2026-02-20 | Mitarbeiter-Rolle, /config-Seite, Paket-Log-Filter, Bereinigungen |