sdasd
All checks were successful
Deploy / deploy-staging (push) Successful in 6s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-04-27 01:30:00 +02:00
parent d04a2214dd
commit bff852291e
3 changed files with 67 additions and 5 deletions

View File

@@ -9,6 +9,10 @@
return d.toLocaleString('de-DE'); return d.toLocaleString('de-DE');
}; };
let refreshTimer = null;
let loadInFlight = false;
let loadErrorShown = false;
const apiCall = async (action, payload = {}) => { const apiCall = async (action, payload = {}) => {
const res = await fetch(`/module/pihole/api?action=${encodeURIComponent(action)}`, const res = await fetch(`/module/pihole/api?action=${encodeURIComponent(action)}`,
{ {
@@ -240,6 +244,8 @@
}; };
const loadDashboard = async () => { const loadDashboard = async () => {
if (loadInFlight) return;
loadInFlight = true;
try { try {
const data = await apiCall('dashboard'); const data = await apiCall('dashboard');
if (!data.ok) throw new Error(data.error || 'API error'); if (!data.ok) throw new Error(data.error || 'API error');
@@ -259,16 +265,32 @@
renderList(document.querySelector('[data-top-queries]'), data.aggregate?.top_queries, 'Keine Daten'); renderList(document.querySelector('[data-top-queries]'), data.aggregate?.top_queries, 'Keine Daten');
renderList(document.querySelector('[data-top-clients]'), data.aggregate?.query_sources, 'Keine Daten'); renderList(document.querySelector('[data-top-clients]'), data.aggregate?.query_sources, 'Keine Daten');
renderBlocked(document.querySelector('[data-recent-blocked]'), data.aggregate?.recent_blocked); renderBlocked(document.querySelector('[data-recent-blocked]'), data.aggregate?.recent_blocked);
loadErrorShown = false;
const existing = page.querySelector('[data-pihole-load-error]');
if (existing) existing.remove();
} catch (err) { } catch (err) {
const message = document.createElement('div'); let message = page.querySelector('[data-pihole-load-error]');
if (!message) {
message = document.createElement('div');
message.className = 'card'; message.className = 'card';
message.style.marginTop = '1rem'; message.style.marginTop = '1rem';
message.textContent = `Fehler beim Laden der Pi-hole Daten: ${err.message}`; message.dataset.piholeLoadError = '1';
page.appendChild(message); page.appendChild(message);
} }
message.textContent = `Fehler beim Laden der Pi-hole Daten: ${err.message}`;
loadErrorShown = true;
} finally {
loadInFlight = false;
}
}; };
bindActionButtons(); bindActionButtons();
bindForms(); bindForms();
loadDashboard(); loadDashboard();
refreshTimer = window.setInterval(loadDashboard, 1000);
window.addEventListener('beforeunload', () => {
if (refreshTimer !== null) {
window.clearInterval(refreshTimer);
}
});
})(); })();

View File

@@ -15,6 +15,21 @@ if (!$module) {
} }
$fields = (array)($module['setup']['fields'] ?? []); $fields = (array)($module['setup']['fields'] ?? []);
$hasGlobalDebugField = false;
foreach ($fields as $field) {
if ((string)($field['name'] ?? '') === 'debug_enabled') {
$hasGlobalDebugField = true;
break;
}
}
if (!$hasGlobalDebugField) {
$fields[] = [
'name' => 'debug_enabled',
'label' => 'Modul-Debug aktivieren',
'type' => 'checkbox',
'help' => 'Wenn aktiv, darf das Modul Debug-Daten sammeln und den Debug-Bereich anzeigen.',
];
}
$fieldTypes = []; $fieldTypes = [];
$fieldMeta = []; $fieldMeta = [];
foreach ($fields as $field) { foreach ($fields as $field) {
@@ -407,6 +422,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
} }
} else { } else {
modules()->saveSettings($moduleName, $payload); modules()->saveSettings($moduleName, $payload);
if (empty($payload['debug_enabled'])) {
module_debug_clear($moduleName);
}
$notice = 'Setup gespeichert.'; $notice = 'Setup gespeichert.';
$module = modules()->get($moduleName) ?: $module; $module = modules()->get($moduleName) ?: $module;
} }

View File

@@ -276,11 +276,30 @@ function module_design(string $module): array
return $cache[$module]; return $cache[$module];
} }
function module_debug_enabled(string $module): bool
{
if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) {
return false;
}
try {
$settings = modules()->settings($module);
} catch (\Throwable $e) {
return false;
}
$value = $settings['debug_enabled'] ?? '0';
return $value === true || $value === 1 || $value === '1' || $value === 'true';
}
function module_debug_entries(string $module): array function module_debug_entries(string $module): array
{ {
if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) { if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) {
return []; return [];
} }
if (!module_debug_enabled($module)) {
return [];
}
app()->session()->start(); app()->session()->start();
$entries = $_SESSION['module_debug'][$module] ?? []; $entries = $_SESSION['module_debug'][$module] ?? [];
@@ -292,6 +311,9 @@ function module_debug_push(string $module, array $entry): void
if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) { if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) {
return; return;
} }
if (!module_debug_enabled($module)) {
return;
}
app()->session()->start(); app()->session()->start();
if (!isset($_SESSION['module_debug']) || !is_array($_SESSION['module_debug'])) { if (!isset($_SESSION['module_debug']) || !is_array($_SESSION['module_debug'])) {
@@ -427,7 +449,7 @@ function module_shell_footer(): string
{ {
$html = ''; $html = '';
$module = current_module_name(); $module = current_module_name();
if (is_string($module) && $module !== '') { if (is_string($module) && $module !== '' && module_debug_enabled($module)) {
if ((string) ($_GET['module_debug_clear'] ?? '') === '1') { if ((string) ($_GET['module_debug_clear'] ?? '') === '1') {
module_debug_clear($module); module_debug_clear($module);
} }