Überwachung
Diese Seite ist nur für Administratoren zugänglich.
'; return; }
$message = null;
$error = null;
$edit = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verify_csrf();
$action = $_POST['action'] ?? '';
if ($action === 'save') {
$id = (int) ($_POST['id'] ?? 0);
$r = ueberwachung_save($pdo, $_POST + ['is_active' => !empty($_POST['is_active']) ? 1 : 0, 'verify_tls' => !empty($_POST['verify_tls']) ? 1 : 0], $id);
if ($r['ok']) { $message = $id ? 'Gespeichert.' : 'Das Ziel wird jetzt überwacht.'; if (!$id) ueberwachung_check($pdo, $r['id']); }
else { $error = $r['error']; $edit = $_POST; }
} elseif ($action === 'self') {
$r = ueberwachung_save($pdo, ['name' => 'Diese DeskHub-Seite', 'type' => 'http', 'target' => rtrim(base_url(), '/') . '/', 'interval_min' => 5]);
if ($r['ok']) { ueberwachung_check($pdo, $r['id']); $message = 'Diese Seite wird jetzt überwacht.'; } else $error = $r['error'];
} elseif ($action === 'test_ticket') {
$tid = ueberwachung_open_ticket($pdo, 'Test: Überwachung', 'Dies ist ein Testticket der Überwachung. Es kann gelöscht oder geschlossen werden.');
if ($tid) { $tn = $pdo->query('SELECT ticket_number FROM tickets WHERE id = ' . (int) $tid)->fetchColumn(); $message = 'Testticket #' . $tn . ' wurde angelegt.'; }
else $error = 'Das Testticket konnte nicht angelegt werden: ' . (plugin_setting(UEBERWACHUNG, 'ticket_error', '') ?: 'Tickets sind ausgeschaltet.');
} elseif ($action === 'check') {
$message = ueberwachung_check($pdo, (int) ($_POST['id'] ?? 0)) ? 'Geprüft.' : null;
if ($message === null) $error = 'Ziel nicht gefunden.';
} elseif ($action === 'toggle') {
$pdo->prepare('UPDATE plugin_ueberwachung_monitors SET is_active = 1 - is_active WHERE id = ?')->execute([(int) ($_POST['id'] ?? 0)]);
$message = 'Gespeichert.';
} elseif ($action === 'delete') {
ueberwachung_delete($pdo, (int) ($_POST['id'] ?? 0));
$message = 'Das Ziel wurde gelöscht (bereits angelegte Tickets bleiben).';
} elseif ($action === 'settings') {
plugin_set_setting(UEBERWACHUNG, 'threshold', (string) max(1, min(10, (int) ($_POST['threshold'] ?? 2))));
plugin_set_setting(UEBERWACHUNG, 'department_id', (string) (int) ($_POST['department_id'] ?? 0));
plugin_set_setting(UEBERWACHUNG, 'priority_id', (string) (int) ($_POST['priority_id'] ?? 0));
foreach (['create_tickets', 'auto_resolve', 'mail'] as $k) plugin_set_setting(UEBERWACHUNG, $k, !empty($_POST[$k]) ? '1' : '0');
$mailTo = trim((string) ($_POST['alert_email'] ?? ''));
$ok = true;
foreach (preg_split('/[,;\s]+/', $mailTo, -1, PREG_SPLIT_NO_EMPTY) ?: [] as $a) if (!filter_var($a, FILTER_VALIDATE_EMAIL)) { $ok = false; $error = 'Ungültige Adresse: ' . $a; }
if ($ok) { plugin_set_setting(UEBERWACHUNG, 'alert_email', $mailTo); $message = 'Einstellungen gespeichert.'; }
}
}
if (isset($_GET['edit'])) {
$s = $pdo->prepare('SELECT * FROM plugin_ueberwachung_monitors WHERE id = ?');
$s->execute([(int) $_GET['edit']]);
$edit = $s->fetch() ?: null;
}
$cfg = ueberwachung_config();
$monitors = $pdo->query('SELECT * FROM plugin_ueberwachung_monitors ORDER BY name')->fetchAll();
$events = $pdo->query('SELECT e.*, m.name FROM plugin_ueberwachung_events e LEFT JOIN plugin_ueberwachung_monitors m ON m.id = e.monitor_id ORDER BY e.id DESC LIMIT 40')->fetchAll();
$depts = $pdo->query('SELECT id, name FROM departments ORDER BY name')->fetchAll();
$prios = $pdo->query('SELECT id, name FROM priorities ORDER BY sort_order')->fetchAll();
$types = ueberwachung_types();
$down = count(array_filter($monitors, fn($m) => $m['state'] === 'down'));
$badge = ['up' => ['In Ordnung', '#157a45', '#e6f7ee'], 'down' => ['Ausfall', '#b42318', '#fde8e8'], 'unknown' => ['Noch nicht geprüft', '#5b6b77', '#eef1f4']];
$f = fn(string $k, $d = '') => $edit[$k] ?? $d;
?>
Website- und Server-Überwachung
= e($message) ?>
= e($error) ?>
Achtung: Die Zertifikatsprüfung scheitert bei allen HTTPS-Zielen, und auf diesem Server findet PHP keine Liste vertrauenswürdiger Zertifizierungsstellen (CA-Bundle). Vermutlich meldet die Prüfung deshalb bei jeder HTTPS-Adresse „Zertifikat ungültig“, auch wenn die Seite in Ordnung ist. Stellen Sie in der PHP-Konfiguration curl.cainfo und openssl.cafile auf eine CA-Datei (zum Beispiel /etc/ssl/certs/ca-certificates.crt) oder schalten Sie bei den Zielen „Zertifikat prüfen“ aus.
Hinweis zum Anlegen von Tickets: = e($ticketError) ?>
Zustand = $monitors ? '' : '' ?>
Noch nichts eingetragen. Unten ein Ziel hinzufügen oder gleich diese Seite überwachen:
= $down ? '' . $down . ' Ausfall' . ($down > 1 ? 'e' : '') . ' · ' : 'Alles in Ordnung · ' ?>= count($monitors) ?> Ziele, geprüft vom Hintergrunddienst von DeskHub (im jeweils eingestellten Abstand).
| Name | Ziel | Zustand | Zertifikat | Zuletzt geprüft | |
| = e($m['name']) ?> = e($types[$m['type']] ?? $m['type']) ?>= $m['is_active'] ? '' : ' · pausiert' ?> |
= e($m['target']) ?> Antwort: = $m['last_status'] ? 'HTTP ' . (int) $m['last_status'] : '' ?>= !empty($m['last_title']) ? ' · Titel „' . e(mb_strimwidth((string) $m['last_title'], 0, 60, '…')) . '“' : '' ?> |
= e($b[0]) ?>
= e((string) $m['last_error']) ?>
0): ?>Fehlschlag = (int) $m['fails'] ?> von = (int) $cfg['threshold'] ?> (Ausfall und Ticket ab Fehlschlag = (int) $cfg['threshold'] ?>): = e((string) $m['last_error']) ?>
nächste Prüfung ca. = e(date('H:i', max($next, time()))) ?> |
= $days === null ? '–' : ($days < 0 ? 'abgelaufen' : ($days <= (int) $m['cert_warn_days'] ? '' . $days . ' Tage' : $days . ' Tage')) ?> |
= $m['last_check_at'] ? e(format_dt((string) $m['last_check_at'])) . ($m['last_ms'] !== null ? ' · ' . (int) $m['last_ms'] . ' ms' : '') : '–' ?> |
|
900);
?>
Hintergrunddienst
Noch kein Lauf. Die Prüfungen starten, sobald DeskHub das nächste Mal aufgerufen wird.
Letzter Lauf vor = e(ueberwachung_duration(time() - $lastTick)) ?>. Es hat länger niemand DeskHub aufgerufen, oder der automatische Hintergrund-Betrieb ist ausgeschaltet (Einstellungen → Cron-Jobs).
✓ Läuft. Letzter Lauf: = e(format_dt(date('Y-m-d H:i:s', $lastTick))) ?>.
Echter Server-Cronjob:
bisher kein Lauf (Einstellungen → Cron-Jobs → „Neu installieren / aktualisieren“, mit den aktuellen DeskHub-Dateien; bei älteren Dateien siehe unten)
900): ?>letzter Lauf vor = e(ueberwachung_duration($cliAge)) ?> (= e(format_dt($cliLast)) ?>). Er sollte jede Minute laufen: Crontab und cron/run_plugins.log prüfen.
✓ läuft (letzter Lauf = e(format_dt($cliLast)) ?>)
Die Prüfungen laufen mit den Hintergrundaufgaben von DeskHub. Mit dem aktuellen DeskHub-Update gehören sie zum echten Server-Cronjob: Einstellungen → Cron-Jobs → „Neu installieren / aktualisieren“ trägt die Zeile ein (jede Minute), dann wird auch nachts ohne Besucher in dem Abstand geprüft, den Sie je Ziel einstellen (mindestens 1 Minute). Bei älteren Dateien oder ohne Server-Cronjob läuft die Prüfung nur, solange jemand die Seite oder das Backend aufruft. Dann hilft ein eigener Cronjob für dieses Plugin (zum Beispiel Plesk → Geplante Aufgaben, alle 5 Minuten):
php = e(str_replace('\\', '/', plugins_dir()) . '/' . UEBERWACHUNG . '/cron.php') ?>
Wichtig: Fällt der Server aus, auf dem DeskHub selbst läuft, kann DeskHub das nicht melden. Die eigene Erreichbarkeit überwacht am besten ein Dienst auf einem anderen Server.
Ereignisse
Noch keine Ereignisse.
| Wann | Ziel | Ereignis |
| = e(format_dt((string) $ev['created_at'])) ?> | = e((string) $ev['name']) ?> | = e(['down' => 'Ausfall', 'up' => 'Entwarnung', 'cert' => 'Zertifikat', 'cert_ok' => 'Zertifikat erneuert'][$ev['kind']] ?? $ev['kind']) ?>: = e((string) $ev['message']) ?> |