DHCP: Subnetze deaktivierbar + 47 verifizierte Standard-Optionen
1. Subnetze koennen einzeln deaktiviert werden (enabled-Spalte), ohne sie loeschen zu muessen -- werden dann bei "In Datei schreiben" und "Aktivieren & (neu) starten" komplett uebersprungen. Bewusst nicht als "ungueltig" gewertet (kein Fehler/keine Warnung), da eine deaktivierte Zeile absichtlich kein echtes Netz braucht. Toggle-Button in der Subnetz-Tabelle, deaktivierte Zeilen abgeblendet mit "Deaktiviert"-Pill. 2. 47 kuratierte Standard-DHCP-Optionen vorbefuellt (analog den "Predefined Options" eines Windows-DHCP-Servers) -- Router/DNS-Server/ Domain-Name/Lease-Zeiten ausgenommen, dafuer gibt es bereits eigene Felder. Alle Namen live gegen eine echte Kea-2.4.1-Instanz verifiziert: jede der 49 Kandidaten-Optionen einzeln per kea-dhcp4 -t getestet, 47 akzeptiert (2 falsch geratene Namen verworfen: nis-domain-name statt nis-domain, nisplus-domain statt nisplus-domain-name). Wichtig fuer Kea-Kompatibilitaet: Standard-Optionen bekommen KEIN eigenes option-def in der generierten Konfiguration (neue is_standard- Spalte in dhcp_option_defs) -- Kea kennt sie bereits nativ, eine Neudefinition haette die eingebaute dupliziert. Nur echte eigene/ herstellerspezifische Options bekommen weiterhin ein option-def. Live verifiziert: option-def bleibt bei gesetztem Standard-Options-Wert leer, option-data enthaelt den Wert korrekt, kea-dhcp4 -t besteht, echter Dienstneustart mit der Config erfolgreich. Einmalige Migration (Guard wie bei den anderen Schema-Migrationen) -- ein vom Admin bewusst geloeschter Standard-Eintrag wird nach einem Neustart nicht stillschweigend wieder angelegt. Ausserdem in dieser Session zuvor gefixt (siehe vorherige Commits): der falsche Kea-Schluessel lease-file->name, der jeden Dienststart blockierte, sowie der 'Jetzt pruefen'-Button, der den Topbar-Countdown nur auf dem Dashboard aktualisierte.
This commit is contained in:
@@ -113,13 +113,15 @@
|
||||
<tbody>
|
||||
{% for s in subnets %}
|
||||
{% set st = subnet_status.get(s.id) %}
|
||||
<tr>
|
||||
<tr {% if not s.enabled %}style="opacity:.55;"{% endif %}>
|
||||
<td class="mono">{{ s.interface }}</td>
|
||||
<td class="mono">{{ s.range_start }} – {{ s.range_end }}</td>
|
||||
<td class="mono text-faint">{{ s.gateway or '(automatisch)' }}</td>
|
||||
<td class="mono text-faint">{{ s.dns or '—' }}</td>
|
||||
<td>
|
||||
{% if st and st.ok %}
|
||||
{% if not s.enabled %}
|
||||
<span class="pill disabled">Deaktiviert</span>
|
||||
{% elif st and st.ok %}
|
||||
<span class="pill online">Erkannt</span>
|
||||
<span class="mono text-faint" style="font-size:11.5px;">{{ st.network }}</span>
|
||||
{% else %}
|
||||
@@ -130,6 +132,16 @@
|
||||
<td>
|
||||
{% if can_edit %}
|
||||
<div class="flex gap-2">
|
||||
<form method="post">
|
||||
<input type="hidden" name="toggle_dhcp_subnet" value="{{ s.id }}">
|
||||
<button type="submit" class="icon-btn" title="{{ 'Deaktivieren' if s.enabled else 'Aktivieren' }}">
|
||||
{% if s.enabled %}
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M4.9 4.9l14.2 14.2"/></svg>
|
||||
{% else %}
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>
|
||||
{% endif %}
|
||||
</button>
|
||||
</form>
|
||||
<button type="button" class="icon-btn" title="Bearbeiten" data-open-modal="editSubnetModal{{ loop.index }}">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4z"/></svg>
|
||||
</button>
|
||||
@@ -156,8 +168,11 @@
|
||||
<div class="card card-pad" style="grid-column:1 / -1;">
|
||||
<div class="section-head" style="margin-bottom:16px;">
|
||||
<div>
|
||||
<h2 style="font-size:16px;">Eigene DHCP-Options</h2>
|
||||
<div class="hint">Herstellerspezifische Options, global oder pro Client überschreibbar.</div>
|
||||
<h2 style="font-size:16px;">DHCP-Options</h2>
|
||||
<div class="hint">
|
||||
Standard-Optionen (analog den "Predefined Options" eines Windows-DHCP-Servers) sind bereits vorbefüllt,
|
||||
eigene/herstellerspezifische Options lassen sich zusätzlich anlegen — beide global oder pro Client überschreibbar.
|
||||
</div>
|
||||
</div>
|
||||
{% if can_edit %}
|
||||
<button type="button" class="btn btn-primary" data-open-modal="addOptionModal">
|
||||
@@ -171,13 +186,20 @@
|
||||
<div class="table-wrap">
|
||||
<div style="overflow-x:auto;">
|
||||
<table class="data-table">
|
||||
<thead><tr><th>Code</th><th>Name</th><th>Typ</th><th>Beschreibung</th><th>Globaler Wert</th><th style="width:1%;">Aktionen</th></tr></thead>
|
||||
<thead><tr><th>Code</th><th>Name</th><th>Typ</th><th>Herkunft</th><th>Beschreibung</th><th>Globaler Wert</th><th style="width:1%;">Aktionen</th></tr></thead>
|
||||
<tbody>
|
||||
{% for d in option_defs %}
|
||||
<tr>
|
||||
<td class="mono">{{ d.code }}</td>
|
||||
<td class="mono">{{ d.name }}</td>
|
||||
<td>{{ d.type }}</td>
|
||||
<td>
|
||||
{% if d.is_standard %}
|
||||
<span class="pill" style="background:var(--muted-dim); color:var(--text-faint);">Standard</span>
|
||||
{% else %}
|
||||
<span class="pill user">Eigen</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-faint" style="font-size:12px;">{{ d.description or '—' }}</td>
|
||||
<td>
|
||||
{% if can_edit %}
|
||||
|
||||
Reference in New Issue
Block a user