Import alt-mysql plugin
This commit is contained in:
@@ -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);
|
||||
};
|
||||
Reference in New Issue
Block a user