feat(schluessel): Zuweisen und Ausrollen auf der Schluesselseite (#017)

Auf der Seite eines Schluessels: Public Key einem Host oder einer
Gruppe zuweisen, Private Key (nur Admin) auf einen Quell-Host legen -
mit ~/.ssh/config-Eintrag und dem Host-Key des Ziels in known_hosts -,
Dry-Run fuer alle Ziele, anwenden und die Verbindung von A nach B
testen. Der Kern-Anwendungsfall laeuft damit im Browser durch (E2E).

Der Dry-Run nimmt Private-Key-Ziele nur fuer Admins auf: sonst koennte
ein Operator einen vorbereiteten Private Key ausrollen lassen. Die
Vorschau zeigt je Datei die Aktion; der Inhalt eines Private Keys
erreicht den Browser nie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 11:05:03 +02:00
co-authored by Claude Opus 5.5
parent 68136e8f07
commit 12603eb145
15 changed files with 660 additions and 39 deletions
@@ -1,10 +1,25 @@
"use client";
/**
* Platzhalter fuer „+ Ausrollen“ in der Karte „Public Key ausgerollt auf“ (#012).
* Inhalt folgt mit #016 (Zuweisung, Dry-Run, Ausrollen); bis dahin bewusst leer.
*/
export function PublicAusrollenAktion(props: { schluesselId: string; darf: boolean }): null {
void props;
return null;
import { AusrollDialog } from "@/components/ausrollen/AusrollDialog";
import { PublicZuweisenFormular } from "@/components/ausrollen/PublicZuweisenFormular";
import type { ZielAuswahl } from "@/server/queries/ziele";
/** „+ Ausrollen“ in der Karte „Public Key ausgerollt auf“ (#016). */
export function PublicAusrollenAktion({
schluesselId,
darf,
auswahl,
}: {
schluesselId: string;
darf: boolean;
auswahl?: ZielAuswahl;
}) {
if (!darf || !auswahl) return null;
return (
<AusrollDialog titel="Public Key zuweisen">
{(schliessen) => (
<PublicZuweisenFormular schluesselId={schluesselId} auswahl={auswahl} beiErfolg={schliessen} />
)}
</AusrollDialog>
);
}