assets(); $assets->addStyle('/module/pihole/asset?file=pihole.css'); $assets->addScript('/module/pihole/asset?file=pihole_instances.js', 'footer', true); require_admin(); $settings = modules()->settings($moduleName); $notice = null; $error = null; $loadInstances = function (array $settings): array { $instances = []; $rawJson = trim((string)($settings['instances_json'] ?? '')); if ($rawJson !== '') { $decoded = json_decode($rawJson, true); if (is_array($decoded)) { foreach ($decoded as $row) { if (!is_array($row)) { continue; } $id = trim((string)($row['id'] ?? '')); $url = trim((string)($row['url'] ?? '')); if ($id === '' || $url === '') { continue; } $instances[$id] = [ 'id' => $id, 'name' => trim((string)($row['name'] ?? '')) ?: $id, 'url' => $url, 'token' => trim((string)($row['token'] ?? '')), 'is_primary' => !empty($row['is_primary']), ]; } } } if (!$instances) { foreach (['primary', 'secondary'] as $key) { $url = trim((string)($settings[$key . '_url'] ?? '')); if ($url === '') { continue; } $instances[$key] = [ 'id' => $key, 'name' => trim((string)($settings[$key . '_name'] ?? '')) ?: ($key === 'primary' ? 'Primaer' : 'Sekundaer'), 'url' => $url, 'token' => trim((string)($settings[$key . '_token'] ?? '')), 'is_primary' => $key === 'primary', ]; } } return $instances; }; $instances = $loadInstances($settings); $sanitizeId = function (string $id): string { $id = preg_replace('/[^a-zA-Z0-9_-]/', '', $id); return trim((string)$id); }; $saveInstances = function (array $settings, array $instances): void { $payload = $settings; $payload['instances_json'] = json_encode(array_values($instances), JSON_UNESCAPED_UNICODE); modules()->saveSettings('pihole', $payload); }; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $deleteId = trim((string)($_POST['delete_id'] ?? '')); $currentId = trim((string)($_POST['current_id'] ?? '')); $instanceId = trim((string)($_POST['instance_id'] ?? '')); $name = trim((string)($_POST['name'] ?? '')); $url = trim((string)($_POST['url'] ?? '')); $token = trim((string)($_POST['token'] ?? '')); $isPrimary = isset($_POST['is_primary']); if ($deleteId !== '') { if (isset($instances[$deleteId])) { unset($instances[$deleteId]); $notice = 'Instanz geloescht.'; } } else { $instanceId = $sanitizeId($instanceId); if ($instanceId === '' || $url === '') { $error = 'Bitte ID und URL angeben.'; } else { $existingToken = ''; if ($currentId !== '' && isset($instances[$currentId])) { $existingToken = (string)($instances[$currentId]['token'] ?? ''); } $tokenToStore = $token !== '' ? $token : $existingToken; if ($currentId !== '' && $currentId !== $instanceId) { unset($instances[$currentId]); } $instances[$instanceId] = [ 'id' => $instanceId, 'name' => $name !== '' ? $name : $instanceId, 'url' => $url, 'token' => $tokenToStore, 'is_primary' => $isPrimary, ]; if ($isPrimary) { foreach ($instances as $id => &$row) { $row['is_primary'] = ($id === $instanceId); } unset($row); $settings['primary_id'] = $instanceId; } $notice = $currentId !== '' ? 'Instanz aktualisiert.' : 'Instanz gespeichert.'; } } if (!$error) { $saveInstances($settings, $instances); $settings = modules()->settings($moduleName); $instances = $loadInstances($settings); } } $primaryId = trim((string)($settings['primary_id'] ?? '')); if ($primaryId === '') { foreach ($instances as $id => $row) { if (!empty($row['is_primary'])) { $primaryId = $id; break; } } } ?>
Pi-hole Instanzen hinzufuegen, bearbeiten und loeschen.