{% extends "base.html" %} {% set active_page = "settings_dhcp" %} {% set can_edit = current_user.has_permission('settings_dhcp.edit') %} {% block page_title %}DHCP{% endblock %} {% block page_sub %}
Reservierungen und eigene Options aus den Client-Stammdaten (Kea DHCP)
{% endblock %} {% block content %} {% import "_hint_icon.html" as hi %}

DHCP-Server-Status

Installation/Dienststeuerung nur über die Buttons unten.
{% if status.installed %}
Installiert {% if status.active is sameas true %} Dienst aktiv {% elif status.active is sameas false %} Dienst inaktiv {% else %} Dienst-Status unbekannt {% endif %} {% if not can_edit and status.enabled is sameas true %}Autostart an{% endif %}
{% if status.version %}
{{ status.version }}
{% endif %} {% if can_edit %}
Autostart beim Hochfahren des Hosts
{% if status.active is sameas true %}
{% endif %}
{% endif %} {% else %} Nicht installiert

Kein kea-dhcp4 auf diesem Host gefunden.

{% if can_edit %}
{% endif %} {% endif %}

Globale DHCP-Einstellungen

Gelten für den gesamten Dienst, unabhängig von den Subnetzen unten.
{% if can_edit %}
{% else %}

Für Änderungen fehlt das Recht „DHCP ändern“.

{% endif %}

Subnetze {{ hi.hint_icon("Ein Host kann mehrere IPs/Interfaces mit jeweils eigenem Netz bedienen — je Subnetz eigene Range, optional eigenes Gateway/DNS. Subnet/Netzmaske werden live vom Interface übernommen, nicht manuell gepflegt.", "Subnetze") }}

{% if can_edit %} {% endif %}
{% if subnets %}
{% for s in subnets %} {% set st = subnet_status.get(s.id) %} {% endfor %}
InterfaceRangeGatewayDNSErkanntes NetzAktionen
{{ s.interface }} {{ s.range_start }} – {{ s.range_end }} {{ s.gateway or '(automatisch)' }} {{ s.dns or '—' }} {% if not s.enabled %} Deaktiviert {% elif st and st.ok %} Erkannt {{ st.network }} {% else %} Nicht erkannt {% if st %}{{ st.error }}{% endif %} {% endif %} {% if can_edit %}
{% endif %}
{% else %}

Noch kein Subnetz konfiguriert — der Dienst kann so nicht gestartet werden.

{% endif %}

DHCP-Options {{ hi.hint_icon('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.', "DHCP-Options") }}

{% if can_edit %} {% endif %}
{% set visible_option_defs = option_defs|rejectattr("is_standard")|list + option_defs|selectattr("is_standard")|selectattr("id", "in", option_values.keys()|list)|list %} {% if visible_option_defs %}
{% for d in visible_option_defs|sort(attribute="code") %} {% endfor %}
CodeNameTypHerkunftBeschreibungGlobaler WertAktionen
{{ d.code }} {{ d.name }} {{ d.type }} {% if d.is_standard %} Standard {% else %} Eigen {% endif %} {{ d.description or '—' }} {% if can_edit %}
Standard-Option zurücksetzen {{ hi.hint_icon("Leeren Wert speichern, um eine Standard-Option wieder auszublenden.", "Standard-Option zurücksetzen") }}
{% else %} {{ option_values.get(d.id, {}).get('', '—') }} {% endif %}
{% if can_edit and not d.is_standard %}
{% elif d.is_standard %} {% endif %}
{% else %}

Noch keine Options in Verwendung.

{% endif %} {% if can_edit %} {% set unused_standard_defs = option_defs|selectattr("is_standard")|rejectattr("id", "in", option_values.keys()|list)|sort(attribute="code")|list %} {% if unused_standard_defs %}
{% endif %} {% endif %}

Aktive Leases {{ hi.hint_icon("Direkt aus Kea gelesen (nicht aus den Reservierungen) — zeigt auch Clients OHNE eigene Reservierung, die sich einfach eine freie IP aus dem Pool genommen haben.", "Aktive Leases") }}

{% if leases is none %}

Keine Lease-Datei gefunden — der Dienst wurde vermutlich noch nie gestartet oder hat noch keine Adresse vergeben.

{% elif leases %}
{% if can_edit %}{% endif %} {% for l in leases %} {% if can_edit %} {% endif %} {% endfor %}
IP-AdresseMACHostnameLäuft abStatusAktionen
{{ l.ip }} {{ l.mac }} {{ l.hostname or '—' }} {% if l.expires_at %} {{ l.expires_at }} UTC
{% else %} — {% endif %}
{% if l.reserved %} Reserviert {% else %} ⚠ Ohne Reservierung {% endif %}
{% else %}

Aktuell keine aktiven Leases vergeben.

{% endif %}

Reservierungen aus den Clients

{{ reservations|length }} aktive{{ ' Clients' if reservations|length != 1 else 'r Client' }} mit gültiger MAC + IP in einem der konfigurierten Subnetze. {% if skipped_count %}{{ skipped_count }} aktive{{ ' Clients' if skipped_count != 1 else 'r Client' }} ohne MAC/IP übersprungen.{% endif %} {% if out_of_subnet_count %}{{ out_of_subnet_count }} aktive{{ ' Clients außerhalb' if out_of_subnet_count != 1 else 'r Client außerhalb' }} aller konfigurierten Subnetze übersprungen.{% endif %}
{% if can_edit %}
{% endif %}
{% if reservations %}
{% for r in reservations %} {% endfor %}
HostnameMACIP-AdresseNameQuelleSubnetzOptionenAktionen
{{ r.hostname }} {{ r.mac }} {{ r.ip }} {{ r.name }} {% if r.source == 'manual' %} Manuell {% else %} Auto (Client) {% endif %} {{ r.subnet_label }} {% for d in option_defs %} {% set override = option_values.get(d.id, {}).get(r.mac) %} {% set global_val = option_values.get(d.id, {}).get('') %} {% if override %} {{ d.name }} (eigen) {% elif global_val %} {{ d.name }} (global) {% endif %} {% endfor %}
{% if option_defs and can_edit %} {% endif %} {% if can_edit and r.source == 'manual' %}
{% elif r.source == 'auto' %} {% endif %}
{% if option_defs and can_edit %} {% for r in reservations %} {% endfor %} {% endif %} {% else %}

Keine aktiven Clients mit MAC + IP vorhanden.

{% endif %}
Generierte Konfiguration (Vorschau, Kea-JSON)
{{ preview }}
{% if can_edit %} {% endif %} {% if can_edit %} {% for s in subnets %} {% endfor %} {% endif %} {% endblock %} {% block scripts %} {% endblock %}