Modul pihole

This commit is contained in:
2026-03-09 01:32:39 +01:00
parent 74b179a9ce
commit c77b4b3ea7
9 changed files with 1246 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
<?php
$assets = app()->assets();
$assets->addStyle('/module/pihole/asset?file=pihole.css');
$assets->addScript('/module/pihole/asset?file=pihole.js', 'footer', true);
$instances = module_fn('pihole', 'instances');
$hasConfig = !empty($instances);
?>
<div class="card pihole-page" data-pihole-page="dashboard">
<div class="pill">Pi-hole</div>
<h1 style="margin-top:.75rem;">Pi-hole Dashboard</h1>
<p class="muted">Status, Blockings, Usage und Steuerung fuer beide Instanzen.</p>
<?php if (!$hasConfig): ?>
<div class="card" style="margin-top:1rem; border-color:var(--accent);">
<strong>Setup erforderlich</strong>
<div class="muted" style="margin-top:.35rem;">Bitte zuerst die Pi-hole Instanzen im Setup konfigurieren.</div>
<div style="margin-top:.75rem;"><a class="nav-link" href="/modules/setup/pihole">Setup oeffnen</a></div>
</div>
<?php else: ?>
<div class="pihole-grid" style="margin-top:1rem;">
<div class="card pihole-stat">
<div class="muted">DNS Queries (heute)</div>
<div class="pihole-stat-value" data-summary-dns></div>
</div>
<div class="card pihole-stat">
<div class="muted">Ads geblockt</div>
<div class="pihole-stat-value" data-summary-blocked></div>
<div class="pihole-stat-sub" data-summary-percent></div>
</div>
<div class="card pihole-stat">
<div class="muted">Unique Clients</div>
<div class="pihole-stat-value" data-summary-clients></div>
</div>
<div class="card pihole-stat">
<div class="muted">Status</div>
<div class="pihole-stat-value" data-summary-status></div>
</div>
</div>
<div class="card" style="margin-top:1.25rem;">
<div class="pihole-section-header">
<strong>Blocker steuern (alle Instanzen)</strong>
<span class="muted" data-summary-last-refresh>Letztes Update: </span>
</div>
<div class="pihole-actions" data-global-actions>
<button class="cta-button" data-action="enable" data-instance="all">Aktivieren</button>
<button class="nav-link" data-action="disable" data-minutes="5" data-instance="all">5 Min</button>
<button class="nav-link" data-action="disable" data-minutes="10" data-instance="all">10 Min</button>
<button class="nav-link" data-action="disable" data-minutes="20" data-instance="all">20 Min</button>
<button class="nav-link" data-action="disable" data-minutes="30" data-instance="all">30 Min</button>
<button class="nav-link" data-action="disable" data-minutes="60" data-instance="all">60 Min</button>
<div class="pihole-inline">
<input type="number" min="1" max="1440" placeholder="Minuten" data-custom-minutes="all">
<button class="nav-link" data-action="disable-custom" data-instance="all">Custom</button>
</div>
</div>
</div>
<div class="card" style="margin-top:1.25rem;">
<div class="pihole-section-header">
<strong>Instanzen</strong>
<span class="muted">Einzeln steuerbar &amp; getrennte Updates</span>
</div>
<div class="pihole-instance-grid" data-instance-cards></div>
</div>
<div class="card" style="margin-top:1.25rem;">
<div class="pihole-section-header">
<strong>Usage (Aggregiert)</strong>
<span class="muted">Query-Typen und Weiterleitungen</span>
</div>
<div class="pihole-split" style="margin-top:1rem;">
<div>
<div class="muted">Query-Typen</div>
<div class="pihole-list" data-query-types></div>
</div>
<div>
<div class="muted">Forward Destinations</div>
<div class="pihole-list" data-forward-destinations></div>
</div>
</div>
</div>
<?php endif; ?>
</div>
<template id="pihole-instance-template">
<div class="card pihole-instance" data-instance="">
<div class="pihole-instance-header">
<div>
<strong data-instance-name></strong>
<div class="muted" data-instance-url></div>
</div>
<div class="pihole-status" data-instance-status></div>
</div>
<div class="pihole-instance-stats">
<div><span class="muted">DNS heute</span><div class="pihole-instance-value" data-instance-dns></div></div>
<div><span class="muted">Ads geblockt</span><div class="pihole-instance-value" data-instance-ads></div></div>
<div><span class="muted">% Blocked</span><div class="pihole-instance-value" data-instance-percent></div></div>
</div>
<div class="pihole-actions" data-instance-actions>
<button class="cta-button" data-action="enable" data-instance="">Aktivieren</button>
<button class="nav-link" data-action="disable" data-minutes="5" data-instance="">5 Min</button>
<button class="nav-link" data-action="disable" data-minutes="10" data-instance="">10 Min</button>
<button class="nav-link" data-action="disable" data-minutes="30" data-instance="">30 Min</button>
<div class="pihole-inline">
<input type="number" min="1" max="1440" placeholder="Minuten" data-custom-minutes="">
<button class="nav-link" data-action="disable-custom" data-instance="">Custom</button>
</div>
<button class="nav-link" data-action="update" data-instance="">Pi-hole Update</button>
</div>
<div class="pihole-update" data-instance-update></div>
</div>
</template>