Quelltext des aktuellen Standes
<?php
$this->layout('layouts/main', [
'page_title' => 'DNS und IP-Verwaltung',
'current_route' => 'dns',
'full_width' => true,
]);
$ohneAdresse = $ohne_adresse ?? [];
$ohneNamen = $ohne_namen ?? [];
$ipamAktiv = $ipam_aktiv ?? false;
$view = $this;
?>
<div>
<div class="content-header">
<div>
<h1><?= $this->te('DNS und IP-Verwaltung') ?></h1>
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/"><?= $this->te('Home') ?></a></li>
<li class="breadcrumb-item"><a href="/dns"><?= $this->te('DNS-Zonen') ?></a></li>
<li class="breadcrumb-item active"><?= $this->te('Abgleich') ?></li>
</ol>
</div>
<div class="content-header-actions">
<a href="/dns" class="btn btn-default"><?= $this->te('« Zu den Zonen') ?></a>
</div>
</div>
<div class="page-body">
<?php if (!$ipamAktiv): ?>
<div class="alert alert-info">
<?= $this->t('Das Modul <strong>IP-Verwaltung</strong> ist nicht aktiv. Ohne Adressbestand gibt es nichts zu vergleichen – einschalten lässt es sich unter <em>Administration → Einstellungen → Module</em>.') ?>
</div>
<?php else: ?>
<div class="alert alert-info">
<?= $this->te('Diese Gegenüberstellung benennt Auffälligkeiten, sie bewertet sie nicht. Beide Richtungen können völlig in Ordnung sein – etwa bei getrennten DNS-Sichten oder bei Adressen, die bewusst keinen Namen tragen. Geändert wird hier nichts.') ?>
</div>
<div class="kpi-row">
<div class="kpi-col">
<div class="small-box <?= count($ohneAdresse) > 0 ? 'bg-warning' : 'bg-success' ?>">
<div class="inner">
<h3><?= count($ohneAdresse) ?></h3>
<p><?= $this->t('Namen ohne Adresse<small style="opacity:.8;font-size:.8em;display:block;">in der IP-Verwaltung unbekannt</small>') ?></p>
</div>
<div class="icon"><i class="fas fa-globe"></i></div>
</div>
</div>
<div class="kpi-col">
<div class="small-box <?= count($ohneNamen) > 0 ? 'bg-warning' : 'bg-success' ?>">
<div class="inner">
<h3><?= count($ohneNamen) ?></h3>
<p><?= $this->t('Adressen ohne Namen<small style="opacity:.8;font-size:.8em;display:block;">kein A-/AAAA-Record</small>') ?></p>
</div>
<div class="icon"><i class="fas fa-network-wired"></i></div>
</div>
</div>
</div>
<h2 style="font-size:1.05rem;margin-top:1.5rem;"><?= $this->te('Namen, deren Adresse die IP-Verwaltung nicht kennt') ?></h2>
<?php if (empty($ohneAdresse)): ?>
<div class="empty-state">
<span class="empty-icon"><i class="fas fa-check-circle"></i></span>
<strong><?= $this->te('Jede Adresse aus dem DNS ist in der IP-Verwaltung geführt') ?></strong>
</div>
<?php else: ?>
<div class="table-wrapper">
<table class="data-table">
<thead><tr><th scope="col"><?= $this->te('Name') ?></th><th scope="col"><?= $this->te('Typ') ?></th><th scope="col"><?= $this->te('Adresse') ?></th><th scope="col"><?= $this->te('Zone') ?></th></tr></thead>
<tbody>
<?php foreach ($ohneAdresse as $r): ?>
<tr>
<td style="font-family:monospace;"><?= $view->e($r['record_name']) ?></td>
<td><span class="badge"><?= $view->e($r['type']) ?></span></td>
<td style="font-family:monospace;"><?= $view->e($r['ip_address']) ?></td>
<td><a href="/dns/zones/<?= (int)$r['zone_id'] ?>" class="table-link"><?= $view->e($r['zone_name']) ?></a></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<h2 style="font-size:1.05rem;margin-top:1.5rem;"><?= $this->te('Vergebene Adressen ohne passenden Record') ?></h2>
<?php if (empty($ohneNamen)): ?>
<div class="empty-state">
<span class="empty-icon"><i class="fas fa-check-circle"></i></span>
<strong><?= $this->te('Jede vergebene Adresse hat einen Namen im DNS') ?></strong>
</div>
<?php else: ?>
<div class="table-wrapper">
<table class="data-table">
<thead><tr><th scope="col"><?= $this->te('Adresse') ?></th><th scope="col"><?= $this->te('Hostname (IPAM)') ?></th><th scope="col"><?= $this->te('Art') ?></th><th scope="col"><?= $this->te('Status') ?></th><th scope="col"><?= $this->te('Subnetz') ?></th></tr></thead>
<tbody>
<?php foreach ($ohneNamen as $a): ?>
<tr>
<td style="font-family:monospace;">
<a href="/ipam/addresses/<?= (int)$a['id'] ?>" class="table-link"><?= $view->e($a['ip_address']) ?></a>
</td>
<td><?= $view->e($a['hostname'] ?: '—') ?></td>
<td class="text-muted"><?= $view->e($a['type']) ?></td>
<td><span class="status-pill"><?= $view->e($a['status']) ?></span></td>
<td class="text-muted">
<?= !empty($a['network']) ? $view->e($a['network'] . '/' . $a['cidr']) : '—' ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<small class="form-hint" style="display:block;margin-top:1rem;">
<?= $this->te('Verglichen werden A- und AAAA-Records gegen die vergebenen Adressen; als frei geführte Adressen bleiben außen vor, weil sie gerade keinen Namen tragen sollen. Je Richtung werden höchstens 500 Einträge gezeigt.') ?>
</small>
<?php endif; ?>
</div>
</div>