198 lines
7.6 KiB
PHP
198 lines
7.6 KiB
PHP
<?php
|
|
use App\Database;
|
|
use App\Repository\KeaHostMetadataRepository;
|
|
use App\Repository\KeaHostRepository;
|
|
|
|
$module = modules()->get('kea');
|
|
$settings = modules()->settings('kea');
|
|
$fallback = $module['db_defaults'] ?? [];
|
|
$metadataFallback = is_array($module['metadata_db_defaults'] ?? null) ? $module['metadata_db_defaults'] : [];
|
|
$metadataConfig = is_array($settings['metadata_db'] ?? null)
|
|
? array_replace($metadataFallback, $settings['metadata_db'])
|
|
: $metadataFallback;
|
|
|
|
$source = (string)($_GET['source'] ?? $_POST['source'] ?? 'reservation');
|
|
$source = $source === 'lease' ? 'lease' : 'reservation';
|
|
$id = (int)($_GET['id'] ?? $_POST['id'] ?? 0);
|
|
$error = null;
|
|
$notice = null;
|
|
$host = null;
|
|
$metadataRepo = null;
|
|
$groups = [];
|
|
$availableIpsByGroup = [];
|
|
|
|
try {
|
|
$pdo = modules()->modulePdo('kea', $fallback);
|
|
if (empty($metadataConfig['driver']) || empty($metadataConfig['dbname'])) {
|
|
throw new RuntimeException('Nexus DHCP Zusatzdatenbank ist nicht konfiguriert.');
|
|
}
|
|
|
|
$metadataRepo = new KeaHostMetadataRepository(Database::createFromArray($metadataConfig));
|
|
$metadataRepo->ensureSchema();
|
|
$groups = $metadataRepo->listGroups();
|
|
$repo = new KeaHostRepository($pdo, $metadataRepo);
|
|
$host = $repo->findDisplayByKey($source, $id);
|
|
if (!$host) {
|
|
throw new RuntimeException('KEA Eintrag wurde nicht gefunden.');
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$metadata = [
|
|
'real_name' => $_POST['real_name'] ?? '',
|
|
'device_name' => $_POST['device_name'] ?? '',
|
|
'owner' => $_POST['owner'] ?? '',
|
|
'location' => $_POST['location'] ?? '',
|
|
'device_type' => $_POST['device_type'] ?? '',
|
|
'group_name' => $_POST['group_name'] ?? '',
|
|
'desired_ip' => $_POST['desired_ip'] ?? '',
|
|
'notes' => $_POST['notes'] ?? '',
|
|
'tags' => [],
|
|
];
|
|
$desiredIp = trim((string)$metadata['desired_ip']);
|
|
if ($desiredIp !== '') {
|
|
$newHostId = $repo->reserveDisplayEntry($host, $desiredIp, $metadata);
|
|
$source = 'reservation';
|
|
$id = $newHostId;
|
|
$notice = 'Zusatzdaten gespeichert und KEA-Reservierung gesetzt.';
|
|
} else {
|
|
$metadataRepo->saveForHost(
|
|
$id,
|
|
(string)($host['dhcp_identifier'] ?? ''),
|
|
(string)($host['ipv4_address'] ?? ''),
|
|
$metadata
|
|
);
|
|
$notice = 'Zusatzdaten gespeichert.';
|
|
}
|
|
$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">
|
|
<div>
|
|
<h2 class="section-title">KEA Eintrag bearbeiten</h2>
|
|
<p>Zusatzdaten werden separat von der KEA-Datenbank gespeichert.</p>
|
|
</div>
|
|
<a class="nav-link" href="/module/kea">Zurueck</a>
|
|
</div>
|
|
|
|
<?php if ($error): ?>
|
|
<div class="kea-message kea-message--error" role="alert">
|
|
<strong>Fehler</strong>
|
|
<p><?= e($error) ?></p>
|
|
</div>
|
|
<?php elseif ($host): ?>
|
|
<?php if ($notice): ?>
|
|
<div class="kea-message kea-message--success">
|
|
<?= e($notice) ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<div class="kea-panel">
|
|
<div class="kea-panel__head">
|
|
<div>
|
|
<span class="pill"><?= ($source === 'lease') ? 'Lease' : 'Reservierung' ?></span>
|
|
<h3><?= e((string)($host['hostname'] ?: 'Unbekannt')) ?></h3>
|
|
<p class="muted">
|
|
IP <?= e((string)($host['ipv4_address'] ?? '')) ?> · MAC <?= e((string)($host['dhcp_identifier'] ?? '')) ?>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<form method="post" class="kea-edit-form">
|
|
<input type="hidden" name="source" value="<?= e($source) ?>">
|
|
<input type="hidden" name="id" value="<?= e((string)$id) ?>">
|
|
|
|
<label class="setup-field">
|
|
<span>Echter Name</span>
|
|
<input type="text" name="real_name" value="<?= e((string)($metadata['real_name'] ?? '')) ?>">
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Gerätename</span>
|
|
<input type="text" name="device_name" value="<?= e((string)($metadata['device_name'] ?? '')) ?>">
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Besitzer</span>
|
|
<input type="text" name="owner" value="<?= e((string)($metadata['owner'] ?? '')) ?>">
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Standort</span>
|
|
<input type="text" name="location" value="<?= e((string)($metadata['location'] ?? '')) ?>">
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Gerätetyp</span>
|
|
<input type="text" name="device_type" value="<?= e((string)($metadata['device_type'] ?? '')) ?>">
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Gruppe</span>
|
|
<select name="group_name" data-kea-group-select>
|
|
<option value="">Bitte waehlen</option>
|
|
<?php foreach ($groups as $group): ?>
|
|
<option value="<?= e($group) ?>" <?= $selectedGroup === $group ? 'selected' : '' ?>><?= e($group) ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</label>
|
|
<label class="setup-field">
|
|
<span>Feste IP</span>
|
|
<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>
|
|
<textarea name="notes" rows="4"><?= e((string)($metadata['notes'] ?? '')) ?></textarea>
|
|
</label>
|
|
|
|
<div class="setup-actions kea-edit-form__wide">
|
|
<button class="cta-button" type="submit">Speichern</button>
|
|
<a class="nav-link" href="/module/kea">Abbrechen</a>
|
|
</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>
|