kea
All checks were successful
Deploy / deploy-staging (push) Successful in 6s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-04-15 02:48:23 +02:00
parent 7157c98dcb
commit 598348a4b6
8 changed files with 532 additions and 11 deletions

View File

@@ -19,6 +19,7 @@ $notice = null;
$host = null;
$metadataRepo = null;
$groups = [];
$availableIpsByGroup = [];
try {
$pdo = modules()->modulePdo('kea', $fallback);
@@ -64,11 +65,19 @@ try {
}
$host = $repo->findDisplayByKey($source, $id) ?: $host;
}
$usedIps = array_diff(
array_merge($repo->usedIpAddresses(), $metadataRepo->desiredIps()),
[(string)($host['ipv4_address'] ?? ''), (string)($host['metadata']['desired_ip'] ?? '')]
);
$availableIpsByGroup = $metadataRepo->availableIpsByGroup($usedIps);
} catch (Throwable $e) {
$error = $e->getMessage();
}
$metadata = is_array($host['metadata'] ?? null) ? $host['metadata'] : [];
$selectedGroup = (string)($metadata['group_name'] ?? '');
$selectedIp = (string)($metadata['desired_ip'] ?? '');
?>
<section class="kea-page">
<div class="section-head">
@@ -128,17 +137,19 @@ $metadata = is_array($host['metadata'] ?? null) ? $host['metadata'] : [];
</label>
<label class="setup-field">
<span>Gruppe</span>
<input type="text" name="group_name" list="kea-groups" value="<?= e((string)($metadata['group_name'] ?? '')) ?>">
<datalist id="kea-groups">
<select name="group_name" data-kea-group-select>
<option value="">Bitte waehlen</option>
<?php foreach ($groups as $group): ?>
<option value="<?= e($group) ?>"></option>
<option value="<?= e($group) ?>" <?= $selectedGroup === $group ? 'selected' : '' ?>><?= e($group) ?></option>
<?php endforeach; ?>
</datalist>
</select>
</label>
<label class="setup-field">
<span>Feste IP</span>
<input type="text" name="desired_ip" value="<?= e((string)($metadata['desired_ip'] ?? '')) ?>" placeholder="<?= e((string)($host['ipv4_address'] ?? '')) ?>">
<small class="muted">Wenn gesetzt, wird der Eintrag als KEA-Reservierung gespeichert.</small>
<select name="desired_ip" data-kea-ip-select data-selected-ip="<?= e($selectedIp) ?>">
<option value="">Erst Gruppe waehlen</option>
</select>
<small class="muted">Es werden nur freie IPs aus dem IP-Bereich der gewaehlten Gruppe angeboten.</small>
</label>
<label class="setup-field kea-edit-form__wide">
<span>Notizen</span>
@@ -151,5 +162,36 @@ $metadata = is_array($host['metadata'] ?? null) ? $host['metadata'] : [];
</div>
</form>
</div>
<script>
(() => {
const ipsByGroup = <?= json_encode($availableIpsByGroup, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
const groupSelect = document.querySelector('[data-kea-group-select]');
const ipSelect = document.querySelector('[data-kea-ip-select]');
if (!groupSelect || !ipSelect) {
return;
}
const selectedIp = ipSelect.dataset.selectedIp || '';
const renderIps = () => {
const ips = ipsByGroup[groupSelect.value] || [];
ipSelect.innerHTML = '';
const empty = document.createElement('option');
empty.value = '';
empty.textContent = groupSelect.value ? 'Keine feste IP' : 'Erst Gruppe waehlen';
ipSelect.appendChild(empty);
if (selectedIp && !ips.includes(selectedIp)) {
ips.unshift(selectedIp);
}
for (const ip of ips) {
const option = document.createElement('option');
option.value = ip;
option.textContent = ip;
option.selected = ip === selectedIp;
ipSelect.appendChild(option);
}
};
groupSelect.addEventListener('change', renderIps);
renderIps();
})();
</script>
<?php endif; ?>
</section>