Release Notes

Übersicht

Auf dieser Seite finden Sie die vollständige Versionshistorie von Staging & Cisco Tools. Jeder Eintrag dokumentiert neue Funktionen, Änderungen, Bugfixes und Sicherheitsaktualisierungen.

Die Versionierung folgt Semantic Versioning 2.0.0. Das Änderungsformat orientiert sich an Keep a Changelog.

Projekt-Statistik live

Aktueller Umfang des selbst geschriebenen Quellcodes (PHP, JavaScript, CSS) – ohne externe Abhängigkeiten im vendor/-Verzeichnis.

443
Dateien
179.282
Zeilen Code
PHP
363 Dateien · 120.474 Zeilen
JavaScript
64 Dateien · 54.312 Zeilen
CSS
16 Dateien · 4.496 Zeilen

Stand: 15.06.2026 12:25 Uhr · Letzte Code-Änderung: 15.06.2026

Aktuelle Version
v2.32.0 – Opt-In stable 15.06.2026

Direkt zum Eintrag: v2.32.0

Vorschau – nächster Release in Arbeit noch nicht veröffentlicht

Diese Änderungen sind auf dem Default-Branch gemerged, aber noch nicht Teil eines offiziellen Releases.

Geändert
  • Konsolenserver fordert das Live-SSH-Terminal automatisch mit an. Der Konsolenserver nutzt für den Read-out das Live-SSH-Terminal und ist ohne dessen Freigabe nicht nutzbar. Beantragt ein Benutzer den Konsolenserver, ohne das SSH-Terminal freigeschaltet zu haben, wird das SSH-Terminal jetzt automatisch mitbeantragt – die gesperrte Kachel und das Profil weisen darauf hin. Fehlt die SSH-Freigabe später wieder, gilt der Konsolenserver erneut als gesperrt und kann zusammen mit dem SSH-Terminal neu beantragt werden.
v2.32.0 – Opt-In stable 15.06.2026

Modul-Zugänge auf Antrag. Außer dem Konfigurator sind alle Module pro Benutzer jetzt standardmäßig gesperrt; der Zugang wird über ein Antragssystem geregelt – Benutzer beantragen ihn direkt an der gesperrten Kachel, Admins und Superadmins geben frei oder lehnen ab, optional mit modulweiser Selbstfreigabe. Dazu: eine öffentliche Info- & Kontaktseite sowie Startseiten-Hinweise mit optionalem Ablaufdatum.

Neu
  • Modul-Zugänge auf Antrag (Opt-in). Außer dem Konfigurator sind alle Module pro Benutzer jetzt standardmäßig gesperrt – der Zugang wird über ein Antragssystem geregelt. Gesperrte Module bleiben als Kachel bzw. Menüeintrag sichtbar und bieten „Zugang beantragen"; der Antrag (optional mit Begründung) landet bei Admins und Superadmins, die ihn im Backend unter System → Zugriffsanträge freigeben oder ablehnen. Pro Modul lässt sich eine Selbstfreigabe aktivieren (Modulsteuerung, nur Superadmin) – dann wird der Antrag sofort automatisch genehmigt (empfohlen z. B. für CVE-Check und Seriennummer-Info). Benutzer verfolgen ihre Anträge im eigenen Profil unter „Meine Modulzugänge & Anträge". Über neue Anträge und Entscheidungen informieren Postfach und Webhooks die jeweils Beteiligten. Superadmins behalten vollen Zugriff (Bypass). Bestandsnutzer behalten ihren bisherigen Zugriff nahtlos; nach dem Update einmalig die Migrationen „Modul-Zugangs-Requests" und „Grandfathering" in der Migrations-Übersicht ausführen.
  • Öffentliche Info- & Kontaktseite. Über das Info-Menü erreichbar (contact.php): Ansprechpartner mit Erreichbarkeits-Ampel (grün/gelb/rot) und Support-Kanäle als Schnellzugriff-Kacheln (z. B. Webex-Space; „Bug melden“ und „Feature vorschlagen“ öffnen direkt das Feedback-Formular). Pflege im Backend unter System → Kontaktseite, inklusive Sortierung und Ausblenden einzelner Einträge; Neuinstallationen erhalten die nötigen Tabellen direkt über den Setup-Wizard, Bestandsinstallationen über die Migration „Kontakt-/Infoseite".
  • Startseiten-Hinweise mit optionalem Ablaufdatum. Hinweise (System → Einstellungen → Hinweise) können nun ein „Sichtbar bis“-Datum erhalten und verschwinden danach automatisch. Dieselben Hinweise erscheinen jetzt zusätzlich im Bereich „Aktuelle Hinweise“ der Info- & Kontaktseite – zentral an einer Stelle gepflegt.
v2.31.0 – MFA stable 12.06.2026

Zwei-Faktor-Authentifizierung mit Cisco Duo. Die Anmeldung am Admin-Backend kann jetzt mit Cisco Duo abgesichert werden: Nach dem korrekten Passwort bestätigt der Benutzer die Anmeldung per Duo (Push, Passcode oder Sicherheitsschlüssel). Die Durchsetzung ist stufenweise ausrollbar – von einer Pilot-Gruppe bis zur Pflicht für alle Benutzer – und vollständig im Admin-Backend konfigurierbar.

Neu
  • Duo-Zwei-Faktor-Anmeldung (Universal Prompt). Ist Duo aktiv, wird der Benutzer nach erfolgreicher Passwort-Prüfung zur Duo-Bestätigung weitergeleitet; die Sitzung entsteht erst nach erfolgreichem zweiten Faktor – es gibt keinen halb angemeldeten Zustand. Gilt für die Login-Seite und den Login über das Frontend. Das Onboarding neuer Geräte (Enrollment) übernimmt Duo direkt im Anmelde-Flow.
  • Duo-Konfiguration unter System → Sicherheits-Einstellungen. Zugangsdaten der Duo-Applikation, Verbindungstest mit aussagekräftiger Fehlerdiagnose, Durchsetzung (Pilot mit Benutzerliste oder Pflicht für alle) sowie das Verhalten bei Duo-Ausfall (Closed: Login verweigern, empfohlen – oder Open: Login ohne zweiten Faktor zulassen, wird auditiert). Standardmäßig ist Duo deaktiviert; ohne vollständige Konfiguration bleibt der Login unverändert.
  • Lückenlose Audit-Spur. Jeder Schritt der Zwei-Faktor-Anmeldung erzeugt ein Ereignis im Security-Audit-Log – Weiterleitung, Erfolg, Ablehnung, abgelaufene oder manipulierte Anfragen sowie ein etwaiger Ausfall-Bypass.
Geändert
  • Konto-Wiederherstellung mit Duo-Bestätigung. Gilt für einen Benutzer die Duo-Pflicht, verlangt auch die Wiederherstellung per Recovery-Code zusätzlich die Duo-Bestätigung, bevor das Passwort neu gesetzt werden kann. Eine Sitzung entsteht dabei weiterhin nicht.
  • E-Mail-Adresse bei aktivem Duo schreibgeschützt. Die E-Mail-Adresse identifiziert das Konto gegenüber Duo und ist deshalb im eigenen Profil nicht mehr änderbar, solange Duo aktiv ist. Änderungen nimmt ein Superadmin in der Benutzerverwaltung vor; sie werden auditiert.
  • Aufgeräumte Navigation und Einstellungen. Die Duo-Sektion steht jetzt an erster Stelle der Sicherheits-Einstellungen. Im System-Menü bilden Konsolenserver, E-Mail-Versand und Einstellungen einen eigenen Block am Ende.
Sicherheit
  • Duo-Zugangsdaten verschlüsselt gespeichert. Das Client Secret wird mit AES-256-GCM verschlüsselt abgelegt (Schlüssel in der Server-Konfiguration) und nach dem Speichern nie wieder angezeigt.
  • Sofort wirksamer Notfall-Schalter. Duo lässt sich jederzeit ohne Neustart oder Deployment deaktivieren – der Login fällt dann auf das bisherige Verhalten zurück. Ein Break-Glass-Vorgehen für den Ernstfall ist in der Betriebsdokumentation beschrieben.
Entfernt
  • Authenticator-App (TOTP) entfernt. Die TOTP-Kopplung im Profil und die TOTP-Option in der Konto-Wiederherstellung entfallen – Duo ist jetzt die zentrale Authenticator-Lösung, ein paralleles System daneben stiftete nur Verwirrung. Recovery-Codes bleiben als Offline-Notfallweg erhalten. Hinweis: Wer bisher nur TOTP und keine Recovery-Codes eingerichtet hat, erzeugt diese bitte im Profil neu; alternativ kann ein Superadmin einen Einmal-Reset-Link ausstellen.
v2.30.0 – Mail stable 11.06.2026

E-Mail-Versand über SMTP. System-Mails (Passwort-Reset, Registrierung, Warenkorb-Reports) können jetzt über einen SMTP-Server versendet werden statt über den lokalen Mailserver – komplett im Admin-Backend konfigurierbar, inklusive Testmail-Funktion mit aussagekräftiger Fehlerdiagnose. Dazu: Live-Port-Übersicht und Ein-Klick-Verbindung für Konsolenserver.

Neu
  • SMTP-Versand konfigurierbar. Neue Superadmin-Seite System → E-Mail-Versand: Umschalten zwischen dem bisherigen Versand über den lokalen Mailserver und einem SMTP-Server (STARTTLS/SMTPS, optionale Authentifizierung, Timeout). Absender-Adresse und -Name lassen sich dort ebenfalls pflegen; ohne Umstellung behalten Bestandsinstallationen ihr bisheriges Verhalten. Nach dem Update einmalig die anstehende Migration in der Migrations-Übersicht ausführen.
  • Testmail mit Diagnose. Ein Klick sendet eine Testmail an die eigene Adresse. Schlägt der Versand fehl, zeigt die Meldung die konkrete Antwort des Mailservers (z. B. eine abgelehnte Anmeldung) statt eines generischen Fehlers. Eine Status-Card fasst aktiven Transport, letztes Testergebnis und Konfigurationsstand zusammen.
  • Konsolenserver: Live-Port-Übersicht und Direktverbindung. Die Port-Liste eines Konsolenservers wird live vom Gerät abgerufen – inklusive Baudrate und serieller Einstellungen – und jeder Port lässt sich per Klick direkt im Live-SSH-Terminal öffnen, auf Wunsch mit hinterlegtem Passwort.
Geändert
  • Alle System-Mails über einen zentralen Transport. Passwort-Reset, Registrierungs-Bestätigung und Warenkorb-Reports (manuell wie zeitgesteuert) verwenden die zentral konfigurierte Versandart – ein Wechsel auf SMTP wirkt sofort für alle ausgehenden Mails.
Sicherheit
  • SMTP-Passwort verschlüsselt gespeichert. Das Passwort wird mit AES-256-GCM verschlüsselt abgelegt (Schlüssel in der Server-Konfiguration), nach dem Speichern nie wieder angezeigt und kann jederzeit gelöscht werden.
v2.29.3 – Picture stable 10.06.2026

VLAN-IDs nachträglich änderbar – mit Sync in alle Richtungen. Schritt 3 bleibt die zentrale VLAN-Sicht, gibt Änderungen jetzt aber auch zurück: Wer dort eine VLAN-ID ändert, zieht automatisch alle Verweise im gesamten Konfigurator mit – von den Port-Gruppen über SVIs bis zu ACL-Zuweisungen. Dazu ein prägnanterer Einfach/Experte-Umschalter.

Neu
  • VLAN-IDs nachträglich änderbar – mit Sync in alle Richtungen. In Schritt 3 lässt sich die ID eines VLANs jetzt auch beim Bearbeiten ändern. Alle Verweise im gesamten Konfigurator ziehen automatisch mit: Management-VLAN (Schritt 1), Access-/Voice-/Trunk-Native-VLANs und Trunk-Allowed-Listen der Port-Gruppen, MST-Instanz-Ranges (Schritt 2), SVIs inkl. FHRP (Schritt 4) sowie ACL-Zuweisungen auf VLAN-Interfaces (Schritt 6). Ein Live-Hinweis am ID-Feld zeigt die Anzahl betroffener Verweise, ein Bestätigungsdialog listet sie vor dem Anwenden im Detail auf – inklusive Vorher/Nachher bei Range-Angaben wie 10,20,40-50.
Geändert
  • Prägnanterer Einfach/Experte-Umschalter. Der Modus-Umschalter im Konfigurator ist jetzt ein Segmented Control mit Farbsemantik: Einfach leuchtet im Cisco-Blau der App, Experte im Amber der „Experte"-Badges. Die Hinweis-Pille zu ausgeblendeten Optionen ist passend amber-getönt – sie zählt ja genau die Experte-Optionen.
v2.29.2 – Picture stable 10.06.2026

Feinschliff im Feedback-Dialog. Zwei kleine Verbesserungen an den Dialogen „Bug melden" und „Feature vorschlagen": Nach dem Absenden ist klarer, dass nichts mehr verworfen wird, und vorbelegte Felder sind auf einen Blick als nicht änderbar erkennbar.

Geändert
  • „Abbrechen" wird nach dem Absenden zu „Schließen". Sobald ein Bug-Report oder Feature-Vorschlag erfolgreich gesendet wurde, heißt der zweite Button „Schließen" (mit ✕-Symbol) statt „Abbrechen" – es entsteht nicht mehr der Eindruck, der gerade eingereichte Vorgang könne noch verworfen werden.
Behoben
  • Vorbelegte Felder klar als schreibgeschützt erkennbar. Bei angemeldeten Benutzern sind Name und E-Mail im Feedback-Dialog aus dem Konto übernommen und nicht änderbar – diese Felder wirkten bisher jedoch beschreibbar. Sie erscheinen nun grau hinterlegt mit einem Schloss-Symbol am Feldnamen (inkl. Hinweis-Tooltip), in Hell- und Dunkel-Modus.
v2.29.1 – Picture stable 10.06.2026

Port-Gruppen umbenennen. Im Konfigurator (Schritt 2 – Interfaces) lassen sich Port-Gruppen jetzt direkt in der Liste umbenennen – Stift-Symbol anklicken, neuen Namen eintippen, mit Enter bestätigen.

Neu
  • Inline-Umbenennung für Port-Gruppen. Jede Gruppenzeile in Schritt 2 trägt neben dem Löschen-Button ein Stift-Symbol. Ein Klick verwandelt den Namen in ein Eingabefeld direkt in der Zeile: Enter bzw. ✓ speichert, Esc bzw. ✗ bricht ab. Der neue Name erscheint sofort im Titel der Port-Konfiguration und in der CLI-Vorschau (Kommentar- und description-Zeilen).
v2.29.0 – Picture stable 10.06.2026

„Picture" – Bilder im Feedback. Beim Bug melden oder Feature vorschlagen lassen sich jetzt Screenshots und Bilder anhängen – einfach ins Eingabefeld ziehen, mit Strg+V einfügen oder über den Bild-Button auswählen. Die Bilder erscheinen direkt in der Beschreibung und, sofern gewünscht, auch auf der öffentlichen Status-Seite des Vorgangs. Im Backend lassen sich Anhänge ansehen, entfernen und pro Vorgang auf „nur intern" stellen.

Neu
  • Bild-Anhänge im Feedback-Dialog. In „Bug melden" und „Feature vorschlagen" können angemeldete Benutzer Bilder anhängen – per Drag & Drop, durch Einfügen aus der Zwischenablage (Strg+V, ideal für Screenshots) oder über den Bild-Button im Editor. Unterstützt werden JPG, PNG, WebP und GIF, bis zu 3 Bilder à max. 5 MB.
  • Anzeige in Beschreibung und öffentlicher Seite. Angehängte Bilder werden direkt in der Vorgangsbeschreibung dargestellt und – sofern freigegeben – auch Besuchern der öffentlichen Status-Seite gezeigt.
  • Verwaltung im Backend. Auf der Detailseite eines Bugs bzw. Feature-Requests gibt es eine Anhang-Übersicht: Bilder ansehen, einzeln entfernen und auch in Kommentaren neue Bilder hinzufügen.
  • Sichtbarkeit pro Vorgang steuerbar. Ein Schalter „Öffentlich sichtbar / Nur intern" legt fest, ob die Bilder eines Vorgangs auf der öffentlichen Seite erscheinen. Auf „intern" gestellt, sind sie ausschließlich im Backend einsehbar.
Sicherheit
  • Sichere Bildverarbeitung. Hochgeladene Bilder werden serverseitig neu aufbereitet und in ein sicheres Format überführt; eingebettete Inhalte und Metadaten (z. B. Standortdaten) werden dabei entfernt. Die Auslieferung erfolgt ausschließlich über einen abgesicherten, zugriffsbeschränkten Weg.
v2.28.0 – Modus stable 09.06.2026

„Modus" – ein Einfach- und ein Experten-Modus im Konfigurator. Der Wizard ist über die Zeit sehr umfangreich geworden. Mit einem Umschalter direkt unter der Schrittleiste lässt sich nun zwischen Einfach (nur die wichtigsten Einstellungen für eine Standard-Konfiguration) und Experte (alle Optionen) wechseln. Es bleibt ein einziger Wizard – im Einfach-Modus werden die erweiterten Bereiche lediglich ausgeblendet, ihre Werte bleiben erhalten. Die gewählte Ansicht wird im Browser gemerkt.

Neu
  • Einfach-/Experten-Umschalter im Konfigurator (eine eigene Kachel unter der Schrittleiste). Neue Nutzer starten im Einfach-Modus, der nur die gängigsten Einstellungen zeigt; Experte blendet sämtliche Optionen ein. Die Auswahl wird lokal im Browser gemerkt.
  • „Experte"-Kennzeichnung. Alle erweiterten Bereiche tragen im Experten-Modus ein „Experte"-Badge – von Globale Variablen, Management-IPv6, StackWise Virtual, MST & Spanning Tree, VTP, per-VLAN-STP über IPv6-Routing, VRF, Loopbacks, FHRP und die Routing-Protokolle bis hin zu Line-Konfiguration, AAA und SNMP. Der komplett experten-pflichtige ACL-Schritt ist zusätzlich direkt in der Schrittleiste markiert.
  • Überblick über ausgeblendete Optionen. Im Einfach-Modus zeigt ein Hinweis, wie viele erweiterte Optionen ausgeblendet sind; ein Hover listet sie – nach Schritt gruppiert – konkret auf.
Geändert
  • Aufgeräumte Schrittleiste. Der Modus-Umschalter und der Hinweis zu ausgeblendeten Optionen liegen in einer eigenen Zeile unter den Schritten, damit die obere Leiste (Schritte, Vorschau, Entwurf-Status) nicht überladen wirkt.
v2.27.0 – Recovery stable 09.06.2026

„Recovery" – Passwort-Wiederherstellung ohne E-Mail. Der klassische „Passwort vergessen“-Link setzt einen funktionierenden Mailversand voraus. Damit ausgesperrte Benutzer auch ohne E-Mail wieder Zugang erhalten, gibt es jetzt zusätzliche Wege: selbst erzeugte Recovery-Codes, eine Authenticator-App (TOTP) sowie einen sofort wirksamen, admin-gestützten Reset im Backend.

Neu
  • Konto-Wiederherstellung ohne E-Mail. Da der Mailversand für den klassischen „Passwort vergessen“-Link nötig ist, gibt es jetzt zusätzliche Wege: Benutzer können sich über Recovery-Codes (einmalige Codes, im Profil erzeugbar) oder eine Authenticator-App (TOTP) selbst wieder Zugang verschaffen. Beide Wege führen auf dieselbe geprüfte Seite zum Setzen eines neuen Passworts.
  • Einrichtung im Profil. Unter „Konto-Wiederherstellung“ lassen sich Recovery-Codes erzeugen (anzeigen/herunterladen/kopieren, einmalig) und eine Authenticator-App koppeln (Schlüssel/otpauth-Link, Bestätigung per 6-stelligem Code).
  • Admin-gestützter Reset (sofort, ohne E-Mail). In der Benutzerverwaltung können Superadmins einen 60 Minuten gültigen Einmal-Reset-Link erzeugen und weitergeben sowie ein temporäres Passwort mit „Änderung beim nächsten Login erzwingen“ setzen.
v2.26.0 – Activation stable 08.06.2026

„Activation" – die Konto-Aktivierung ist jetzt frei wählbar. Nach einer Registrierung lässt sich im Backend festlegen, wie ein neues Benutzerkonto aktiv wird: klassisch per Bestätigungs-E-Mail, sofort nach Abschluss der Registrierung oder erst nach Freigabe durch einen Superadmin. So funktioniert die Selbstregistrierung auch dann zuverlässig, wenn der E-Mail-Versand gerade nicht zur Verfügung steht. Jede Registrierung kann zusätzlich als Webhook an Slack, Teams, Webex & Co. gemeldet werden – inklusive Direkt-Link zur Freigabe.

