diff --git a/modules/kea/migrations/003_1.2.0_device_checks.php b/modules/kea/migrations/003_1.2.0_device_checks.php new file mode 100644 index 0000000..ec668a0 --- /dev/null +++ b/modules/kea/migrations/003_1.2.0_device_checks.php @@ -0,0 +1,26 @@ +settings(); + $fallback = is_array($context->module['metadata_db_defaults'] ?? null) + ? $context->module['metadata_db_defaults'] + : []; + $config = is_array($settings['metadata_db'] ?? null) + ? array_replace($fallback, $settings['metadata_db']) + : $fallback; + + if (empty($config['driver']) || empty($config['dbname'])) { + return; + } + + $repo = new KeaHostMetadataRepository(Database::createFromArray($config)); + $repo->ensureSchema(); + } +}; diff --git a/modules/kea/module.json b/modules/kea/module.json index 0061568..36aaa8e 100644 --- a/modules/kea/module.json +++ b/modules/kea/module.json @@ -1,7 +1,7 @@ { "title": "KEA DHCP", - "version": "1.1.0", - "schema_version": 2, + "version": "1.2.0", + "schema_version": 3, "description": "Verwaltung von KEA DHCP Hosts und Reservierungen.", "menu": [ { "label": "Hosts", "href": "/module/kea" }, diff --git a/modules/kea/pages/edit.php b/modules/kea/pages/edit.php index 2bbb85a..e7d39e7 100644 --- a/modules/kea/pages/edit.php +++ b/modules/kea/pages/edit.php @@ -20,6 +20,8 @@ $host = null; $metadataRepo = null; $groups = []; $availableIpsByGroup = []; +$checks = []; +$hostKey = ''; try { $pdo = modules()->modulePdo('kea', $fallback); @@ -35,35 +37,54 @@ try { if (!$host) { throw new RuntimeException('KEA Eintrag wurde nicht gefunden.'); } + $hostKey = $source . ':' . (string)($host['host_id'] ?? $id); 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.'; + $action = (string)($_POST['action'] ?? 'save_metadata'); + if ($action === 'dns_lookup') { + $ip = (string)($host['ipv4_address'] ?? ''); + $hostname = trim((string)($host['metadata']['device_name'] ?? $host['hostname'] ?? '')); + $reverse = $ip !== '' ? gethostbyaddr($ip) : ''; + $forward = $hostname !== '' ? gethostbyname($hostname) : ''; + $success = ($reverse !== '' && $reverse !== $ip) || ($forward !== '' && $forward !== $hostname); + + $metadataRepo->saveCheck($hostKey, 'dns', $success ? 'success' : 'warning', [ + 'ip' => $ip, + 'hostname' => $hostname, + 'reverse' => $reverse, + 'forward' => $forward, + ]); + $notice = $success ? 'DNS-Pruefung gespeichert.' : 'DNS-Pruefung gespeichert, aber kein eindeutiger Name gefunden.'; } else { - $metadataRepo->saveForHost( - $id, - (string)($host['dhcp_identifier'] ?? ''), - (string)($host['ipv4_address'] ?? ''), - $metadata - ); - $notice = 'Zusatzdaten gespeichert.'; + $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; + $hostKey = $source . ':' . (string)($host['host_id'] ?? $id); } $usedIps = array_diff( @@ -71,6 +92,7 @@ try { [(string)($host['ipv4_address'] ?? ''), (string)($host['metadata']['desired_ip'] ?? '')] ); $availableIpsByGroup = $metadataRepo->availableIpsByGroup($usedIps); + $checks = $metadataRepo->latestChecks([$hostKey])[$hostKey] ?? []; } catch (Throwable $e) { $error = $e->getMessage(); } @@ -115,6 +137,7 @@ $selectedIp = (string)($metadata['desired_ip'] ?? '');
+ +Pruefergebnisse werden in der Nexus-DHCP-Datenbank gespeichert und koennen spaeter fuer Reports genutzt werden.
+Status: = e((string)($dnsCheck['status'] ?? '')) ?> · = e((string)($dnsCheck['checked_at'] ?? '')) ?>
+Reverse: = e((string)($dnsResult['reverse'] ?? '-')) ?>
+Forward: = e((string)($dnsResult['forward'] ?? '-')) ?>
+ +Noch keine DNS-Pruefung gespeichert.
+ + +Vorbereitet fuer spaetere HTTP/Port-Erkennung. Noch nicht automatisch aktiv, damit keine ungewollten Scans laufen.
+