Files
MUA-Mikes-Unraid-Agent/plugin/mua.plg
T

291 lines
14 KiB
XML

<?xml version='1.0' standalone='yes'?>
<!DOCTYPE PLUGIN [
<!ENTITY name "mua">
<!ENTITY author "Michael">
<!ENTITY version "2026.09.21.r029">
<!ENTITY launch "Settings/mua">
<!ENTITY pluginURL "https://git.casaderoll.de/michael/MUA-Mikes-Unraid-Agent/raw/branch/main/plugin/mua.plg">
<!ENTITY pluginLOC "/boot/config/plugins/&name;">
<!ENTITY emhttpLOC "/usr/local/emhttp/plugins/&name;">
<!ENTITY txzURL "https://git.casaderoll.de/michael/MUA-Mikes-Unraid-Agent/raw/branch/main/dist/mua-2026.09.21.r029-x86_64-1.txz">
<!ENTITY txzSHA256 "9de60f05d97801dd9da33556e9696f78559659f76e816b642611515565d7d73c">
]>
<PLUGIN name="&name;"
author="&author;"
version="&version;"
launch="&launch;"
pluginURL="&pluginURL;"
icon="cubes"
min="7.0.0"
support="https://git.casaderoll.de/michael/MUA-Mikes-Unraid-Agent"
project="https://git.casaderoll.de/michael/MUA-Mikes-Unraid-Agent"
>
<CHANGES>
### 2026.09.21.r029
- Liest mehrzeilige URBM- und Unraid-Benachrichtigungen ohne PHP-Parserwarnungen.
- Erhält Benachrichtigungstext wörtlich, ohne INI-Variablen auszuwerten; ergänzt Regressionstests.
### 2026.08.31.r028
- Beendet festhängende Tool-Aufrufe mit einem echten harten Timeout, auch wenn Kindprozesse Ausgabe-Streams offen halten.
- Ersetzt den fehleranfälligen globalen Tool-Zähler durch idempotente, selbstheilende Leases; abgebrochene Aufrufe blockieren MUA nicht mehr dauerhaft mit `Server busy`.
- Der Health-Endpunkt zeigt aktive und maximal erlaubte Tool-Aufrufe sowie das Alter des ältesten Aufrufs an.
- Beendet Prozesse bei erreichtem Ausgabelimit sofort und liefert die begrenzte Ausgabe weiterhin korrekt zurück.
### 2026.08.29.r027
- Stellt bei aktivierter Toolbox zwei echte MCP-Werkzeuge bereit: `unraid_toolbox_status` und `unraid_toolbox_exec`.
- Agenten erkennen und verwenden Medienwerkzeuge direkt im dynamisch gelabelten Container, ohne lokales Docker oder Umwege über die Host-Shell.
- Toolbox-Werkzeuge verschwinden automatisch aus `tools/list`, wenn der GUI-Schalter aus ist oder kein gelabelter Container existiert.
### 2026.08.29.r026
- Erkennt optionale Agent-Werkzeugcontainer dynamisch über `mike.ai.role=toolbox` statt über einen fest eingebauten Namen.
- Die WebGUI bietet den Toolbox-Schalter nur bei vorhandenem Label an und zeigt andernfalls eine konkrete Einrichtungsanleitung.
- Bei Aktivierung erhalten MCP-Clients den aktuellen Containernamen und die Nutzung über `unraid_system_shell`/`docker exec` als Serverhinweis.
### 2026.08.28.r025
- Die freie Unraid-Shell ist als direkter Host-Terminalweg beschrieben, damit Agenten sie statt lokaler Proxy-Skripte oder MUA-Quellcodeanalyse verwenden.
- Mehrzeilige Skripte bis 256 KiB und synchrone Laufzeiten bis 30 Minuten werden unterstützt; nur noch längere Arbeiten benötigen die vorhandenen asynchronen Job-Werkzeuge.
### 2026.08.25.r024
- Container-Inspect liefert standardmäßig nur Status, Image, Netzwerkmodus und Ports; Umgebungsvariablennamen und Mounts sind nur noch über `detail=full` enthalten.
- Reduziert große MCP-Ausgaben bei gezielten Containerdiagnosen und hält Secrets weiterhin vollständig aus den Antworten heraus.
### 2026.08.24.r023
- Begrenzt die Ausgabe der Nur-Lese-Shell bereits serverseitig auf standardmäßig 12.000 Zeichen und erlaubt ein explizites Limit von 1.000 bis 30.000 Zeichen.
- Präzisiert die Werkzeugbeschreibung für eine zielgerichtete Diagnosekette statt breiter Konfigurations- und Verzeichnisabfragen.
### 2026.08.24.r022
- Allgemeine asynchrone Root-Jobs mit getrennten Werkzeugen für Start, kompakten Status und Aufräumen verhindern HTTP-Timeouts bei langen autorisierten Arbeiten.
- Bestehende Freigaben der kritischen Root-Shell erhalten dieselbe Berechtigungsklasse automatisch; Nur-Lese-Profile bleiben unverändert.
- Jobstatus enthält nur Zustand, Exit-Code und begrenzte, redigierte Log-Enden. Kommandoargumente und mögliche Secrets werden nicht zurückgegeben.
### 2026.08.24.r021
- Die gefilterte Sammlungssuche beendet den Abstieg an einem passenden Verzeichnis. Episodenordner fluten dadurch nicht mehr das begrenzte Erkennungsergebnis.
- Der zweite Aufruf auf den gefundenen Sammlungspfad bleibt unverändert und liefert die vollständige gebündelte Bestandsaufnahme.
### 2026.08.24.r020
- Neues begrenztes Nur-Lese-Werkzeug `unraid_files_inventory` erfasst Datei- und Ordnernamen eines Shares in einem Aufruf, ohne Dateiinhalte zu lesen.
- Ein Namensfilter findet gezielt Sammlungsordner; ein zweiter gebündelter Aufruf inventarisiert den exakten Treffer. Medienprüfungen benötigen keine Kette aus wiederholten `ls`/`find`-Aufrufen mehr.
- Bestehende Freigaben der Nur-Lese-Shell erhalten das engere Inventarwerkzeug automatisch, ohne Schreibrechte hinzuzufügen.
### 2026.08.24.r019
- Ein gebündelter Docker-Updateablauf prüft echte Image-IDs, überspringt bereits aktuelle Images trotz veraltetem Unraid-Cache und erhält den ursprünglichen Laufzustand.
- Bis zu 25 ausdrücklich benannte Container werden in einem Werkzeugaufruf aktualisiert und anschließend kompakt auf Container-ID, Zustand, RestartCount und Health geprüft.
- Eine bestehende Freigabe des bisherigen Einzel-Update-Werkzeugs schaltet automatisch dessen sicherere Batch-Variante frei.
### 2026.08.24.r018
- Added focused, batched container-log analysis via `focus_terms` to avoid repeated shell/grep loops.
- Repaired the repository self-test command.
### 2026.08.24.r017
- Community-Applications-Suche akzeptiert bis zu fünf mit `|` getrennte Namens-, Schreib- oder Zweckvarianten in einem einzigen begrenzten Feed-Durchlauf.
- Treffer nennen die tatsächlich passenden Varianten; kleine Agenten müssen Synonyme nicht mehr in einzelnen Werkzeugrunden abfragen.
### 2026.08.23.r016
- Docker-Update-Status wird primär über Unraids nativen Containernamen-Schlüssel aufgelöst; Image-, `library/`- und `:latest`-Varianten bleiben als kompatible Fallbacks erhalten.
- Alternative Cacheformate und boolesche oder textuelle Statuswerte werden global normalisiert, statt einzelne Container wie Windows11 und WindowsXP als `unknown` zu verlieren.
- Unvollständige Ergebnisse enthalten `unknown_count`, `status_complete` und kennzeichnen `updates_available` ausdrücklich als Mindestzahl.
### 2026.08.22.r015
- Docker-Liste kann serverseitig nach running/stopped/created/exited filtern und liefert verbindliche Zustandszähler.
- Kompakte Antworten ohne Live-Metriken sind nun Standard; CPU/RAM/I/O und Detailfelder werden nur bei Bedarf erzeugt.
- Die Werkzeugbeschreibung weist kleine Modelle ausdrücklich auf state=running für aktive Container hin.
### 2026.08.21.r014
- CA-Template-Normalisierung: Fehlende Mode-Attribute werden ergänzt, damit Unraids Docker-Manager Community-Apps ohne PHP-Warnungen einliest.
### 2026.08.21.r013
- CA-Port-Override-Fix: Numerische XML-Ziele wie Port 8080 werden nach PHPs JSON-Dekodierung sicher als Text normalisiert.
### 2026.08.21.r012
- CA-Installationsfix: Vorhandene Container werden über eine exakte Docker-Namensabfrage erkannt statt durch fehleranfällige Interpretation von Docker-Fehlertexten.
### 2026.08.21.r011
- CA-Vorschau-Fix: asynchrone Bun-Dateiprüfungen werden korrekt abgewartet; freie Container- und Templatenamen werden nicht mehr fälschlich als belegt gemeldet.
### 2026.08.21.r010
- Sieben kompakte Unraid-Lesewerkzeuge für Systemzustand, Storage/Parity, SMART, Benachrichtigungen, Shares und Docker-Update-Status.
- Community Applications: offizieller Feed, kompakte Suche sowie sicherer Vorschau- und Installationsablauf.
- CA-Installationen benötigen ein exaktes, zehn Minuten gültiges Freigabeticket und erzeugen reguläre Unraid-Benutzertemplates für die GUI-Verwaltung.
- PHP-Helfer werden ohne Shell-Interpreter als direkte Argumentliste gestartet.
### 2026.08.21.r009
- WebGUI-Fix: Alle Formulare senden neben dem internen MUA-CSRF-Wert auch Unraids verpflichtendes csrf_token; Button-Klicks enden nicht mehr auf einer leeren Seite.
### 2026.08.21.r008
- Neue getrennte Nur-Lese-Shell: unraid_system_shell_readonly mit Programm-Allowlist und direkter argv-Ausführung ohne /bin/sh.
- Schreibende Unterbefehle und Optionen für ip, find, ss, dmesg, date, mount und hostname werden serverseitig abgelehnt.
- Die uneingeschränkte Root-Shell bleibt als separates kritisches Werkzeug standardmäßig deaktiviert.
- GUI-Fix: MUA-eigene CSS-Klassennamen verhindern die Kollision mit Unraids globaler notice-Klasse; die blaue Karte wird wieder korrekt dargestellt.
### 2026.08.21.r007
- Navigation: MUA liegt unter Settings → User Utilities; der Klick im Plugin-Manager öffnet zuverlässig die MUA-Seite (korrekte Groß-/Kleinschreibung).
- Sicherheitsprofile: Nur Lesen (Standard), Betrieb + Diagnose, Alles sperren und expliziter Vollzugriff.
- Fix: Eine leere Tool-Auswahl aktiviert nicht mehr versehentlich alle Tools.
- Secrets: Container-Umgebungswerte werden nicht mehr ausgegeben; häufige Secrets in Logs werden redigiert.
- API-Key: nur einmalige Klartextanzeige nach Rotation; danach ausschließlich maskiert.
- Config-Server: zusätzlicher, pro Start erneuerter Admin-Token und CSRF-Schutz in der WebGUI.
- Netzwerk: CORS standardmäßig aus, Request-Limit 1 MiB und Rate-Limit pro Client.
- Audit: Werkzeugname, Risikostufe, Ergebnis und Laufzeit ohne Argumente/Inhalte in mua-audit.log.
- WebGUI vollständig neu geordnet: Statuskarten, Sicherheitsprofile und Werkzeuge nach Risikostufe.
### 2026.08.18.r006
- Neues Tool: unraid_system_shell — direkter Shell-Zugriff auf den Unraid-Host (root, /bin/sh -c). Liefert exit_code + stdout + stderr (JSON).
- WebGUI: unraid_system_shell in der System-Tool-Gruppe (jetzt 2 System-Tools, insgesamt 22 Tools).
### 2026.08.18.r005
- Fix: unraid_docker_analyze_logs scan-all-Modus (ohne container-Parameter) funktionierte nicht — docker logs ohne Container-Argument lief ins Leere. Jetzt Loop über alle laufenden Container.
- Output: sample_matches enthält jetzt den Container-Namen + neues Feld containers_with_matches.
### 2026.08.18.r004
- Auto-Restart: Binary erkennt Update auf Platte (mtime/size) und startet den Service automatisch neu.
- WebGUI: „MUA neu starten"-Button (manueller Restart über Config-Server).
- POST-INSTALL/UPDATE: Service wird nach Installation/Update automatisch neu gestartet.
- WebGUI: Version wird dynamisch aus /health gelesen (kein hartkodiertes rNNN).
### 2026.08.18.r002
- API-Key-Authentifizierung (Bearer-Token) für den MCP-HTTP-Endpunkt (Port 3002). /health bleibt offen.
- Einstellungs-Maske im WebGUI-Tab: API-Key generieren + Tools per Checkbox aktivieren/deaktivieren.
- Config-Server auf 127.0.0.1:3013 (nur localhost) für WebGUI-Integration.
- Tool-Filter: deaktivierte Tools werden in tools/list ausgeblendet und bei tools/call abgelehnt.
### 2026.08.18.r001
- Initial release: 21 Docker, network, and system tools as MCP server over HTTP (Streamable HTTP, port 3002).
- Runtime: TypeScript (Bun Runtime, compiled binary) — no PHP built-in server.
</CHANGES>
<!--
===========================================
PRE-INSTALL: Cleanup + Verzeichnisse
===========================================
-->
<FILE Run="/bin/bash">
<INLINE>
set -e
echo ""
echo "===================================================="
echo " MUA - Mikes Unraid Agent"
echo " Installation"
echo "===================================================="
echo ""
# Verzeichnisse
mkdir -p &emhttpLOC;
mkdir -p &pluginLOC;
mkdir -p /var/log/plugins
touch /var/log/plugins/mua.log
</INLINE>
</FILE>
<!--
===========================================
SLACKWARE-PACKET INSTALLIEREN
===========================================
Das .txz enthält:
usr/local/bin/mua (kompiliertes Binary)
usr/local/bin/unraid-docker-mcp-helper.php (PHP-Helper)
etc/rc.d/rc.mua (SysVinit-Service)
usr/local/emhttp/plugins/mua/mua.page (WebGUI-Tab)
install/doinst.sh (läuft nach Installation)
===========================================
-->
<FILE Name="/boot/config/plugins/&name;/mua-2026.09.21.r029-x86_64-1.txz" Run="upgradepkg --install-new" Mode="755" Min="7.0.0">
<URL>&txzURL;</URL>
<SHA256>&txzSHA256;</SHA256>
</FILE>
<!--
===========================================
POST-INSTALL: Service neu starten + Health-Check
===========================================
Läuft nach Installation UND nach Update.
`restart` stoppt den Service (falls er läuft) und startet ihn neu —
funktioniert sowohl bei Erstinstallation als auch bei Update.
===========================================
-->
<FILE Run="/bin/bash">
<INLINE>
set +e
echo ""
echo " Starte MUA-Service neu..."
/etc/rc.d/rc.mua restart 2>/dev/null || true
echo ""
echo " Führe Health-Check aus..."
sleep 3
if curl -sf "http://127.0.0.1:3002/health" > /dev/null 2&gt;&amp;1; then
echo ""
echo " Health-Check: OK"
echo ""
echo "===================================================="
echo " MUA installiert und läuft auf Port 3002"
echo " Endpunkt: http://$(hostname -I | awk '{print $1}'):3002/mcp"
echo " WebGUI: Settings > User Utilities > MUA"
echo "===================================================="
else
echo ""
echo " WARNUNG: Health-Check fehlgeschlagen"
echo " Logs: tail -f /var/log/plugins/mua.log"
echo "===================================================="
fi
exit 0
</INLINE>
</FILE>
<!--
===========================================
UPDATE: Alte Dateien bereinigen
===========================================
-->
<FILE Run="/bin/bash" Method="update">
<INLINE>
# Service stoppen vor Update
/etc/rc.d/rc.mua stop 2>/dev/null || true
# Alte PHP-Dateien entfernen (falls vorhanden)
rm -rf &emhttpLOC;/mcp
rm -rf &emhttpLOC;/scripts
rm -f &emhttpLOC;/plugin.php
</INLINE>
</FILE>
<!--
===========================================
REMOVE: Deinstallation
===========================================
-->
<FILE Run="/bin/bash" Method="remove">
<INLINE>
echo ""
echo "===================================================="
echo " MUA - Mikes Unraid Agent"
echo " Deinstallation"
echo "===================================================="
echo ""
# 1. Service stoppen
/etc/rc.d/rc.mua stop 2>/dev/null || true
# 2. Service-Datei entfernen
rm -f /etc/rc.d/rc.mua
# 3. Binary entfernen
rm -f /usr/local/bin/mua
# 4. PHP-Helper entfernen
rm -f /usr/local/bin/unraid-docker-mcp-helper.php
rm -f /usr/local/bin/unraid-mcp-status-helper.php
# 5. Plugin-Verzeichnis entfernen
rm -rf &emhttpLOC;
# 6. Config entfernen
rm -rf &pluginLOC;
# 7. Logs entfernen
rm -f /var/log/plugins/mua.log
rm -f /var/log/plugins/mua-audit.log
rm -f /var/run/mua.pid
rm -f /var/run/mua-admin.token
echo ""
echo " MUA wurde deinstalliert."
echo "===================================================="
</INLINE>
</FILE>
</PLUGIN>