91 lines
6.7 KiB
PHP
91 lines
6.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Prüft die Überwachung der Plugin-Webseite auf der Statusseite: Prüfadresse aus dem offiziellen Katalog, Standarddienst,
|
|
* automatische Erkennung am Namen und dass ohne offiziellen Katalog nichts angelegt wird.
|
|
*/
|
|
|
|
putenv('DESKHUB_TESTING=1');
|
|
putenv('DESKHUB_CATALOG_DEFAULTS=' . __DIR__ . '/fixtures/no-catalog.php');
|
|
putenv('DESKHUB_SQLITE_PATH=:memory:');
|
|
require_once dirname(__DIR__) . '/includes/bootstrap.php';
|
|
|
|
$failures = [];
|
|
$check = function (bool $ok, string $what) use (&$failures): void {
|
|
if (!$ok) $failures[] = $what;
|
|
};
|
|
$pdo = get_db();
|
|
$byName = fn(string $name) => $pdo->query("SELECT * FROM status_components WHERE name = " . $pdo->quote($name))->fetch(PDO::FETCH_ASSOC);
|
|
|
|
// Ohne offiziellen Katalog gibt es nichts zu prüfen
|
|
$check(status_plugin_site_url() === '', 'ohne Katalog keine Prüfadresse');
|
|
status_restore_core_components($pdo);
|
|
$check(!$byName('Plugin-Webseite'), 'ohne Katalog wird kein Dienst "Plugin-Webseite" angelegt');
|
|
|
|
// Mit offiziellem Katalog
|
|
$GLOBALS['deskhub_catalog_defaults'] = ['plugins_url' => 'https://plugins.example.test/seite/catalog.php?type=plugins', 'themes_url' => '', 'publisher_key' => 'x'];
|
|
$check(status_plugin_site_url() === 'https://plugins.example.test/seite/health.php', 'Prüfadresse liegt neben dem Katalog: ' . status_plugin_site_url());
|
|
$check(status_restore_core_components($pdo) >= 1, 'Standarddienste ergänzen den fehlenden Dienst');
|
|
$c = $byName('Plugin-Webseite');
|
|
$check((bool) $c && $c['monitor_type'] === 'plugin_site' && (int) ($c['is_enabled'] ?? 1) === 1, 'Dienst "Plugin-Webseite" ist angelegt und aktiv');
|
|
$t = status_component_monitor_target($pdo, $c);
|
|
$check($t && $t['type'] === 'plugin_site' && $t['target'] === 'https://plugins.example.test/seite/health.php', 'Prüfziel ist das health.php der Plugin-Webseite');
|
|
$check(status_restore_core_components($pdo) === 0, 'ein zweiter Durchlauf legt nichts doppelt an');
|
|
$check(isset(status_monitor_types()['plugin_site']) && status_set_component_monitor($pdo, (int) $c['id'], 'plugin_site', ''), 'Prüfart "Plugin-Webseite" lässt sich wählen');
|
|
|
|
// Automatische Erkennung am Namen (Dienst mit anderem Namen, Prüfart "auto")
|
|
$id = status_save_component($pdo, null, 'Pluginseite von DeskHub', '', 900, null);
|
|
$row = $pdo->query('SELECT * FROM status_components WHERE id = ' . (int) $id)->fetch(PDO::FETCH_ASSOC);
|
|
$t = status_component_monitor_target($pdo, $row);
|
|
$check($t && $t['type'] === 'plugin_site', 'Name mit "Plugin" und "seite" wird automatisch erkannt');
|
|
$id2 = status_save_component($pdo, null, 'Plugin-Hersteller', '', 910, null);
|
|
$row2 = $pdo->query('SELECT * FROM status_components WHERE id = ' . (int) $id2)->fetch(PDO::FETCH_ASSOC);
|
|
$check(status_component_monitor_target($pdo, $row2) === null, 'ein anderer Name mit "Plugin" wird nicht fälschlich geprüft');
|
|
|
|
// Intern: wird geprüft, steht aber nicht öffentlich
|
|
$check(status_has_internal($pdo), 'Spalte is_internal ist vorhanden');
|
|
$check((int) $byName('Plugin-Webseite')['is_internal'] === 1, 'Plugin-Webseite ist standardmäßig intern');
|
|
$cat = $pdo->query('SELECT name FROM status_categories WHERE id = ' . (int) $byName('Plugin-Webseite')['category_id'])->fetchColumn();
|
|
$check($cat === 'Server & Datenbank', 'Kategorie ist "Server & Datenbank", nicht "Webseite": ' . var_export($cat, true));
|
|
$pub = array_column(status_components($pdo, false, true), 'name');
|
|
$all = array_column(status_components($pdo), 'name');
|
|
$check(!in_array('Plugin-Webseite', $pub, true) && in_array('Plugin-Webseite', $all, true), 'öffentliche Liste ohne den internen Dienst, Mitarbeiterliste mit ihm');
|
|
$check(in_array('plugin_site', array_map(fn($c) => (status_component_monitor_target($pdo, $c)['type'] ?? ''), status_components($pdo)), true), 'interner Dienst wird weiter geprüft');
|
|
// Ausfall eines internen Dienstes ändert den öffentlichen Gesamtzustand nicht
|
|
status_set_component($pdo, (int) $byName('Plugin-Webseite')['id'], 'outage');
|
|
$check(status_overall($pdo)['key'] === 'operational', 'Ausfall eines internen Dienstes ändert den öffentlichen Gesamtzustand nicht: ' . status_overall($pdo)['key']);
|
|
$check(status_set_component_internal($pdo, (int) $byName('Plugin-Webseite')['id'], false) && in_array('Plugin-Webseite', array_column(status_components($pdo, false, true), 'name'), true), 'als öffentlich markiert erscheint er wieder');
|
|
$check(status_overall($pdo)['key'] === 'outage', 'öffentlich: der Ausfall zählt');
|
|
status_set_component_internal($pdo, (int) $byName('Plugin-Webseite')['id'], true);
|
|
status_set_component($pdo, (int) $byName('Plugin-Webseite')['id'], 'operational');
|
|
// Störung an einem internen Dienst erscheint nicht öffentlich
|
|
$inc = status_create_incident($pdo, 'Plugin-Webseite langsam', 'x', 'investigating', (int) $byName('Plugin-Webseite')['id'], null, null);
|
|
$check(!empty($inc['ok']) && count(status_incidents($pdo, 14)) === 0 && count(status_incidents($pdo, 14, false, true)) === 1, 'Störung an einem internen Dienst steht nicht öffentlich, Mitarbeiter sehen sie');
|
|
|
|
// Benachrichtigung der Administratoren bei Ausfall und Wiederkehr (E-Mail ist im Test nicht eingerichtet: der Versuch steht im Protokoll)
|
|
$pdo->exec("INSERT INTO staff (name, email, password_hash, role, is_active, created_at) VALUES ('Admin Test','admin-test@example.de','x','admin',1,'" . date('Y-m-d H:i:s') . "')");
|
|
$comp = $byName('Plugin-Webseite');
|
|
$n = status_notify_admins($pdo, $comp, false, 'HTTP 503');
|
|
$check($n >= 1, 'bei Ausfall werden die Administratoren benachrichtigt: ' . $n);
|
|
$logged = $pdo->query("SELECT COUNT(*) FROM admin_audit_log WHERE action LIKE '%Statusmeldung%' AND action LIKE '%admin-test@example.de%'")->fetchColumn();
|
|
$check((int) $logged >= 1, 'der Mailversuch an den Administrator steht im Protokoll (Versand ist im Test nicht eingerichtet)');
|
|
$check(status_notify_admins($pdo, $comp, false, 'HTTP 503') === 0, 'innerhalb von 10 Minuten keine zweite Ausfallmeldung (kein Dauerfeuer)');
|
|
$check(status_notify_admins($pdo, $comp, true) >= 1, 'die Wiederkehr wird separat gemeldet');
|
|
set_setting('status_notify_admins', '0');
|
|
$comp2 = $byName('Plugin-Webseite');
|
|
$comp2['id'] = 99999;
|
|
$check(status_notify_admins($pdo, $comp2, false, 'x') === 0, 'abgeschaltet: keine Meldung');
|
|
set_setting('status_notify_admins', '1');
|
|
|
|
// Eine http-Adresse (ohne https) wird nicht als Prüfadresse verwendet
|
|
$GLOBALS['deskhub_catalog_defaults'] = ['plugins_url' => 'http://plugins.example.test/catalog.php', 'themes_url' => '', 'publisher_key' => 'x'];
|
|
$check(status_plugin_site_url() === '', 'nur https wird verwendet');
|
|
unset($GLOBALS['deskhub_catalog_defaults']);
|
|
|
|
if ($failures) {
|
|
fwrite(STDERR, "Fehlgeschlagen:\n - " . implode("\n - ", $failures) . "\n");
|
|
exit(1);
|
|
}
|
|
echo "Status plugin site checks passed.\n";
|