feat: use new backup deletion functions
This commit is contained in:
@@ -43,16 +43,28 @@ class BackupEdit extends Component
|
|||||||
#[Validate(['string'])]
|
#[Validate(['string'])]
|
||||||
public string $timezone = '';
|
public string $timezone = '';
|
||||||
|
|
||||||
#[Validate(['required', 'integer', 'min:1'])]
|
#[Validate(['required', 'integer'])]
|
||||||
public int $numberOfBackupsLocally = 1;
|
public int $databaseBackupRetentionAmountLocally = 0;
|
||||||
|
|
||||||
|
#[Validate(['required', 'integer'])]
|
||||||
|
public ?int $databaseBackupRetentionDaysLocally = 0;
|
||||||
|
|
||||||
|
#[Validate(['required', 'integer'])]
|
||||||
|
public ?int $databaseBackupRetentionAmountS3 = 0;
|
||||||
|
|
||||||
|
#[Validate(['required', 'integer'])]
|
||||||
|
public ?int $databaseBackupRetentionDaysS3 = 0;
|
||||||
|
|
||||||
|
#[Validate(['required', 'integer'])]
|
||||||
|
public ?int $databaseBackupRetentionMaxStorageS3 = 0;
|
||||||
|
|
||||||
#[Validate(['required', 'boolean'])]
|
#[Validate(['required', 'boolean'])]
|
||||||
public bool $saveS3 = false;
|
public bool $saveS3 = false;
|
||||||
|
|
||||||
#[Validate(['nullable', 'integer'])]
|
#[Validate(['required', 'integer'])]
|
||||||
public ?int $s3StorageId = 1;
|
public ?int $s3StorageId = 1;
|
||||||
|
|
||||||
#[Validate(['nullable', 'string'])]
|
#[Validate(['required', 'string'])]
|
||||||
public ?string $databasesToBackup = null;
|
public ?string $databasesToBackup = null;
|
||||||
|
|
||||||
#[Validate(['required', 'boolean'])]
|
#[Validate(['required', 'boolean'])]
|
||||||
@@ -73,7 +85,11 @@ class BackupEdit extends Component
|
|||||||
if ($toModel) {
|
if ($toModel) {
|
||||||
$this->backup->enabled = $this->backupEnabled;
|
$this->backup->enabled = $this->backupEnabled;
|
||||||
$this->backup->frequency = $this->frequency;
|
$this->backup->frequency = $this->frequency;
|
||||||
$this->backup->number_of_backups_locally = $this->numberOfBackupsLocally;
|
$this->backup->database_backup_retention_amount_locally = $this->databaseBackupRetentionAmountLocally;
|
||||||
|
$this->backup->database_backup_retention_days_locally = $this->databaseBackupRetentionDaysLocally;
|
||||||
|
$this->backup->database_backup_retention_amount_s3 = $this->databaseBackupRetentionAmountS3;
|
||||||
|
$this->backup->database_backup_retention_days_s3 = $this->databaseBackupRetentionDaysS3;
|
||||||
|
$this->backup->database_backup_retention_max_storage_s3 = $this->databaseBackupRetentionMaxStorageS3;
|
||||||
$this->backup->save_s3 = $this->saveS3;
|
$this->backup->save_s3 = $this->saveS3;
|
||||||
$this->backup->s3_storage_id = $this->s3StorageId;
|
$this->backup->s3_storage_id = $this->s3StorageId;
|
||||||
$this->backup->databases_to_backup = $this->databasesToBackup;
|
$this->backup->databases_to_backup = $this->databasesToBackup;
|
||||||
@@ -84,7 +100,11 @@ class BackupEdit extends Component
|
|||||||
$this->backupEnabled = $this->backup->enabled;
|
$this->backupEnabled = $this->backup->enabled;
|
||||||
$this->frequency = $this->backup->frequency;
|
$this->frequency = $this->backup->frequency;
|
||||||
$this->timezone = data_get($this->backup->server(), 'settings.server_timezone', 'Instance timezone');
|
$this->timezone = data_get($this->backup->server(), 'settings.server_timezone', 'Instance timezone');
|
||||||
$this->numberOfBackupsLocally = $this->backup->number_of_backups_locally;
|
$this->databaseBackupRetentionAmountLocally = $this->backup->database_backup_retention_amount_locally;
|
||||||
|
$this->databaseBackupRetentionDaysLocally = $this->backup->database_backup_retention_days_locally;
|
||||||
|
$this->databaseBackupRetentionAmountS3 = $this->backup->database_backup_retention_amount_s3;
|
||||||
|
$this->databaseBackupRetentionDaysS3 = $this->backup->database_backup_retention_days_s3;
|
||||||
|
$this->databaseBackupRetentionMaxStorageS3 = $this->backup->database_backup_retention_max_storage_s3;
|
||||||
$this->saveS3 = $this->backup->save_s3;
|
$this->saveS3 = $this->backup->save_s3;
|
||||||
$this->s3StorageId = $this->backup->s3_storage_id;
|
$this->s3StorageId = $this->backup->s3_storage_id;
|
||||||
$this->databasesToBackup = $this->backup->databases_to_backup;
|
$this->databasesToBackup = $this->backup->databases_to_backup;
|
||||||
@@ -104,10 +124,10 @@ class BackupEdit extends Component
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if ($this->delete_associated_backups_locally) {
|
if ($this->delete_associated_backups_locally) {
|
||||||
$this->deleteAssociatedBackupsLocally();
|
deleteOldBackupsLocally($this->backup);
|
||||||
}
|
}
|
||||||
if ($this->delete_associated_backups_s3) {
|
if ($this->delete_associated_backups_s3 && $this->backup->s3) {
|
||||||
$this->deleteAssociatedBackupsS3();
|
deleteOldBackupsFromS3($this->backup);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->backup->delete();
|
$this->backup->delete();
|
||||||
@@ -160,63 +180,12 @@ class BackupEdit extends Component
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function deleteAssociatedBackupsLocally()
|
|
||||||
{
|
|
||||||
$executions = $this->backup->executions;
|
|
||||||
$backupFolder = null;
|
|
||||||
|
|
||||||
foreach ($executions as $execution) {
|
|
||||||
if ($this->backup->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
|
|
||||||
$server = $this->backup->database->service->destination->server;
|
|
||||||
} else {
|
|
||||||
$server = $this->backup->database->destination->server;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $backupFolder) {
|
|
||||||
$backupFolder = dirname($execution->filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_backup_locally($execution->filename, $server);
|
|
||||||
$execution->delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str($backupFolder)->isNotEmpty()) {
|
|
||||||
$this->deleteEmptyBackupFolder($backupFolder, $server);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function deleteAssociatedBackupsS3()
|
|
||||||
{
|
|
||||||
// Add function to delete backups from S3
|
|
||||||
}
|
|
||||||
|
|
||||||
private function deleteAssociatedBackupsSftp()
|
|
||||||
{
|
|
||||||
// Add function to delete backups from SFTP
|
|
||||||
}
|
|
||||||
|
|
||||||
private function deleteEmptyBackupFolder($folderPath, $server)
|
|
||||||
{
|
|
||||||
$checkEmpty = instant_remote_process(["[ -z \"$(ls -A '$folderPath')\" ] && echo 'empty' || echo 'not empty'"], $server);
|
|
||||||
|
|
||||||
if (trim($checkEmpty) === 'empty') {
|
|
||||||
instant_remote_process(["rmdir '$folderPath'"], $server);
|
|
||||||
|
|
||||||
$parentFolder = dirname($folderPath);
|
|
||||||
$checkParentEmpty = instant_remote_process(["[ -z \"$(ls -A '$parentFolder')\" ] && echo 'empty' || echo 'not empty'"], $server);
|
|
||||||
|
|
||||||
if (trim($checkParentEmpty) === 'empty') {
|
|
||||||
instant_remote_process(["rmdir '$parentFolder'"], $server);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
return view('livewire.project.database.backup-edit', [
|
return view('livewire.project.database.backup-edit', [
|
||||||
'checkboxes' => [
|
'checkboxes' => [
|
||||||
['id' => 'delete_associated_backups_locally', 'label' => __('database.delete_backups_locally')],
|
['id' => 'delete_associated_backups_locally', 'label' => __('database.delete_backups_locally')],
|
||||||
// ['id' => 'delete_associated_backups_s3', 'label' => 'All backups associated with this backup job from this database will be permanently deleted from the selected S3 Storage.']
|
['id' => 'delete_associated_backups_s3', 'label' => 'All backups associated with this backup job for this database will be permanently deleted from the selected S3 Storage.'],
|
||||||
// ['id' => 'delete_associated_backups_sftp', 'label' => 'All backups associated with this backup job from this database will be permanently deleted from the selected SFTP Storage.']
|
// ['id' => 'delete_associated_backups_sftp', 'label' => 'All backups associated with this backup job from this database will be permanently deleted from the selected SFTP Storage.']
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ class BackupExecutions extends Component
|
|||||||
|
|
||||||
public $setDeletableBackup;
|
public $setDeletableBackup;
|
||||||
|
|
||||||
public $delete_backup_s3 = true;
|
public $delete_backup_s3 = false;
|
||||||
|
|
||||||
public $delete_backup_sftp = true;
|
public $delete_backup_sftp = false;
|
||||||
|
|
||||||
public function getListeners()
|
public function getListeners()
|
||||||
{
|
{
|
||||||
@@ -57,18 +57,14 @@ class BackupExecutions extends Component
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($execution->scheduledDatabaseBackup->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
|
$server = $execution->scheduledDatabaseBackup->database->getMorphClass() === \App\Models\ServiceDatabase::class
|
||||||
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->service->destination->server);
|
? $execution->scheduledDatabaseBackup->database->service->destination->server
|
||||||
} else {
|
: $execution->scheduledDatabaseBackup->database->destination->server;
|
||||||
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->destination->server);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->delete_backup_s3) {
|
deleteBackupsLocally($execution->filename, $server);
|
||||||
// Add logic to delete from S3
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->delete_backup_sftp) {
|
if ($this->delete_backup_s3 && $execution->scheduledDatabaseBackup->s3) {
|
||||||
// Add logic to delete from SFTP
|
deleteBackupsS3($execution->filename, $server, $execution->scheduledDatabaseBackup->s3);
|
||||||
}
|
}
|
||||||
|
|
||||||
$execution->delete();
|
$execution->delete();
|
||||||
@@ -143,7 +139,7 @@ class BackupExecutions extends Component
|
|||||||
return view('livewire.project.database.backup-executions', [
|
return view('livewire.project.database.backup-executions', [
|
||||||
'checkboxes' => [
|
'checkboxes' => [
|
||||||
['id' => 'delete_backup_s3', 'label' => 'Delete the selected backup permanently form S3 Storage'],
|
['id' => 'delete_backup_s3', 'label' => 'Delete the selected backup permanently form S3 Storage'],
|
||||||
['id' => 'delete_backup_sftp', 'label' => 'Delete the selected backup permanently form SFTP Storage'],
|
// ['id' => 'delete_backup_sftp', 'label' => 'Delete the selected backup permanently form SFTP Storage'],
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
@endif
|
@endif
|
||||||
<x-modal-confirmation title="Confirm Backup Deletion?" buttonTitle="Delete" isErrorButton
|
<x-modal-confirmation title="Confirm Backup Deletion?" buttonTitle="Delete" isErrorButton
|
||||||
submitAction="deleteBackup({{ data_get($execution, 'id') }})"
|
submitAction="deleteBackup({{ data_get($execution, 'id') }})"
|
||||||
|
:checkboxes="$checkboxes"
|
||||||
:actions="['This backup will be permanently deleted from local storage.']" confirmationText="{{ data_get($execution, 'filename') }}"
|
:actions="['This backup will be permanently deleted from local storage.']" confirmationText="{{ data_get($execution, 'filename') }}"
|
||||||
confirmationLabel="Please confirm the execution of the actions by entering the Backup Filename below"
|
confirmationLabel="Please confirm the execution of the actions by entering the Backup Filename below"
|
||||||
shortConfirmationLabel="Backup Filename" step3ButtonText="Permanently Delete" />
|
shortConfirmationLabel="Backup Filename" step3ButtonText="Permanently Delete" />
|
||||||
|
|||||||
Reference in New Issue
Block a user