M30: Experte-Tab Mode-Taste-Menü + SSH-Trust-/REST-Fixes

Neues Schema für /system routerboard mode-button (enabled/on-event/
hold-time), live gegen echte Hardware verifiziert.

Dabei drei echte Bugs gefunden und gefixt:
- SSH-Trust-Dead-End beim ersten Experte-Tab-Schreiben (Backup-vor-
  Schreiben-Pfad hatte keinen Weg, den Trust-Dialog auszulösen) —
  ConnectionService.noteUntrustedSSHHostKey
- RouterOSFieldSchema.clearable: optionale Felder senden nie mehr
  einen expliziten Leer-Wert, wenn das RouterOS ablehnt
- RouterOSMenuSchema.writesRequireSSH + ConnectionService.applyViaSSH:
  für Menüs ohne REST-Anbindung (bewiesen per direktem SSH-Test) wird
  zwingend eine dedizierte SSH-Verbindung genutzt statt REST

Live Ende-zu-Ende bestätigt: Skript anlegen, Mode-Taste zuweisen,
Tastendruck löst Skript korrekt aus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Kay
2026-09-17 15:14:31 +02:00
co-authored by Claude Sonnet 5
parent 221b914b05
commit 6f29bbcb2b
13 changed files with 272 additions and 14 deletions
+54
View File
@@ -1897,3 +1897,57 @@ Infrastruktur, zuvor gab es nur den DE/EN-Toolbar-Schalter):
Build+alle 98 Unit-Tests grün nach jedem Schritt. Live bestätigt
("passt, lassen wir so").
**M30: Experte-Tab — "Mode-Taste"-Menü (`/system routerboard mode-button`)**
(2026-09-17, gegen echte Hardware live verifiziert):
1. Recherchiert (help.mikrotik.com, nicht geraten): drei echte Felder
`enabled`/`on-event`/`hold-time` (Zeitspanne Min..Max, z.B.
"3s..5s"). Als neuer Singleton-Schema-Eintrag in
`RouterOSSchemaCatalog.systemFamily` gebaut, `on-event` als
`.menuItemPick` auf `/system script` (wie beim bestehenden
Zeitplaner). Warnhinweis ergänzt: ab RouterOS 7.1rc4 braucht jede
Änderung zusätzlich eine physische Tastenbestätigung am Gerät.
2. **Bug 41:** Speichern schlug mit `HTTP 500` fehl. Erste, falsche
Spur: `hold-time=""` im gesendeten Befehl (leeres optionales Feld
wurde trotzdem mitgeschickt) — dafür neuer
`RouterOSFieldSchema.clearable`-Parameter (Default `true`, bricht
bestehende Tests nicht), `hold-time` auf `clearable: false` gesetzt.
Fix wirkte (Feld verschwand aus dem gesendeten Befehl), **derselbe
HTTP-500-Fehler blieb aber** — Beweis, dass das nicht die
eigentliche Ursache war. Nutzer führte denselben Befehl direkt per
SSH-Terminal aus: lief dort sofort fehlerfrei, `print` bestätigte
alle Felder korrekt gesetzt. Damit zweifelsfrei belegt: dieses
RouterOS-Hardware-Menü hat schlicht keine REST-API-Anbindung auf
diesem Router — eine echte RouterOS-Deckungslücke, kein App-Bug.
Fix: neuer `RouterOSMenuSchema.writesRequireSSH`-Parameter +
`ConnectionService.applyViaSSH(_:)` (dedizierte SSH-Verbindung,
exakt das Muster von `BackupService`/`UpdateService`) —
`ExpertViewModel.saveEditingItem()` nutzt sie für so markierte
Schemas zwingend statt des Session-Transports. Mode-Taste
entsprechend markiert. Live bestätigt: Speichern über die App läuft
seitdem fehlerfrei.
3. **Bug 42 (kein App-Bug, reines RouterOS-Verhalten, hier
dokumentiert weil beim Live-Test dieser Funktion gefunden):**
Tastendruck löste das Skript aus, aber
`script,error executing script ... failed ... (not enough
permissions)` im Log. Skripte, die vom Mode-Button (RouterOS-intern
"sys2"-Kontext) ausgelöst werden, laufen mit eingeschränkten
Rechten, nicht mit dem vollen Standard-Policy-Set eines manuell
angelegten Skripts. Zwei erste Fix-Versuche (Policy einschränken,
dann `dont-require-permissions=yes` setzen) zeigten scheinbar keine
Wirkung — Ursache: Skriptname war tatsächlich "Button test" (großes
B), die Terminal-Befehle zielten auf "button test"/nutzten
ungültige `set`-Syntax ohne `[find ...]`/Index, trafen also nie den
echten Eintrag (`print detail` bestätigte das: Werte unverändert).
Mit korrektem Index-Befehl (`/system script set 0
dont-require-permissions=yes`) griff es sofort. **Für jedes
künftige Mode-Taste-Skript nötig:** `dont-require-permissions=yes`,
sonst schlägt die Ausführung vom Button aus fehl, obwohl dasselbe
Skript manuell/per Scheduler einwandfrei liefe. Die App hat dafür
noch kein Feld im "Skripte"-Schema (`/system script` kennt nur
Name+Inhalt) — für später vorgemerkt (`found.md` Punkt 6).
Build+alle 99 Unit-Tests grün. Live Ende-zu-Ende bestätigt: Skript
anlegen → Mode-Taste zuweisen+speichern (über die App) → Tastendruck
löst Skript korrekt aus, Log zeigt den Eintrag.