get('kea'); $fallback = $module['db_defaults'] ?? []; $settings = modules()->settings('kea'); $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; $metadataRepo = null; $hosts = []; $error = null; $warnings = []; $stats = [ 'total' => 0, 'reservations' => 0, 'leases' => 0, 'groups' => [], 'free_ips' => [], ]; try { $pdo = modules()->modulePdo('kea', $fallback); if (!empty($metadataConfig['driver']) && !empty($metadataConfig['dbname'])) { try { $metadataRepo = new KeaHostMetadataRepository(Database::createFromArray($metadataConfig)); $metadataRepo->ensureSchema(); } catch (\Throwable $e) { $warnings[] = 'Nexus DHCP Zusatzdatenbank nicht verfuegbar: ' . $e->getMessage(); $metadataRepo = null; } } $repo = new KeaHostRepository($pdo, $metadataRepo); $hosts = $repo->findAll(200); $stats['reservations'] = $repo->countReservations(); $stats['leases'] = $repo->countLeases(); $stats['total'] = $stats['reservations'] + $stats['leases']; foreach ($hosts as $host) { $group = trim((string)($host['metadata']['group_name'] ?? '')); if ($group !== '') { $stats['groups'][$group] = ($stats['groups'][$group] ?? 0) + 1; } } if ($metadataRepo !== null) { $stats['free_ips'] = array_map( static fn(array $ips): int => count($ips), $metadataRepo->availableIpsByGroup( array_merge($repo->usedIpAddresses(), $metadataRepo->desiredIps()), 4096 ) ); } } catch (\Exception $e) { $error = "Datenbankfehler: " . $e->getMessage(); } module_tpl('kea', 'dashboard', compact('hosts', 'error', 'warnings', 'stats'));