# LaunchPad-Plugins Jeder Unterordner hier ist ein Plugin. Erkannt wird alles, was eine `index.js` mit einem passenden Default-Export enthält – kein Rebuild des Docker-Images nötig, dieser Ordner wird zur Laufzeit als Volume eingebunden (siehe `docker-compose.yml`). Nach dem Hinzufügen/Ändern eines Plugins reicht ein Neustart des Backend-Containers: ```bash docker compose restart backend ``` ## Minimalstruktur ``` apps/backend/plugins/mein-plugin/ └── index.js ``` ```js export default { name: "mein-plugin", version: "1.0.0", description: "Kurze Beschreibung, erscheint unter Admin -> Plugins", // optional: Scanner erweitern setup(ctx) { ctx.registerSoftwareSignature({ name: "Meine Software", category: "Sonstiges", icon: "🔧", // Emoji oder Icon-URL matches: (input) => !!input.body && /meine-software/i.test(input.body), }); }, // optional: eigene Geräte-Importquelle async importDevices() { return [ { hostname: "beispiel", ip: "192.168.1.99", source: "plugin" }, ]; }, }; ``` Beide Funktionen (`setup`, `importDevices`) sind optional – ein Plugin kann nur die eine, nur die andere, oder beide implementieren. Reines JavaScript (ESM), kein Build-Schritt nötig. ## Was Plugins aktuell können - **Scanner registrieren**: `ctx.registerSoftwareSignature(...)` in `setup()` fügt der automatischen Softwareerkennung (siehe `apps/backend/src/scanner/softwareDetection.ts`) eine zusätzliche Signatur hinzu, inklusive eigenem Icon. Wird bei jedem Geräte-Scan berücksichtigt. - **Geräte importieren**: `importDevices()` liefert eine Liste von Geräten, die per Knopfdruck unter Admin -> Plugins importiert werden (`POST /api/plugins/:name/import`). Abgeglichen wird wie bei Scans über MAC/IP – ein erneuter Import überschreibt keine Gerätefelder, die der Nutzer zwischenzeitlich geändert hat, außer den scan-eigenen (siehe `upsertDeviceFromScan`). - **Icons bereitstellen**: über `icon` an einer registrierten Signatur. Wird als Startwert für neu angelegte Dienste übernommen (wie `category` – niemals nachträglich überschrieben, siehe README Hauptprojekt). ## Was (noch) nicht geht - Eigene Admin-Menüpunkte/Unterseiten (aktuell erscheinen alle Plugins gesammelt auf einer Seite unter Admin -> Plugins, keine eigene Route pro Plugin). - Kein Sandboxing: Plugin-Code läuft mit vollem Zugriff im Backend-Prozess. Nur Plugins aus vertrauenswürdiger Quelle einbinden. ## Beispiel-Plugins - `example-signatures/` – registriert zwei zusätzliche Software-Signaturen (Homebridge, Uptime Kuma). - `static-import/` – importiert Geräte aus einer lokalen `devices.json` (standardmäßig leer, siehe `devices.example.json` für das Format).