Files
nexus/modules/kea/pages/index.php
Lars Gebhardt-Kusche 598348a4b6
All checks were successful
Deploy / deploy-staging (push) Successful in 6s
Deploy / deploy-production (push) Has been skipped
kea
2026-04-15 02:48:23 +02:00

66 lines
2.1 KiB
PHP

<?php
use App\Database;
use App\Repository\KeaHostRepository;
use App\Repository\KeaHostMetadataRepository;
$module = modules()->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(50);
$stats['total'] = count($hosts);
foreach ($hosts as $host) {
if (($host['source'] ?? '') === 'lease') {
$stats['leases']++;
} else {
$stats['reservations']++;
}
$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'));