Import alt-mysql plugin

This commit is contained in:
Marek Miklewicz
2026-07-04 15:48:19 +02:00
commit d71fcf9ace
101 changed files with 18635 additions and 0 deletions
+170
View File
@@ -0,0 +1,170 @@
<?php
declare(strict_types=1);
return static function (AppContext $ctx): void {
$ok = [];
$errors = [];
$daUser = $ctx->daUser->username();
$prefix = $ctx->daUser->prefix();
$availableDbs = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser));
$selectedDatabases = $ctx->postArray('databases');
if (empty($selectedDatabases)) {
$queryDb = $ctx->queryString('db');
if ($queryDb !== '') {
$selectedDatabases = [$queryDb];
}
}
$selectedDatabases = array_values(array_unique(array_filter($selectedDatabases, static fn(string $v): bool => $v !== '')));
$confirmDelete = $ctx->postString('confirm_delete') === '1';
if ($ctx->isPost() && !$confirmDelete) {
try {
$ctx->requireCsrf('select_delete_databases');
} catch (Throwable $e) {
$errors[] = $e->getMessage();
$selectedDatabases = [];
}
}
if ($ctx->isPost() && $confirmDelete) {
try {
$ctx->requireCsrf('delete_databases_confirm');
if (empty($selectedDatabases)) {
throw new RuntimeException('Nie wybrano baz danych do usunięcia.');
}
$deleteRelatedUsers = $ctx->postString('delete_related_users') === '1';
$deletedDbs = [];
$deletedUsers = [];
$keptUsers = [];
foreach ($selectedDatabases as $rawDb) {
try {
$dbName = NamePolicy::normalizeDatabaseName($rawDb, $prefix);
if (!in_array($dbName, $availableDbs, true)) {
$errors[] = 'Pominięto bazę spoza konta: ' . $dbName;
continue;
}
$users = $ctx->mysql->listDatabaseUsers($daUser, $dbName);
$users = array_values(array_unique($users));
foreach ($users as $roleName) {
$ctx->mysql->revokePrivileges($dbName, $roleName);
}
$ctx->mysql->dropDatabase($dbName);
$deletedDbs[] = $dbName;
if ($deleteRelatedUsers) {
foreach ($users as $roleName) {
$assigned = $ctx->mysql->roleAssignedDatabases($roleName, $daUser);
$owned = $ctx->mysql->roleOwnedDatabases($roleName, $daUser);
if (empty($assigned) && empty($owned)) {
try {
$ctx->mysql->deleteRoleHosts($daUser, $roleName);
$ctx->mysql->dropRole($roleName);
$deletedUsers[] = $roleName;
} catch (Throwable $dropErr) {
$keptUsers[] = $roleName . ' (' . $dropErr->getMessage() . ')';
}
} else {
$keptUsers[] = $roleName . ' (ma nadal przypisane bazy)';
}
}
}
} catch (Throwable $inner) {
$errors[] = $rawDb . ': ' . $inner->getMessage();
}
}
$sync = $ctx->mysql->syncHostRules();
if (!$sync['ok']) {
$errors[] = 'Operacja wykonana, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output'];
}
if (!empty($deletedDbs)) {
$ok[] = 'Usunięto bazy: ' . implode(', ', array_values(array_unique($deletedDbs)));
}
if (!empty($deletedUsers)) {
$ok[] = 'Usunięto użytkowników powiązanych z usuniętymi bazami: ' . implode(', ', array_values(array_unique($deletedUsers)));
}
if (!empty($keptUsers)) {
$errors[] = 'Użytkownicy pozostawieni: ' . implode('; ', array_values(array_unique($keptUsers)));
}
$selectedDatabases = [];
$availableDbs = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser));
} catch (Throwable $e) {
$errors[] = $e->getMessage();
}
}
if (empty($selectedDatabases)) {
$rows = '';
foreach ($availableDbs as $dbName) {
$users = $ctx->mysql->listDatabaseUsers($daUser, $dbName);
$rows .= '<tr>';
$rows .= '<td><input type="checkbox" name="databases[]" value="' . AppContext::e($dbName) . '"></td>';
$rows .= '<td>' . AppContext::e($dbName) . '</td>';
$rows .= '<td>' . AppContext::e(implode(', ', $users)) . '</td>';
$rows .= '</tr>';
}
if ($rows === '') {
$rows = '<tr><td colspan="3" class="muted">Brak baz do usunięcia.</td></tr>';
}
$body = '';
$body .= '<form method="post">';
$body .= $ctx->csrfField('select_delete_databases');
$body .= '<table><thead><tr><th></th><th>Baza</th><th>Przypisani użytkownicy</th></tr></thead><tbody>' . $rows . '</tbody></table>';
$body .= '<div class="actions"><button class="danger" type="submit">Usuń zaznaczone bazy</button></div>';
$body .= '</form>';
$ctx->renderPage('Usuwanie Baz Danych', $body, $ok, $errors);
return;
}
$confirmRows = '';
foreach ($selectedDatabases as $rawDb) {
try {
$dbName = NamePolicy::normalizeDatabaseName($rawDb, $prefix);
$users = $ctx->mysql->listDatabaseUsers($daUser, $dbName);
$confirmRows .= '<tr>';
$confirmRows .= '<td>' . AppContext::e($dbName) . '<input type="hidden" name="databases[]" value="' . AppContext::e($dbName) . '"></td>';
$confirmRows .= '<td>' . AppContext::e(implode(', ', $users)) . '</td>';
$confirmRows .= '</tr>';
} catch (Throwable $e) {
$errors[] = $rawDb . ': ' . $e->getMessage();
}
}
if ($confirmRows === '') {
$ctx->renderPage('Usuwanie Baz Danych', '<p class="muted">Brak poprawnych baz do usunięcia.</p>', $ok, $errors);
return;
}
$body = '';
$body .= '<p>Potwierdź usunięcie baz danych. Operacja jest nieodwracalna.</p>';
$body .= '<form method="post">';
$body .= $ctx->csrfField('delete_databases_confirm');
$body .= '<input type="hidden" name="confirm_delete" value="1">';
$body .= '<table><thead><tr><th>Baza</th><th>Przypisani użytkownicy</th></tr></thead><tbody>' . $confirmRows . '</tbody></table>';
$body .= '<p><label class="inline"><input type="checkbox" name="delete_related_users" value="1"> Usuń także użytkowników przypisanych do usuwanych baz (jeżeli po usunięciu baz nie mają już innych przypisań)</label></p>';
$body .= '<div class="actions">';
$body .= '<button class="danger" type="submit">Potwierdź usunięcie</button>';
$body .= '<a class="btn" href="' . AppContext::e($ctx->url('delete_databases.html')) . '">Anuluj</a>';
$body .= '</div>';
$body .= '</form>';
$ctx->renderPage('Potwierdzenie Usuwania Baz Danych', $body, $ok, $errors);
};