From 5a3ebc607cc263cd54765fe85331a32c7f7b2edc Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Wed, 15 Apr 2026 01:27:52 +0200 Subject: [PATCH] asdsad --- modules/kea/module.json | 6 +- partials/landingpages/modules/setup.php | 169 +++++++++++++++++++++--- public/assets/css/app.css | 12 ++ 3 files changed, 165 insertions(+), 22 deletions(-) diff --git a/modules/kea/module.json b/modules/kea/module.json index f1d5072..31cf00e 100644 --- a/modules/kea/module.json +++ b/modules/kea/module.json @@ -47,11 +47,11 @@ "password": "" }, "metadata_db_defaults": { - "driver": "pgsql", + "driver": "mysql", "host": "192.168.178.10", - "port": 5432, + "port": 3306, "dbname": "", - "schema": "public", + "schema": "", "user": "", "password": "" } diff --git a/partials/landingpages/modules/setup.php b/partials/landingpages/modules/setup.php index 771f790..adc2072 100644 --- a/partials/landingpages/modules/setup.php +++ b/partials/landingpages/modules/setup.php @@ -34,6 +34,10 @@ $metadataDefaults = $module['metadata_db_defaults'] ?? []; if (empty($current['metadata_db']) && is_array($metadataDefaults)) { $current['metadata_db'] = $metadataDefaults; } +$dbDefaultsByGroup = [ + 'db' => is_array($defaults) ? $defaults : [], + 'metadata_db' => is_array($metadataDefaults) ? $metadataDefaults : [], +]; $setNested = function (array &$target, string $path, mixed $value): void { $parts = explode('.', $path); @@ -100,7 +104,84 @@ $driverOptions = [ 'sqlite' => 'SQLite', ]; -$renderField = function (array $field) use ($current, $getNested, $driverOptions): void { +$describeDbConfig = static function (array $dbConfig): string { + $driver = (string)($dbConfig['driver'] ?? ''); + $host = (string)($dbConfig['host'] ?? ''); + $port = (string)($dbConfig['port'] ?? ''); + + return 'Aktive Einstellung: Treiber ' . ($driver !== '' ? $driver : 'nicht gesetzt') + . ', Host ' . ($host !== '' ? $host : 'nicht gesetzt') + . ', Port ' . ($port !== '' ? $port : 'nicht gesetzt') . '.'; +}; + +$describeDbDefaults = static function (array $dbDefaults): string { + $driver = (string)($dbDefaults['driver'] ?? ''); + $host = (string)($dbDefaults['host'] ?? ''); + $port = (string)($dbDefaults['port'] ?? ''); + + if ($driver === '' && $host === '' && $port === '') { + return ''; + } + + return 'Standard: Treiber ' . ($driver !== '' ? $driver : 'nicht gesetzt') + . ', Host ' . ($host !== '' ? $host : 'nicht gesetzt') + . ', Port ' . ($port !== '' ? $port : 'nicht gesetzt') . '.'; +}; + +$dbConfigWarning = static function (array $dbConfig): ?string { + $driver = (string)($dbConfig['driver'] ?? ''); + $port = (string)($dbConfig['port'] ?? ''); + + if ($driver === 'pgsql' && $port === '3306') { + return 'Port 3306 ist typisch fuer MySQL/MariaDB, aber als Treiber ist PostgreSQL ausgewaehlt. Bitte den Treiber auf MySQL / MariaDB stellen.'; + } + + if ($driver === 'mysql' && $port === '5432') { + return 'Port 5432 ist typisch fuer PostgreSQL, aber als Treiber ist MySQL / MariaDB ausgewaehlt. Bitte Port oder Treiber pruefen.'; + } + + return null; +}; + +$dbConfigHint = static function (string $group, array $dbConfig, array $dbDefaults): ?string { + if ($group !== 'metadata_db') { + return null; + } + + $driver = (string)($dbConfig['driver'] ?? ''); + $host = (string)($dbConfig['host'] ?? ''); + $port = (string)($dbConfig['port'] ?? ''); + $defaultDriver = (string)($dbDefaults['driver'] ?? ''); + $defaultHost = (string)($dbDefaults['host'] ?? ''); + $defaultPort = (string)($dbDefaults['port'] ?? ''); + + if ($driver !== $defaultDriver || $host !== $defaultHost || $port !== $defaultPort) { + return 'Diese Verbindung ist fuer Nexus-eigene DHCP-Zusatzinfos gedacht, nicht fuer die Nexus-App/Base-DB. Erwartet wird normalerweise: ' + . ($defaultDriver !== '' ? $defaultDriver : 'Treiber offen') + . ' auf ' + . ($defaultHost !== '' ? $defaultHost : 'Host offen') + . ':' + . ($defaultPort !== '' ? $defaultPort : 'Port offen') + . '.'; + } + + return null; +}; + +$normalizeDriver = static function (mixed $value): mixed { + if (!is_string($value)) { + return $value; + } + + $normalized = strtolower(trim($value)); + return match ($normalized) { + 'postgres', 'postgresql' => 'pgsql', + 'mariadb', 'mysql/mariadb', 'mysql / mariadb' => 'mysql', + default => $normalized, + }; +}; + +$renderField = function (array $field) use (&$current, $getNested, $driverOptions): void { $name = (string)($field['name'] ?? ''); if ($name === '') { return; @@ -162,6 +243,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { continue; } $value = is_string($value) ? trim($value) : $value; + if (str_ends_with($name, '.driver')) { + $value = $normalizeDriver($value); + } if ($name === 'kea_auto_init') { $payload[$name] = $value === '1'; @@ -179,7 +263,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $current = array_replace_recursive($current, $payload); $postedTestGroup = (string)($_POST['test_db'] ?? ''); - if ($postedTestGroup !== '') { + $postedResetGroup = (string)($_POST['reset_db'] ?? ''); + if ($postedResetGroup !== '') { + $testGroup = $postedResetGroup; + if (!array_key_exists($postedResetGroup, $dbGroups)) { + $error = 'Unbekannte Datenbank-Konfiguration.'; + } elseif (($dbDefaultsByGroup[$postedResetGroup] ?? []) === []) { + $dbTestMessages[$postedResetGroup] = [ + 'type' => 'error', + 'text' => 'Fuer diese Datenbank sind keine Standardwerte hinterlegt.', + ]; + } else { + $current[$postedResetGroup] = $dbDefaultsByGroup[$postedResetGroup]; + $dbTestMessages[$postedResetGroup] = [ + 'type' => 'success', + 'text' => 'Standardwerte geladen. Bitte pruefen und speichern.', + ]; + } + } elseif ($postedTestGroup !== '') { $testGroup = $postedTestGroup; if (!array_key_exists($postedTestGroup, $dbGroups)) { $error = 'Unbekannte Datenbank-Konfiguration.'; @@ -191,23 +292,31 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'text' => 'Datenbank-Konfiguration ist unvollstaendig.', ]; } else { - try { - $dbConfig['options'] = array_replace([ - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, - \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, - ], (array)($dbConfig['options'] ?? [])); - - $testPdo = \App\Database::createFromArray($dbConfig); - $testPdo->query('SELECT 1')->fetchColumn(); - $dbTestMessages[$postedTestGroup] = [ - 'type' => 'success', - 'text' => 'Verbindung erfolgreich.', - ]; - } catch (\Throwable $e) { + $warning = $dbConfigWarning($dbConfig); + if ($warning !== null) { $dbTestMessages[$postedTestGroup] = [ 'type' => 'error', - 'text' => 'Verbindung fehlgeschlagen. ' . $e->getMessage(), + 'text' => $warning . ' ' . $describeDbConfig($dbConfig), ]; + } else { + try { + $dbConfig['options'] = array_replace([ + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, + \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, + ], (array)($dbConfig['options'] ?? [])); + + $testPdo = \App\Database::createFromArray($dbConfig); + $testPdo->query('SELECT 1')->fetchColumn(); + $dbTestMessages[$postedTestGroup] = [ + 'type' => 'success', + 'text' => 'Verbindung erfolgreich. ' . $describeDbConfig($dbConfig), + ]; + } catch (\Throwable $e) { + $dbTestMessages[$postedTestGroup] = [ + 'type' => 'error', + 'text' => 'Verbindung fehlgeschlagen. ' . $describeDbConfig($dbConfig) . ' ' . $e->getMessage(), + ]; + } } } } @@ -278,20 +387,42 @@ $activeDbGroup = $testGroup !== null && array_key_exists($testGroup, $dbGroups)
$label): ?> +
>

konfigurieren

+ +

+ +
+
+ + + +
-
+ +
+ +
diff --git a/public/assets/css/app.css b/public/assets/css/app.css index e35c46b..d58d63c 100644 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -701,6 +701,18 @@ a { background: color-mix(in srgb, #d92d20 10%, var(--surface)); } +.setup-db-message--hint { + border-color: color-mix(in srgb, var(--accent) 48%, var(--line)); + background: color-mix(in srgb, var(--accent) 10%, var(--surface)); +} + +.setup-db-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; + justify-content: flex-end; +} + .setup-db-panels { display: grid; gap: 14px;