Neu
  • Wählbare Aktivierungsart für neue Benutzer in den Einstellungen (Karte „Registrierung"): Per E-Mail bestätigen (wie bisher, Aktivierung über einen Bestätigungslink), Sofort aktiv (das Konto ist direkt nach der Registrierung nutzbar) oder Freigabe durch Superadmin (das Konto bleibt inaktiv, bis es manuell freigegeben wird).
  • Unabhängig vom E-Mail-Versand. In den beiden neuen Modi wählt der Benutzer sein Passwort direkt im Registrierungsformular – ein automatisch erzeugtes Passwort per E-Mail ist nicht mehr nötig. Die optionale Beschränkung auf erlaubte E-Mail-Domains greift weiterhin.
  • Komfortable Superadmin-Freigabe. Wartet ein Konto auf Freigabe, werden alle Superadmins im Postfach benachrichtigt und können den Benutzer mit einem Klick in der Benutzerverwaltung aktivieren; nach der Freigabe erhält der Benutzer eine Willkommens-Nachricht in seinem Postfach.
  • Neues Webhook-Event „user.registered" (System-Event). Jede Selbstregistrierung kann an externe Kanäle gemeldet werden – Slack, Mattermost, Microsoft Teams, Cisco Webex, Discord oder einen eigenen JSON-Empfänger – mit Benutzername, Anzeigename, E-Mail, gewählter Aktivierungsart und dem Hinweis, ob noch eine Freigabe aussteht. Abonnierbar über das Superadmin-Webhook-Modal in der Gruppe System.
  • Direkt-Link in der Webhook-Benachrichtigung. Die Meldung enthält einen channel-nativen Button bzw. Link, der direkt zum betreffenden Benutzer in der Benutzerverwaltung führt und ihn dort kurz hervorhebt – im Freigabe-Modus mit der Beschriftung „Benutzer freigeben", sonst „Benutzer ansehen".
  • Lifecycle-Informationen (EoL/EoS/EoSr) im CVE-Check – in Vorbereitung. Sobald für den hinterlegten Cisco-Account die zugehörige Lifecycle-API verfügbar und freigeschaltet ist, werden pro geprüfter Komponente End-of-Sale, End-of-Software-Maintenance, Ende des Security-Support und das Last Date of Support angezeigt – inklusive Cisco-Migrationsempfehlung und einem Lifecycle-Badge im Ergebnis. Bis dahin bleibt der CVE-Check auf reine Schwachstellen-Auskunft beschränkt.
v2.25.0 – Setup stable 31.05.2026

„Setup" – ein geführter Einrichtungs-Assistent für den Browser. Die Erstinbetriebnahme läuft jetzt vollständig über einen mehrstufigen Assistenten: Systemvoraussetzungen prüfen, Datenbank verbinden und testen, das erste Administrator-Konto anlegen, die Grundeinstellungen festlegen und die Installation abschließen – Schritt für Schritt, mit Fortschrittsanzeige und ohne manuelles Hantieren an Konfigurationen. Bis die Einrichtung abgeschlossen ist, bleibt die Anwendung gesperrt und verweist freundlich auf den Assistenten.

Neu
  • Geführter Einrichtungs-Assistent für die Erstinstallation. Er führt in klar getrennten Schritten durch Willkommen & Voraussetzungen, Datenbank, Administrator-Konto, Anwendungseinstellungen, regelmäßige Hintergrund-Aufgaben, die optionale Terminal-Anbindung sowie eine abschließende Übersicht – jeweils mit Vor-/Zurück-Navigation und Schrittanzeige.
  • Automatische Voraussetzungs-Prüfung direkt zu Beginn: benötigte Laufzeit-Version, erforderliche Erweiterungen, Schreibrechte und eine sichere Verbindung werden in einer übersichtlichen Ampel-Darstellung angezeigt, sodass auf einen Blick erkennbar ist, was erfüllt ist und was noch fehlt.
  • Pflicht-Verbindungstest zur Datenbank, bevor es weitergeht. Die eingegebenen Zugangsdaten werden unmittelbar im Assistenten geprüft, damit Tippfehler sofort auffallen statt erst später im Betrieb.
  • Komfortable Anlage des ersten Administrator-Kontos – wahlweise mit selbst gewähltem Passwort samt Stärke-Anzeige oder einem automatisch erzeugten, sicheren Passwort, das am Ende einmalig angezeigt wird.
  • Automatisch erkannte Basis-URL. Der Assistent schlägt die öffentliche Adresse der Anwendung anhand des aktuellen Aufrufs vor und trägt sie bereits vorausgefüllt ein – bei Bedarf frei überschreibbar.
  • Weitere Grundeinstellungen an einer Stelle: Absenderadresse für System-E-Mails, Sicherheitsstufe für den Formular-Schutz, der Umgang mit vorgelagerten Proxys und ob die Selbstregistrierung erlaubt sein soll.
  • Fertige Copy-&-Paste-Anleitungen für die regelmäßigen Hintergrund-Aufgaben und die optionale Terminal-Anbindung, passend auf die jeweilige Umgebung zugeschnitten.
  • Mehrsprachig und themenfähig. Der Assistent steht auf Deutsch und Englisch zur Verfügung und übernimmt das helle bzw. dunkle Design des restlichen Bereichs.
  • Schutz vor halben Zuständen. Solange die Einrichtung nicht abgeschlossen ist, bleibt die übrige Anwendung gesperrt und zeigt einen freundlichen Hinweis mit Direktlink zum Assistenten; nach Abschluss ist der Assistent gegen ein versehentliches erneutes Ausführen abgesichert.
v2.24.0 – CVE stable 27.05.2026

„CVE" – Cisco-Schwachstellen-Check als neues Modul. Eine öffentliche Prüfseite vergleicht ausgewählte oder manuell eingegebene Geräte und Software-Versionen gegen die offizielle Cisco-Schwachstellen-Datenbank, zeigt Severity, CVSS, gefixte Versionen und Workaround-Verfügbarkeit pro Treffer an und gibt konkrete Handlungsempfehlungen. Tippfehler in der Software-Version werden bereits beim Eintippen über eine Autovervollständigung mit den von Cisco gepflegten Releases abgefangen.

Neu
  • Cisco CVE-Vulnerability-Check als neue öffentliche Seite. Geräte lassen sich aus dem Katalog wählen oder per SKU manuell eingeben; pro Komponente kann eine Software-Version mitgegeben werden. Das Ergebnis zeigt bekannte Sicherheitslücken inkl. Severity, CVSS-Werte, betroffener CVE-IDs, der von Cisco gefixten Versionen und ob ein Workaround verfügbar ist – jeweils mit direktem Link auf das Cisco-Advisory.
  • Konkrete Handlungsempfehlungen pro Komponente: empfohlene Ziel-Version für ein Upgrade, Hinweis auf einen vorhandenen Workaround und eine konsolidierte „Alles in Ordnung"-Meldung, wenn keine Treffer existieren.
  • Eingabe-Validierung der Software-Version. Beim Tippen werden die von Cisco gepflegten Releases zum gewählten Betriebssystem (IOS XE, IOS, NX-OS, ASA, FTD, FXOS) als Autocomplete-Vorschläge angeboten; ein Status-Indikator unter dem Feld zeigt jederzeit, wie viele Versionen verfügbar sind oder warum eine Liste gerade nicht abrufbar ist. Eine unbekannt eingetippte Version löst in der Ergebnisansicht einen klaren Hinweis mit den nächsten passenden Versionen aus, statt eine leere Treffer-Liste zu zeigen.
  • Mehrere Komponenten in einem Lauf prüfen (bis zu 25 Einträge pro Abfrage).
  • CSV- und Excel-Export der Prüfergebnisse mit Severity, CVE-IDs, gefixten Versionen, Workaround-Spalten und Remediation-Empfehlungen. Ein zweiter Export verbraucht kein zusätzliches API-Budget.
  • Neues Admin-Modul „CVE-Einstellungen". Superadmins hinterlegen die OAuth2-Zugangsdaten von apiconsole.cisco.com, testen die Verbindung mit einem Klick, sehen den Status pro Teil-API getrennt und können den Antwort-Cache selektiv leeren. Eine Status-Kachel zeigt Token-Gültigkeit, Cache-Statistik und die letzten Anfragen.
  • Eigener Block für „CVE-Einstellungen" im System-Dropdown der Backend-Navigation.
  • Automatische Cache- und Protokoll-Bereinigung. Eine wartungsfreie Routine entfernt abgelaufene API-Antworten und alte Aktivitätsprotokolle; die Aufbewahrungsdauer ist in den Sicherheits-Einstellungen konfigurierbar.
  • DE/EN durchgängig. Das gesamte CVE-Modul (Prüfseite, Admin-Bereich, Fehlertexte, Export-Spalten, Empfehlungen) ist über den projektweiten Sprach-Switcher zweisprachig.
  • Frisch-Installation: Das CVE-Modul ist im Setup-Routinen mit verdrahtet, neue Umgebungen bringen die nötigen Strukturen ohne Zusatzschritt mit.
Geändert
  • Pflichtfeld-Hinweis an Client-ID und Client-Secret in der API-Credentials-Kachel der CVE-Einstellungen – konsistent zur projektweiten Formular-Konvention.
  • Aussagekräftige Statusmeldungen bei Cisco-API-Problemen. Verbindungstest und Public-Frontend zeigen klare Hinweise, wenn das Token abgelaufen ist, ein Rate-Limit greift oder einem Konto die Berechtigung für eine bestimmte Teil-API fehlt – statt stillschweigend leere Ergebnisse anzuzeigen.
  • Robustere Versions-Liste. Temporäre API-Fehler oder Parsing-Probleme werden nicht mehr fest gespeichert; ein erneuter Aufruf holt die Liste automatisch frisch. Betriebssysteme, für die Cisco keine Versionsliste pflegt, werden mit eindeutigem Hinweis markiert.
v2.23.0 – Translated stable 25.05.2026

„Translated" – projektweite DE/EN-Internationalisierung. Die komplette UI-Hülle (PHP-Templates und JS-Bundles) ist jetzt DE/EN-zweisprachig, alle nutzersichtbaren API-Fehlermeldungen liefern lokalisierten Text passend zum aktiven Cookie, und die zuvor eigenständige SDA-i18n-Runtime ist in das projektweite t()/te()-System konsolidiert – ein Sprach-Switcher schaltet jetzt Konfigurator, CLI-Editor, SSH-Terminal, Feedback-Flows und den SDA-Wizard gemeinsam um.

Neu
  • DE/EN-Sprachumschalter im Header und Footer; die Auswahl persistiert im app_lang-Cookie und wirkt projektweit.
  • Föderiertes Dictionary unter admin/includes/i18n/*.php (eine Datei pro Modul: common, btn, js, api, sda, wizard, inbox, customers, …). Modul-Dicts liefern ['de' => …, 'en' => …] und werden automatisch eingelesen.
  • Projektweite Runtime admin/includes/i18n.php: t($key, $params), te() (HTML-escaped), Platzhalter :name, Locale-Auflösung GET → Cookie → Session → Default.
  • JS-Bridge js/i18n.js (window.i18n.t/te) liest das vom Server injizierte window.__I18N-Mapping und unterstützt dieselben Platzhalter.
  • DE/EN-Paritätstest tests/i18n.smoke.php: prüft pro Dict-File, dass jeder Key in beiden Sprachen vorhanden ist.
Geändert
  • API-Fehlermeldungen sind übersetzt. Alle JSON-Error-Responses unter admin/api/* – Kern-Projekt-Endpoints, Template-Schema-Validierung, Feedback-/CLI-Snippet-/Firmware-Upload-APIs, das gesamte vault/* (29 Dateien, json_fail()-Helper) sowie die Plain-Text-Antworten der download/*- und export/*-Endpoints – liefern lokalisierten Text.
  • SDA-Wizard-Modul konsolidiert. Die frühere eigenständige SDA-i18n-Runtime (admin/includes/sda/i18n.php mit eigenem sda_lang-Cookie und sda_t()/sda_te()) ist entfernt; SDA-Keys leben jetzt unter dem sda.*-Prefix im projektweiten Dictionary, der Sprach-Switcher umfasst auch den Wizard.
  • JS-Bundles übersetzt: Konfigurator-Wizard, CLI-Editor (inkl. Cisco-Lang-Linter), SSH-Terminal, Bug-Report- und Feature-Request-Formulare, ACL-/Routing-/VLAN-/Interfaces-/Session-Editoren rufen statt deutscher Literale i18n.t('...') auf.
  • Smoke-Tests nachgezogen: rund 50 veraltete Source-Pattern-Assertions auf die neuen i18n-Calls umgestellt; neuer i18n-Stub für die Node-Tests, damit new Function()-Bundles im Test-Sandbox die i18n.t/te-Aufrufe nicht mehr abbrechen.
Entfernt
  • Legacy-Cookie-Fallback $_COOKIE['sda_lang'] aus der Locale-Auflösung in locale() – die SDA-Konsolidierung hat den Cookie auf app_lang vereinheitlicht.
  • Alte SDA-i18n-Runtime admin/includes/sda/i18n.php samt Funktionen sda_t/sda_te/sda_locale/sda_set_locale/sda_locale_labels und dem internen _sda_dict().
  • Obsoletes Test-Modul tests/sda-i18n.smoke.php: das Verhalten ist nun vollständig durch tests/i18n.smoke.php abgedeckt.
v2.22.0 – Locked stable 19.05.2026

„Locked" – Modulsteuerung und harter Wartungsmodus. Einzelne Module (Konfigurator, CLI-Editor, Live-SSH-Terminal, SDA-Wizard) lassen sich jetzt gezielt sperren – mit eigenem Hinweistext, Superadmin-Bypass und voller Audit-/Postfach-/Webhook-Spur. Der Wartungsmodus wirkt erstmals serverseitig hart und wird ebenfalls als System-Webhook ausgespielt.

Neu
  • Modulsteuerung – Superadmins können in den Einstellungen jedes Modul unabhängig vom Wartungsmodus aktivieren oder sperren und einen individuellen Hinweistext hinterlegen. Gesperrte Module sind serverseitig blockiert (Sperrseite mit HTTP 403; zugehörige APIs antworten mit HTTP 403 als JSON).
  • Superadmin-Bypass mit Hinweis – Superadmins behalten Zugriff auf gesperrte Module; ein deutliches Hinweisbanner sowie ein „Gesperrt"-Badge an Kachel bzw. Navigationspunkt machen den Zustand sichtbar.
  • Live-Sichtbarkeit ohne Reload – Kacheln und Navigationseinträge erscheinen/verschwinden bei Login, Logout und Modul-Statuswechsel sofort.
  • Eigene Sperr- und Wartungsseite – dezentes, dark-mode-fähiges Layout mit pro Modul konfigurierbarem Hinweistext und Rücksprung zur Startseite.
  • Audit- und Postfach-Parität zum Wartungsmodus: Jeder Modul-Zustandswechsel wird mit Wer/Wann protokolliert und an Admins/Superadmins ins Postfach gemeldet (separate Typen für gesperrt/freigegeben).
  • Neue System-Webhook-Events module.access_changed und maintenance.changed (Klasse system, nur über das Superadmin-Webhook-Modal in der neuen Gruppe System abonnierbar).
  • Öffentlicher Status-Endpunkt liefert Wartungsmodus + Modulsperren in einem JSON für das Frontend.
Geändert
  • Wartungsmodus jetzt wirklich hart – Modul-Einstiegsseiten liefern serverseitig eine Wartungsseite (HTTP 503), die zugehörigen Frontend-APIs antworten ebenfalls mit HTTP 503 als JSON. Der Admin-Bereich bleibt wie bisher erreichbar.
  • Erweiterbare Modul-Registry als Basis: neue Module lassen sich zukünftig zentral ergänzen, ohne die Einstellungs- oder Guard-Logik anzufassen.
  • Anleitung und README um Modulsteuerung, korrigierte Wartungsmodus-Beschreibung und die neuen Webhook-Events ergänzt.
Sicherheit
  • Konservative Behandlung des geteilten Speicherwegs zwischen Konfigurator und CLI-Editor: dieser wird auf API-Ebene erst blockiert, wenn beide Module gesperrt sind – die primäre Sperre erfolgt jeweils am Modul-Einstieg, sodass ein noch aktives Modul nicht unbeabsichtigt mitgesperrt wird.
  • SDA-Modul: Sperre wirkt konsistent auch im Admin-Bereich (für alle Backend-Rollen außer Superadmin) und blockiert zusätzlich die öffentliche Token-Vorschau, solange das Modul deaktiviert ist.
v2.21.0 – SDA Diagrams stable 16.05.2026

SDA-Phase 6: High-Level-Design-Vorschau mit SVG-Diagrammen. Neue read-only Seite admin/sda/preview.php bündelt das komplette Design (Eckdaten, Annahmen/Risiken, Standorte, Fabric/Transits, Adressplan, VNs, Segmentierung, Services, Validierung) als druckfreundliches HTML mit serverseitig gerenderten, deterministischen SVG-Diagrammen. Basis für den Export/Public-Preview in Phase 7. Auth-gated – kein öffentlicher Zugriff in dieser Phase.

Neu
  • SVG-Komponentenbibliothek admin/includes/sda/diagram.php (pure, DB-frei, deterministisch): Topologie (Fabrics + Transit-Bus), Fabric-Detail (Rollen-Tiers inkl. Border+CP/Intermediate, SKU ×Anzahl), Standort-Hierarchie (Area→Building→Floor mit Σ-Aggregaten), VN↔IP-Pool (bipartit). XSS-sicheres SVG-Escaping.
  • HLD-Vorschau admin/sda/preview.php: alle Sektionen + die vier Diagramme + Validierungs-Zusammenfassung (Regel-Engine). „HLD-Vorschau"-Button im Wizard-Header und Spalte in der SDA-Liste.
  • i18n: 31 neue Keys preview.*/diagram.* (DE+EN, Parität gewahrt, EN umlautfrei).
  • Druck-Layout in admin/css/admin.css (@media print, break-inside-Schutz für Diagramme).
Geändert
  • tests/sda-diagram.smoke.php (neu) prüft die SVG-Builder strukturell (gültiges <svg>, Knoten/Kanten, Escaping, Determinismus); tests/sda-wizard.smoke.js um Preview-/Verlinkungs-/i18n-Checks erweitert. Gesamte Smoke-Suite grün.
v2.20.3 – SDA Wizard II stable 15.05.2026

„Feld-Erläuterung"-Kachel für alle 9 Wizard-Steps. Die in Step 2 eingeführte Hilfebox ist jetzt ein wiederverwendbarer Helper (sda_help_box()) und wird als eigene Kachel unten in jedem Tab gerendert – zwischen den Eingabefeldern und der globalen Footer-Navigation. Jeder Step (Eckdaten, Standorte, Fabric & Transits, Rollen & Hardware, Adressplan, Virtual Networks, Segmentierung, Services & Identity, Validierung & Migration) hat eine eigene, fachlich passende Erläuterung mit korrekten Umlauten. i18n DE/EN-Parität 246/246.

Neu
  • Wiederverwendbarer Hilfebox-Helper sda_help_box($titleKey, $bulletKeys) in admin/sda/wizard.php: einheitliche Card (gleicher Stil wie SSH-/SDA-Hinweisboxen), Bullets via sda_t() (roh, da Inline-HTML wie <strong>/<em>/<code>), Titel escaped.
  • Step-spezifische Erläuterungen: je eigene i18n-Keys (DE + EN) für Steps 1, 3–9 – Design-Typ/Annahmen/Risiken, Fabric-/Transit-Typen, SDA-Rollen, Pool-Typen + CIDR-Hinweise, VN/Pool-Mapping, SGT/Policy-Matrix-Bedienung, Service-Reachability, Validierungs-Severities + Brownfield-Hinweis. Step 2 nutzt die bestehenden Keys.
Geändert
  • Hilfebox-Position: von oben (nach der Intro) ans Ende jeder Pane verschoben – als letztes Element vor dem Footer (Zurück/Designs/Weiter). Step 2 zeigt sie damit nur noch einmal, unten.
  • tests/sda-wizard.smoke.js: +13 Assertions (Helper vorhanden, je 1 Box pro Step 1–9, Box vor Pane-Schluss, kein Top-Help-Box-Rest in Step 2). 134 Assertions; Gesamt-Suite 2359 pass / 0 fail.
v2.20.2 – SDA Wizard II stable 15.05.2026

Tab-Design + Step-2-UX. Bei 9 Steps brachen die Bootstrap-nav-tabs mehrzeilig um und „stapelten" sich optisch. Umstellung auf nav-pills (rundum abgerundete Button-Pills in einem umrandeten Flex-Container) – sauberer Umbruch, aktiver Step klar markiert, Content-Block jetzt rundum umrandet. Step 2 „Standorte" bekommt eine Feld-Hinweisbox (Name/Typ/EP/AP/SW erklärt) und gehärtete Zahlenfelder (Client-Guard + serverseitige Integer-Validierung).

Geändert
  • Wizard-Tabs als Pills: nav nav-pills im umrandeten bg-body-tertiary-Container mit flex-wrap gap-2; Step-Nummer als rounded-pill-Badge. Content-Block von border-top-0 rounded-bottom auf border rounded umgestellt (alle Ecken abgerundet, da Pills nicht mit dem Block verbunden sind).
  • Step 2 Feld-Hinweisbox: erklärt Name (Pflicht), Typ (Area→Building→Floor), EP=Endpoints, AP=Access-Points, SW=Switches sowie die Bedienung über die Plus-/Papierkorb-Buttons – im gleichen Card-Stil wie die SSH-/SDA-Hinweisboxen. Eigene i18n-Keys (DE/EN, Parität 204/204).
Behoben
  • Numerische Validierung Step 2: EP/AP/SW-Inputs jetzt type=number step=1 inputmode=numeric + Client-Guard (js/sda/wizard.js strippt Nicht-Ziffern, paste-sicher). Serverseitig (admin/api/sda/sites.php): Nicht-Integer → HTTP 422 „Nur ganze Zahlen erlaubt", Negativwerte werden auf 0 geklemmt.
v2.20.1 – SDA Wizard II stable 15.05.2026

Zwei SDA-Wizard-Bugfixes. (1) Umlaut-Darstellung: die deutschen UI-Strings nutzten durchgängig ASCII-Transliterationen (fuer/Loeschen/Zurueck …) statt echter Umlaute – jetzt korrekt UTF-8 (für/Löschen/Zurück). Der englische i18n-Block bleibt nachweislich unverändert. (2) Tab-Sprung: jede Add-/Delete-Aktion löste window.location.reload() aus, wodurch der Wizard immer auf Schritt 1 zurücksprang. Der aktive Tab wird jetzt pro Design in sessionStorage gehalten und nach Reload (und nach dem Sprach-Switch-Redirect) wiederhergestellt.

Geändert
  • tests/sda-wizard.smoke.js: +8 Regressions-Assertions (DE-Umlaute vorhanden, keine Transliterationen, EN ohne Umlaute, sessionStorage-Tab-Persistenz/-Restore verdrahtet). 112 Assertions, Gesamt-Suite 2337 pass / 0 fail.
Behoben
  • Umlaut-Darstellung im gesamten SDA-Modul: kuratiertes, deutsch-spezifisches Transliterations-Mapping über 21 Dateien (i18n-DE-Dictionary, Wizard- und Listen-UI, Service-Layer-/API-Texte). Der EN-Block in i18n.php wurde gezielt vom Mapping ausgeschlossen; Smoketest verifiziert nun: DE hat echte Umlaute + keine Transliterationen mehr, EN enthält keine Umlaute, Key-Parität 197/197 unverändert.
  • Wizard-Tab springt nicht mehr auf Schritt 1: js/sda/wizard.js persistiert den aktiven Tab unter sda_wizard_tab_<designId> in sessionStorage (Event shown.bs.tab) und stellt ihn beim Laden via restoreTab() wieder her – bevor syncNav() die Prev/Next-Buttons synchronisiert. Behebt das Verhalten für ALLE reload-basierten Aktionen über alle neun Steps (Standort/Fabric/Transit/Rolle/Pool/VN/SGT/Service hinzufügen + löschen) und überlebt zusätzlich den Sprach-Switch-Redirect.
v2.20.0 – SDA Wizard II stable 15.05.2026

Wizard-Steps 5–9 + Validierungs-Rule-Engine (SDA-Phase 5). Der SDA-Wizard ist jetzt vollstaendig: Adressplan (IP-Pools), Virtual Networks mit Pool-Mapping, Segmentierung mit klickbarer SGT-Policy-Matrix, Shared Services/Identity sowie Validierung & Migration. Eine neue Rule-Engine prueft das Design auf Vollstaendigkeit und Plausibilitaet (Fehler/Warnung/Hinweis) und macht bei verknuepftem Classic-Projekt eine Brownfield-Adressplan-Verschneidung gegen die Bestands-Configs. Zweisprachig (DE/EN) durchgaengig – das i18n-Dictionary umfasst jetzt 197 Keys je Locale.

Neu
  • Wizard-Step 5 (Adressplan): IP-Pool-Tabelle mit 8 Pool-Typen (Underlay/Loopback/P2P/LAN-Auto/Border-Handoff/Overlay/AP-Mgmt/Guest), CIDR/VRF/DHCP, Autosave, Add/Delete.
  • Wizard-Step 6 (Virtual Networks): VN-Karten mit Anycast-GW, L2-Handoff, Multicast-Mode und Pool-Mapping per Toggle-Badge (n:m gegen die Step-5-Pools).
  • Wizard-Step 7 (Segmentierung): SGT-Tabelle (0–65535, Default-Flag) + klickbare Policy-Matrix (Source × Destination, Zyklus Default→Allow→Deny→Log, UPSERT bzw. Loeschen bei Default).
  • Wizard-Step 8 (Shared Services & Identity): Service-Tabelle (DHCP/DNS/NTP/ISE/CatC/RADIUS/TACACS/Other) mit IP, HA-Partner und Reachability (shared/border/fusion).
  • Wizard-Step 9 (Validierung & Migration): „Validierung ausfuehren"-Button rendert die Findings live (Error/Warning/Info-Badges + Codes); Migrationsphasen als Inline-Liste (sda_assumptions category=migration).
  • Rule-Engine admin/includes/sda/rules.php: sda_rules_run() mit ~25 Regeln auf dem Phase-3-Schema – Pool-Overlap (IPv4/IPv6), fehlende CP/Border/Edge, ungerade Border-Anzahl, Single-CP-Hinweis, Handoff-Pflicht bei Border, FiaB-Konsistenz, VN-ohne-Pool, Pflicht-Pooltypen, SGT-Default, Contract-Luecke, Shared-Services-Luecken (DHCP/DNS/ISE/CatC), DNA-Advantage-Reminder, Multicast-RP-Doku-Hinweis und Brownfield-Adressplan-Verschneidung (CIDR-Extraktion aus den Classic-Configs via sda_extract_ipv4_cidrs()). sda_rules_summary() liefert die Badge-Zaehler.
  • Service-Layer admin/includes/sda/services.php: CRUD + Ownership-Guard fuer Shared Services. In load.php verdrahtet (services + rules).
  • Vier neue JSON-Endpoints unter admin/api/sda/: addressplan.php (kind=pool/vn/map), segmentation.php (kind=sgt/contract, action=default loescht), services.php, validate.php (read-only, GET+POST). Alle mit Ownership-Checks und ueber das gemeinsame _boot.php abgesichert.
  • i18n: +95 Keys je Locale fuer Steps 5–9 (Dictionary jetzt 197 DE / 197 EN, smoketest-verifizierte Paritaet).
  • Smoketest tests/sda-rules.smoke.php (34 Assertions): fuenf Szenarien auf SQLite – leeres Design, unvollstaendige Fabric + Pool-Overlap + VN-ohne-Pool, konsistentes Design (0 Errors), FiaB-Logik, Brownfield-Overlap inkl. CIDR-Extraktion (dotted + Slash-Notation) + Summary-Helper.
Geändert
  • wizard.php: Tab-Nav auf 9 Steps erweitert, Phase-5-Daten (Pools/VNs/SGTs/Matrix/Services/Migration) vorab geladen, fuenf neue Tab-Panes.
  • wizard.js: generischer bindEntity()-Feldbinder fuer Steps 5–8, Pool-Mapping-Toggle, zyklische Matrix-Zellen, Validierungs-Panel-Rendering. design.php kennt jetzt die Liste „migration" (sda_assumptions category=migration).
  • tests/sda-wizard.smoke.js: 104 Assertions (war 62) – neue Endpoint-/Datei-/Tab-/Handler-Marker.
v2.19.2 – SDA Wizard I stable 15.05.2026

SDA-Design-Kachel layout-vereinheitlicht. Die Frontend-Kachel sitzt jetzt oberhalb der Live-SSH-Terminal-Kachel und nutzt dasselbe Zwei-Spalten-Layout wie diese: Aktions-Karte links (col-lg-7), separate „Hinweis & Ablauf"-Box rechts (col-lg-5). Damit ist der Frontend-Block optisch konsistent statt einer schmalen, abweichenden Einzelkarte.

Geändert
  • SDA-Kachel-Position + -Layout (index.php): Markup von der Stelle unterhalb der SSH-Kachel nach oberhalb verschoben. Neue rechte Spalte „Hinweis & Ablauf" (HLD statt Config, Autosave/Versionierung, Backend-/Audit-Bindung, Sprachumschalter, Rollen-Verfügbarkeit) im selben card border-0 shadow-sm-Stil wie die SSH-Sicherheitsbox. Eligibility-Gate, Kachel-ID und Login-Toggle unverändert – die Phase-4-Smoketests greifen weiterhin.
v2.19.1 – SDA Wizard I stable 15.05.2026

Frontend-Einstiegskachel fuer das SDA-Modul. Der SDA-Wizard war bisher nur ueber die Backend-Navigation auffindbar. Analog zur bestehenden „Live-SSH-Terminal"-Kachel zeigt das oeffentliche Frontend jetzt – nur nach Login, fuer alle Rollen – eine „SDA Design & HLD"-Kachel mit Kurzbeschreibung und einem Button, der auf den Backend-Wizard verlinkt. Der eigentliche Wizard bleibt unveraendert account- und audit-gebunden im Backend; die Kachel enthaelt keine sensiblen Daten.

Neu
  • SDA-Design-Kachel im Frontend (index.php): Markup wird immer gerendert und beim Page-Load per d-none ausgeblendet, wenn nicht eingeloggt. _adminApplyUI() in js/admin.js toggelt die Sichtbarkeit live bei Login/Logout (kein Page-Reload), identisch zum Pattern der SSH-Kachel. Zugriffsgate $sdaTileEligible = alle eingeloggten Rollen (user/admin/superadmin). Button verlinkt auf admin/sda/index.php (Design-Liste), nicht direkt in den Wizard.
Geändert
  • tests/sda-wizard.smoke.js um 7 Assertions erweitert: Eligibility-Variable + Rollen-Set, Kachel-ID, d-none-Default, Backend-Link, und der Login-synchrone d-none-Toggle in js/admin.js.
v2.19.0 – SDA Wizard I stable 15.05.2026

Erste UI-Stufe des SDA-Planungs-Moduls (SDA-Phase 4). Neuer Admin-Bereich SDA Design mit Design-Liste und einem vierstufigen Wizard (Eckdaten / Standorte / Fabric & Transits / Rollen & Hardware), der direkt auf dem Phase-3-Service-Layer aufsetzt. Alle Felder speichern per Autosave (debounced fetch) gegen drei CSRF-geschützte JSON-Endpoints; Listen-Items (Sites, Fabrics, Transits, Rollen, Annahmen, Risiken) werden per AJAX angelegt/gelöscht. Zweisprachig ab Tag 1 (DE/EN) über ein leichtgewichtiges Array-i18n mit Sprach-Switcher; jeder Übersetzungs-Key existiert in beiden Locales (smoketest-verifiziert).

Neu
  • Admin-Bereich „SDA Design": neuer Navigations-Eintrag (beide Rollen-Branches) und Design-Liste admin/sda/index.php mit Status-/Typ-Badges, Filter (Name/Public-ID/Status) und einem Anlege-Modal inklusive Brownfield-Verknüpfung (Classic-Projekt-Dropdown, clientseitig nach Kunde gefiltert).
  • Vierstufiger SDA-Wizard admin/sda/wizard.php: Bootstrap-Tabs mit Prev/Next-Navigation. Step 1 Eckdaten (Name, Kunde, Beschreibung, Greenfield/Brownfield, Classic-Link) + Inline-Listen für Annahmen und Risiken; Step 2 rekursiv gerenderter Standort-Tree (Area→Building→Floor) mit Add-Root/Add-Child/Delete; Step 3 Fabric-Sites + Transits als Karten-Editoren; Step 4 Rollen-Tabelle pro Fabric mit SKU-Datalist aus dem Switch-Katalog.
  • i18n-Modul admin/includes/i18n.php: sda_t() / sda_te() (HTML-escaped) mit DE- und EN-Dictionary (je >120 Keys), Locale-Präzedenz GET → Cookie → Session → Default „de", Fallback fehlender EN-Key → DE → Key. Sprach-Switcher im Header von Liste und Wizard.
  • Drei JSON-API-Endpoints unter admin/api/sda/ mit gemeinsamem _boot.php (require_auth + csrf_verify + JSON-Helper + Design-404-Guard): design.php (Stammdaten-PUT + Annahmen/Risiken-Listenops), sites.php (Site-Tree-CRUD mit Ownership-Check), fabric.php (Fabric/Transit/Rollen-CRUD via kind-Diskriminator, je mit Zugehörigkeits-Prüfung gegen das Design).
  • Client-Logik js/sda/wizard.js: debounced Autosave (600 ms) mit Header-State-Anzeige (Speichere…/Gespeichert/Fehlgeschlagen), CSRF-Header aus dem Meta-Tag, Add/Delete für alle Listentypen, Prev/Next-Tab-Navigation synchron zu den Bootstrap-Tabs.
  • Smoketests: tests/sda-wizard.smoke.js (55 Assertions – Datei-Inventar, DE/EN-Key-Parität, Header-Nav in beiden Branches, Tab-Struktur, API-Methoden + Ownership-Checks, wizard.js-Endpoints) und tests/sda-i18n.smoke.php (12 Assertions – Locale-Default, Key-Parität via Reflection, Auflösung, Unknown-Key-Fallback, Platzhalter, HTML-Escaping).
Geändert
  • Header-Navigation: SDA-Eintrag in beiden Rollen-Branches (User-Direktlinks und Admin/Superadmin) mit Active-State-Markierung über $activePage === 'sda'.
v2.18.0 – SDA Foundation stable 14.05.2026

Datenbank-Foundation für das SDA-Planungs- und HLD-Modul (SDA-Phase 3). Sechs neue idempotente Migrationen unter admin/migrate/sda-*.php legen das vollständige Schema an: Designs, Site-Hierarchie, Fabric-Sites + Rollen, Transits, IP-Pools, Virtual Networks, VN-/Pool-Mapping, Border-Handoffs, SGTs, Contracts, Shared Services, Annahmen, Risiken, SVG-Diagramm-Cache und immutable HLD-Versions-Snapshots — alles in PG- und MariaDB-Varianten mit konsequenter Idempotenz. Brownfield-Bindung über nullable FKs auf beiden Seiten (sda_designs.classic_project_fk und staging_projects.sda_design_fk) plus eine Read-only-View v_brownfield_overview. Darüber liegt ein prozedurales Service-Layer-Skelett unter admin/includes/sda/ mit stabilen Signaturen für Design-, Site-, Fabric-, Address-Plan-, Segmentation-, BOM- und Brownfield-Operationen, das ab Phase 4 vom Wizard konsumiert wird.

Neu
  • SDA-Kernschema (sda-core.php): fünf Tabellen sda_designs (Design-Header mit 12-stelliger Public-ID, Status draft/review/finalized/archived, Versions-Bump), sda_sites (selbstreferenzieller Tree Global → Area → Building → Floor), sda_fabric_sites (Fabric-Definition pro Standort, Typ collocated/dedicated/fiab), sda_transits (sd-access/ip-based/sdwan) und sda_roles (Rollenbelegung CP/Border/Edge/Extended/Policy-Extended/FiaB mit device_sku + device_count).
  • Adressplan-Schema (sda-addressing.php): sda_ip_pools (8 Pool-Typen Underlay/Loopback/P2P/LAN-Auto/Border-Handoff/Overlay/AP-Mgmt/Guest), sda_virtual_networks (VNs mit Anycast-GW, L2-Handoff, Multicast-Mode), sda_vn_pool_map (n:m), sda_handoffs (eBGP-AS-Plausibilität via CHECK 1..4294967295).
  • Segmentierungs-Schema (sda-segmentation.php): sda_sgts (0..65535, UNIQUE (design_fk, tag_value) + UNIQUE (design_fk, name)) und sda_contracts (n:m mit action allow/deny/log, UNIQUE über die SGT-Paar-Achse für saubere UPSERT-Semantik).
  • Inhalts-Tabellen (sda-services.php): sda_services (8 Service-Typen DHCP/DNS/NTP/ISE/CatC/RADIUS/TACACS/other mit Reachability shared/border/fusion), sda_assumptions (5 Kategorien) und sda_risks (4 Severities low/medium/high/critical) für die HLD-Kapitel Annahmen und Risiken.
  • Artefakt-Tabellen (sda-artifacts.php): sda_diagrams (SVG-Cache mit 8 erlaubten Diagrammtypen site-tree/fabric/multi-site/vn-pool/policy-matrix/ha-cluster/services/migration-gantt) und sda_hld_versions (immutable Snapshots mit SHA-256-Hash, UNIQUE (design_fk, version_num), JSONB-Metadata).
  • Brownfield-Bindung (sda-brownfield-links.php): nullable Rück-FK staging_projects.sda_design_fk + Index. Read-only-View v_brownfield_overview joint Classic-Projekt und SDA-Design (LEFT JOIN, NULL-Spalten bei Greenfield).
  • Service-Layer-Skelett admin/includes/sda/: sieben Module mit insgesamt 51 Public-Funktionen — design.php (CRUD + Public-ID-Generator A-Z/2-9 ohne 0/O/1/I, Versions-Bump, Status-Wechsel), sites.php (Tree-Aufbau, Reorder), fabrics.php (Fabric/Rollen/Handoffs/Transits), addressplan.php (Pools/VNs/Mapping + pure-PHP-CIDR-Overlap-Detektor für IPv4 + IPv6), segmentation.php (SGTs/Contracts/Matrix mit UPSERT-Semantik), bom.php (Stub mit Chassis-Aggregation aus sda_roles; volle Implementierung in Phase 7), brownfield.php (Hin-/Rück-Link mit Transaktion). Single-Include-Point admin/includes/sda/load.php.
  • Dashboard-Eintraege in admin/migrations.php für alle sechs SDA-Migrationen (sortiert im bestehenden Block, mit Phase-3-Marker in der Beschreibung).
  • Smoketest tests/sda-foundation.smoke.php: 63 Assertions auf SQLite-In-Memory — Design-CRUD inkl. Public-ID + Versions-Bump, Site-Tree mit Reorder, Fabric-/Rollen-/Handoff-/Transit-CRUD, IP-Pool/VN/Mapping inkl. CIDR-Validierung und Overlap-Detektor für IPv4 + IPv6, SGT/Contract-UPSERT + Matrix-Aggregation, BOM-Stub, Brownfield-Link mit Transaktion + Overview-View.
  • Smoketest tests/sda-foundation.smoke.js: 155 statische Source-Marker — sechs Migrationen vorhanden mit erwarteten CREATE TABLE / ALTER TABLE / CREATE OR REPLACE VIEW-Statements, jeweils PG- und MariaDB-Branch, require_auth + require_superadmin + migration_tracker eingebunden; sieben Service-Layer-Dateien mit den erwarteten Public-Funktionen; Dashboard-Inventar prüft die Beschreibungen.
v2.17.0 – Compatibility Matrix stable 14.05.2026

Cross-Domain-Compatibility-Matrix für den Hardware-Katalog (SDA-Phase 2). Elf neue Helper-Funktionen verbinden die fünf Catalog-Domänen (Switches / NMs / Linecards / Supervisoren / Optiken / Netzteile) zu einem konsistenten Lookup-Geflecht. Jedes Detail-Modal im öffentlichen Geräte-Katalog zeigt jetzt die passenden Cross-Domain-Treffer: Switches listen kompatible Optiken (gruppiert nach Familie) plus kompatible Netzteile; NMs/Linecards/Supervisoren listen die für ihre Port-Typen verbaubaren Optiken; Optiken und Netzteile bieten einen Reverse-Lookup „Verbaubar in …" mit Switches/NMs/Linecards/SUPs pro Cat9k-Serie. Damit ist die Foundation gelegt, auf der Phase 3+ (SDA-Datenmodell, Wizard, BOM-Aggregation) ohne weitere Datenarbeit aufsetzen kann.

Neu
  • Catalog-Compatibility-Helper: Elf neue Funktionen am Ende von js/catalog/helpers.jsfindOptic(sku), findPsu(sku), platformPortTypes(m) + platformPortTypesExtended(m) (sammeln direkt vs. inkl. NM/LC/SUP), opticsCompatibleWithSwitch/Nm/Lc/Sup, psusCompatibleWith sowie die Reverse-Lookups opticPlatformsFor und psuPlatformsFor. Single Source of Truth für die Public-Detail-Modals heute und die spätere SDA-BOM-Aggregation (Phase 7).
  • Stack-Cable-Modellierung: platformPortTypes(m) markiert stapelfähige Switches mit einem Pseudo-Port-Typ stack, sodass STACK-T1-*/STACK-T4-*-Kabel mit compatibility.ports: ['stack'] automatisch in den passenden Switch-Serien (C9300/L bzw. C9300X) erscheinen — ohne die Series-Filter zu umgehen.
  • Detail-Modal-Reiter „Kompatible Optiken" im Switch-, NM-, Linecard- und Supervisor-Detail des öffentlichen Geräte-Katalogs. Gruppiert nach Optik-Familie (SFP/SFP+/SFP28/QSFP+/QSFP28/StackWise), inkl. Anzahl-Badge pro Familie. SUP-Reiter erscheint nur bei C9400-Supervisoren mit Daten-Ports — die portlosen C9600/C9610-SUPs zeigen ihn korrekt nicht.
  • Detail-Modal-Sektion „Kompatible Netzteile" im Switch-Detail mit Watt-Klasse, PoE-Eignung und Hinweistext pro PSU-SKU.
  • Reverse-Lookup „Verbaubar in …" im Optik-Detail (Switches / NMs / Linecards pro Chassis / Supervisoren pro Chassis) und im Netzteil-Detail (Switches pro Cat9k-Serie). Stack-Kabel landen über den stack-Pseudo-Port automatisch in den richtigen Switch-Serien.
  • Neuer Smoketest tests/optics-compat.smoke.js: 34 Cross-Domain-Assertions — Existenz aller elf Helper, Coverage (jeder Glas-/Stack-Port-fähige Switch/NM/Linecard hat ≥1 kompatible Optik, jeder Switch hat ≥1 kompatible PSU), Stack-Cable-Special-Cases (StackWise-480 nur C9300/L, StackWise-1T nur C9300X), Symmetry-Spot-Check (Onboard-Reverse ⊂ Forward) und Sanity-Checks gegen die portlosen C9600/C9610-Supervisoren.
Geändert
  • PSU-Katalog: C9350 in PWR-C1-* aufgenommen. Bisher fehlte die Compat-Markierung für die C9350-Familie in allen vier PWR-C1-*-P-Einträgen — die Smoketest-Coverage hätte sie bei sonst gleicher PSU-Architektur als „kein Netzteil"-Lücke gemeldet. C9350-Hochlast-Modelle wie C9350-48HX sind jetzt auch auf PWR-C1-1900WAC-P abgebildet.
  • device-catalog.smoke.js erweitert: vier zusätzliche Block-Renderer-Checks (compatOpticsBlock, compatPsusBlock, reversePlatformsBlock, reverseSwitchesBlock) plus sieben Aufruf-Pattern-Checks in den jeweiligen render*Detail-Funktionen.
v2.16.0 – Catalog Foundation stable 14.05.2026

Vorbereitung des Hardware-Katalogs für das künftige SDA-Planungs- und HLD-Tool. js/switches-data.js ist in fünf themenscharfe Dateien unter js/catalog/ zerlegt (Chassis, NMs, Supervisoren, Linecards, Helper) – Verhalten und Globals bleiben identisch. Darauf aufbauend kommen zwei neue Domänen: ein Optik-Katalog mit 86 Cisco-OEM-SKUs (1G SFP, 10G/25G SFP+/SFP28, 40G/100G QSFP+/QSFP28, Multirate, DAC/AOC, Breakout-Kabel sowie StackWise-480/1T-Kabel) und ein AC-PSU-Katalog mit 17 SKUs über alle Catalyst-9000-Serien hinweg. Der öffentliche Geräte-Katalog (device-catalog.php) bekommt zwei neue Tabs „Optiken" und „Netzteile" mit Familien-/Serien-Filter und vollständigem Detail-Modal inklusive kompatibler Port-Typen und Cat9k-Serien. Damit ist die Datenbasis gelegt, um in den nächsten SDA-Phasen verbindliche Bill-of-Materials direkt aus dem Design zu erzeugen.

Neu
  • Optik-Katalog (SDA-Phase 1): js/catalog/optics.js mit 86 Cisco-OEM-Transceiver-SKUs. Datenfelder pro Eintrag: sku, family, speed, mediaType (fiber/copper/dac/aoc/stack-cable), reach+reachM, wavelength, connector, fiber, dom, temp (COM/EXT/IND), breakout sowie compatibility.ports/compatibility.series. Abdeckung: 1G (8), 10G (20), 10/25G Multirate (2), 25G (13), 40G (19), 100G (17), Stack-Kabel (7). 400G-Optiken bewusst ausgelassen — werden bei realem SDA-Bedarf später ergänzt.
  • PSU-Katalog (SDA-Phase 1, AC-only): js/catalog/psus.js mit 17 SKUs über alle Catalyst-9000-Serien — C9200/L (3), C9300/L/X (4), C9400 modular (3), C9500 (3), C9600 (2), C9610 (2). Datenfelder: watts, type (AC), formFactor (fixed/modular), platinum (80 Plus), poeCapable, airflow (standard/reverse) sowie compatibility.series. DC/HVDC-Varianten und höhere C9500X-Klassen werden bei realem Bedarf später ergänzt.
  • Public Geräte-Katalog: Tabs Optiken + Netzteile: Zwei neue Tabs in device-catalog.php. Tab „Optiken" filtert nach Optik-Familie (SFP/SFP+/SFP28/QSFP+/QSFP28/StackWise-480/StackWise-1T), Tab „Netzteile" nach Cat9k-Serie. Detail-Modal zeigt Speed, Reichweite, Connector, Faser-/Kabeltyp, Wellenlänge, DOM, Temperaturbereich, Breakout-Annotation, kompatible Port-Typen und kompatible Switch-Serien (Optik) bzw. Watt, Formfaktor, Airflow, Platinum, PoE-Eignung und kompatible Serien (PSU). Single Source of Truth für die spätere SDA-BOM-Aggregation.
  • Catalog-Modularisierung (SDA-Phase 0): js/switches-data.js ist byte-genau in fünf Domain-Dateien zerlegt — js/catalog/switches.js (SWITCH_CATALOG), js/catalog/nms.js (NM_CATALOG), js/catalog/supervisors.js (SUP/C9600_SUP/C9610_SUP_CATALOG), js/catalog/linecards.js (LC/C9600_LC/C9610_LC_CATALOG) und js/catalog/helpers.js (sämtliche Lookups, Linecard-Speed-Modi, License- und VRF-Helper). Verhalten ist identisch — Globals bleiben im selben Namensraum. index.php und device-catalog.php laden jetzt sieben statt einem <script>-Tag.
  • Neue Smoketests: tests/optics-catalog.smoke.js (48 Assertions: Pflichtfelder, SKU-Eindeutigkeit, Speed-Klassen-Abdeckung, Breakout-Konsistenz, Stack-Kabel-Compat, SKU-Anker) und tests/psu-catalog.smoke.js (39 Assertions: AC-only, Watt-Plausibilität, Serien-Coverage über alle Cat9k-Serien, Formfaktor-Konsistenz für modulare vs. fixed Chassis-Klassen).
Geändert
  • Bestehende Smoketests auf Catalog-Modularisierung umgestellt: tests/vrf-pass.smoke.js und tests/routed-ports.smoke.js konkatenieren die fünf Catalog-Dateien in derselben Reihenfolge wie der Browser zu einem virtuellen SWITCHES_SRC — funktional identisch zur früheren Single-File-Quelle. tests/device-catalog.smoke.js prüft jetzt sieben <script src=…>-Patterns (statt einem) sowie sechs Tab-Anker und die neuen Render-/Detail-Funktionen.
v2.15.0 – Export stable 13.05.2026

CSV- und Excel-Export für alle Admin-Listen-Seiten. Über einen neuen "Export"-Dropdown-Button rechtsbündig zwischen Filter-Form und Tabelle lädt der Admin den aktuellen Listen-Stand als UTF-8-CSV (RFC-4180, mit BOM für Excel-Codierungs-Heuristik) oder als echtes XLSX (PhpSpreadsheet, mit Bold-Header, eingefrorener Top-Zeile, Auto-Filter und Auto-Sizing) herunter. 13 Endpoints decken Projekte, Audit-Logs (Security/SSH/SSH-Vault/Error), Stammdaten (Kunden/Benutzer/Firmware/CLI-Snippets/Webhooks) und Feedback (Bugs/Features/Inbox) ab — die Filter der jeweiligen Listen-Seite werden 1:1 auf den Export übertragen, sodass der Empfänger genau den gefilterten Ausschnitt bekommt. CSV-Injection-Schutz (OWASP-Liste maskiert =/+/-/@/TAB/CR-Prefixe mit Apostroph) und ein konsequenter Ausschluss sensibler Spalten (Passwort-Hashes, MFA-Secrets, API-Tokens, Webhook-HMAC-Secrets) sind in der Foundation verbaut. Begleitend ist im Frontend der Geräte-Katalog als öffentliche Seite verfügbar, der CSRF-Enforcement-Mode wurde nach mehrtägigem sauberem Audit-Log auf hard gestellt und der frühere Backend-Geräte-Katalog entfernt.

Neu
  • Foundation für Listen-Export (EXP-1): Neue Helper-API in admin/includes/export-helpers.php mit export_csv_stream() (UTF-8-BOM, RFC-4180-Quoting, CRLF-Zeilenende) und export_xlsx_stream() (PhpSpreadsheet 5.7.0, Bold-Header, Freeze-Panes A2, Auto-Filter über alle Spalten, Auto-Sizing). Gemeinsamer Helper export_cell_escape() schützt vor CSV-Injection per OWASP-Liste (=/+/-/@/TAB/CR-Prefix erhält ein führendes Apostroph; int/float-Typen werden korrekt ohne Maskierung durchgereicht). export_sanitize_filename() liefert path-traversal-sichere Dateinamen.
  • Projekte-Export (EXP-2): admin/api/export/projects.php mit den 9 Listen-Spalten (Projekt-ID, Auftrag, Kunde, Projektname, Stager, Geräte, Status, Erstellt, Aktualisiert). Filter q/status/from/to und der User-Rollen-Scope (project_users-EXISTS) sind identisch zur List-Seite.
  • Audit-Log-Export (EXP-3): Vier Endpoints für die forensischen Tabellen — Security-Audit (14 Spalten), SSH-Audit (15 Spalten inkl. Bytes-In/Out + Host-Key-Fingerprint), SSH-Vault-Audit (8 Spalten, Non-Superadmin nur eigener Scope per admin_id-Filter) und Error-Audit (14 Spalten inkl. Stack-Trace). Alle filtern via gleicher GET-Parameter wie die List-Seite.
  • Stammdaten-Export (EXP-4): Fünf Endpoints für Kunden (mit Counts für Configs/Projekte/Templates/Firmware), Benutzer (Subset ohne password_hash/mfa_secret/api_token), Firmware-Images (mit Customer-Aggregation per STRING_AGG/GROUP_CONCAT), CLI-Snippets (mit Body) und Webhook-Subscriptions (ohne hmac_secret, Events-JSON als Klartext).
  • Feedback-Export (EXP-5): Drei Endpoints für Bug-Reports (User-Scope per bug_assignee/bug_watcher), Feature-Requests (User-Scope per feature_assignee/feature_watcher, mit Sort-Switch) und persönliches Postfach (immer auf admin_fk = $myId gescoped, kein Cross-User-Zugriff).
  • Hard-Cap pro Endpoint: Jeder Export ist auf 50.000 Zeilen limitiert; bei Überschreitung erscheint eine letzte Zeile „[Hinweis: Export auf 50000 Zeilen begrenzt — Filter weiter eingrenzen.]". Tabellen, die in einer frühen Migrations-Phase noch fehlen können (security_audit_log, error_audit_log, admin_inbox, firmware_images, webhook_subscription), liefern statt eines Crashs einen leeren Export mit Hinweis-Zeile.
  • Geräte-Katalog als öffentliche Frontend-Seite: Neue Übersicht device-catalog.php spiegelt die bisher Backend-only Lese-Übersicht ins Frontend. Vier Tabs (Switches / Netzwerkmodule / Linecards / Supervisoren) mit Filter, Series-Pillen, Stat-Karten und einem geteilten Detail-Modal inklusive VRF-Lite-Skala (aus js/switches-data.js). Aufgerufen wird die Seite über den Info-Dropdown – eine neue Trennlinie nach „Release Notes" leitet den Referenz-Block ein, in dem Geräte-Katalog vor der Lizenz-Featurematrix steht.
Geändert
  • CSRF-Enforcement auf hard: CSRF_ENFORCEMENT_MODE in admin/config.php auf hard umgestellt. Verstöße werden ab sofort sofort mit HTTP 403 abgewiesen statt nur protokolliert. Voraussetzung war ein über mehrere Tage sauberes Security-Audit-Log ohne Soft-Fail-Einträge — alle Frontend- und Backend-Aufrufer sind auf den einheitlichen CSRF-Guard migriert.
  • Composer-Dependency PhpSpreadsheet: composer.json um phpoffice/phpspreadsheet ^5.7 erweitert. Bringt transitiv markbaker/matrix + markbaker/complex (Matrix-/Komplex-Mathematik in Formeln), maennchen/zipstream-php (XLSX-Zip-Streaming), composer/pcre + psr/simple-cache mit. .gitignore ist um die drei neuen Top-Level-Vendor-Verzeichnisse erweitert, konsistent zum bisherigen Pattern.
Behoben
  • Default-Route-Kachel-Layout in Schritt 4: Die „Default Route / Default Gateway"-Kachel hing zwischen FHRP-Modal und der Routing-Protokolle-Spalte und nutzte als einzige Kachel auf der Seite eine 4 px breite linke Akzent-Border (border-start border-4 border-cisco-blue) plus Inline-h6-Header im card-body. Daneben wirkte sie eingerückt. Position jetzt direkt unter der SVI-Kachel (globale Routing-Basis bleibt im Sichtfeld), Card-Pattern an Loopback/VRF angeglichen (card border-0 shadow-sm mit eigenem card-header und card-body p-3).
  • EXP-2-Hotfix: PDO-/Driver-Init im Projekte-Endpoint: Der Endpoint rief $pdo->prepare(...) ohne vorherigen $pdo = get_db()-Aufruf — Folge war ein Fatal Error, und mit display_errors=off in Production lieferte PHP eine weiße Seite statt einen Download. Inzwischen fängt ein Regression-Guard in der Smoke-Suite den gleichen Fehler in zukünftigen Endpoints ab.
Entfernt
  • Backend-Geräte-Katalog entfernt: admin/switch-catalog.php wurde gelöscht und der zugehörige Navigations-Eintrag in admin/includes/header.php entfernt. Die Daten waren nie geheim und stehen jetzt unter device-catalog.php ohne Login zur Verfügung — single source of truth für die Public-Seite, kein paralleles Backend-Pendant mehr.
v2.14.0 – VRF stable 13.05.2026

Virtual Routing & Forwarding (VRF Lite) als durchgängiges Feature. Der Wizard kann jetzt Mandanten-VRFs anlegen, an SVIs / Loopbacks / Routed Ports binden und in OSPF, OSPFv3, EIGRP-Named-Mode und BGP referenzieren. Hardware-Skala kommt direkt aus dem Switch-Katalog (4 User-VRFs auf C9200, 1 auf C9200L/CX, 256 auf C9300/X/350/9400/9500 access-class, 1024 auf C9500H/X und C9600) – Werte sind aus den Cisco IOS-XE 17.x Config-Guides verifiziert. Beim ersten VRF-Anlage fragt der Wizard nach einem License-Upgrade auf Network Advantage; im Backend zeigt sowohl das Geräte-Katalog-Detail-Modal als auch die Schritt-2-Specs-Kachel die VRF-Skala des gewählten Modells. Customer-Templates erhalten einen neuen step4.vrfs[]-Block (Schema-Version 10) mit Locked- und Preset-Modus.

Neu
  • VRF-Editor in Schritt 4 (VRF-1/2): Eigene Kachel zwischen Loopbacks und Default-Gateway. Form-Panel mit Name (Cisco-konform: max. 32 Zeichen, [A-Za-z0-9][A-Za-z0-9._-]*, reservierte Namen „default" und „Mgmt-vrf" sind gesperrt), Route-Distinguisher (Live-Validation analog zu den IP-Feldern in Schritt 1), Address-Family-Toggles IPv4/IPv6 und Import-/Export-Route-Target-Listen pro AF. Mgmt-vrf wird als read-only System-VRF (Lock-Icon, nicht editierbar/löschbar) automatisch geseedet, weil er auf Catalyst 9000 nativ existiert.
  • VRF-Binding pro Interface (VRF-3): SVI-, Loopback- und Routed-Port-Editor erhalten ein Dropdown „VRF-Binding". Leerer Wert = Default Routing Table, sonst wird im jeweiligen Interface-Block vrf forwarding NAME emittiert. Stale-Werte werden im Dropdown als „(nicht definiert)" markiert und beim Submit von validateVrfBinding abgewiesen. SVI- und Loopback-Tabellen blenden eine VRF-Spalte ein, sobald mindestens ein Eintrag gebunden ist.
  • Cisco-konforme CLI-Generierung (VRF-4/5/6/7): vrf definition NAME-Bloecke direkt nach den globalen Routing-Toggles, alphabetisch sortiert, mit Description, RD und je nach AF-Flag address-family ipv4|ipv6 + Export-/Import-Route-Targets. Cisco-kritische Reihenfolge auf den Interfaces: vrf forwarding NAME steht VOR ip address, sonst löscht IOS-XE die Adresse beim Apply. Statische Routen emittieren ip route vrf NAME bzw. ipv6 route vrf NAME. OSPF/OSPFv3-Prozesse hängen vrf NAME an die Prozess-Zeile an. EIGRP-Named-Mode setzt den vrf-Token zwischen unicast und autonomous-system; im Classic-Mode wird ein Warn-Comment emittiert (Cisco unterstützt VRF nicht in Classic-EIGRP). BGP gewinnt einen dedizierten VRF-Pfad mit address-family ipv4|ipv6 vrf NAME-Blöcken.
  • Hardware-Limit-Enforcement aus dem Switch-Katalog (VRF-8): Neuer State VRF_LIMITS_BY_SERIES + VRF_LIMITS_BY_SKU mit den verifizierten Cisco-Werten (4 / 1 / 256 / 1024 je nach Modell). Helper modelVrfMax, modelVrfCapable, stackVrfMax (Stack-Minimum gemischter Konfigurationen). Der Wizard ersetzt den hartcodierten Soft-Limit 32 durch dieses dynamische Hard-Limit; der Add-Button wird beim Erreichen disabled, der Banner-Text nennt das Modell-spezifische Limit.
  • License-Auto-Upgrade-Confirm (VRF-8): VRF Lite erfordert auf allen Cat9k-Modellen Network Advantage. Beim ersten VRF-Anlage fragt der Wizard mit einem Bestätigungs-Modal nach: bei „Auf Advantage upgraden" wird das Switch-Profil im Wizard auf Advantage gehoben und das gesamte License-Gate neu ausgewertet; bei „Abbrechen" bricht der Submit ab. Beim Downgrade-Pfad listet das Konflikt-Modal die zu löschenden User-VRFs und gebundenen Routing-Prozesse explizit auf; nach OK werden alle Bindings auf Interfaces, statischen Routen und Protokollen kaskadiert geleert.
  • VRF-Skala im Geräte-Katalog sichtbar (VRF-8b/8c): Backend-Geräte-Katalog-Detail-Modal zeigt eine neue Zeile „VRF Lite" mit farbcodiertem Badge (Warning bei ≤ 4, Primary bei 256, Info bei 1024+) plus „erfordert Network Advantage". Bei den L2-fokussierten Modellen (C9200/C9200L/CX) ergänzt ein Hinweis „Für VRF-Lite-Designs eher C9300+ wählen". Die identische Zeile erscheint im Wizard-Schritt-2 in der Switch-Specs-Kachel zwischen Stacking und Durchsatz – Single Source of Truth über die switches-data.js-Helper.
  • Customer-Template Schema v10 mit VRF-Block (VRF-9): Templates können User-VRFs mit Name, RD, AF-Flags, Route-Target-Listen sowie Locked-Mode (Wizard-User darf nicht editieren) oder Preset-Mode (vorbelegt, editierbar) vordefinieren. Backend-Validator prüft Name-Pattern, Reserved-Check, RD/RT-Pattern, Duplikate (case-INsensitive) und das Schema-Pflicht-Feld. Apply-Pfad mappt snake_case → camelCase, überschreibt bei Namens-Konflikt und ruft _ensureSystemVrfs, damit Mgmt-vrf konsistent bleibt.
Geändert
  • License-Framework um vrf erweitert: ADVANTAGE_FEATURES in switches-data.js listet jetzt zusätzlich vrf. Der Registry-Eintrag in license-gate.js stellt den Cleanup-Hook für Downgrade-Konflikte (alle User-VRFs entfernen, Bindings auf Interfaces/Static-Routes/Protokolle zurücksetzen, Tabellen + CLI re-rendern).
  • Snapshot-Schema v10 für Customer-Templates: admin/api/template.php akzeptiert nun Schemata v2 bis v10. Pre-v10-Templates ohne step4.vrfs[] bleiben kompatibel; Templates mit gesetztem VRF-Block erzwingen v10.
Behoben
  • VRF-1-Hotfix: VRF-Liste im Snapshot persistieren: Der Capture-Pfad _captureStep4() hatte den neuen vrfs-Slot zunächst nicht in den Wizard-Snapshot übernommen, sodass VRF-Konfigurationen beim Save (manuell und Auto-Save) verloren gegangen wären. Restore las den Slot bereits korrekt; jetzt ist die Symmetrie hergestellt.
  • Umlaute in den neuen VRF-UI-Strings: Form-Titel, Toasts und Banner verwendeten in der Aufbau-Phase ASCII-Ersatzformen (ue/oe/ae); alle user-sichtbaren Strings sind jetzt konsistent UTF-8 (z. B. „VRF hinzufügen", „… kann nicht gelöscht werden", „Modell-Limit erreicht").
v2.13.1 – Cross-Step stable 13.05.2026

Durchgehend bessere Workflows zwischen den Wizard-Schritten und ein neues, einheitliches Bestätigungs-Modal-Design. Routing-Protokoll-Aktivierungen synchronisieren sich jetzt in beide Richtungen zwischen Routed-Ports (Schritt 2) und Routing (Schritt 4), die Schritt-Indikatoren in der Wizard-Navigation sind klickbar und zeigen invalide Eingaben farblich an, und sämtliche Bestätigungs-Dialoge wurden von Browser-Prompts auf ein gebrandetes Bootstrap-Modal umgestellt – mit Variant-Farbgebung, semantischen Button-Labels und Konflikt-Listen bei Kaskaden-Aktionen.

Neu
  • Klickbare Schritt-Indikatoren in der Wizard-Navigation: Die Step-Bubbles oben im Wizard erlauben jetzt den direkten Sprung zu beliebigen Schritten – inklusive Validation-Color-Coding. Sobald ein Schritt unvollständige oder ungültige Eingaben enthält, wird sein Indikator rot eingefärbt und der Tooltip nennt den fehlenden Pflichtwert. Vorher war ausschließlich „Zurück/Weiter" möglich.
  • Quick-Aktivieren für IPv6-Protokolle im Routed-Port-Editor: Die Felder OSPFv3-Area und EIGRP IPv6 lassen sich direkt im Routed-Port-Akkordion (Schritt 2) bearbeiten. Ist der zugehörige Routing-Process in Schritt 4 noch nicht aktiv, erscheint statt eines gesperrten Feldes ein „Aktivieren"-Button – ein Klick schaltet den globalen Process ein und übernimmt die Per-Interface-Bindung sofort. Schritt-2- und Schritt-4-Darstellung werden dabei in beide Richtungen synchron gehalten.
  • Gebrandetes Bestätigungs-Modal: Alle bisherigen Browser-Bestätigungen („OK/Abbrechen"-Native-Prompts) wurden durch ein einheitliches Bootstrap-Modal ersetzt. Die Dialoge passen ihre Kopfzeile und den primären Button farblich an die Aktion an (Info, Warnung, Gefahr), tragen ein passendes Icon, zeigen den betroffenen Namen oder die Liste der Folgewirkungen direkt im Body und nutzen klare, semantische Button-Labels („Löschen", „Entfernen", „Übernehmen", „Lizenz wechseln") statt generischer OK-/Abbrechen-Texte. Betroffen sind unter anderem: Editor leeren, VLAN/SVI/Loopback/Statische-Route/FHRP-Gruppe/Port-Gruppe/Benutzer löschen, ACLs samt Regeln, Anwendungen, Object-Groups und Members entfernen, Globals-Import (mit Liste der fehlerhaften Einträge), Lizenz-Downgrade (mit Konflikt-Liste) und Port-Gruppen-Übernahme beim Modellwechsel.
  • Drei-Optionen-Dialog beim Routing-Protokoll-Deaktivieren: Wer einen Process (OSPF, OSPFv3, EIGRP) mit aktiven Per-Interface- oder Netzwerk-Bindungen ausschaltet, bekommt jetzt einen einzelnen Dialog mit drei semantischen Buttons statt zwei aufeinanderfolgender OK/Abbrechen-Prompts: Abbrechen (alles bleibt), Beibehalten (Werte bleiben für spätere Re-Aktivierung erhalten) oder Zurücksetzen (alle gebundenen Areas/Flags/Netzwerke werden sofort geleert, die CLI ist clean). Der Body listet die betroffenen Bindungen tabellarisch auf.
Geändert
  • Bidirektionale Synchronisierung Routed-Ports ↔ Routing: Routing-Protokoll-Aktivierungen aus dem Routed-Port-Editor schlagen sofort in der Routing-Konfiguration durch – und umgekehrt. Wird ein Process im Routing-Schritt deaktiviert, werden die zugehörigen Per-Interface-Felder im Routed-Port-Editor automatisch gesperrt und ein Hinweisbanner eingeblendet. Die Status-Badges („aktiv"/„deaktiviert") sind in beiden Schritten konsistent.
  • Konsistente Modal-Typografie projektweit: Sämtliche Bestätigungs-Modals teilen sich jetzt eine einzige zentrale API und respektieren das Bootstrap-Theming des Projekts (Header-Trennlinie, Body-Padding, Footer-Button-Abstand, Light-/Dark-Mode). ESC-Taste, Klick außerhalb und das X-Symbol lösen einheitlich „Abbrechen" aus.
Behoben
  • UTF-8-Umlaute in Toasts und Bestätigungs-Dialogen: An mehreren Stellen wurden Umlaute (ä/ö/ü/ß) als ASCII-Transliteration angezeigt; alle Nutzer-sichtbaren Strings sind jetzt konsistent UTF-8.
v2.13.0 – Routed stable 12.05.2026

Layer-3-Routed-Ports auf physischen Switch-Ports. Bisher waren Layer-3-Interfaces nur als SVIs (Schritt 4) abbildbar; der L3-Pass macht beliebige Downlink- oder Uplink-Ports im Schritt 2 routbar. „Routed"-Modus existierte rudimentaer (Mode-Toggle + ip address), wurde aber im L3-Pass zur Cisco-IOS-XE-konformen Vollvariante ausgebaut: IPv6-Adresse + Prefix-Laenge, MTU (Jumbo-Frames), DHCP-Helper-Liste, Per-Interface OSPF/OSPFv3/EIGRP-Bindung, visuelle Markierung im Frontpanel (Aquamarin-Stroke + L3-Badge analog Po-Label), automatische Filterung der L2-only-Subkommandos (`switchport`, `spanning-tree`, `port-security`, `ip dhcp snooping trust`, `ip arp inspection trust`) im CLI-Builder. Das License-Gate erweitert sein EIGRP-Cleanup um die per-Routed-Port-Bindings, sodass beim Downgrade auf Network Essentials keine Zombie-Konfiguration zurueckbleibt. Pflichtfeld- und Optional-Badges sind im Schritt-2-Akkordion durchgehend konsistent.

Neu
  • State + Switch-Katalog (L3-1): Neuer Helper modelL3Capable() in switches-data.js mit Default true (alle aktuellen Catalyst-9k unterstuetzen Routed Ports nativ). defaultGroupConfig um sieben Routed-Felder erweitert (ipv6Address, ipv6PrefixLen, mtu, ipHelperAddresses, perItfOspfArea, perItfOspfv3Area, perItfEigrpIpv6). _portGroupEnsureRoutedDefaults backfillt Pre-L3-Drafts mit Type-Coercion (NaN/Strings/falsche-Range-Werte werden defensiv normalisiert); Restore-Hook in project-edit.js::_applyStep2State.
  • UI-Polish im Port-Konfig-Akkordion (L3-2): Routed-Sektion ausgebaut um IPv6, MTU, DHCP-Helper-Adressen mit Live-Validierung (Pattern aus LO-2d). Generic-Handler onRoutedPortInputValidate dispatcht ueber data-routed-validate an die Wizard-Validatoren aus validation.js. STP- und Sicherheit-Akkordion-Tabs werden im Routed-Modus komplett ausgeblendet (vorher: nur Banner/Badge). Tab „Layer 2" -> „Modus" (Downlink + Uplink). Optional/Pflichtfeld-Badges im gesamten Akkordion auf Projekt-Konvention angeglichen.
  • Visuelle Routed-Port-Markierung (L3-3): Neues SVG-Overlay drawRoutedPortLabels() markiert Ports einer Routed-Gruppe mit Aquamarin-Stroke (dashed) am Port-Frame und einem hellen „L3"-Label im Stecker-Slot — Pattern analog zu Port-Channel-Brackets (Po1/Po2). Hover-Tooltip erweitert um „Routed Port (10.0.0.1 255.255.255.0)".
  • CLI-Builder Cisco-IOS-XE-Compliance (L3-4): Routed-Block emittiert in fester Reihenfolge no switchport -> ip address -> ipv6 address -> ip helper-address (pro Eintrag) -> mtu. L2-only-Subkommandos (ip dhcp snooping trust, ip arp inspection trust) werden im Routed-Modus rigoros unterdrueckt — IOS lehnt sie nach no switchport ohnehin ab. QoS-Trust bleibt unconditional (DSCP-Trust ist L3-relevant).
  • Per-Interface Routing-Protokoll-Bindung (L3-5): Drei zusaetzliche Felder im Routed-Tab — OSPF Area (IPv4) emittiert ip ospf <pid> area <X>, OSPFv3 Area (IPv6) emittiert ipv6 ospf <pid> area <X>, EIGRP IPv6 (Switch) emittiert ipv6 eigrp <AS>. UI-Gates: Felder disabled, solange der jeweilige globale Process im Schritt 4 nicht aktiv ist (analog Loopback-Editor in LO-2b).
  • Subnetzmaske Dotted/CIDR-Toggle (L3-2-Fixup5): Subnetzmaske-Eingabe im Routed-Tab akzeptiert jetzt sowohl Dotted-Decimal (255.255.255.0) als auch CIDR-Praefix (/24) — analog Wizard-Schritt 1. State-Wert bleibt Dotted-Decimal (Cisco-CLI-Konvention); CIDR-Eingabe wird ueber cidrToMask() konvertiert.
Geändert
  • License-Gate Defensive (L3-6): EIGRP-Cleanup setzt zusaetzlich grp.config.perItfEigrpIpv6 = false auf allen Port-Gruppen, analog zur SVI- und Loopback-Schleife aus LO-6. Conflict-Detail nimmt aktive Routed Ports im IPv6-AF-Detail mit auf („N SVIs, M Loopbacks, K Routed Ports"). Defensive typeof ifState-Guards fuer Login-/Admin-Seiten ohne Interfaces-Bundle.
  • Routing-CLI live mit Step-2-CLI synchronisiert (L3-5-Fixup): refreshRoutingCLI() triggert jetzt zusaetzlich refreshIfaceCLI(), damit per-Interface-OSPF/EIGRP-Bindungs-Zeilen auf Routed Ports sofort erscheinen, wenn der User im Schritt 4 ein globales Protokoll aktiviert.
  • Akkordion-Tab-Rename „Layer 2" -> „Modus" (L3-2-Fixup2/3): Konsistent im Downlink- und Uplink-Port-Konfig-Form. Der Tab fasst alle port-modus-spezifischen Felder zusammen (Access/Trunk/Routed inkl. der jeweiligen Sub-Felder).
  • Pflichtfeld-/Optional-Badge-Konvention im Port-Konfig (L3-2-Fixup4): 18 Stellen angepasst — 9× Klartext-(optional) -> Optional-Badge, 6× neue Optional-Badges an bisher unmarkierten Routed-Feldern, 2× Pflichtfeld-Badge an Access VLAN und Native VLAN, 1× Optional-Badge an Allowed-VLANs.
  • Smoke-Suite (L3-Pass): Neue self-contained Test-Datei cisco-switch-config/tests/routed-ports.smoke.js deckt 221 Cases ab — L3-1 State + Validatoren (53), L3-2 UI + Helper (38+8+20), L3-3 Visualisierung (17), L3-4 CLI-Hardening (25), L3-5 Per-Interface-Bindung (26+1 Live-Sync), L3-6 License-Gate (8 in ipv6-pass.smoke.js), L3-7 End-to-End-Pass-Done-Marker (21). Bestehende Suites unveraendert: JS-Smoke 288/288, TV-Smoke 216/216, PHP-Smoke 42/42.
v2.12.2 – Template Polish stable 12.05.2026

Live-Validierung erreicht jetzt auch die Step-1-Felder im Customer-Template-Editor. Nach TV-1..TV-7 (SVI-Card, Loopback-Card, Helper-Listen, BGP-Networks-Textareas, IPv6-Sub-Modal) schliesst TV-8 die letzte Luecke: Management IP, Subnetzmaske und Default Gateway aus dem Schritt-1-Tab bekommen denselben Haken/X-Indikator direkt am Inputfeld. Schema- und Daten-Format unveraendert.

Neu
  • Step-1-Felder im Editor (TV-8): Die in $step1Fields definierten IP-Felder bekommen einen optionalen vierten Parameter validate (ipv4 oder mask). Beim Rendern werden diese Felder statt eines einfachen input-Elements als input-group mit .validation-icon und invalid-feedback-Div ausgegeben. data-tpl-value-wrap-Attribut am Wrapper sorgt dafuer, dass handleModeChange beim Wechsel auf Offen das ganze input-group versteckt, nicht nur den inneren Input.
Geändert
  • handleModeChange: Beim Wechsel auf Offen wird der Live-Validity-Status fuer TV-Validator-Felder auf neutral zurueckgesetzt (_tplSetFieldValidity(valEl, ..., null)), damit kein stehengebliebenes is-invalid-Highlight aus einem frueheren Modus uebrig bleibt.
  • Restore-Loader: Beim Edit-Restore wird _tplOnIpValidate fuer Step-1-Felder mit data-tpl-validate-Attribut sofort getriggert, sodass vorbelegte Werte gleich gruen markiert sind.
  • Smoke-Suite (TV-8): 12 neue Cases in tests/template-validation.smoke.js – PHP-Source-Marker (Validate-Spalte in $step1Fields, input-group + Icon + Feedback im Render-Block) und JS-Source-Marker (Restore-Validate + Mode-Change-Reset). Pass-Done-Block um TV-8-Marker erweitert. Total jetzt 216 Cases gruen.
v2.12.1 – Template Polish stable 12.05.2026

Live-IP-Validierung im Customer-Template-Editor. Admins bekamen bisher erst beim Save Rueckmeldung, wenn eine IP-Adresse, Subnetzmaske oder ein IPv6-Prefix im falschen Format eingetragen war (Server-Validation in admin/api/template.php). Im Wizard zeigt Schritt 1 schon lange einen Haken oder ein rotes Kreuz direkt am Inputfeld – der TV-Pass spiegelt diese Live-Validierung jetzt im Editor: SVI-Card (IP, Subnetzmaske, DHCP-Helper, DHCPv6-Relay), Loopback-Card (IPv4, IPv6-Prefix), beide BGP-Networks-Textareas (kompakte Status-Zeile darunter) und das IPv6-Adressen-Sub-Modal. Schlanke editor-eigene Validatoren (~150 LoC) spiegeln die Wizard-Regex 1:1, ohne dass js/validation.js ins Admin-Bundle gezogen wird; Drift-Schutz haengt an einer eigenen Smoke-Suite tests/template-validation.smoke.js.

Neu
  • Editor-eigene IP-Validatoren (TV-1): sechs schlanke Pure-Logic-Funktionen in admin/js/template-editor.js_tplValidateIPv4 (Range-Check), _tplValidateSubnetMask (Contiguous-1-Bits + CIDR-Aequivalent), _tplValidateIPv6 (grobe Plausi), _tplValidateIPv6Prefix (<addr>/<len>), _tplValidateIPv4List/_tplValidateIPv6List (komma-/whitespace-getrennt). Plus generischer UI-Helper _tplSetFieldValidity (analog setFieldState aus validation.js: is-valid/is-invalid + bi-check-lg/bi-x-lg/bi-dash-Icon + Klartext-Fehler in invalid-feedback).
  • SVI-Card Live-Feedback (TV-2): IP-Adresse und Subnetzmaske im SVI-Card-Editor sind jetzt in input-group input-group-sm has-validation mit Icon-Span (rechts) und Inline-Fehlertext eingerahmt. Beim Tippen zeigt der Editor sofort Haken bei gueltigen Werten bzw. rotes X plus Klartext bei Format-Fehlern. Generischer _tplOnIpValidate-Handler liest den Validator-Typ aus data-tpl-validate und dispatcht; Event-Delegation greift fuer alle Live-Felder dieses Passes.
  • Loopback-Card Live-Feedback (TV-3): IPv4-Adresse (leer = Unnumbered, sonst A.B.C.D) und IPv6-Prefix (CIDR-Form) im Loopback-Card-Editor analog zu TV-2 – inklusive Initial-Validate-Trigger fuer vorbelegte Werte aus dem Edit-Restore-Pfad.
  • Komma-Listen Live-Feedback (TV-4): DHCP-Helper-Liste (IPv4) und DHCPv6-Relay-Ziele (IPv6) zeigen Aggregat-Status: alle Eintraege gueltig -> gruener Haken, sonst rotes X mit Hinweis auf die Position des ersten ungueltigen Eintrags („Eintrag 2 ungueltig: ...").
  • BGP-Networks-Textareas Status-Zeile (TV-5): Beide mehrzeilige Textareas (IPv4 + MP-BGP-IPv6) bekommen unter dem Feld eine kompakte Status-Zeile – „N gueltige Networks" (gruen) oder „Zeile X: Fehler" (rot, plus „N gueltige davor"). Multi-Line-Validatoren _tplValidateBgpNetworksV4/V6 akzeptieren pro Zeile <ip> <mask>, <ip>/<cidr> bzw. <prefix>/<len>; leere Zeilen werden ignoriert. Wird vom input-Listener bei Edits und vom Restore-Loader nach dem Page-Load gepflegt.
  • IPv6-Adressen-Sub-Modal Hardening (TV-6): Das Adress-Inputfeld im Sub-Modal fuer Per-SVI-IPv6-Adressen bekommt dieselbe Icon-Variante wie die uebrigen Single-Inputs. Beim Modus-Wechsel auf slaac/dhcpv6 (kein Adress-Wert noetig) wird der Validity-Status auf neutral zurueckgesetzt; in den Modi mit Pflichtwert (manual, eui64, link-local) wird einmal validiert, damit Edit-Restore vorbelegte Werte sofort gruen markiert.
Geändert
  • Smoke-Suite (TV-Pass): Neue self-contained Test-Datei cisco-switch-config/tests/template-validation.smoke.js deckt 204 Cases ab – TV-1-Pure-Logic-Tests (74), TV-2..TV-4-HTML-Marker + Mini-Sandbox-Dispatch-Tests (58), TV-5-Multi-Line-Validatoren + Renderer (40), TV-6-Modal-Hardening (12), TV-7-End-to-End-Pass-Done-Marker (20). Bestehende Suites unveraendert: JS-Smoke 280/280, PHP-Smoke 42/42.
v2.12.0 – Loopback stable 12.05.2026

Loopback-Interfaces im Wizard, Template-Editor und CLI. Der Routing-Wizard kann jetzt vordefinierte interface Loopback<N> anlegen – inklusive optionaler IPv4 (Cisco-Konvention 1.1.1.1/32 als Router-ID + iBGP-Update-Source), IPv6-Prefix, OSPFv3-Area und EIGRP-IPv6-Toggle. BGP-Neighbors bekommen pro Eintrag ein Update-Source-Select, das alle existierenden Loopbacks listet und im CLI als neighbor <ip> update-source Loopback<N> emittiert wird. Der „Router-ID aus Loopback ableiten"-Helper schreibt die /32-Adresse direkt in OSPF, OSPFv3, EIGRP oder BGP. Customer-Templates tragen das neue Feld step4.loopbacks[] (Schema v9), das beim Apply locked/preset-Loopbacks ins routingState.loopbacks ausrollt; das License-Gate räumt per-Loopback EIGRPv6-Bindings beim Downgrade mit ab. Persistierung ist im Auto-Save, im Edit-Mode-Restore und im Template-Apply-Pfad geschlossen. Parallel zieht der Customer-Template-Editor beim IPv6-Routing-Bundle aus 2.11.0 nach (I-14): alle Top-Level-Felder (ipv6_routing, vrrpv3_global), OSPFv3, EIGRP-Named-Mode/IPv6-AF, MP-BGP-IPv6-Networks, vier Per-SVI-Spalten und ein FHRP-Family-Toggle sind jetzt direkt im UI editierbar.

Neu
  • Loopback-State + Validatoren (LO-1): Neuer State-Slot routingState.loopbacks mit { id, description, ipv4Address, ipv4PrefixLen, ipv6Addresses, ipv6OspfArea, ipv6Eigrp, shutdown }. validateLoopbackId (Integer 0..2147483647, eindeutig) und validateLoopbackPrefixLen (0..32) etablieren die Range-Checks, _loopbackEnsureDefaults backfillt fehlende Felder auf Cisco-Best-Practice-Defaults (IPv4 leer = Unnumbered, /32, no shutdown).
  • Loopback-Editor im Wizard (LO-2 + LO-2a/b/c/d): Form-Panel + Tabelle analog zum SVI-Editor – ein Klick auf „Loopback hinzufügen" öffnet das Formular, ausgefüllte Loopbacks erscheinen in einer kompakten .vlan-table darunter. IPv4/IPv6-Felder haben Live-Validierung mit Haken/X-Icon direkt am Inputfeld (Pattern aus Schritt 1), Inline-Fehler für IPv6-Prefix und OSPFv3-Area, UI-Gates für die per-Loopback Routing-Protokoll-Felder (OSPFv3-Area + EIGRP-IPv6 disabled, solange der globale Process im Routing-Accordion inaktiv ist).
  • CLI-Builder Loopback-Block (LO-3): Pro angelegtem Loopback wird ein interface Loopback<N>-Block emittiert mit description, ip address <ip> <mask> (oder no ip address bei Unnumbered), beliebig vielen ipv6 address-Modi (manual/eui-64/slaac/dhcpv6/link-local), ipv6 ospf <pid> area <X> wenn OSPFv3 aktiv ist, ipv6 eigrp <AS> wenn EIGRP-Named-Mode + IPv6-AF aktiv sind, und abschließend shutdown/no shutdown. Sortierung aufsteigend nach ID.
  • „Router-ID aus Loopback ableiten"-Helper (LO-4): Jeder Router-Prozess (OSPF, OSPFv3, EIGRP, BGP) bekommt im Routing-Accordion ein Dropdown Aus Loopback ableiten mit allen Loopbacks, die eine IPv4-Adresse tragen. Klick schreibt die /32-Adresse direkt in den Router-ID-Slot und Input, Toast-Bestätigung inklusive. Loopback-Liste-Änderungen aktualisieren die Dropdowns automatisch.
  • BGP update-source Loopback<N> per Neighbor (LO-5): Neue Spalte „Update-Source" in der BGP-Neighbor-Tabelle mit einem Inline-<select> pro Neighbor. Optionen sind alle existierenden Loopbacks (sortiert nach ID, plus „— keine —" für eBGP). Wenn der referenzierte Loopback gelöscht wurde, zeigt das Select eine stale-Option „Loopback<N> (entfernt)" und der CLI-Builder skippt die Zeile defensiv. Im CLI wird neighbor <ip> update-source Loopback<N> direkt nach remote-as emittiert – im klassischen BGP-Block und im globalen MP-BGP-Block vor den address-family-Sektionen.
  • License-Gate: per-Loopback EIGRPv6 (LO-6): EIGRP ist Network-Advantage. Conflict-Reporting zählt jetzt aktive Loopbacks im IPv6-AF-Detail mit (z. B. EIGRP AS 100 (0 Netzwerke, IPv6-AF (1 SVI, 2 Loopbacks))); Cleanup setzt lo.ipv6Eigrp = false auf allen Loopbacks analog zur SVI-Schleife. Pre-LO-Drafts ohne loopbacks-Array bleiben verhalten- und format-identisch zu vorher.
  • Customer-Template-Editor: Loopback-Sektion (LO-7, Schema v9): Neue Sektion „Vordefinierte Loopback-Interfaces" in Tab 4 mit Add-Button und Card-Layout pro Loopback (drei Reihen: ID/Description/Modus, IPv4/Präfix/Shutdown, IPv6/OSPFv3-Area/EIGRP-IPv6). _collectLoopbackRows validiert ID-Range + Eindeutigkeit + IPv6-CIDR-Form und ergänzt step4.loopbacks im Template-JSON. Schema-Bump auf v9 ist auto-getriggert, Pre-v9-Templates bleiben uneingeschränkt gültig.
  • Server-Validation + Apply (LO-8, Schema v9): admin/api/template.php akzeptiert Schema-Versionen 2..9 und validiert step4.loopbacks[] defense-in-depth (ID-Range/Eindeutigkeit, Mode-Enum, IPv4-Pattern + Prefix-Range, IPv6-Adressen mit allen fünf Modi und prefix_len 0..128, OSPFv3-Area, EIGRP-Boolean, Description-Länge). admin/includes/template-apply-server.php spielt locked-Loopbacks beim Apply ins wizard_state.step4.loopbacks ein (snake_case → camelCase, Add-only mit tplLocked=true).
  • Client-Persistierung (LO-9): Drei Pfade geschlossen – _captureStep4 nimmt loopbacks in den Auto-Save-Snapshot auf, _applyStep4State spielt sie beim Edit-Mode-Restore zurück und ruft _allLoopbackEnsureDefaults + renderLoopbackTable, und template-apply.js rollt step4.loopbacks beim Wizard-Apply mit tplLocked/tplPreset-Markierung aus.
  • Konsolidierte Smoke-Suite (LO-10): cisco-switch-config/tests/ipv6-pass.smoke.js deckt jetzt 280 JS-Pure-Logic-Cases ab (+126 für den LO-Pass: State+Validatoren, Gates, CLI-Builder, Router-ID-Helper, Update-Source, License-Gate, Template-Editor-Bump, Capture/Restore + Template-Apply, End-to-End-Sanity-Marker). cisco-switch-config/tests/ipv6-pass.smoke.php deckt 42 Server-Apply-Cases ab (+20 für LO-8: Loopback-Apply Neu-Anlage/Update/preset-skip/State-Preservation, Schema-v9-Source-Check).
  • Top-Level + OSPFv3 + EIGRP Named-Mode/IPv6-AF im Template-Editor (I-14a): Neue Felder im Routing-Tab des Editors – ipv6_routing, vrrpv3_global, kompletter OSPFv3-Block (enabled/process_id/router_id/passive_default), EIGRP-Named-Mode + Process-Name + IPv6-AF + IPv6-Redistribute, BGP-IPv6-Redistribute. Schema-Bump-Logik erweitert um die neuen Trigger; Server-Validation und Server-Apply (Pfad-Map snake_case → camelCase) sowie Client-Apply ziehen mit.
  • MP-BGP IPv6-Networks-Textarea (I-14b): Eigene Textarea unterhalb der IPv4-Networks-Textarea, Format pro Zeile <prefix>/<len>. Parser trennt strikt am letzten Slash (Doppelpunkte im IPv6-Adress-Teil bleiben heil). Client-Apply pushed die Liste mit prefix_lenprefixLen Normalisierung und Duplikat-Schutz ins routingState.bgp.ipv6Networks; ipv6 unicast-routing wird auto-erzwungen.
  • Per-SVI IPv6-Felder + IPv6-Adressen-Submodal (I-14c): SVI-Repeater um vier responsive Spalten erweitert – „DHCPv6-Relay" (komma-getrennt analog zu DHCP-Helper), „IPv6-Adressen" (Trigger-Button mit Count-Badge), „OSPFv3 Area", „EIGRP v6" (Switch). Neues Sub-Modal #tpl-ipv6-addr-modal verwaltet beliebig viele IPv6-Adressen pro SVI in den fünf Cisco-Modi (manual, eui-64, slaac, dhcpv6, link-local) mit modus-spezifischer Pflichtfeld-Sichtbarkeit und Plausi-Validierung. Working-Copy sitzt am data-svi-ipv6-addresses-Attribut der Zeile, Modal-Lifecycle analog zum FHRP-Modal.
  • FHRP-Modal Family-Toggle (I-14d): Neue Btn-Group „Familie" (IPv4/IPv6) im FHRP-Edit-View. List-Renderer zeigt pro Gruppe ein Familie-Badge plus „v3"-Hinweis bei VRRP+IPv6. Submit-Validierung trennt strikten IPv4-Validator vs. IPv6-Plausi-Pattern, lehnt HSRPv1 + IPv6 mit klarem Inline-Fehler ab (Pendant zur Wizard-Validierung aus 2.11.0).
Geändert
  • Routing-Tabellen-Layout vereinheitlicht (LO-2d-Followup): Die Loopback-Tabelle nutzt jetzt dieselbe .vlan-table-Klasse wie SVI- und Static-Routes-Tabellen (kleinere Schrift, kompaktes thead, schmaleres Padding) und liegt bündig zur Card-Body-Kante. Spaltenreihenfolge ist an die SVI-Tabelle angeglichen.
v2.11.0 – IPv6 stable 11.05.2026

IPv6 in Schritt 4 angekommen. Der Routing-Wizard kannte bisher ausschließlich IPv4 – im neuen I-Pass kommt das volle IPv6-Set dazu: per-SVI ipv6 address in fünf Modi (manual, eui-64, slaac, dhcpv6, link-local) inkl. DHCP-Relay-Zielen, statische IPv6-Routen, OSPFv3 als separater Cisco-Prozess, EIGRP-Named-Mode mit zusätzlicher IPv6-Address-Family, MP-BGP mit Auto-Switch zwischen klassischem IPv4-Output und dem Block mit zwei address-family-Sektionen sowie HSRPv2-IPv6 und VRRPv3 mit globalem fhrp version vrrp v3 (automatisch erzwungen bei IPv6-Virtual-IPs). Außerdem: License-Gate kennt die neuen IPv6-Routing-Features, Customer-Templates lockern/presetten sie über Schema v8, und der zuvor in Schritt 4 verstreute Pflichtfeld-/Optional-Hinweis ist als einheitliche Badge-Variante umgesetzt. Zusätzlich kommen ein konsolidiertes Smoke-Skript für die JS-Pure-Logic-Slices sowie ein PHP-Pendant für die Server-Apply-Pfade in cisco-switch-config/tests/ hinzu.

Neu
  • IPv6 pro SVI (I-3 bis I-7): SVI-Editor erhält einen Repeater für IPv6-Adressen in den Modi manual, eui-64, slaac, dhcpv6 und link-local (Cisco-Syntax ipv6 address <prefix>/<len> [eui-64], autoconfig, dhcp oder fe80::… link-local). Zusätzlich: kommagetrennte DHCPv6-Relay-Ziele (ipv6 dhcp relay destination), ein OSPFv3-Area-Feld pro SVI (ipv6 ospf <pid> area <X>) und ein eigener separater OSPFv3-Accordion-Block (ipv6 router ospf) mit Router-ID, Passive-Default und Redistribute.
  • Statische IPv6-Routen (I-5): Statische Routen tragen jetzt eine family-Spalte (IPv4/IPv6) und akzeptieren das CIDR-Format 2001:db8::/32. Cisco-Output wechselt automatisch zwischen ip route und ipv6 route.
  • EIGRP Named-Mode + IPv6-AF (I-8a/I-8b): Neuer Toggle "Named-Mode" im EIGRP-Block schaltet zwischen klassischem router eigrp <AS> und der modernen Address-Family-Form router eigrp NAME + address-family ipv4 unicast autonomous-system <AS>. Eine zweite Address-Family address-family ipv6 unicast kann nur im Named-Mode aktiviert werden; per-SVI-Toggle "EIGRP IPv6" emittiert ipv6 eigrp <AS> im Interface-Block.
  • MP-BGP mit Auto-Switch (I-9): BGP-Neighbor-Eingabe akzeptiert IPv4 und IPv6 (Auto-Detect, Familie-Badge pro Eintrag). Neue Sektion "IPv6-Unicast Address-Family" mit Prefix-Tabelle (network <prefix>/<len>) und IPv6-Redistribute-Checkboxen. Sobald irgendeine IPv6-Aktivität vorhanden ist, wechselt der CLI-Builder vom klassischen IPv4-only-Output auf MP-BGP mit no bgp default ipv4-unicast, zwei address-family-Blöcken und per-Neighbor neighbor <ip4|ip6> activate.
  • HSRPv2 IPv6 + VRRPv3 (I-10): HSRP v2 emittiert jetzt auch standby <id> ipv6 <addr>; VRRP akzeptiert IPv6-VIPs und erzwingt dabei den neuen globalen Toggle "VRRPv3 global" (fhrp version vrrp v3). HSRPv1 + IPv6 wird mit klarem Inline-Fehler abgelehnt; eine VRRP-Gruppe mit IPv6-VIP kippt den Globalen-Toggle automatisch und blockt manuelles Deaktivieren, solange IPv6-VRRP existiert.
  • License-Gate IPv6-Aware (I-11): BGP-Conflict-Detail zeigt IPv4/IPv6-Neighbor- und Network-Counts getrennt sowie IPv6-Redistribute-Quellen; EIGRP nennt Named-Mode mit Process-Name und IPv6-AF mit Anzahl per-Interface-aktivierter SVIs; HSRP-Conflict-Detail trägt ein Familie-Tag. Cleanup räumt beim Downgrade alle IPv6-Slots (inkl. svi.ipv6Eigrp) und ruft _refreshSviIpv6ProtocolGates, damit ein offener SVI-Editor den gesperrten Toggle korrekt darstellt.
  • Vorlagen-Schema v8 (I-12): Customer-Templates können step4.fields.ipv6_routing, vrrpv3_global, step4.bgp_ipv6_networks[] sowie pro SVI ipv6_addresses[], ipv6_helper_addresses[], ipv6_ospf_area und ipv6_eigrp tragen; FHRP-Gruppen erhalten ein family-Feld. Schema-Bump auf 8 ist auto-getriggert (kein manuelles Hochzählen), Pre-v8-Templates bleiben uneingeschränkt gültig. Server-Validation und Server-Apply sind defense-in-depth implementiert; Client-Apply normalisiert prefix_lenprefixLen, damit der Wizard direkt damit arbeiten kann.
  • Pflichtfeld-/Optional-Badges konsistent: Die bisher verstreuten roten Sternchen und „(optional)"-Klartexte im Schritt 4 sind durch eine einheitliche Badge-Variante (Pflichtfeld-Badge in bg-danger, Optional-Badge in bg-secondary) ersetzt – inklusive aller in I-1 bis I-12 neu eingeführten Felder.
  • Konsolidierte Smoke-Suite: cisco-switch-config/tests/ipv6-pass.smoke.js deckt 76 JS-Pure-Logic-Cases ab (EIGRP-Named-Mode, MP-BGP-Auto-Switch, SVI-Gates, Live-Update/Snapshot, HSRPv2-IPv6/VRRPv3, License-Conflict/Cleanup, Schema-v8-Bump). cisco-switch-config/tests/ipv6-pass.smoke.php deckt 21 Server-Apply-Cases ab (Template-Lock-Apply, Pre-v8-Preservation, Source-Range-Stichproben). Beide Skripte sind self-contained und ohne Test-Framework-Setup lauffähig.
Geändert
  • SVI-Editor: Live-Update für IPv6-Protokoll-Felder (I-9c): OSPFv3-Area-Input und EIGRP-IPv6-Toggle schreiben jetzt direkt in den State und aktualisieren die CLI-Vorschau ohne „Speichern"-Klick. Snapshot-/Revert-Logik stellt sicher, dass „Abbrechen" weiterhin korrekt revertiert. Die übrigen SVI-Felder (IP/Prefix/Description/Helper) bleiben Batch-Mode, weil dort Pflicht-/Cross-Validation hängt.
  • SVI-Editor: Disabled-Hint für IPv6-Protokoll-Felder (I-9b): OSPFv3-Area und EIGRP-IPv6-Toggle werden disabled und mit kurzem Hinweistext markiert, solange der jeweilige globale Process im Routing-Accordion nicht aktiv ist. Das entzerrt die Cisco-Semantik (Per-Interface-Aktivierung wirkt nur in Kombination mit aktivem globalem Process) und erspart dem Techniker das Rätseln, warum sein Toggle nichts macht.
  • BGP advertised jetzt etwas (B-Pass / Schema v7): Neue Sektion „Netzwerke (advertised)" und „Redistribute" im BGP-Block (siehe Schema v7), mit Smart-Parser für IP+Subnet-Mask oder CIDR, Inline-Validity-Markern und Warn-Banner bei aktivem Toggle ohne Pflichtwert. Detaillierter License-Conflict-Banner beim Downgrade.
Behoben
  • BGP-Add-Button und Redistribute-Checkboxen ohne Effekt: Drafts aus der Zeit vor dem B-Pass enthielten kein networks-/redistribute-Feld im persistierten BGP-State. Nach dem Restore in den Wizard crashte der Klick auf „Hinzufügen" still an routingState.bgp.networks.some(...), die Checkbox-Handler sprangen wegen !routingState.bgp.redistribute in den frühen Return. Defense-in-Depth via _bgpEnsureDefaults() in jedem Mutator plus expliziter Aufruf direkt nach dem JSON-Restore in _applyStep4State reparieren das.
v2.10.0 – Licenses stable 08.05.2026

License-Awareness für Catalyst 9000. Der Wizard kennt ab sofort die beiden Cisco-Lizenztiers Network Essentials und Network Advantage und entscheidet pro Gerät, welche Routing-Features verfügbar sind. EIGRP, BGP, HSRP und StackWise Virtual sind Advantage-Only und werden bei Essentials hart gesperrt – inklusive Auto-Cleanup bei Lizenz-Downgrade. Stack-Member erben die Lizenz vom Master-Switch; ein neuer Banner im Stack-Card macht das transparent. Customer-Templates können in Schema-Version 6 ein Feld min_license tragen, und der Wizard zeigt einen Warn-Banner, wenn die Vorlage Advantage erfordert, das aktive Gerät aber nur Essentials hat. Server-seitige Validierung bei Template-Save verhindert inkonsistente JSON-Stände.

Neu
  • License-Card im Wizard (Schritt 2): separate Karte zwischen Modell-Auswahl und Stack-Konfiguration mit Btn-Group Network Essentials / Network Advantage. Hardware-typischer Default ist vorausgewählt (Essentials für C9200/C9300, Advantage für C9400/9500/9600). Override pro Gerät möglich; ein Warn-Hint kennzeichnet Override-Auswahl, damit der Anwender sieht, dass das Gerät tatsächlich eine entsprechende Lizenz braucht.
  • Hard-Disable für Advantage-Only-Features (js/license-gate.js): EIGRP- und BGP-Toggles im Routing-Accordion bekommen ein Network Advantage-Lock-Badge und werden komplett gesperrt. HSRP im FHRP-Modal ist greyed-out mit Hinweis, dass VRRP im Essentials-Tier verfügbar bleibt. StackWise-Virtual-Toggle ist disabled mit Lock-Tooltip; ein Banner im SVL-Card-Body erklärt die Voraussetzung.
  • Auto-Cleanup beim Lizenz-Downgrade: wechselt der Anwender ein konfiguriertes Gerät auf Essentials zurück, listet ein nativer Confirm-Dialog alle betroffenen Konfig-Blöcke (z. B. BGP AS 65000 (1 Nachbar), 2 HSRP-Gruppen (Vlan10 HSRP G1, Vlan20 HSRP G5), StackWise Virtual (Domain 42)). Bei Bestätigung werden die State-Slots geleert und betroffene Bereiche neu gerendert; bei Abbruch bleibt die Lizenz unverändert.
  • Stack-Lizenz-Banner: sichtbar sobald ein stapelbares Modell aktiv ist; zeigt die effektive Stack-Lizenz und stellt klar, dass alle Member-Switches die Lizenz vom Master übernehmen. Aktualisiert bei Modell- und Lizenzwechsel.
  • Vorlagen-Schema v6: Templates können das Feld min_license mit Werten essentials oder advantage führen. Der Customer-Template-Editor bekommt eine Btn-Group Minimum License-Level in der Metadaten-Spalte; der Wert wird beim Speichern serialisiert und bumpt die Schema-Version auf 6, wenn Advantage gewählt ist.
  • License-Mismatch-Banner im Wizard: erscheint, sobald die angewandte Vorlage min_license=advantage verlangt, das aktive Gerät aber Network Essentials hat. Der Banner schlägt vor, License-Level oben anzupassen oder eine andere Vorlage zu wählen, da sonst Advantage-Features (EIGRP, BGP, HSRP, StackWise Virtual) verworfen werden.
  • Server-seitige Validierung in admin/api/template.php: erlaubt Schema-Versionen 2..6, prüft min_license als Enum (essentials oder advantage) und erzwingt, dass min_license nur in Schema 6 stehen darf. Konsistenzfehler liefern HTTP 422 mit aussagekräftiger Fehlermeldung.
Geändert
  • VRRP ist neu der Default-Protokoll-Wert beim Anlegen einer FHRP-Gruppe – VRRP ist in beiden Lizenztiers verfügbar, HSRP nur in Network Advantage. Beim Bearbeiten bestehender FHRP-Gruppen wird das gespeicherte Protokoll weiterhin übernommen.
  • Catalyst-9000-Katalog trägt pro Series einen defaultLicense-Wert. Hilfsfunktionen defaultLicenseForModel(), licenseAtLeast() und featureRequiresLicense() stehen global zur Verfügung, damit andere Module (z. B. CLI-Renderer) Lizenz-aware sind, ohne den Wizard-State direkt zu kennen.
Behoben
  • Umlaute in der License- und FHRP-UI: License-Card-Tooltip („möglich", „Gerät"), FHRP-Modal-Hint („benötigt", „verfügbar"), License-Confirm-Dialog („behält"), HSRP-Versions-Hint („IPv6-fähig"), Priority-Default-Hint („Höher") und Preempt-Tooltip („übernimmt", „höher", „für") – alle als korrekte UTF-8-Umlaute statt ASCII-Transliteration.
v2.9.0 – Access Control List stable 07.05.2026

Großer ACL-Release. Der Konfigurator-Wizard bekommt einen neuen Schritt 6 „Access Control Lists" mit vollständigem Editor: ACLs anlegen, Regeln pflegen, Anwendungen an Interfaces oder VTY-Lines binden – alles mit Cisco-konformer Live-CLI-Vorschau. Unterstützt werden Named und Numbered ACLs (letztere mit Deprecated-Hinweis), IPv4 und IPv6 als getrennte Adress-Familien sowie Service-Namen wie eq ssh, eq https oder eq domain statt nackter Portnummern. Drag & Drop sortiert ACLs und Regeln (Touch-fähig auf Tablets); Pfeil-Buttons bleiben als Tastatur-Fallback. Der Customer-Template-Editor bekommt einen passenden Tab, mit dem Administratoren ACL-Vorlagen pflegen und einzelne ACLs gegen Anwender-Änderungen sperren können – der Server erzwingt gesperrte Werte beim Laden eines Projekts. Implicit-Deny-Banner und sechs ?-Inline-Hints machen den Editor selbsterklärend.

Neu
  • Wizard-Schritt 6 „Access Control Lists": neuer Schritt zwischen Sicherheit und Überprüfung mit ACL-Liste, Anwendungs-Sektion und Cisco-CLI-Live-Vorschau. Das Step-Indicator-Strip zeigt jetzt sieben Schritte; die bisherige Überprüfung-Karte wandert auf Schritt 7.
  • ACL-Editor: Anlegen, Bearbeiten, Löschen und Umsortieren benannter Access Control Lists. Pro ACL wählbar zwischen standard und extended, Cisco-konforme Namensvalidierung (1–63 Zeichen, beginnend mit Buchstabe), optionale Bemerkung und Eindeutigkeitsprüfung. Nicht mehr referenzierte ACLs werden beim Löschen mit Cascade-Warnung quittiert, falls Anwendungen daran hängen.
  • Regel-Editor: modaler Inline-Editor pro Regel mit Aktion (permit/deny), Protokoll (ip/tcp/udp/icmp), Quelle und Ziel als any/host/network mit Prefix, Quell-/Ziel-Port (eq, neq, lt, gt, range), optionalem log-Flag und Pro-Regel-Bemerkung. Wildcard-Masken werden automatisch aus CIDR-Eingaben generiert (/24 → 0.0.0.255).
  • Auto-Sequenzierung in 10er-Schritten: neue Regeln bekommen automatisch last+10 als Sequenznummer, und beim Reorder werden alle Regeln auf 10/20/30/… renumeriert. Macht spätere Einschübe zwischen bestehende Regeln (in Cisco selbst 15 permit …) jederzeit möglich, ohne dass die Sequenz manuell gepflegt werden muss.
  • Anwendungen: ACLs an Interfaces (in/out) oder VTY-Lines (Cisco access-class IN) binden. Der Target-Picker zieht echte Cisco-Interface-Namen aus den im Wizard konfigurierten Interfaces (Schritt 2) und SVIs (Schritt 4); Eindeutigkeitsprüfung verhindert zwei ACLs der gleichen Familie in derselben Richtung am selben Ziel.
  • Numbered ACLs (1–99 / 1300–1999 für standard, 100–199 / 2000–2699 für extended): klassische Cisco-Numbered-Syntax mit access-list 100 permit … pro Regel. Der Wizard zeigt einen Deprecated-Hinweis und empfiehlt Named ACLs für moderne Netze; Numbered bleibt verfügbar für Legacy-Kompatibilität.
  • IPv6-ACLs: eigene Adress-Familie. IPv6 erzwingt automatisch named + extended (Cisco IOS XE kennt keine Numbered-IPv6 und keine standard/extended-Trennung in der CLI-Syntax) und nutzt Prefix-Notation (2001:db8::/32) statt Wildcard-Masken. Apply-Statements emittieren Cisco-konform ipv6 traffic-filter und ipv6 access-class; eine IPv4 und eine IPv6 ACL dürfen am selben Interface in derselben Richtung koexistieren.
  • Service-Name-Mapping: rund 70 Cisco-IOS-XE-Mnemonics für TCP und UDP. Im Port-Feld kann ssh, https, domain, ntp, tftp usw. eingegeben werden – die Auflösung erfolgt automatisch. Der generierte Cisco-CLI-Output zeigt symbolisch (eq ssh) wenn ein Mapping existiert, sonst numerisch. range bleibt zwingend numerisch.
  • CLI-Live-Vorschau mit Syntax-Highlighting analog zu Schritt 1–5. Die ACL-Sektion wird automatisch in die Gesamt-Konfiguration in Schritt 7 (Überprüfung) übernommen.
  • Implicit-Deny-Visualisierung: ein Info-Banner am Schritt-Anfang erklärt Cisco's unsichtbares deny ip any any-Default-Verhalten, und unter jeder ACL-Karte erscheint eine graue Pseudo-Zeile → deny ip any any (impliziter Deny). Im generierten Cisco-CLI-Block steht ein Kommentar mit dem gleichen Hinweis.
  • Sechs ?-Inline-Hints an den komplexesten Feldern: ACL-Typ (extended vs. standard), Action (permit/deny), Protokoll-Wahl, Quelle/Ziel-Kind (mit Wildcard-Mask-Erklärung), Port-Operator und Apply-Direction (in vs. out, inbound-Best-Practice).
  • Drag & Drop-Reorder: ACL-Karten und Regeln lassen sich per Drag (Grip-Handle links) sortieren. Touch-fähig für Tablet-Bedienung, mit Drop-Indikator-Animation und automatischer Neunummerierung der Sequenzen nach jedem Reorder. Pfeil-Buttons bleiben als Tastatur-Fallback erhalten.
  • Validierung beim Step-Wechsel: vor dem Sprung zu Schritt 7 weist der Wizard auf leere ACLs hin (blockieren wegen impliziter Deny effektiv allen Verkehr), auf nicht angewendete ACLs (Tote Konfiguration) und auf Anwendungen mit verwaisten Ziel-Referenzen. Warnungen blockieren die Navigation nicht – Cisco akzeptiert auch leere ACLs.
  • Customer-Template-Editor – Tab „ACLs": derselbe ACL-Editor steht im Backend für Vorlagen zur Verfügung. Pro ACL kann ein Locked-Toggle aktiviert werden – gesperrte ACLs sind im Konfigurator schreibgeschützt (kein Bearbeiten, kein Löschen, keine Regel-Änderung). Der Editor zeigt Vorlagen-eigene SVIs aus Tab Routing als Apply-Ziele.
  • Server-seitiges Re-Apply für ACLs: gesperrte ACLs aus einer aktiven Vorlage werden beim Laden eines Projekts in den Wizard-State gemerged. Match per Name (case-insensitive) bei Named ACLs und per Nummer bei Numbered ACLs; Override-Liste wird zur Audit-Anzeige zurückgegeben.
  • Wizard-State-Persistenz: ACL-Definitionen und Anwendungen werden bei jedem Autosave und beim Speichern eines Projekts mitgesichert und beim Wieder-Laden korrekt restauriert.
Geändert
  • Wizard hat jetzt 7 Schritte: neue Reihenfolge ist Grundkonfiguration → Interfaces → VLANs → Routing → Sicherheit → Access Control Lists → Überprüfung. Schritt-Indikator, Navigation, Bug-Report-Schritt-Namen, Auto-Save-Restore-Banner und CLI-Editor-Wiederaufnahme-Punkte sind durchgängig auf 1–7 aktualisiert; der Auto-Save-Schema-Bump (Version 2) sorgt für saubere Kompatibilität mit Bestandsentwürfen.
  • Vorlagen-Schema auf Version 4 angehoben: Vorlagen können jetzt eine step6-Sektion mit ACL-Definitionen und Anwendungen tragen. Bestehende Vorlagen ohne step6 bleiben uneingeschränkt nutzbar.
v2.8.0 – Ledger stable 05.05.2026

Migrations-Versions-Tracking. Das frueher implizite "irgendwann mal alles durchgeklickt" wird zur expliziten, nachvollziehbaren Liste: fuer jedes Migrations-Skript zeigt das neue Dashboard, ob es schon gelaufen ist, von wem, wann und wie oft. Eine Header-Pill macht ausstehende oder fehlgeschlagene Migrationen sichtbar, eine kanonische Beschreibungs-Liste dokumentiert pro Skript Sinn und Zweck, und das Setup-Skript spiegelt die Tracking-Eintraege automatisch fuer Frischinstallationen – das Dashboard zeigt direkt nach einer Neuinstallation keine faelschlichen Ausstehend-Markierungen. Ein neuer woechentlicher Cron raeumt verwaiste Eintraege auf, die durch umbenannte oder entfernte Skripte entstehen.

Neu
  • Migrations-Dashboard: Eine neue Superadmin-Seite listet alle Migrations-Skripte mit Status (OK / Ausstehend / Fehlgeschlagen), Zeitstempel des letzten Laufs, ausfuehrendem Admin, Quelle (Web-UI oder Setup) und Anzahl der Aufrufe. Ein Filter-Dropdown blendet nach Status ein/aus, ein Bulk-Button markiert fuer Bestandsinstallationen alle Skripte auf einmal als „bereits gelaufen" – sinnvoll, wenn die Tabellen schon existieren und nur das Tracking nachgezogen wird.
  • Header-Pill fuer ausstehende Migrationen: Sobald Skripte ausstehen oder fehlgeschlagen sind, erscheint in der Navbar neben der Postfach-Glocke eine farbige Pill mit Counter und Direktlink ins Dashboard. Gelb mit Klemmbrett-Icon fuer „pending", rot mit Warndreieck fuer „failed". Andere Rollen sehen die Pill nicht; fuer Superadmins verschwindet sie automatisch, sobald alles sauber durchgelaufen ist.
  • Beschreibungs-Liste mit Doc-Block-Fallback: Jedes Migrations-Skript bekommt eine kanonische Ein-Satz-Beschreibung im Dashboard. Fehlt der Listen-Eintrag, faellt das System auf den ersten Doc-Block-Hinweis aus dem Datei-Kommentar zurueck und markiert die Zeile mit einer „Beschreibung fehlt"-Warnung – damit bleibt das Hinzufuegen neuer Migrations-Skripte selbst-disziplinierend, ohne dass alte Skripte je ohne Beschreibung dastehen.
  • Setup-Spiegelung: Eine Frischinstallation legt nicht nur das Schema an, sondern markiert die Migrations-Skripte, deren Schema das Setup-Skript selbst aufbaut, automatisch als „gelaufen via Setup". Das Dashboard zeigt direkt nach einer Neuinstallation keine faelschlichen Ausstehend-Eintraege fuer Tabellen, die in Wirklichkeit schon vorhanden sind. Ein einzelnes Migrations-only-Skript (CLI-Snippets) ist bewusst ausgenommen, weil das zugehoerige Schema nur in der Migration existiert.
  • Permanenter Dropdown-Link: Im System-Dropdown direkt ueber „Einstellungen" liegt ein dauerhafter Eintrag Migrations, sodass das Dashboard auch dann erreichbar bleibt, wenn die Pill verschwindet (alle Skripte gelaufen, nichts pending oder failed) – fuer Spot-Checks, Re-Runs oder Audit-Zwecke.
  • Cleanup-Cron: Ein neuer woechentlicher CLI-Cron entfernt Tracking-Zeilen fuer umbenannte oder geloeschte Skripte. Mit --dry-run testbar, gibt einen JSON-Report aus und meldet Fehler ueber das Postfach an alle Superadmins – konsistent mit den bestehenden Purge-Crons fuer SSH, Postfach und Admin-Sessions.
Geändert
  • Migrations-Skripte registrieren ihren Lauf: Alle 16 bestehenden Migrations-Skripte hinterlegen am Ende ihres Laufs einen Tracking-Eintrag. Jeder Klick auf „Jetzt ausfuehren" oder „Erneut ausfuehren" aktualisiert Status, Zeitstempel, ausfuehrenden Admin und Counter im Dashboard – mit korrektem Fehler-Status, falls die Schema-Aenderung in einen Catch-Zweig faellt.
  • Self-bootstrapping Tracking-Tabelle: Die Tracking-Tabelle braucht selbst kein eigenes Migrations-Skript (das waere ein zirkulaeres Bootstrap-Problem). Stattdessen legt der Tracker sie beim ersten Tracking-Aufruf idempotent selbst an – mit Request-Cache, sodass pro Aufruf hoechstens ein Anlage-Versuch zur Datenbank geht.
v2.7.0 – Inbox stable 03.05.2026

Großes Postfach-Release. Das in 2.6.x eingeführte Inbox-System wird systematisch über die ganze Anwendung ausgerollt: über 20 neue Ereignis-Typen aus sechs Bereichen (Vault & Recovery, Bug-Reports & Feature-Requests, Kollaboration, Kontingente und Auto-Limits, System & Wartung, Onboarding) landen jetzt direkt im persönlichen Postfach des betroffenen Benutzers – ohne dass jemand aktiv Audit-Logs oder Cron-Reports prüfen muss. Die bisherige Dedup-Logik sorgt dabei dafür, dass wiederholte Trigger eine bereits offene Postfach-Zeile aktualisieren statt sie zu duplizieren – das Postfach bleibt auch bei aktiven Phasen ruhig und übersichtlich. Neu ist außerdem eine automatische Versions-Bump-Erkennung: nach einem Update sieht jeder Benutzer beim ersten Login einen Hinweis auf die neue Version mit Verweis auf die Release-Notes. Administrative Aufräumaktion: alle Migrations-Skripte sind in ein eigenes Unterverzeichnis konsolidiert und konsistent benannt.

Neu
  • Vault & Recovery: Antragsteller eines Vault-Recoverys werden über erteilte Grants und deren Token-Gültigkeit informiert; Benutzer mit Recovery-Wrap an einem stillgelegten oder als verloren markierten Recovery-Key bekommen eine Empfehlung zum Neu-Wrappen ins Postfach (mit passender Severity – Warnung bzw. Fehler). Das Teilen und Entziehen von SSH-Credential-Freigaben löst beim Empfänger eine Postfach-Nachricht aus, sodass neu freigegebene Credentials sofort entdeckt werden. Eine Häufung fehlgeschlagener Vault-Entsperrungen führt zusätzlich zu einer Warnung – Selbst-Erkennung von Tippfehler-Serien oder Hinweis auf einen fremden Zugriffsversuch.
  • Bug-Reports & Feature-Requests: Wer einen Bug oder Feature-Request zugewiesen bekommt, einen Statuswechsel an einem zugewiesenen Ticket erlebt oder einen neuen Kommentar erhält, sieht das im Postfach – mit Direktlink auf die Detail-Seite und einem Snippet des Kommentars. Feature-Requests posten zusätzlich Vote-Meilensteine (5/10/25/50/100/250/500/1000) an den zugewiesenen Bearbeiter sowie an Admins/Superadmins; dank Dedup wird die bestehende Meilenstein-Nachricht beim nächsten Schwellwert aktualisiert statt verdoppelt.
  • Kollaboration & Zuweisung: Hinzufügen und Entfernen von Benutzern bei Kunden und Projekten erzeugt eine Postfach-Nachricht beim betroffenen Benutzer. Bei Kunden wird zusätzlich die Rolle (Member oder Lead Engineer) genannt; ein expliziter Rollenwechsel oder ein Re-Add mit anderer Rolle wird als Rollenwechsel-Eintrag dargestellt und erklärt die Konsequenz für die Vorlagen-Verwaltung.
  • Kontingente & Auto-Limits: Genau einen Versuch vor dem Login-Lockout bekommt der Account-Eigentümer eine Warnung mit aktuellem Counter und verbleibenden Versuchen. Schnappt der Lockout zu, folgt eine zweite Nachricht mit Lockout-Dauer, Endzeit und – soweit verfügbar – der IP des letzten Versuchs als Forensik-Hinweis. Persönliche Webhooks, deren Stunden-Lieferquote ausgeschöpft ist, posten dem Eigentümer eine Warnung über das verworfene Event – damit nicht unbemerkt Slack/Teams/Webex-Channels schweigen.
  • System & Wartung: Wird der Wartungsmodus an- oder ausgeschaltet, sehen alle anderen Admins/Superadmins die Zustandsänderung im Postfach – inklusive eines Auszugs aus dem Hinweistext. Cron-Skripte (SSH-Cleanup, Webhook-Retry, Inbox-Cleanup) melden Stage-Abbrüche jetzt aktiv an alle Superadmins ins Postfach, sodass Logfile-Inspektion nicht mehr nötig ist.
  • Versions-Bump-Erkennung: Beim ersten Aufruf nach einem Update sieht jeder eingeloggte Benutzer eine Postfach-Nachricht mit der neuen Version, dem Codenamen und einem Verweis auf die Release-Notes. Pro Benutzer und Release greift der Hinweis genau einmal; Bestandskonten werden nicht rückwirkend mit einer Begrüßung überschwemmt.
  • Onboarding: Neue Selbst-Registrierungen werden allen Admins/Superadmins gemeldet – mit dem Hinweis, dass die Aktivierung noch aussteht. Nach erfolgter E-Mail-Bestätigung sieht der frische Benutzer eine Begrüßungs-Nachricht mit den empfohlenen nächsten Schritten (Passwort ändern, Vault einrichten, Zuweisungs-Bitte an einen Admin), und die Admins werden über die Aktivierung informiert. Manuell vom Superadmin angelegte Konten erhalten beim ersten Login dieselbe Begrüßung – mit dem Hinweis, wer den Account für sie eingerichtet hat.
Geändert
  • Migrations-Skripte konsolidiert: Die seit Projektbeginn gewachsene Sammlung an Migrations-Endpunkten ist in ein eigenes Unterverzeichnis umgezogen und einheitlich benannt. Die in den Self-Heal-Bannern verlinkten URLs sind entsprechend angepasst – die Funktion der Skripte (idempotente Schema-Ergänzungen für Bestandsinstallationen) bleibt unverändert.
  • Dedup-Logik nutzt sich aus: Mehrere der neuen Ereignis-Typen (z. B. Vote-Meilensteine, Pre-Lockout-Warnungen, Webhook-Quoten) sind so aufgebaut, dass wiederholte Trigger nicht eine neue Postfach-Zeile pro Treffer erzeugen, sondern die bereits offene Zeile mit aktualisiertem Counter und frischem Zeitstempel ungelesen markieren. Das Postfach bleibt damit auch in aktiven Phasen ruhig.
Sicherheit
  • Pre-Lockout-Warnung & Lockout-Notice: Brute-Force-Versuche gegen einen Account werden jetzt nicht nur in den Sicherheits-Audit geschrieben und per Webhook an den Superadmin gemeldet, sondern auch dem Account-Eigentümer selbst zugestellt – sobald er sich nach Lockout-Ende einloggt, erkennt er eine fremde Aktivität anhand der Postfach-Nachricht und kann reagieren (Passphrase ändern, Recovery-Wrap prüfen). Username-Probing auf nicht existente Accounts erzeugt bewusst keine Postfach-Spuren.
  • Vault-Unlock-Häufung: Drei oder mehr fehlgeschlagene Vault-Entsperrungen innerhalb von 10 Minuten lösen eine Warnung an den betroffenen Benutzer aus. Damit ist eine schleichende Brute-Force-Attacke auf den browserseitigen Vault-Schlüssel auch ohne explizite Audit-Log-Inspektion sichtbar.
  • Failsafe-Design durchgängig: Alle Postfach-Trigger sind so verdrahtet, dass ein Fehler beim Posten den auslösenden Vorgang (Login, Speichern, Recovery-Grant, Cron-Lauf, …) niemals scheitern lässt – das Postfach erweitert die Sichtbarkeit, ohne neue Fehlerpfade in kritische Aktionen zu legen.
v2.6.1 – Broadcast stable 02.05.2026

Patch-Release im Anschluss an 2.6.0. Pass E schließt die letzte Lücke des Template-Lock-Konzepts: Step 2 (STP-Modus + MST-Region) wird jetzt sowohl im wizard_state erfasst als auch serverseitig erzwungen – damit ist das Lock-Konzept End-to-End wasserdicht. Zusätzlich wird ein in Phase 4 vergessener Whitelist-Eintrag in der Template-Apply-Pipeline ergänzt: Vorlagen mit stp_mode = mst wirken nun korrekt im Konfigurator (vorher silent verworfen).

Geändert
  • Header-Kommentar in admin/includes/template-apply-server.php aktualisiert – die "Step 2 wird nicht erfasst"-Limitation ist mit Pass E hinfällig.
  • Aktualisierter Phase-1-Kommentar in js/template-apply.js: Die Auswahl ist nicht mehr auf PVST-Varianten begrenzt; MSTP wird jetzt vollständig akzeptiert.
Behoben
  • Pre-Existing-Inkonsistenz aus Phase 4: Der Template-Editor (admin/customer-template-editor.php) bot seit Phase 4 stp_mode = mst als Wert an, aber die Apply-Logik _applyStpGlobalField() in js/template-apply.js verwarf mst silent (Whitelist nur pvst/rapid-pvst). Effekt: Vorlagen mit stp_mode = mst wirkten nicht – das Dropdown blieb auf rapid-pvst, die MST-Region-Karte erschien nicht, der CLI-Output zeigte den falschen Modus. Bei mode: locked besonders verwirrend, weil "locked" Sicherheit suggerierte. Whitelist um mst ergänzt; bei MSTP wird zusätzlich renderStpMstCard(true) gerufen, damit die Region-Karte sofort eingeblendet ist.
Sicherheit
  • Pass E – Lock-Konzept Step 2: _captureStep2() in js/project-edit.js erfasst jetzt ifState.stpGlobal (Modus + MST-Region inkl. user-spezifischer Instances). Server-seitiges Re-Apply in admin/includes/template-apply-server.php erzwingt für Templates mit mode: locked die drei Felder stp_mode, mst_region_name, mst_revision – analog zu Pass A für Step 1/3/4/5. MST-Instances bleiben bewusst außen vor (zu projektspezifisch, analog zu User-VLANs in Step 3).
  • Handler-Guards in onStpGlobalModeChange() und onStpMstRegionChange() (js/interfaces.js) blockieren direkte JS-Aufrufe (Browser-Console etc.), wenn das jeweilige UI-Element durch disabled/readOnly als locked markiert ist. Defense-in-Depth analog zu den security.js-Guards aus Pass B.
  • Restore-Pfad erweitert: _applyStep2State() in js/project-edit.js stellt beim Edit-Aufruf den persistierten stpGlobal-State wieder her, synchronisiert das Dropdown #stp-global-mode und blendet die MST-Karte ein, wenn der Modus mst ist. Defensive Defaults greifen bei Snapshots, die vor 2.6.1 angelegt wurden.
v2.6.0 – Broadcast stable 02.05.2026

Webhooks werden für eingeloggte Benutzer geöffnet (Pass D). Persönliche Webhook-Subscriptions feuern nur bei Aktionen, die der Eigentümer selbst ausgelöst hat (Owner-Scoping); System-Subscriptions des Superadmins bleiben erhalten und sehen weiterhin alle Events. Sicherheits-Events (login.lockout, csrf.violation) bleiben Superadmin-only. Defense-in-Depth durch SSRF-Härtung (DNS-Resolve + IP-Blocklist gegen Loopback, Private, Link-Local, Cloud-Metadata, CGNAT; HTTPS-only via CURLOPT_PROTOCOLS; DNS-Pinning über CURLOPT_RESOLVE), Per-User-Quotas (Subscriptions, Test-Events/Stunde, Lieferungen/Stunde) und ein bewusst zu setzendes Feature-Flag webhook_user_scope_enabled – default aus, damit der Superadmin die Härtung erst in Staging verifizieren kann. Audit-Detail (Payload, Antwort-Body) bleibt Superadmin vorbehalten.

Neu
  • Persönliche Webhooks: Neue Seite Mein Profil → Meine Webhooks (admin/profile-webhooks.php). Eingeloggte User können eigene Empfänger anlegen (Slack, Microsoft Teams, Cisco Webex, Mattermost, Discord, generic JSON), Test-Events auslösen und Subscriptions aktivieren / deaktivieren. Im Modal sind nur user-bound Events (project.*, device.config_saved, firmware.uploaded, bug.*, feature.requested, vault.unlock_failed, template.activated, webhook.test) auswählbar.
  • Owner-Scoping: Spalte webhook_subscription.owner_admin_fk (FK admins.id, ON DELETE CASCADE). NULL = System-Subscription, INT = persönliche Subscription. Migration admin/migrate/webhooks.php mit Self-healing-ALTER für Bestand; setup.php legt die Spalte direkt beim Neuanlegen an.
  • Status-Counter pro Webhook: Pro persönlichem Webhook werden Erfolg / Fehler / Pending der letzten 7 Tage als kleine Badges angezeigt – ohne Payload-Einsicht (Datenschutz). Audit-Details bleiben Superadmin-Sicht.
  • Quota-Card oberhalb der Liste: aktuelle Auslastung der drei Limits (Subscriptions, Test-Versuche / Stunde, Lieferungen / Stunde) pro User.
  • Owner-Spalte im Superadmin-Audit (admin/webhook-deliveries.php) und in der Subscription-Liste (admin/webhooks.php): „System" (blau) vs. <username> (grau, mit Person-Icon) macht System- und User-Webhooks auf einen Blick unterscheidbar.
  • Neues Profil-Dropdown-Item „Meine Webhooks" mit Broadcast-Icon, sichtbar wenn Superadmin oder das Feature-Flag aktiv ist.
Geändert
  • webhook_dispatch($event, $data, ?int $triggeringAdminId = null): neuer optionaler Parameter. System-Subscriptions feuern wie bisher; User-Subscriptions feuern nur bei Match auf den triggernden User. Alle 7 user-bound Aufrufstellen wurden umgestellt (save.php, bugreport.php, featurerequest.php, firmware-upload-finalize.php, template.php 2x, bug-detail.php); System-Aufrufstellen (login-ratelimit.php, functions.php CSRF) bleiben unverändert.
  • webhook_send_test() protokolliert Test-Versuche jetzt in webhook_delivery (state=delivered/failed). Damit erscheinen sie im Audit und werden für die Per-User-Test-Quota gezählt.
  • admin/api/webhooks.php öffnet sich für Nicht-Superadmins, wenn das Feature-Flag aktiv ist; Owner-Filter bei GET / get / update / delete / toggle / test, Quota-Checks bei create / test, Sicherheits-Events bleiben verboten.
Behoben
  • Vor Pass D nutzte webhook_send_test() direkt webhook_deliver_now() ohne Audit-Eintrag – damit waren Test-Versuche im Audit-Log unsichtbar. Jetzt wird der Versuch korrekt protokolliert.
Sicherheit
  • SSRF-Schutz in webhook_url_safety_check(): HTTPS-only, IP-Literale werden gegen die Blocklist (Loopback 127.0.0.0/8 + ::1, Private 10/8 / 172.16/12 / 192.168/16, Link-Local 169.254/16 inkl. 169.254.169.254, CGNAT 100.64/10, IPv6 fe80::/10, etc.) geprüft, Hostnames per gethostbynamel() aufgelöst – ALLE A-Records müssen Public sein, sonst Reject. Optionale Domain-Allowlist via security_settings.webhook_allowed_domains.
  • cURL-Härtung: CURLOPT_PROTOCOLS + CURLOPT_REDIR_PROTOCOLS = HTTPS, CURLOPT_FOLLOWLOCATION bleibt false (Redirects auf interne Hosts ausgeschlossen), CURLOPT_RESOLVE pinnt den Host auf die im Safety-Check ermittelte IP – Schutz gegen DNS-Rebinding-Angriffe.
  • Event-Klassifizierung: Neue Konstante WEBHOOK_EVENT_CLASS markiert login.lockout und csrf.violation als system-only. Der Backend-CRUD-Endpunkt lehnt entsprechende Events für User-Subscriptions mit HTTP 403 ab; der Dispatcher schickt sie ohnehin nur an System-Subscriptions.
  • Quotas in security_settings: webhook_user_max_subscriptions (Default 5), webhook_user_test_per_hour (Default 10), webhook_user_deliveries_per_hour (Default 100). Der Dispatcher droppt User-Lieferungen still, wenn das Stunden-Limit erreicht ist; Test-Versand antwortet mit HTTP 429.
  • Privilege-Escalation-Schutz: Backend setzt owner_admin_fk beim Anlegen ausschließlich aus der Session, niemals aus dem Request-Body. Existence-Oracle-Schutz: fremde Subscription-IDs liefern 404 statt 403, damit kein Status-Code-Leak möglich ist.
  • Feature-Flag webhook_user_scope_enabled (Default aus): Solange nicht durch den Superadmin gesetzt, ist profile-webhooks.php nicht aufrufbar (HTTP 403) und der Profil-Dropdown-Eintrag ausgeblendet. Erlaubt einen kontrollierten Roll-out (z. B. erst in Staging).
v2.5.0 – Lockdown stable 01.05.2026

Härtungs-Release im Anschluss an 2.4.0. Das Template-Lock-Konzept wurde wasserdicht gemacht (Defense-in-Depth, Pass A + B): clientseitige UI-Locks, Handler-Guards gegen direkte JS-Aufrufe und ein serverseitiges Re-Apply in admin/api/save.php, das jeden auf locked gesetzten Vorlagen-Wert beim Speichern erzwingt – auch bei DOM-Manipulation, deaktiviertem JavaScript oder direkten API-Aufrufen mit manipuliertem Body. Sub-Sektionen wie VTP, SVI, Subnetzmasken-CIDR und alle 27 Step-5-Sicherheits-Felder schließen dabei vorher offene Bypass-Pfade. Zusätzlich kommt korrekte Cisco-Hardware-Modellierung für die Linecards C9600-LC-24C (24× 40G default / max. 12× 100G) und C9400-LC-12QC (12× 40G default / max. 4× 100G oder 25G auf Port 9–12) – inklusive klickbarem Speed-Mode-Toggle pro Port-Gruppe direkt im Switch-Panel-SVG.

Neu
  • Per-Port-Group-Speed-Modes für die Linecards C9600-LC-24C und C9400-LC-12QC: jeder toggleable Top-Port bekommt im Switch-Panel ein klickbares Speed-Tab (40G grau, 100G orange, 25G grün). Beim Wechsel auf 100G/25G wird der gepaarte Bottom-Port automatisch mit rotem Diagonal-X markiert und ist nicht mehr selektierbar. Die Render-Pipeline reichert die Port-Group um portOverrides (Map top → {prefix, num, modeId}) und disabledPorts (Set) an; Cisco-konforme Interface-Namen (Hu1/3/0/25 etc.) werden direkt in Tooltips angezeigt.
  • Speed-Mode-Hinweis-Alert oberhalb der Linecard-Slot-Auswahl: erscheint dynamisch, sobald mindestens eine zugewiesene LC speedModes unterstützt; listet betroffene Slots inkl. SKU und Modus-Zusammenfassung („12 Top-Ports 40G/100G").
  • Sidebar-Legende in Schritt 2 mit Farb-Swatches (40G/100G/25G) und Diagonal-X-Symbol für deaktivierte Ports. Sichtbar nur bei aktiven Speed-Mode-Linecards.
  • CLI-Pre-Block für Speed-Mode-Aktivierung: pro non-default Top-Port wird ein interface HundredGigabitEthernet…/enable-Block vor den eigentlichen Port-Konfigurationen emittiert – Cisco-konforme Reihenfolge.
  • CLI-Sub-Header pro Speed-Mode-Bucket: bei Mischbetrieb (z. B. 20× 40G + 4× 100G in derselben Gruppe) bekommt jeder „interface range"-Block einen eigenen Header (Port-Gruppe: D1 – 40G-Block / … – 100G-Block), damit beim Scrollen die Mode-Zuordnung sofort erkennbar ist.
  • Server-Override-Toast: wenn das serverseitige Re-Apply beim Speichern Werte korrigieren musste (lock_overrides in der Save-Response), erhält der Anwender pro betroffenem Gerät einen Warning-Toast mit den zurückgesetzten Feld-Labels (12 s).
  • Auto-Migration für Bestandsprojekte: alte wizard_state-Snapshots ohne portModes werden beim Restore auf den bestandskompatiblen 100G-Modus migriert, neue Geräte starten korrekt im 40G-Default.
Geändert
  • Datenmodell C9600-LC-24C / C9400-LC-12QC korrigiert: vorher als „24× 100G" bzw. „12× 100G" modelliert, was Cisco-physikalisch nicht möglich ist. Jetzt korrekt als „24× 40G default / max. 12× 100G QSFP28" und „12× 40G default / max. 4× 100G oder 25G auf Port 9–12". Bestandsprojekte werden automatisch migriert (siehe added).
  • Linecard-Hilfsfunktionen in switches-data.js ergänzt: lcSpeedToggleablePortsFor(), lcDefaultSpeedModeId(), lcFindSpeedMode(), lcSisterPortFor(), lcInitialPortModes(lc, forceMode?), lcHasSpeedModes().
  • Wizard-Save-Response erweitert um lock_overrides-Map (deviceId → string[]) für die Frontend-Toasts beim Server-Re-Apply.
  • Step 5 Sub-Section-Felder: oninput/onchange-Handler bleiben unverändert in Funktion und Reihenfolge – die neuen Lock-Guards greifen am Anfang jedes Handlers, ohne die bestehende Logik zu berühren.
Behoben
  • Chassis-SVG-Render-Crash bei Linecards mit Speed-Modes: buildChassisPanelSVG(rawModel, effectiveModel) referenzierte fälschlich die nicht definierte Variable model beim Auflösen der Per-Port-Overrides → ReferenceError, der gesamte Chassis-Render brach ab und das Switch-Panel blieb leer (sichtbar bei C9606R + C9600-LC-24C). Auf den korrekt benannten effectiveModel-Parameter umgestellt mit defensivem Array-Check.
  • Umlaute in den User-sichtbaren Texten der Speed-Mode-Hinweisbox, des SVG-Tooltips am Speed-Tab und der beiden Toasts (Disabled-Port-Click und Mode-Wechsel-Blockade) wurden korrigiert (verfuegbar → verfügbar, ueber → über, gruen → grün, laeuft → läuft, ausfuehrliche → ausführliche, fuer → für).
  • Kunden-Dropdown auf der Index-Seite lud bei AJAX-Login (ohne Page-Reload) die Auswahlliste nicht nach – _loadCustomers() hörte nur auf DOMContentLoaded. Jetzt zusätzlich auf das admin-state-changed-Event in session.js registriert.
Sicherheit
  • Server-Side Template-Re-Apply (Defense-in-Depth, Pass A): admin/api/save.php lädt vor dem INSERT pro Gerät die aktive Vorlage und überschreibt im wizard_state alle Felder, die im Template auf mode: locked stehen, mit dem Template-Wert. Schützt gegen DOM-Manipulation, deaktiviertes JavaScript und direkte API-Aufrufe mit manipuliertem Body. Best-effort, nie blockierend – Fehler beim Template-Load werden geschluckt.
  • Vollständige Step-5-Lock-Abdeckung (Pass B): alle 27 Sicherheits-Felder, die der Server kennt, werden jetzt clientseitig sauber gelockt – inkl. der bisher unbedeckten Sub-Sektionen (SSH-Version/-Timeout/-Retries, Console-/VTY-Login + Transport, AAA-Login-Default + Enable-Default, RADIUS-/TACACS-Server-IP + Ports, SNMP-v2c-Community + -Access). 20 neue stabile sec-*-IDs in der HTML-Struktur; 4 Button-Groups (HTTP/HTTPS-Server, AAA-Login-Default, SNMP-Version) bekommen Wrapper-IDs und werden via disabled-Attribut auf allen inneren Buttons gesperrt.
  • Handler-Guards in js/security.js: neuer _secLocked(stateKey)-Helper liest window._secLockedFields (Set über secState-Pfade); jeder der 13 on*-Handler lehnt direkte programmmatische Aufrufe (z. B. über Browser-Console) auf gesperrte Felder ab. AAA-/SNMP-Master-Toggle stellt zusätzlich den Checkbox-Wert wieder her, damit ein toggled UI sofort zurückspringt.
  • VTP-Felder respektieren jetzt Template-Lock: VTP-Modus, -Version, -Domain und -Passwort waren in 2.4.0 zwar visuell als gelockt markiert, aber die Eingabefelder waren weiterhin editierbar – Bypass komplett offen. Jetzt mit echten DOM-Locks und Handler-Guards.
  • SVI-Lock-Enforcement: editSvi() und deleteSvi() haben einen tplLocked-Guard erhalten; in der SVI-Tabelle erscheint statt der Edit-/Delete-Buttons ein Schloss-Icon, damit gelockte SVIs nicht über die UI-Buttons umgegangen werden können.
  • Subnetzmasken-Lock umfasst CIDR-Schwesterfeld: war eine Vorlage auf die Dotted-Notation gelockt, konnte der User per Toggle auf CIDR-Modus wechseln und die Eingabe dort ändern. Jetzt wird das gepaarte CIDR-Prefix-Feld synchron gelockt.
  • Top-Level-Security-Felder respektieren Template-Lock: die obersten Step-5-Toggles (Password-Encryption, AAA-aktiv, AUX-no-exec, MOTD/Login-Banner, SNMP-aktiv) waren bisher gar nicht im Lock-System enthalten. Jetzt vollständig integriert mit visueller Markierung.
v2.4.0 – Webhooks stable 01.05.2026

Großes Sicherheits- und Integrations-Release. Neu: Outbound-Webhooks für Slack, Microsoft Teams, Cisco Webex, Mattermost, Discord und generic JSON, mit zentraler Backend-Verwaltung, Audit-Log, Retry-Cron und human-lesbaren Markdown-Nachrichten. Sicherheitsschicht massiv erweitert: einheitlicher CSRF-Guard mit Soft/Hard-Mode + generischer Security-Audit-Log, Login-Rate-Limiting (Brute-Force-Schutz pro Username und IP-Bucket), Backend-Verwaltung aller Security-Einstellungen mit Tag-Input für Trusted Proxies. UX-Politur im Konfigurator: Wizard-Autosave mit Restore-Banner, Zoom + Pan im Frontpanel-SVG, visuelle Markierung von Vorlagen-Locked/Preset-Feldern, zentrale Toast-API als Ersatz für native alert()-Aufrufe.

Neu
  • Webhooks: Komplett neuer Bereich unter System → Webhooks für Outbound-Integrationen mit externen Systemen. Sechs Target-Types vorbereitet (Slack, Microsoft Teams, Cisco Webex, Mattermost, Discord, generic JSON). Pro Subscription wird festgelegt, welche der 12 vordefinierten Events ausgelöst werden – z.B. project.created, device.config_saved, firmware.uploaded, bug.created, bug.status_changed, feature.requested, login.lockout, csrf.violation, template.activated.
  • Cisco Webex Bot-Integration: Bot-Access-Token + Room-ID konfigurierbar, Room-ID akzeptiert Deep-Link (webexteams://im?space=…), reine UUID oder die Base64-API-Form und konvertiert beim Speichern automatisch. Markdown-formatierte Nachrichten direkt im Webex-Raum.
  • Webhook-Audit-Log (System → Webhook-Audit): Filter nach Empfänger, Event, State und Zeitraum. Detail-Modal mit UUID, HTTP-Status, Antwort-Body und Versuchszähler. Manueller Erneut versuchen-Button für fehlgeschlagene Lieferungen.
  • Cron-Retry-Skript admin/cron/webhook-retry.php (analog zu ssh-purge.php): verarbeitet pending-Lieferungen mit Backoff (1 min / 5 min / 30 min / 6 h / 24 h) und räumt erledigte Einträge älter als 30 Tage auf.
  • Test-Funktion: Vor Aktivierung kann jeder Webhook über einen Test-Button live geprüft werden – Toast meldet HTTP-Status und Empfänger-Antwort.
  • Master-Checkbox „Alle auswählen" im Webhook-Modal mit Counter (X von Y ausgewählt) und HTML-nativem Indeterminate-State bei Teilauswahl.
  • Humanized Payloads: Channel-Renderer (Slack/Teams/Webex/…) übersetzen snake_case-Schlüssel in deutsche Labels und Status-Werte (z. B. in_progress → In Bearbeitung, active → Aktiviert). Display-Name des Admins wird als „Max Mustermann (admin)" angezeigt. Geräte-Listen, Bytes-Größen, SHA-256 und ISO-Timestamps werden kompakt formatiert. Generic-Empfänger erhalten weiter den unveränderten JSON-Envelope.
  • Login-Rate-Limiting: Brute-Force-Schutz auf zwei Achsen – pro Username und pro IP-Bucket (IPv6 mit /64-Granularität). Konfigurierbare Schwellwerte und Sperrdauer; erfolgreicher Login löscht beide Counter. Lockout-Badge in der Benutzerliste mit Sperre aufheben-Button für Superadmins.
  • Sekundäre Pfade gegen Email-Enumeration und Spam: Forgot-Password (5 / 15 min / IP), Reset-Password (10 / 15 min / IP), Register (3 / 24 h / IP).
  • Generischer Security-Audit-Log (System → Security-Audit): vorbereitet für CSRF-Verstöße, Login-Fails, Lockouts, Vault-Unlock-Fails, Rate-Limit-Treffer. Filter nach Event-Type, Severity, Mode, Admin, Endpunkt, IP, Zeitraum. 24h-Statistik-Karten im Header zeigen Soft/Hard-Anteile.
  • Security-Einstellungen im Backend (System → Security-Einstellungen): Sämtliche Login-Rate-Limit-Werte und die TRUSTED_PROXIES-Liste sind nun live anpassbar (Hybrid-Strategie: DB überschreibt config.php-Defaults). Tag-Input für Trusted-Proxy-IPs mit clickbaren Pills und IP-Validierung.
  • Wizard-Autosave: Eingaben werden alle 1,5 s lokal in localStorage gespeichert (TTL 24 h). Beim nächsten Aufruf erscheint ein Wiederherstellen-Banner mit Datum, Modell und Schritt. Status-Pille im Step-Progress zeigt „Entwurf gespeichert vor X s". Multi-Tab-Sync via storage-Event. Cleanup nach erfolgreichem Backend-Save.
  • Zoom + Pan im Frontpanel-SVG: Toolbar oben rechts mit −/Fit/100%/+, Strg+Mausrad für Cursor-Punkt-Zoom, Drag-to-Pan auf Whitespace, Tasten +//0/1. Auto-Fit beim Modell-/Stack-/SVL-Wechsel. Macht große Modelle (C9400, StackWise Virtual mit 2× 480 Ports) erstmals praktikabel bedienbar.
  • Vorlagen-Felder visuell markiert: Locked-Felder im Wizard mit gelb-warmem Hintergrund + Schloss-Icon im Feld + Tooltip „Aus Vorlage „X" – nicht bearbeitbar". Preset-Felder mit dezent blauem linken Rand. Listen-Zeilen (VLAN, SVI) bekommen analoge Wrapper-Markierung.
  • Zentrale Toast-API (js/toast.js): Stack rechts unten, max 5 sichtbar, Pause-on-hover, Dedup über id, Light/Dark-Mode, mobile-responsive, aria-live-Support. Vier Level: success / info / warning / error.
  • Erfolgs-Toasts an Schlüsselstellen: Vorlage angewandt/entfernt, VLAN-/Variablen-Import, Port-Gruppe gelöscht, Geräte-Abschluss im Multi-Device-Workflow, erfolgreicher Backend-Save.
Geändert
  • Navbar-System-Dropdown reorganisiert: Webhooks und Webhook-Audit als eigener Block zwischen Security und Einstellungen. Security-Audit als eigener Block zwischen Vault-Recovery und Einstellungen.
  • CLI-Copy-Buttons in allen sechs Wizard-Schritten nutzen jetzt die zentrale Toast-API statt eigenständiger Bootstrap-Toast-Komponenten. Konsistenter Look, plus sichtbares Feedback bei verweigerter Clipboard-Berechtigung (vorher silent).
  • 23 verstreute alert(...)-Aufrufe in 8 JS-Dateien auf Toast.error/warning/info migriert. Browser-blockierende Modals weg.
  • CSRF-Token-Entropie von 16 auf 32 Byte erhöht.
  • setup.php richtet bei Neuinstallationen automatisch das Security-Schema (security_audit_log, login_lockout, security_settings) und das Webhook-Schema (webhook_subscription, webhook_delivery) mit ein – die einzelnen Migrations-Skripte bleiben für bestehende Installationen erhalten.
Behoben
  • Webhook-Modal war bei vielen Events nicht scrollbar, der Speichern-Button nicht erreichbar – das <form>-Element wurde aus dem .modal-content in das .modal-body verschoben (Bootstrap-Standard-Pattern, form="…"-Attribut auf dem Footer-Button).
  • Webhook-Test an Cisco Webex meldete HTTP 404, weil der Webex-Client einen Deep-Link kopiert, der nicht der API-Form entspricht. Eingaben werden jetzt automatisch in die Base64-API-Form normalisiert.
  • Wizard-Autosave-Restore versteckt jetzt korrekt die Pre-Wizard-Form (#step-0) und blendet Footer/Vorschau-Button ein – analog zu startProject().
  • Panel-Zoom-Toolbar war nach erstem renderSwitchPanel()-Inject nicht mehr sichtbar, weil sie im überschriebenen Container lag. Toolbar in eigenen .switch-panel-host-Wrapper außerhalb von #switch-panel verschoben.
  • Tipp-Zeile unter dem Frontpanel war im Light- wie im Dark-Mode kaum lesbar – Schriftgröße erhöht, Kontrast gestärkt, <kbd>-Tags mit echtem Tasten-Look (Border + inset Box-Shadow).
  • Inkonsistente sessionState-Feldnamen im Wizard-Autosave-Snapshot korrigiert (project statt projectName, currentDevice statt deviceIndex; projectId und customerFk ergänzt).
  • Umlaute in Webhook-Event-Labels korrigiert (Geraete → Geräte, ausgeloest → ausgelöst, geaendert → geändert, Verstoss → Verstoß).
Sicherheit
  • Einheitlicher CSRF-Guard: csrf_verify() in admin/includes/functions.php wurde method-aware (überspringt GET/HEAD/OPTIONS) und um Soft/Hard-Mode erweitert. Im Soft-Mode landen Verstöße im Security-Audit, ohne Funktionen zu brechen – zur Übergangsphase. Im Hard-Mode werden sie mit HTTP 403 abgewiesen.
  • CSRF-Schutz auf 21 JSON-Mutations-Endpunkte (Vault-, SSH-, Template-, Delete-, Logout- und Edit-Queue-API) sowie auf 12 klassische POST-Forms (Login, Change-Password, Users, Customer-Detail, Project-Detail, Bug-Detail, Settings, Customers, Profile, User-Edit, Feature-Detail) ausgeweitet.
  • Frontend-Wrapper admin/js/csrf.js patcht fetch() und XMLHttpRequest global, sodass same-origin POST/PUT/PATCH/DELETE-Requests automatisch den X-CSRF-Token-Header bekommen – keine manuelle Migration der Frontend-Aufrufe nötig.
  • TRUSTED_PROXIES-Liste schützt vor IP-Spoofing über X-Forwarded-For. Sicherer Default: leer = Header nie vertrauen.
  • Security-Header-Pille zeigt im Security-Audit den aktuellen CSRF_ENFORCEMENT_MODE mit 24h-Statistiken (Soft- vs. Hard-Fails).
v2.3.0 – CLI Editor stable 28.04.2026

Großer Ausbau des Inline-CLI-Editors: Autosave mit Restore-Banner, Tipps-Sidebar, Login direkt im Editor, neue Toolbar-Buttons (Verlauf, Suchen, Kommentar, Lint-Navigation, Snippets), Cisco-Autovervollständigung, verwaltete CLI-Snippets mit Backend-Editor, Backend-Badges (SVL/Stack/CLI-Editor), Save-Modal-Politur (Pflichtfelder, Kunden-Dropdown, Auto-Pick) sowie zwei neue Workflows: Konfiguration aus einem bestehenden Projekt heraus hinzufügen und vorhandene Freeform-Configs per schlankem Confirm-Dialog aktualisieren.

Neu
  • Autosave: Jede Editor-Änderung landet im Browser-LocalStorage. Nach versehentlichem Tab-Close erscheint ein Restore-Banner mit Wiederherstellen / Verwerfen. Eine Toolbar-Pill Autosave aktiv macht den Status sichtbar und erlaubt das Abschalten für Shared-Workstations.
  • Tipps-Sidebar: Rechts vom Editor zeigt eine Card die wichtigsten Tastatur-Shortcuts und Konventionen (Tastatur, Speichern, Linter, Konventionen). Sticky-Position; klappt unter lg automatisch unter den Editor.
  • Login direkt im Editor: Login- und Logout-Buttons in der Editor-Toolbar; Anmelden ohne Wechsel auf index.php. Editor-Inhalt und Autosave-Slot bleiben beim Login/Logout erhalten – kein Reload. Login-Modal wurde in admin/_login_modal.php extrahiert (eine gemeinsame Quelle für index.php und editor.php).
  • Toolbar-Buttons: Neue Verlauf-Group (Rückgängig / Wiederholen) und Werkzeuge-Group (Suchen, Kommentar an/aus, nächstes Lint-Problem, Snippet-Picker). Tastatur-Shortcuts Strg+S, Strg+F, Strg+/, F8, Strg+Leertaste sind in der Sidebar dokumentiert.
  • Cisco-Autovervollständigung: Kuratierte Phrasen-Aliasse (conf tconfigure terminal, sh runshow running-config, no shutno shutdown, int g/t/v/p, swi mo a/t, …) plus Wort-Match auf alle Block-Opener und Keyword-Phrases der Cisco-Sprache. Auto-Trigger nur am Zeilen-Anfang; Strg+Leertaste erzwingt das Panel auch in der Mitte.
  • CLI-Snippets: Mehrzeilige Bausteine, die Admins / Superadmins im Backend pflegen (admin/cli-snippets.php). Backend-Editor mit dem gleichen dunklen CodeMirror wie das Frontend; Pflichtfeld- und Optional-Badges. Snippets erscheinen im Editor sowohl im Autocomplete (höchste Priorität) als auch über das Puzzle-Icon der Toolbar (Snippet-Picker mit Suche und Kategorie-Gruppierung). Platzhalter {{hostname}}, {{customer}}, {{project_id}}, {{user}}, {{date}} werden beim Einfügen aus dem Editor-Kontext ersetzt; unbekannte Tokens bleiben als Lückentext.
  • Konfiguration zu bestehendem Projekt hinzufügen: Split-Button-Eintrag Konfiguration im CLI-Editor auf project-detail.php. Der Editor öffnet mit ?add_to=PROJECT_ID, zeigt einen grünen Hinweisbanner mit Projektname und Kunde, sperrt die Projekt-ID im Save-Dialog und ersetzt das volle Save-Modal durch einen schlanken Bestätigungs-Dialog – User klickt nur „Speichern". Server vergibt device_number = max + 1 und zieht total_devices automatisch hoch.
  • Update-Pfad mit Confirm-Dialog: Klick auf das CLI-Editor-Icon einer Geräte-Zeile in project-detail.php öffnet die existierende Freeform-Config. Editor zeigt einen blauen Hinweisbanner („Bearbeitung der Konfiguration …") mit „Zurück zum Projekt"-Link; Speichern-Button öffnet ein Update-Confirm-Modal mit Vorschau aller Werte und der erkannten Hostname-Zeile aus dem CLI.
  • Backend-Badges: Drei farblich unterscheidbare Badges (SVL = warning, Stack = info, CLI-Editor = primary) erscheinen in projects.php (Status-Spalte), project-detail.php (neue Spalte Typ statt Stack) und im Admin-Dashboard (Tab Projekte, neue Spalte Typ). Konsistente Farbsprache über alle Backend-Listen.
  • Backend-Link in der öffentlichen Navbar: partials/public-navbar.php rendert jetzt den Backend-Link mit identischem Verhalten wie auf index.php – sichtbar nur für eingeloggte Admins/Superadmins, öffnet admin/ in neuem Tab. Damit profitieren auch editor.php, guide.php, releases.php und roadmap.php.
  • Berechtigungen & Anleitung: Neue Sektion CLI-Editor in guide.php (Aufruf, Features, Tastatur-Shortcuts-Tabelle, Toolbar-Buttons, Autovervollständigung, Snippets & Platzhalter, Speichern). Zwei neue Tabellen-Sektionen CLI-Editor und CLI-Snippets in admin/help.php mit Berechtigungsmatrix (User / Admin / Superadmin).
  • Release-Tag: Versionsnummer 2.3.0, Codename CLI Editor.
Geändert
  • Save-Modal: Auftragsnummer ist jetzt Pflichtfeld (war fälschlich „optional", obwohl save.php sie verlangt hat). Felder Device-Nummer und Total Devices entfallen – der Server vergibt sie per Auto-Pick (max + 1). Echte Umlaute statt ae/oe/ue.
  • Kunden-Dropdown im Save-Modal: Eingeloggte Benutzer mit zugewiesenen Kunden sehen ein Dropdown analog zur „Neues Staging-Projekt anlegen"-Kachel; Manuell eingeben blendet zusätzlich ein Freitext-Feld ein, ohne den Dropdown auszublenden. Sichtbarer Abstand zwischen den Feldern; Fokus springt nach dem Wechsel auf das Eingabefeld.
  • Backend-Navbar entlastet: CLI-Snippets sind ins Projekte-Dropdown gewandert (zusammen mit Projektübersicht und CLI-Suche). Top-Level-Items von 7 auf 6 reduziert; keine Zwei-Zeilen-Umbrüche mehr.
  • Spalte „Stack" → „Typ" in project-detail.php: passt zu drei möglichen Badge-Typen pro Gerät.
  • Open-Banner im CLI-Editor: zeigt jetzt Hostname, Projektname, Kunde und Device-ID (statt nur „Projekt-ID / Device 1 / 1"); Backlink zur project-detail.php.
Behoben
  • CSP-Konformität auf editor.php: alle Inline-onclick-Attribute durch addEventListener ersetzt. Login/Logout-Buttons funktionieren jetzt unter der strengen script-src 'self'-Policy.
  • Login/Logout dynamisch: nach erfolgreichem Login bzw. Logout aktualisiert sich die Editor-UI ohne Reload (Pill, Buttons, Stager). Robust auch ohne CustomEvent-Pfad durch direkten Funktions-Hook in admin.js.
  • Race-Conditions im Save-Modal: Kunden-Dropdown blieb in einigen Setups verborgen, der preselectCustomer('')-Fallback klappte das Dropdown wieder zu, der Re-Fetch beim Modal-Open klaute den Fokus. Alle drei Fälle behoben.
  • Modal-Überlagerung im add_to-Pfad: Save-Modal und Confirm-Modal erschienen gleichzeitig. Save-Modal-Markup wird im add_to-Modus per PHP-Conditional gar nicht mehr gerendert.
  • Echte Umlaute (ä/ö/ü) statt ae/oe/ue in Tipps-Sidebar, Snippet-Editor und Save-Modal.
v2.2.1 – Spanning Tree stable 23.04.2026

Vollständige Spanning-Tree-Unterstützung im Konfigurator: globaler Modus (PVST+/Rapid PVST+/MSTP), Port-Cost und Port-Priority pro Interface, Root-Rolle und Bridge-Priority pro VLAN sowie eine eigene MST-Region- und Instance-Konfiguration. Cross-Cutting STP-Konsistenzprüfungen im Review-Schritt.

Neu
  • Globaler STP-Modus: Neue Karte Spanning Tree (global) in Schritt 2 mit Dropdown für rapid-pvst (Default), pvst und mst. Der gewählte Modus wird immer explizit als spanning-tree mode … vor die Interface-Blöcke geschrieben, damit die erzeugte Config unabhängig vom IOS-/IOS-XE-Default deterministisch bleibt.
  • Port-Cost und Port-Priority pro Interface: Zusatzfelder in den Downlink- und Uplink-STP-Sektionen. Cost als Number-Input (1–200 000 000, IOS-XE-Long-Format), Priority als Dropdown mit Cisco-Schrittweite 16 (128 (Default) markiert). Leere Werte erzeugen keine CLI-Zeile – IOS-XE berechnet dann selbst aus der Speed.
  • Root-Rolle und Bridge-Priority pro VLAN: Neue Spanning Tree-Subsektion im VLAN-Editor (Schritt 3). Rolle als Dropdown (root primary / root secondary – Cisco-Makro, empfohlen) oder expliziter Priority-Wert (4 096er-Schrittweite). Beides gegenseitig exklusiv; kompaktes Badge an der VLAN-Zeile zeigt den aktuellen Override.
  • MSTP-Vollausbau: Eigene Karte MST – Region & Instances, sichtbar bei mode === mst. Region-Name (bis 32 Zeichen) + Revision (0–65 535), Instance-CRUD-Tabelle mit ID, VLAN-Range (10,20-30-Syntax), Priority-Dropdown und Root-Rolle. Live-Validator flaggt ID-Duplikate und VLAN-Overlap zwischen Instances als Fehler.
  • MST-CLI-Ausgabe: Sauber formatierter spanning-tree mst configuration-Block mit name, revision, instance <id> vlan <range> und exit. Pro-Instance Priority und Root-Rolle (spanning-tree mst <id> priority|root …) außerhalb des Blocks auf Global-Ebene.
  • Template-Integration: STP-Modus (stp_mode) sowie MST-Region-Name und Revision (mst_region_name, mst_revision) als Preset/Locked/Open-Felder im Template-Editor. Port-Profile-Templates tragen zusätzlich Port-Cost und Port-Priority.
  • STP-Konsistenzprüfung im Review: Schritt 6 blendet oberhalb der CLI-Vorschau einen Hinweisblock ein, wenn unschlüssige Kombinationen erkannt werden – z. B. BPDU Guard + Filter gleichzeitig, MSTP aktiv aber keine Instance, oder Root Guard auf einem Uplink, der Richtung Root zeigt.
  • Cisco Best Practice: Alle Priority-Dropdowns sind hart auf die vom IOS erzwungenen Schrittweiten begrenzt (16 bei Port-Priority, 4 096 bei Bridge- und MST-Priority). Typische Referenzwerte (24576 Primary Root Macro, 32768 Default, …) sind im Dropdown beschriftet.
  • Anleitung erweitert: Neuer Abschnitt Spanning Tree (global) im Benutzerhandbuch (guide.php) mit Modus-Wahl, MST-Region/Instance-Erklärung und Priority-Konventionen; Schritt 3 dokumentiert jetzt auch die VLAN-STP-Felder.
v2.2.0 – Global Variables stable 23.04.2026

Globale Variablen im Konfigurator: Platzhalter wie {{hostname}} oder {{mgmt_ip}} lassen sich in Banner-Texten, Port-/Uplink-, SVI- und BGP-Neighbor-Beschreibungen verwenden und werden beim CLI-Build aufgelöst. Projektweite User-Variablen mit Validierung, Persistenz und JSON-Import/Export, Autocomplete beim Tippen von {{, klickbare Chip-Leisten unter jedem unterstützten Feld sowie eine Warnung im Review-Schritt bei ungelösten Platzhaltern.

Neu
  • System-Variablen: Eingebaute Platzhalter {{hostname}}, {{mgmt_ip}}, {{mgmt_vlan}}, {{gateway}} und {{date}} werden beim Build aus dem aktuellen Wizard-State gezogen. Die Rohwerte in den Feldern bleiben erhalten – wird der Hostname später geändert, ziehen alle Verwendungen automatisch nach.
  • Kontext-Variablen: Feldspezifische Platzhalter stehen zusätzlich zur Verfügung – {{port_id}} in Port-/Uplink-Beschreibungen, {{vlan_id}} in SVI-Beschreibungen und {{neighbor_ip}} in BGP-Neighbor-Beschreibungen.
  • Eigene globale Variablen: Neue Karte Globale Variablen in Schritt 1 mit Tabelle zum Anlegen/Entfernen beliebiger Key/Value-Paare. Keys folgen dem Muster [a-z_][a-z0-9_]*, Duplikate und Kollisionen mit System-Variablen werden inline markiert. Werte sind Teil des Projekt-States und werden beim Speichern persistiert.
  • Autocomplete: Beim Tippen von {{ öffnet sich unter dem Feld eine Auswahlliste mit passenden System- und User-Variablen (Teilname filtert, z. B. {{host). Navigation per Arrow/Enter/Tab/Escape, Übernahme auch per Klick.
  • Variablen-Chips: Kleine Chip-Leiste unter jedem unterstützten Feld. Ein Klick fügt den Token an der aktuellen Cursorposition ein; System-Variablen in Grau, eigene in Blau.
  • Import / Export: Die Globals-Liste kann als globals.json heruntergeladen und projektübergreifend wieder eingespielt werden. Der Import validiert jeden Eintrag (Namensregeln, System-Var-Kollisionen, Duplikate) und fragt vor dem Ersetzen der aktuellen Liste nach.
  • Unterstützte Felder: Platzhalter funktionieren in MOTD- und Login-Banner (Schritt 5), Port- und Uplink-Description (Schritt 2) sowie SVI- und BGP-Neighbor-Description (Schritt 4).
  • Review-Warnung: Schritt 6 blendet oberhalb der CLI-Vorschau einen Hinweis ein, sobald in der generierten Konfiguration noch unaufgelöste {{name}}-Tokens vorkommen – inklusive Liste der betroffenen Namen.
  • Hinweisboxen & Anleitung: Neuer Abschnitt Globale Variablen in guide.php mit Syntax, System-Var-Tabelle, drei Einfüge-Wegen, Feldliste und Import/Export-Workflow. Kontext-Hinweise in Banner-, SVI- und BGP-Neighbor-Eingabemasken verlinken direkt dorthin.
  • Release-Tag: Versionsnummer 2.2.0, Codename Global Variables.
Geändert
  • SVI-Beschreibung: Label „(lokal, nicht im CLI)" auf „(optional)" korrigiert, da der Wert sehr wohl als description im CLI landet.
v2.1.4 – Escrow stable 22.04.2026

Force-Wrap-Migration: Der Superadmin kann alle noch an einen stillgelegten Recovery-Key gebundenen Vaults in einem Durchlauf auf einen aktiven Recovery-Key umwrappen – ohne auf die betroffenen User zu warten. Entsiegelung und Neu-Versiegelung laufen ausschließlich im Browser.

Neu
  • Recovery-Wrap migrieren: Neuer Button Migrieren in der Aktions-Spalte für stillgelegte Recovery-Keys mit gebundenen Vaults. Der Superadmin wählt im Modal einen aktiven Ziel-Key und lädt die private Schlüsseldatei des Quell-Keys (plus Passphrase) hoch. Der Browser entsiegelt jedes betroffene recovery_wrapped_privkey-Blob mit dem Quell-Privkey, versiegelt den Vault-Privkey frisch gegen den Ziel-Pubkey und speichert das neue Blob pro User atomar zurück.
  • Live-Fortschritt: Das Migrations-Modal zeigt eine Progressbar und ein Log mit je einer Zeile pro Vault (✓/✗). Fehlgeschlagene Einzelfälle unterbrechen die restliche Migration nicht.
  • Helper + APIs: vault_force_wrap_preview() / vault_force_wrap_save() plus die beiden Endpoints admin/api/vault/recovery-key/force-wrap-preview.php (Liste der betroffenen Vaults inkl. Quell-Blobs) und force-wrap-save.php (schreibt den neuen Wrap pro User, optimistic lock auf die bestehende Quell-Bindung). Audit pro Erfolg: action=rotate, target=user_id, Detail recovery-wrap force-migrate from=A to=B.
Sicherheit
  • Der Force-Wrap ist bewusst nur für stillgelegte Quell-Keys freigeschaltet – nicht gegen aktive Keys. Aktive Keys bleiben während der Migration produktiv; nur der Zielkey ist aktiv. Privkeys existieren während der Operation ausschließlich flüchtig im Superadmin-Browser und werden nach jedem Vault sofort per scrub() überschrieben.
v2.1.3 – Escrow stable 22.04.2026

Prävention und Aufräumen rund um stillgelegte Recovery-Keys: Warnung beim Stilllegen, wenn noch Vaults gebunden sind; proaktiver User-Alert, sobald ein Vault an einen nicht mehr aktuellen Recovery-Key gebunden ist; neuer Superadmin-Vorgang „Als verloren markieren“ räumt tote Recovery-Wraps auf, wenn die private Schlüsseldatei dauerhaft weg ist.

Neu
  • Warnung beim Stilllegen: Wer einen Recovery-Key stilllegt, an den noch Vaults gebunden sind, sieht jetzt im Dialog einen auffälligen gelben Block mit der Anzahl der betroffenen Vaults und zwei konkreten Handlungsempfehlungen (private Schlüsseldatei offline sichern oder betroffene User zur Rotation bitten). Stilllegen bleibt weiter ungefährlich; der Warnblock sensibilisiert für den Folgefall.
  • User-Alert „Wrap veraltet“: Sobald im Profil gilt recovery.key_id !== recovery.active_key_id, erscheint in der Credential-Vault-Kachel ein gelber Hinweis-Alert mit Handlungsaufforderung (Passphrase rotieren oder Recovery-Wrap aktualisieren). Ergänzt den bestehenden V6c-Button und macht die Lage für Nicht-Eingeweihte verständlich.
  • Als verloren markieren (Superadmin): Neuer Endpoint admin/api/vault/recovery-key/mark-lost.php und Button im Vault-Recovery-UI für stillgelegte Keys mit gebundenen Vaults. Setzt bei allen betroffenen Admins recovery_wrapped_privkey und recovery_key_fk auf NULL (atomar per Transaktion) und protokolliert jeden Fall als eigenständiges Audit-Event (Aktion delete mit target=User, Detail recovery-wrap lost-key=…). Die eigentlichen Credentials im Vault bleiben unberührt, weil sie am Passphrase-Wrap hängen, nicht am Recovery-Wrap.
Geändert
  • Aktions-Spalte der Recovery-Liste: Stillgelegte Keys mit noch gebundenen Vaults zeigen jetzt den Gebunden (N)-Badge gemeinsam mit dem neuen Als verloren markieren-Button. Stillgelegte Keys ohne Bindung bleiben wie gewohnt direkt löschbar.
v2.1.2 – Escrow stable 22.04.2026

Pflege-Patch rund um die Recovery-Schlüssel: Stillgelegte Keys ohne gebundenen Vault lassen sich jetzt endgültig löschen, die Übersicht bekommt einen Aktive / Stillgelegte / Alle-Filter, und der Stilllegen-Dialog erklärt die Lösch-Voraussetzungen transparent.

Neu
  • Recovery-Key löschen: Auf der Seite Vault-Recovery erscheint für stillgelegte Keys ein roter Löschen-Button – aber ausschließlich, wenn kein admin_vault_key mehr auf diesen Key wrappt. Neuer Superadmin-Endpunkt admin/api/vault/recovery-key/delete.php mit zwei Wachen (retired_at IS NOT NULL & admin_count == 0); Verstöße liefern 404/409 mit klarer reason (not-retired, vaults-bound, not-found). Der Vorgang wird unter Aktion delete im Vault-Audit-Log festgehalten.
  • Filter-Toggle: Neue Button-Group Aktive / Stillgelegte / Alle im Header der Recovery-Key-Karte. Die Auswahl wird pro Browser in localStorage gemerkt, sodass sich der Superadmin nicht bei jedem Seitenaufruf neu auf seinen bevorzugten Blick umstellen muss.
Geändert
  • Stilllegen-Dialog: Erklärt jetzt, dass ein stillgelegter Key später gelöscht werden kann – aber nur, wenn kein Vault mehr daran hängt. Nimmt Unklarheit aus der Frage „was passiert, wenn ich einen Key loswerden will“.
  • Aktions-Spalte: Bei stillgelegten Keys mit noch gebundenen Vaults steht statt des Buttons ein deutlich erkennbarer Gebunden-Hinweis mit Anzahl der offenen Vault-Wraps im Tooltip; der Löschen-Button erscheint erst, wenn die Zahl auf 0 fällt.
v2.1.1 – Escrow stable 22.04.2026

Passphrase-Recovery für den Credential-Vault: Benutzer, die ihre Vault-Passphrase vergessen, können mit Hilfe eines Superadmin-gestützten Escrow-Verfahrens wieder Zugriff auf ihre gespeicherten Credentials erhalten. Der private Recovery-Schlüssel bleibt offline beim Superadmin, alle kryptografischen Schritte laufen im Browser, und der Vault wird beim Abmelden jetzt automatisch gesperrt.

Neu
  • Vault-Recovery (Escrow): Neue Superadmin-Seite Vault-Recovery (Systemmenü → Vault-Block) zum Anlegen, Anzeigen und Stilllegen von Recovery-Schlüsseln. Der öffentliche Teil wird im Backend registriert, der private Gegenpart wird ausschließlich im Browser erzeugt, mit einer eigenen Datei-Passphrase versiegelt und einmalig als JSON-Datei zum Download angeboten; er verlässt den Server nie.
  • Recovery-Wrap beim Vault-Setup & Rotate: Beim Einrichten oder Rotieren der Vault-Passphrase wird – sofern ein aktiver Recovery-Schlüssel existiert – eine zusätzliche versiegelte Kopie des Vault-Privkeys mit dem Recovery-Pubkey (crypto_box_seal) abgelegt. Bestehende Vaults ohne Wrap können den Wrap per Recovery-Wrap hinzufügen nachziehen, ohne die Passphrase zu ändern.
  • Recovery anfordern (Button im Profil): Benutzer, die ihre Passphrase vergessen haben, stellen einen Antrag mit 7 Tagen Gültigkeit. Der Superadmin sieht offene Anfragen auf der Vault-Recovery-Seite und gewährt sie mit seiner privaten Recovery-Schlüsseldatei – Browser-seitig: Datei entsiegeln, Vault-Privkey freischalten, Einmal-Token erzeugen, Vault-Privkey mit dem aus dem Token abgeleiteten KEK neu versiegeln.
  • Einmal-Token einlösen: Der Antragsteller bekommt den Token über einen zweiten Kanal, tippt ihn im Profil ein und vergibt eine neue Vault-Passphrase. Der Browser entsiegelt den Vault-Privkey mit dem Token, erzeugt eine neue Passphrase-Versiegelung und aktualisiert den Eintrag – alle Freigaben und Credentials bleiben zugänglich, weil der öffentliche Vault-Key unverändert bleibt. Grant-Gültigkeit: 15 Minuten.
  • Vault-Audit-Erweiterungen: Neue Aktionen recovery-request, recovery-grant, recovery-complete dokumentieren den gesamten Ablauf (inkl. fehlgeschlagener Einlöse-Versuche). Rate-Limits begrenzen Anfragen (3/24 h), Grants (10/24 h) und Einlöse-Versuche (10/15 min).
  • DB-Schema: Neue Tabelle vault_recovery_request (Request-Lebenszyklus pending → granted → completed/expired/cancelled) samt Token-Hash, versiegeltem Vault-Privkey, Wrap-Nonce und KDF-Salt. Migration via admin/migrate/vault-v6.php; Frisch-Installationen legen alles automatisch über setup.php an.
Geändert
  • Profil-Layout: Die Hilfe-Kachel „Was machen die Buttons?" steht jetzt unterhalb der Credential-Vault-Kachel statt daneben – die Seite wird nicht mehr unnötig hoch, und die Buttons bleiben sichtbar.
  • System-Navigation: Neuer Eintrag Vault-Recovery im Vault-Block des Admin-Dropdowns; nur für Superadmins sichtbar. Vault-Audit und Vault-Recovery liegen gebündelt zwischen SSH- und allgemeinen Einstellungen.
Behoben
  • Auto-Lock bei Logout und Session-Expiry: Der entschlüsselte Vault-Privkey wurde bisher im localStorage weitergelebt, bis das 15-min-Idle-Timeout ablief – auch nach einem expliziten Abmelden. Jetzt räumt der Logout-Flow (Backend-Abmelden, Frontend-AJAX-Logout) den Vault-State sofort weg; zusätzlich sperrt der API-Wrapper den Vault, sobald ein Server-Aufruf mit HTTP 401 antwortet. Relevant vor allem für geteilte Rechner.
  • Stale Recovery-Requests: Eine granted-Anfrage mit abgelaufenem 15-min-Grant-Fenster blockierte das Anlegen einer neuen Anfrage und zeigte dauerhaft den „Token liegt bereit“-Alert an. Abgelaufene pending/granted-Zeilen werden jetzt automatisch auf expired geflippt, sobald Profil oder Superadmin-Liste sie berührt.
v2.1.0 – Vault stable 21.04.2026

Credential-Vault: Gespeicherte SSH-Credentials lassen sich im Live-SSH-Terminal direkt auswählen, nach einer manuellen Verbindung auf Wunsch in den Vault übernehmen und mit anderen Benutzern teilen. Verschlüsselung und Entschlüsselung erfolgen browser-seitig, sodass Zugangsdaten die Webanwendung niemals im Klartext erreichen.

Neu
  • Credential-Vault: Neuer Bereich Profil → Credential-Vault zum Einrichten, Entsperren, Passphrase-Rotation und Zurücksetzen. Eine eigene Vault-Passphrase pro Benutzer schaltet das persönliche Credential-Repository frei.
  • SSH-Credentials-Verwaltung: Neuer Navigationseintrag SSH-Credentials mit Liste, Suche, Anlegen, Bearbeiten und Löschen. Jeder Eintrag kapselt Name, Host, Port, Zielbenutzer, Auth-Typ und das zugehörige Secret.
  • „Aus Vault“ als vierter Auth-Typ in der Live-SSH-Terminal-Kachel: Credential auswählen, Host/Port/User werden automatisch vorbefüllt, mit Verbinden startet die Sitzung.
  • Teilen & Freigaben: Eigene Credentials lassen sich mit Kolleginnen und Kollegen teilen, die ebenfalls einen Vault eingerichtet haben. Freigaben sind jederzeit einzeln entziehbar; der Überblick aller Berechtigten steht im Dialog Freigaben verwalten.
  • Auto-Store nach manueller Verbindung: Nach erfolgreichem Login per Passwort oder SSH-Key bietet das Terminal einen Banner „Soll dieses Credential als Vault-Eintrag gespeichert werden?“. Ein Klick reicht, um den Eintrag zu übernehmen – ohne Daten erneut einzugeben.
  • Vault-Audit: Eigene Tabelle ssh_vault_audit protokolliert die Aktionen setup, unlock/unlock-failed, rotate, reset, create, update, delete, use, share, revoke. Superadmins sehen das komplette Log, Benutzer sehen ihre eigenen Events.
  • Session-Handling: Der entsperrte Vault-Status bleibt 15 Minuten aktiv und verlängert sich pro Vault-Aktion automatisch. Tab-Schluss, Logout und manuelles Sperren räumen den Zustand sofort auf.
  • Rollen: Die Vault-Funktionen stehen für User, Admin und Superadmin gleichermaßen bereit. Superadmins behalten zusätzlich den Vollzugriff auf das Audit-Log aller Benutzer.
  • Benutzerführung: Hilfe im Backend und Guide im Frontend erklären den Vault-Flow. Passphrase-Stärkeanzeige (Zxcvbn) und Eye-Toggles in allen relevanten Modalen erleichtern die Eingabe.
  • Release-Tag: Versionsnummer 2.1.0, Codename Vault.
Geändert
  • Live-SSH-Terminal-Kachel: Reagiert jetzt live auf Login/Logout im selben Tab – die Kachel erscheint/verschwindet sofort, ohne dass die Seite neu geladen werden muss.
Behoben
  • Diverse Kleinigkeiten bei Dark-Mode-Kontrasten und Sichtbarkeit der Vault-Elemente in der SSH-Kachel.
v2.0.0 – Shell stable 20.04.2026

Major-Release: Live-SSH-Terminal im Browser. Admins und Superadmins öffnen eine Kachel auf der Startseite, wählen Host/Port/User und eine von drei Authentifizierungsarten (Passwort, Keyboard-Interactive, SSH-Key-Upload inkl. PPKv2) und erhalten ein vollwertiges Terminal-Fenster im neuen Tab. Credentials verlassen den Browser ausschließlich per WSS und werden nicht an die Webanwendung weitergereicht.

Neu
  • Live-SSH-Terminal: Neue Kachel auf der Startseite (nur Admin/Superadmin) öffnet ein vollwertiges Browser-Terminal in einem neuen Tab. Auto-Resize, Ereignislog, sauberes Trennen beim Tab-Schluss.
  • Drei Auth-Modi: Passwort, Keyboard-Interactive (Modal-Dialog für Prompts, inkl. TACACS/MFA-Mehrrunden) und Public-Key-Upload in PEM/OpenSSH/PPKv2-Format mit optionaler Passphrase. Credentials gehen direkt per WSS an den Broker und werden nicht von der Webanwendung gesehen.
  • Cisco-kompatible Algorithmen: Default-Algorithmen decken C9200/C9300 und Legacy-IOS ab (u. a. ssh-rsa, dh-group14-sha1 verfügbar); pro Installation überschreibbar.
  • Einmal-Tokens: 30-Sekunden-TTL zwischen Klick auf „Verbinden" und Terminal-Aufruf. Replay-Versuche scheitern deterministisch.
  • Audit-Log: Jede Session mit Start, Dauer, Bytes in/out, Disconnect-Grund, Browser-IP und SSH-Host-Key-Fingerprint. Admin-Ansicht SSH-Audit mit Filter nach Admin, Host, Auth-Typ und Zeitraum sowie Detail-Modal.
  • Concurrency-Limits & Retention: Parallele Sessions je Admin und global, Idle-/Max-Session-Timeouts und Retention-Tage editierbar unter SSH-Einstellungen. Abgelaufene Artefakte werden automatisch bereinigt.
  • Blocklist: CIDRs (Default: Loopback, Link-local, Multicast) und Hostname-Patterns unter SSH-Blocklist. DNS-Rebinding-Schutz: alle aufgelösten Adressen werden vor dem Connect gegen die CIDR-Liste geprüft; die Verbindung erfolgt anschließend auf der IP-Literal, eine zweite abweichende DNS-Antwort kann nicht mehr dazwischen­grätschen.
  • TOFU-Host-Keys: Bei der ersten Verbindung Modal „Neuer Host-Key – Vertrauen?" mit SHA-256-Fingerprint. Spätere Verbindungen verifizieren stumm. Fingerprint-Wechsel bricht die Session hart ab; Superadmin akzeptiert oder lehnt unter SSH-Host-Keys ab.
v1.6.1 – Compact stable 17.04.2026

Switch-Katalog für Catalyst 9200/9200L/9200CX überarbeitet: C9200L als stackbar korrigiert (StackWise-80), modulare C9200 mit NM-Steckplatz wie C9300/C9350 modelliert, PoE-Budgets an aktuelles Cisco-Datenblatt angepasst, neue SKUs (PB, PXG, PL, 4G-Uplink-Varianten) aufgenommen und Catalyst 9200CX Compact Series (fanless) komplett aufgenommen.

Neu
  • Catalyst 9200CX Compact Series: Alle fünf aktuellen SKUs (C9200CX-12T-2X2G, C9200CX-12P-2X2G, C9200CX-8P-2X2G, C9200CX-8UXG-2X, C9200CX-8PT-2G) mit Frontpanel-Rendering, PoE-Budgets bis 240 W und fixen Uplinks aufgenommen. Eigene Serie C9200CX inklusive Dropdown-Gruppe und Serie-Farbcode; nicht stapelbar, kein NM-Steckplatz.
  • Switch-Katalog: Neue C9200-SKUs C9200-24PB, C9200-48PB (Full PoE+ mit Enhanced VRF), C9200-24PXG, C9200-48PXG (mGig-PoE+) sowie 4G-Uplink-Varianten, Partial-PoE (C9200L-48PL-4G/-4X), Data-Only-L-Varianten (C9200L-24T-4G/-4X, -48T-4G/-4X) und mGig-L-Varianten (C9200L-24PXG-4X, C9200L-48PXG-4X).
  • NM-Katalog: C9200-Uplink-Module C9200-NM-4G, C9200-NM-4X, C9200-NM-2Q, C9200-NM-2Y aufgenommen; modulare C9200 bieten jetzt eine Auswahl-UI für den Network-Module-Slot analog zu C9300/C9350 (Default: C9200-NM-4X).
  • StackWise-80 als neue Stack-Technologie (bis 8 Member) für Catalyst 9200L ergänzt.
Geändert
  • Modulare Catalyst-9200-Modelle (C9200-24T/P, -48T/P, -PB, -PXG) werden jetzt mit NM-Steckplatz statt fester 4× 1G SFP-Uplinks modelliert – damit lässt sich das bestückte Network-Module (1G SFP, 10G SFP+, 40G QSFP+, 25G SFP28) pro Switch konfigurieren.
  • Schritt 2 – Switch-Auswahl umgebaut: statt eines einzelnen langen Dropdowns gibt es jetzt eine Zwei-Stufen-Auswahl (Dropdown Serie → Dropdown Modell). Die Serien sind nach logischen Kategorien gruppiert (Access – Compact, Access – Entry, Access – Advanced, Core / Distribution, Modulare Chassis). Zusätzlich neues Such-Modal (Button „Suche") für Freitext-Suche über alle SKUs und Bezeichnungen.
  • Edit-Flow, Reset und State-Restore auf neuen Wrapper applySelectedModel(sku) umgestellt, der Serien- und Modell-Dropdown synchron setzt. Bestehende gespeicherte Projekte bleiben unverändert kompatibel (keine Datenmigration nötig, nur SKU wird persistiert).
  • Guide: Hinweis zu StackWise-80 für C9200L, zum neuen Auswahl-UI für den C9200-NM-Steckplatz und zur neuen Zwei-Stufen-Modellauswahl mit Suche ergänzt.
Behoben
  • Catalyst 9200L ist laut Cisco-Datenblatt mittels optionalem C9200L-STACK-KIT (StackWise-80, 80 Gbps Ring) bis zu 8 Member stapelbar – der Katalog markierte die L-Serie bisher fälschlich als nicht stapelbar. Alle C9200L-Einträge liefern nun stackable: true, stack: StackWise-80.
  • PoE-Budgets der C9200/C9200L an die aktuellen Cisco-Werte angeglichen (C9200-24P / C9200L-24P-4X: 370 W, C9200-48P / C9200L-48P-4X: 740 W).
v1.6.0 – Editable stable 17.04.2026

Projekt-Bearbeitung: Bestehende Projekte lassen sich jetzt direkt aus dem Admin-Backend heraus im Konfigurator öffnen, im Wizard editieren und als Update zurückspeichern. Dazu persistenter Wizard-State pro Gerät, Update-Modal mit Projekt-Metadaten, robuster Edit-Init gegen unerwartete Restore-Fehler sowie Aktualisierungs-Zeitstempel und Stack-/SVL-Badges in der Projektübersicht.

Neu
  • Projekt-Bearbeitung: Neuer Button „Projekt bearbeiten" (gelb) in der project-detail.php öffnet den Konfigurator mit ?edit=<project_id>. Der Wizard wird mit allen gespeicherten Daten aus Schritt 1–5 vorbelegt, Step 0 (Landing) wird übersprungen.
  • Edit-Mode-Banner am Kopf des Konfigurators zeigt Projektname und Projekt-ID mit „Bearbeitung beenden"-Link zurück zum Projekt-Detail. Footer-Badge State v1 signalisiert die aktive Wizard-State-Version.
  • Wizard-State-Snapshot pro Gerät: Alle fünf Schritte (Grunddaten, Interfaces inkl. Stack/SVL, VLANs, Routing, Security) werden beim Speichern als strukturiertes JSON (wizard_state-Spalte in device_configs) persistiert und beim nächsten Edit vollständig restauriert.
  • Update-Bestätigungs-Modal zeigt Projekt-ID, ursprüngliches Erstelldatum und Gerätezahl. Erst nach Bestätigung schickt der Konfigurator den Save mit mode=update an das Backend.
  • Save-API: Neuer Modus update mit Permission-Check (Admin immer, User nur bei project_users-Zuordnung), Orphan-Cleanup für umbenannte Dateien (inkl. per-Chassis-SVL-Dateien) und explizitem UPDATE staging_projects.updated_at, damit der Zeitstempel den letzten Edit widerspiegelt.
  • Load-API: Neuer Endpunkt admin/api/load-project.php liefert Projekt-Metadaten und Device-Configs inkl. wizard_state und stack_metadata mit Berechtigungsprüfung.
  • Projekt-Detail: Neue Zeile „Aktualisiert" im Projektinfo-Panel, sichtbar sobald das Projekt mindestens einmal über den Edit-Flow aktualisiert wurde (Toleranz 2 s gegen Erstsave-Drift).
  • Projekt-Übersicht: Kompakte Labels „SVL" und „Stack" unterhalb von Kunde/Projekt, sobald ein Gerät des Projekts eine entsprechende Konfiguration enthält. Aggregation per Batch-Query, keine N+1-Last.
  • DB-Schema: Neue Spalte wizard_state (TEXT NULL) auf device_configs, idempotent per setup.php und Migrations-Endpoint admin/migrate/wizard-state.php angelegt. save.php besitzt ein Self-Heal-Fallback, das die Spalte bei Bedarf automatisch nachzieht.
Behoben
  • Edit-Modus bricht nicht mehr ab, wenn ein einzelner Restore-Schritt (z.B. Modell-Selektor, Chassis, Stack, SVL) intern eine Exception wirft: Jede Unter-Operation in _applyStep2State ist in ein eigenes try/catch gekapselt, der goToStep(1)-Aufruf läuft immer – die Seite bleibt nie leer.
  • Edit-Modus für Legacy-Projekte (gespeichert vor 1.6.0, ohne wizard_state): Der Hostname wird aus device_configs.hostname als Fallback vorbelegt, und ein Info-Banner erklärt, dass die restlichen Felder manuell zu ergänzen sind.
v1.5.0 – Virtual stable 16.04.2026

Vollständige StackWise Virtual-Unterstützung für C9500, C9600 und C9400 (SUP-1XL+): zweistufiger Bootstrap + Fusion, horizontale Zwei-Chassis-Frontansicht, Multi-File-Download mit getrennten Chassis-Configs und tiefe Admin-Backend-Integration mit SVL-Badge und per-Chassis Downloads.

Neu
  • StackWise Virtual (SVL): Neue Konfigurations-Card in Schritt 2 erscheint automatisch für SVL-fähige Modelle (C9500, C9600, C9400 mit SUP-1XL/1XL-Y/2XL, C9610). Zwei Chassis-Karten (Active/Standby) mit Priority, Bootstrap-Hostname und optionaler OOB-IP. Domain ID 1–255, DAD-Methode als Radio (Fast Hello / ePAgP / BFD).
  • SVL Port-Picker: Interaktive Auswahl der SVL-Link- und DAD-Ports aus allen 10G+-Ports des Modells. Bei Chassis-Modellen gruppiert nach Linecard-Slot mit aufklappbarem <details>-Akkordeon. Nur eine Gruppe gleichzeitig offen, Open-State bleibt bei Port-Toggle erhalten. Reservierte Ports sind für Port-Gruppen gesperrt und farblich markiert.
  • SVL CLI-Generator erzeugt nach Cisco Best Practice: Phase 1 Bootstrap (pro Chassis getrennt, mit switch N provision, stackwise-virtual domain, SVL-Link- und DAD-Interfaces), Phase 2 Reload-Anleitung als Kommentar, Phase 3 Post-SVL Unified Config. SVL-Abschnitt erscheint in Schritt 2 und Schritt 6 in der CLI-Vorschau.
  • SVL Validator mit 12 Regeln in drei Schweregraden (Error/Warning/Info): Cross-Platform-Mix, C9400-SUP-Check, SVL-Links vorhanden, Domain-ID-Range, SVL-/DAD-Port-Überlappung, Min. SVL-Link-Anzahl, Rolle-vs-Priority-Konflikt, identische Bootstrap-IPs sowie Hinweise zur Reload-Reihenfolge und Management-VRF.
  • SVL Horizontale Frontansicht: Zwei Chassis nebeneinander mit Rollen-Label-Streifen (grün/gelb), Connector-Block mit Domain-Badge, SVL-Link-Indikator (blau durchgehend) und DAD-Link-Indikator (gelb gestrichelt). Funktioniert sowohl für Fixed-Modelle (C9500) als auch für modulare Chassis (C9400/C9600/C9610).
  • SVL Review-Card in Schritt 6 und im Full-Config-Modal mit Domain-Badge, Active/Standby-Kacheln, SVL-Links, DAD-Methode und Hinweis auf zwei Konfigurationsdateien.
  • SVL Multi-File-Download: Neuer Button „SVL-ZIP (2 Chassis)" in Schritt 6 erzeugt einen ZIP-Download mit zwei separaten Chassis-Configs. Jede Datei enthält Phase 1 Bootstrap (chassis-spezifisch), Phase 2 Reload-Anleitung und Phase 3 Unified Config (in beiden Dateien identisch, damit jede eigenständig nutzbar ist).
  • Admin-Backend: SVL-Badge in der Gerätetabelle des Projekt-Details (SVL · Domain N · 2× SKU, gelb) mit Tooltip-Details. Info-Banner unter der CLI-Vorschau weist auf die Zwei-Chassis-Struktur hin. Per-Chassis-Dateien (C1/C2-Buttons) stehen direkt zum Download bereit.
  • SVL-Metadaten werden als JSON mit Type-Discriminator in der bestehenden stack_metadata-Spalte gespeichert (keine DB-Migration nötig). Per-Chassis-Konfigurationen werden als separate .txt-Dateien im Projektverzeichnis abgelegt und über den bestehenden Download-Endpoint mit neuem chassis-Parameter ausgeliefert.
  • Schritt 2 CLI-Vorschau zeigt jetzt auch SVL- und StackWise-CLI direkt an (nicht mehr nur in Schritt 6 / Gesamt-Config), sodass der Techniker live sieht, welche Interfaces für SVL-Links und DAD reserviert sind.
Behoben
  • C9500-Modelle (C9500-16X/-40X/-24Y4C/-48Y4C/-32C) im Switch-Katalog trugen den falschen stack-String und erkannten SVL nicht. Jetzt korrekt auf StackWise Virtual gesetzt.
  • SVL-Metadaten-Validation in save.php akzeptierte nur StackWise-Metadaten (enabled + size). SVL-Metadaten mit type:'svl' + domainId wurden still verworfen und kamen nie in der DB an. Validation erweitert um beide Formen.
  • SVL-Port-IDs bei Chassis-Modellen wurden als rohe IDs wie s5-c-1 in der CLI ausgegeben statt als korrekte Cisco-Interface-Namen wie HundredGigE1/5/0/1. _resolvePortNames() nutzt jetzt Longest-Prefix-Match.
  • Schritt 2: CLI-Vorschau leerte sich beim Modellwechsel nicht, sodass alte Port-Gruppen mit falschen Interface-Namen stehenblieben. refreshIfaceCLI() wird jetzt auch in onModelChange() aufgerufen.
v1.4.1 – Labeled stable 15.04.2026

Port-Channel-Markierung im Frontpanel-SVG umgestellt: Statt einer Klammer über alle Member bekommt jetzt jeder Member-Port individuell ein Po<N>-Overlay direkt auf seinem Stecker-Slot.

Behoben
  • Schritt 2 Frontpanel: Die bisherige Klammer über die Member-Ports eines Port-Channels suggerierte bei nicht-zusammenhängenden LAGs (z. B. Ports 11, 18, 28, 31) fälschlich, dass auch die dazwischenliegenden Ports dazugehören. Jeder Member-Port bekommt jetzt ein eigenes Po<N>-Text-Overlay zentriert auf dem dunklen Stecker-Slot. Die Port-Nummer bleibt am unteren Rand sichtbar, sodass sowohl die logische LAG-Zuordnung als auch die physische Port-Nummer klar erkennbar sind. Font-Size skaliert automatisch mit der Label-Länge (Po1–Po9 = 6 pt, Po10–Po99 = 5,6 pt, Po100+ = 4,8 pt), damit auch hohe Po-Nummern in die Port-Breite passen.
v1.4.0 – Bundled stable 15.04.2026

Port-Channels (LACP) sind jetzt auch für Downlink-Gruppen verfügbar – mit gemeinsamer UI-Card, scope-spezifischen Best-Practice-Defaults, vollständiger Cisco-CLI für Access- und Trunk-LAGs, einem neuen Validator mit neun Regeln sowie Po-Badges in der Gruppen-Liste und sichtbaren Klammern über den Member-Ports im Frontpanel.

Neu
  • Schritt 2: Port-Channels (LACP) lassen sich jetzt auf jeder Port-Gruppe mit mindestens zwei Membern aktivieren – unabhängig vom Scope. Bisher war das Feature auf Uplinks beschränkt.
  • Schritt 2: Scope-spezifische Best-Practice-Defaults beim Aktivieren eines LAGs. Uplinks starten mit LACP-Mode active (symmetrisch zum Core), Downlinks mit passive (Server-LAG mit LACP-Initiator auf der Serverseite).
  • Schritt 2: Automatische Vergabe der kleinsten freien Port-Channel-Nummer (1–256) beim Aktivieren eines LAGs. Manuelles Überschreiben bleibt möglich.
  • Schritt 2: CLI-Generator emittiert bei Access-LAGs jetzt Voice-VLAN, PortFast, BPDU Guard, BPDU Filter, Root Guard, Storm Control, DHCP-Snooping-Rate-Limit und Port-Security auf dem Port-channel-Interface. Bei Trunk-LAGs wird PortFast korrekt als spanning-tree portfast edge trunk ausgegeben. PoE bleibt bewusst auf den Member-Interfaces, weil Cisco PoE pro Port und nicht per LAG konfiguriert.
  • Schritt 2: Neuer Port-Channel-Validator prüft live neun Cisco-Regeln in drei Schweregraden – Po-Nummer-Duplikate, Mindest-Member-Anzahl, Mixed Speed / Port-Type, 8-Member-Limit, PortFast-auf-Trunk, BPDU Guard auf Downlink-Trunk, statischer on-Modus und Scope-abhängige LACP-Empfehlung.
  • Schritt 2: Sichtbare LAG-Markierung. Die Gruppen-Liste zeigt rechts vom Gruppen-Namen ein blaues Badge Po<N> mit LACP-Mode als Tooltip, und das Frontpanel-SVG zeichnet eine dünne Klammer über die Member-Ports mit der Port-Channel-Nummer direkt darüber.
Geändert
  • Interner Refactor: Das bisherige Uplink-Port-Channel-Singleton in ifState.uplinkChannel wurde zu einer scope-agnostischen Map ifState.portChannels[groupId]. Jede Port-Gruppe kann damit ihren eigenen Port-Channel haben, und das bestehende Uplink-Verhalten bleibt unverändert – nur die Datenstruktur dahinter ist einheitlich.
v1.3.5 – Consistent stable 15.04.2026

Schritt-übergreifende Zustandskonsistenz: Ports lassen sich im Gruppen-Bearbeitungsmodus jetzt sauber hinzufügen und entfernen, und VLANs aus SVIs in Schritt 4 werden automatisch in den VLAN-Katalog von Schritt 3 übernommen.

Neu
  • Schritt 3: VLANs, die in Schritt 4 als SVI-Ziel angegeben werden, werden beim Wechsel automatisch im VLAN-Katalog angelegt – mit transliterierter ASCII-Namensableitung aus der SVI-Beschreibung (Umlaute ä/ö/ü/ß werden sauber zu ae/oe/ue/ss) oder Fallback svi<N>.
  • Schritt 4: Neuer Live-Hint im SVI-Editor zeigt beim Tippen der VLAN-ID sofort, ob sie bereits im Schritt-3-Katalog existiert oder beim Wechsel automatisch angelegt wird.
  • Schritt 4: Neues Split-Dropdown „Aus bestehendem VLAN" neben „SVI hinzufügen". Listet alle VLANs aus Schritt 3, zu denen noch kein SVI existiert, und legt mit einem Klick einen SVI-Stub mit dem VLAN-Namen als Startbeschreibung an.
Behoben
  • Schritt 2: Ports lassen sich jetzt wieder korrekt aus einer Port-Gruppe im Bearbeitungsmodus entfernen. Plain-Klick und Strg+Klick wirken als Toggle (hinzufügen/entfernen), Shift+Klick bleibt Range-Add – und die Gruppe spiegelt die Auswahl nach jeder Aktion exakt wider.
  • Schritt-Navigation: Die automatischen VLAN-Syncs (Management, Port-Gruppen, SVIs) laufen jetzt bei jeder Navigation in die Schritte 3 bis 6 und nicht nur beim Betreten von Schritt 3. Damit tauchen auch in Schritt 4 angelegte SVI-VLANs bei einem direkten Vorwärts-Wechsel nach Schritt 5 oder 6 korrekt in der generierten CLI auf.
v1.3.4 – Validated stable 14.04.2026

Der StackWise-Konfigurator warnt jetzt live vor Best-Practice-Verletzungen und Cisco-Inkompatibilitäten in Mixed-Stacks. Dazu einige kleine Darstellungsfixes.

Neu
  • Mixed-Stack-Validator: Die StackWise-Card zeigt jetzt live Warnungen unterhalb der Member-Tabelle. Sieben Regeln nach Cisco Best Practice mit drei Schweregraden (Error, Warning, Info) prüfen Serien-Kompatibilität, Rollen-Konsistenz, Priority-Duplikate, Rolle-vs-Priority-Konflikte, Uplink-Typ-Mismatch, gemischte PoE-Bestückung und heterogene Port-Dichte im Stack.
Geändert
  • StackWise-Validator: Die Warnung Unterschiedliche Port-Anzahl wurde neu formuliert. Statt sperrigem „Member haben 24..48 Downlink-Ports" steht jetzt „Der Stack enthält Modelle mit 24 und 48 Downlink-Ports. Die Port-Nummern 25–48 existieren nur auf den größeren Membern".
Behoben
  • Release Notes: Der release_render()-Sanitizer ergänzt fehlende Schluss-Tags automatisch. Ein einzelner vergessener Tag kann damit nicht mehr die komplette Seite zerschießen. Zusätzlich wurde das 1.3.3-Summary auf Plain-Text umformuliert, nachdem ein unausbalanciertes <code> die Darstellung gebrochen hatte.
  • Gesamte-Konfiguration-Modal: Zwischen der StackWise-Übersicht und dem dunklen CLI-Block fehlte der untere Abstand. Wrapper um pb-3 ergänzt.
  • Admin-Projekt-Detail: Die Projekt-Info-Card trug h-100, wodurch sie bei zwei gestapelten Karten in der linken Spalte die zweite Card (Zugeordnete Benutzer) aus dem Row-Container drückte und den Footer überlappte.
v1.3.3 – Persistent stable 14.04.2026

Gespeicherte Projekte behalten jetzt den StackWise-Zustand als strukturierte Metadaten, sichtbar im Admin-Backend. Release Notes unterstützen zudem eine minimale Inline-Markup-Allowlist für Inline-Code, Betonung und Hervorhebung.

Neu
  • Admin-Backend: Neue Spalte „Stack" in der Gerätetabelle des Projekt-Details. Kompaktes Badge 4× C9300-48P bzw. 4× Mixed mit Tooltip, der die komplette Member-Aufstellung (Rolle, Priority, SKU) und den stack-mac-persistent-Status zeigt.
  • Datenpersistenz: Beim Speichern eines Projekts wird pro Gerät ein strukturierter StackWise-Snapshot (stack_metadata, JSON) in der DB abgelegt – Technologie, Größe, Member-Liste, Basis-SKU. Mixed-Stacks werden anhand unterschiedlicher Member-SKUs erkannt.
  • Release Notes: Minimale Inline-Markup-Allowlist für <code>, <strong> und <em> in Summary- und Bullet-Texten. HTML-Entities wie &lt;sku&gt; werden korrekt durchgereicht. XSS-Schutz bleibt vollständig erhalten – alle anderen Tags und Attribute werden weiterhin escaped.
  • Admin-Backend: Neuer Migrations-Endpoint admin/migrate/stack-metadata.php für Superadmins (idempotent), um die stack_metadata-Spalte proaktiv anzulegen.
Behoben
  • save.php enthält jetzt ein Self-Healing-Fallback, das die stack_metadata-Spalte beim ersten Projekt-Save automatisch nachzieht. Bestehende Deployments müssen setup.php nicht mehr manuell aufrufen, bevor Stacks gespeichert werden können.
v1.3.2 – Templated stable 14.04.2026

Kundenvorlagen können jetzt StackWise-Defaults vorgeben, und die Step-6-Konfigurationsübersicht hebt aktive Stacks mit einer eigenen Übersichts-Card hervor.

Neu
  • Kundenvorlagen: Neue Card „StackWise-Defaults" im Tab Interfaces. Drei Felder (Stack vorbelegen, Anzahl Member, stack-mac persistent) im vertrauten Offen / Vorgabe / Gesperrt-Schema. Beim Wechsel auf ein stapelbares Modell im Konfigurator werden die Defaults automatisch angewandt – gesperrte Felder lassen sich im Panel nicht mehr ändern. Bei nicht-stapelbaren Modellen werden die Defaults ignoriert.
  • Schritt 6: Über der CLI-Vorschau erscheint bei aktivem Stack eine kompakte StackWise-Übersichts-Card mit Badges für Member-Anzahl, Technologie, Mixed-Stack-Warnung und stack-mac-persistent, Bestückungszeile (z. B. „4× C9300-48P"), farbigen Kacheln für Active- und Standby-Member sowie ausklappbarer Gesamt-Tabelle. Wird auch im „Gesamte Konfiguration"-Modal angezeigt.
v1.3.1 – Quality of Life stable 14.04.2026

Kleinere Verbesserungen an Bedienung und Dark Mode sowie automatische Übernahme der in Schritt 2 referenzierten VLANs in den VLAN-Katalog von Schritt 3.

Neu
  • Schritt 3: VLANs aus den Port-Gruppen (Access-VLAN, Voice-VLAN, Trunk-Native, parsebare Trunk-Allowed-Liste) werden beim Wechsel von Schritt 2 automatisch im VLAN-Katalog angelegt. Ranges werden expandiert und auf 256 IDs pro Gruppe begrenzt, VLAN 1 sowie reservierte 1002–1005 bleiben ausgespart. Änderungen in Schritt 2 werden beim nächsten Wechsel sauber nachgezogen.
Behoben
  • Dark Mode: Die Buttons „Dotted-Decimal" und „CIDR-Präfix" in Schritt 1 zeigen den aktiven Zustand jetzt wieder deutlich erkennbar.
  • Dark Mode: Die Member-Nummerierung in der StackWise-Tabelle ist jetzt lesbar hervorgehoben.
  • Schritt 2: Bei Modellen mit NM-Steckplatz wird das vorausgewählte Standard-Modul jetzt sofort in der Uplink-Zeile des Specs-Panels angezeigt – vorher erst nach einem manuellen NM-Wechsel.
  • Schritt 2: Der Button für neue Uplink-Gruppen ist deaktiviert, solange bei NM-Modellen kein Netzwerk-Modul bestückt ist. Beim Wechsel zurück auf „Kein Modul" werden zudem bestehende Uplink-Gruppen entfernt, damit keine ungültigen Port-Referenzen übrig bleiben.
v1.3.0 – Stacked stable 14.04.2026

StackWise-Unterstützung im Konfigurator: stapelbare Catalyst-Modelle lassen sich jetzt als physischer Stack mit 2–8 Membern, vertikaler Frontansicht und Cisco-Best-Practice-CLI konfigurieren.

Neu
  • StackWise-Panel in Schritt 2: erscheint automatisch für stapelbare Modelle (C9200, C9300, C9300X, C9350), liest Technologie (StackWise-160 / -480 / -1T) und maximale Member-Anzahl direkt aus dem Switch-Katalog.
  • Member-Tabelle mit Rolle (Active / Standby / Member), Priority (1–15), SKU und Provision-Flag pro Member. Mixed-Stacks mit unterschiedlichen SKUs der gleichen Serie werden unterstützt.
  • Vordefinierte Best-Practice-Vorlagen (2-Node, 4-Node, 8-Node) setzen Member-Anzahl, Rollen und Priorities per Klick.
  • Vertikale Stapelansicht im Frontpanel: ein Chassis pro Member mit farbigem Rollen-Streifen (Active = grün, Standby = gelb), SKU- und Priority-Label sowie StackWise-Kabelindikator zwischen den Membern.
  • Eigener CLI-Abschnitt „Schritt 1b: StackWise" in der Zusammenfassung: erzeugt switch N provision <sku>, switch N priority und stack-mac persistent timer 0 nach Cisco Best Practice. Renumber-Kommandos werden bewusst nur als Kommentar ausgegeben.
  • Port-IDs und Slot-Präfixe werden automatisch member-aware umgeschrieben (GigabitEthernet1/0/1, GigabitEthernet2/0/1, …) – Port-Gruppen, Ranges und LACP funktionieren stack-weit ohne Zusatzschritte.
Geändert
  • Anleitung (guide.php): Schritt 2 um zwei neue Unterabschnitte „StackWise-Konfiguration" und „StackWise – Frontansicht & CLI" erweitert, inklusive Hinweis auf den bewusst ausgeklammerten Sonderfall StackWise Virtual.
v1.2.3 – Toggle stable 14.04.2026

Superadmins können das Feedback-Menü und die Einreichung neuer Bug-Reports / Feature Requests nun einzeln deaktivieren. Zusätzlich Feinschliff am Backend-Dashboard und ein vollständiger inhaltlicher Abgleich der Anleitung mit dem Konfigurator.

Neu
  • Feedback-Toggle: Drei unabhängige Schalter in den Backend-Einstellungen („Einstellungen" → „Feedback-Anzeige") steuern, ob das kombinierte Feedback-Menü sichtbar ist und ob neue Bug-Reports bzw. Feature Requests eingereicht werden dürfen. Bestehende Einträge bleiben in jedem Fall vollständig zugänglich – nur Neueinreichungen werden unterbunden. Die Sperre wird sowohl client-seitig (FAB / Modals werden nicht gerendert) als auch server-seitig (HTTP 403 in den API-Endpoints) durchgesetzt, sodass auch direkte API-Aufrufe geblockt werden.
Geändert
  • Dashboard: Tab-Leiste visuell aufgeräumt – die Tabs überlappen nicht mehr mit dem Inhaltsbereich, die Aktions-Buttons (CLI-Suche, Alle Projekte etc.) wandern in die Tab-Nav rechts und wechseln dynamisch beim Tab-Switch. Doppelte Untertitel („Zuletzt geänderte …") entfallen, weil der Tab-Name den Kontext bereits liefert. Tab-Reihenfolge: Projekte → Konfigurationen → Bugs → Feature Requests, passend zur thematischen Gruppierung der KPI-Cards oben.
  • Anleitung (guide.php): Inhaltlich vollständig mit dem tatsächlichen Konfigurator abgeglichen. Reihenfolge von Schritt 2 (Interfaces) und Schritt 3 (VLANs) korrigiert, „Projekt anlegen" mit echten Pflichtfeldern aktualisiert, Schritt 1 um Management VLAN ID und Subnetzmaske ergänzt, Schritt 5 komplett neu nach den sechs Sicherheits-Sektionen (Passwörter & Dienste, Benutzer, Lines, AAA, Banner, SNMP) gegliedert, Schritt 4 um OSPF / EIGRP / BGP erweitert, Schritt 6 um Kopieren / Download / ZIP-Export-Buttons aktualisiert.
v1.2.2 – Polish stable 14.04.2026

Visueller Feinschliff: aufgeräumte Navbars im Konfigurator und auf den öffentlichen Sub-Pages, schlankerer Wizard-Stepper und ein gemeinsames Navbar-Partial als zentrale Quelle der Wahrheit.

Geändert
  • Konfigurator-Navbar: Komplett überarbeitet auf das Bootstrap-Nav-Pattern – Anleitung, Roadmap und Release Notes zu einem Info-Dropdown zusammengefasst, Theme-Toggle und Admin-Lock-Button auf einheitliche Bootstrap-Klassen umgestellt, integriertes „Login/admin/user"-Label im Lock-Button, Version-Badge rechts in der Button-Leiste. Die funktionslose „Bereit"-Anzeige sowie der Vorschau-Button sind aus der Navbar entfernt. Der Vorschau-Button ist in den Schritt-Inhalt umgezogen.
  • Public-Pages-Navbars: guide.php, releases.php und roadmap.php nutzen jetzt ein gemeinsames Partial (partials/public-navbar.php) mit identischem Brand, Info-Dropdown und Aktiv-Markierung. Brand-Text auf „Staging" verkürzt, Version-Badge auf allen Sub-Pages verfügbar.
  • Wizard-Stepper: Schwere Card-Hülle entfernt und durch einen schlanken Streifen mit Trennlinie ersetzt. Step-Indikatoren kompakter (28 px statt 36 px), Vorschau-Button in den Flex-Flow integriert. Mobile-Layout passt jetzt bis ~360 px Bildschirmbreite ohne Umbruch.
v1.2.1 – Feedback stable 13.04.2026

Feinschliff des Feedback-Releases: Roadmap-Verlinkung an allen relevanten Stellen, kombinierter Feedback-FAB auch im Admin-Backend und überarbeitetes Dashboard mit KPI-Gruppen und Tab-Navigation.

Geändert
  • Roadmap: Öffentliche Roadmap nun auch aus dem Konfigurator, den Release Notes, der Feature-Request-Detailansicht und der Admin-Übersicht verlinkt.
  • Admin-Backend: Alter Bug-Report-FAB durch den kombinierten „Feedback"-FAB ersetzt – Bug melden und Feature vorschlagen sind jetzt backendseitig identisch zum Frontend erreichbar.
  • Dashboard: Komplett überarbeitet – vier thematische KPI-Gruppen (Kerndaten, Feedback, Uploads, System), tab-basierte Aktivitätsliste (Projekte, Bugs, Feature Requests, Konfigurationen) mit Badge-Counts, Zeitbereichs-Filter und Aufmerksamkeits-Banner bei kritischen Schwellwerten.
v1.2.0 – Feedback stable 13.04.2026

Neues Feature-Request-System inklusive öffentlicher Roadmap, Upvote-Mechanismus und kombiniertem Feedback-Menü im Frontend – adaptiert aus dem bestehenden Bug-Report-Workflow.

Neu
  • Feature Requests: Nutzer können über ein neues Frontend-Modal Feature-Wünsche einreichen. Jeder Request erhält eine eindeutige ID im Format FR-XXXXX.
  • Fünf Status-Labels für Feature Requests: Offen, Geplant, In Umsetzung, Erledigt und Wird nicht umgesetzt.
  • Kombiniertes "Feedback"-Menü (Floating Action Button) im Frontend, das die beiden Aktionen "Bug melden" und "Feature vorschlagen" bündelt – inklusive Mobile-Variante, Outside-Click-Close und Esc-Handling.
  • Upvote-Mechanismus in der öffentlichen Read-only-Ansicht eines Feature Requests. Mehrfach-Votes werden über einen SHA-256-Voter-Hash (IP + User-Agent + App-Secret) verhindert – ohne Speicherung von Roh-IPs (DSGVO-konform).
  • Öffentliche Roadmap-Seite (roadmap.php) im Kanban-Layout mit drei Spalten: Geplant, In Umsetzung und Erledigt. Einträge sind nach Votes absteigend sortiert und verlinken direkt in die Detail-Ansicht.
  • Admin-Backend: neue Übersichtsseite mit Such-, Label-, Bereichs- und Sortierfilter (u. a. nach Votes) sowie vollständige Detailansicht mit Label-Buttons, Titel- und Beschreibungs-Editoren, Metadaten-Card, Benutzerzuweisung, Kommentar-Timeline und Löschen-Modal.
  • Metadaten pro Feature Request: Priorität (Niedrig / Mittel / Hoch), Bereich (Konfigurator, Admin-Backend, Anleitung, Allgemein), Ziel-Release und Auslieferungsrelease – Release-Dropdowns werden automatisch aus releases.php befüllt.
  • Admin-Navigation: neues "Feedback"-Dropdown für Admins (Bug Reports + Feature Requests) sowie zusätzlicher Menüpunkt im Superadmin-System-Dropdown.
  • Bedingter Menüpunkt "Features" für die User-Rolle, sobald dem Benutzer mindestens ein Feature Request zugeordnet ist – analog zur bestehenden Bug-Report-Logik.
  • Öffentlicher POST-Endpoint admin/api/featurerequest.php zum Einreichen neuer Requests inklusive Validierung, User-Prefill, Public-Token-Erzeugung und automatischer Schema-Migration (Postgres und MySQL).
  • Automatische Historie: Status-, Titel-, Beschreibungs- und Metadaten-Änderungen erzeugen System-Kommentare in der Timeline – identisch zum bestehenden Bug-Report-Verhalten.
Geändert
  • Dokumentation: guide.php um einen neuen Abschnitt "Feedback & Verbesserungsvorschläge" erweitert, der das kombinierte Feedback-Menü, den Bug-Report-Flow, den neuen Feature-Request-Flow (inklusive Upvotes und Release-Bezug) sowie die öffentliche Roadmap erklärt. Die Sidebar- und Navbar-Navigation wurde um Einträge für Feedback und Roadmap ergänzt.
  • Dokumentation: admin/help.php neu strukturiert – die bisherige Bug-Reports-Sektion wurde zu einem kombinierten "Feedback"-Block ausgebaut, der zusätzlich die Rechte rund um Feature Requests (einreichen, anzeigen, kommentieren, upvoten, verwalten) auflistet. Die Rollenbeschreibungen für User und Admin wurden entsprechend ergänzt.
v1.1.5 – Port Profiles stable
Neu
  • Port Profiles: Hinzufügen, ändern und löschen von Port Profilen im Konfigurator und in den Vorlagen im Backend.
Geändert
  • Dokumentation: Ausführliche Erklärung des Port-Gruppen-Modells und der Port-Profile in Vorlagen hinzugefügt.
Behoben
  • UI: Diverse Darstellungen korrigiert und übersichtlicher gestaltet.
v1.0.0 – Initial Release stable 12.04.2026

Erste öffentliche Version des Cisco Switch Config Generators mit vollständigem Konfigurations-Workflow, Admin-Backend und zentraler Versionierung.

Neu
  • Sechsstufiger Konfigurations-Workflow (Grundeinstellungen, VLANs, Interfaces, Routing, Sicherheit, Überprüfung).
  • Projekt- und Kundenverwaltung im Admin-Backend.
  • Template-System für wiederverwendbare Konfigurationen.
  • Export der generierten IOS-Konfiguration als Text und ZIP.
  • Dark-Mode mit cookiebasierter Persistenz (Frontend ↔ Admin synchronisiert).
  • Bug-Report-Modal mit automatischer Erfassung der aktuellen Seite.
  • Zentrale Versionierung via admin/includes/version.php (Single Source of Truth).
  • Release-Notes-Seite releases.php im Layout der Anleitung (guide.php).
Geändert
  • Datei "anleitung.php" umbenannt in "guide.php" zur Vereinheitlichung der Seitennamen.
Versionsschema

Die Versionsnummer besteht aus drei durch Punkte getrennten Zahlen: MAJOR.MINOR.PATCH.

  • MAJOR – Inkompatible Änderungen, z. B. am Datenbankschema oder am Template-Format.
  • MINOR – Neue Funktionen, die abwärtskompatibel sind (z. B. neuer Konfig-Schritt, neues Switch-Modell).
  • PATCH – Bugfixes und kleinere UI-Anpassungen ohne Funktionsänderung.
  • Pre-Release-Suffix – Optionale Kennzeichnung für Vorabversionen, z. B. 1.5.0-beta.1 oder 1.5.0-rc.2.