mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
94 lines
2.9 KiB
PHP
94 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Commands;
|
|
|
|
use CodeIgniter\CLI\BaseCommand;
|
|
use CodeIgniter\CLI\CLI;
|
|
use ZipArchive;
|
|
|
|
class RestoreBackup extends BaseCommand
|
|
{
|
|
protected $group = 'Safekat';
|
|
protected $name = 'restore:backup';
|
|
protected $description = 'Restaura un backup desde un archivo .zip en writable/backups/.';
|
|
protected $usage = 'restore:backup [--dry-run]';
|
|
protected $options = [
|
|
'--dry-run' => 'Simula el proceso de restauración sin ejecutarlo realmente.',
|
|
];
|
|
|
|
public function run(array $params)
|
|
{
|
|
$isDryRun = CLI::getOption('dry-run');
|
|
|
|
$backupDir = WRITEPATH . 'backups/';
|
|
$backups = glob($backupDir . '*.zip');
|
|
|
|
if (empty($backups)) {
|
|
CLI::error("No se encontraron backups .zip en: $backupDir");
|
|
return;
|
|
}
|
|
|
|
CLI::write("Backups disponibles:", 'blue');
|
|
foreach ($backups as $i => $file) {
|
|
CLI::write("[" . ($i + 1) . "] " . basename($file));
|
|
}
|
|
|
|
$index = CLI::prompt("Selecciona el número del backup a restaurar", null, 'required');
|
|
|
|
if (!is_numeric($index) || $index < 1 || $index > count($backups)) {
|
|
CLI::error("Selección no válida.");
|
|
return;
|
|
}
|
|
|
|
$selectedFile = $backups[$index - 1];
|
|
CLI::write("🎯 Seleccionado: " . basename($selectedFile), 'cyan');
|
|
|
|
if ($isDryRun) {
|
|
CLI::write("🔍 Modo simulación activado (--dry-run)", 'yellow');
|
|
}
|
|
|
|
$zip = new ZipArchive();
|
|
if ($zip->open($selectedFile) !== TRUE) {
|
|
CLI::error("No se pudo abrir el archivo ZIP.");
|
|
return;
|
|
}
|
|
|
|
$extractPath = WRITEPATH . 'backups/tmp_restore/';
|
|
if (!is_dir($extractPath)) {
|
|
mkdir($extractPath, 0775, true);
|
|
}
|
|
|
|
$zip->extractTo($extractPath);
|
|
$zip->close();
|
|
|
|
$sqlFiles = glob($extractPath . '*.sql');
|
|
if (count($sqlFiles) === 0) {
|
|
CLI::error("No se encontró ningún .sql dentro del backup.");
|
|
return;
|
|
}
|
|
|
|
$sqlFile = escapeshellarg($sqlFiles[0]);
|
|
$db = config('Database')->default;
|
|
|
|
$cmd = "mysql -h {$db['hostname']} -u {$db['username']} -p'{$db['password']}' {$db['database']} < {$sqlFile}";
|
|
|
|
if ($isDryRun) {
|
|
CLI::write("📋 Comando que se ejecutaría:", 'yellow');
|
|
CLI::write($cmd, 'light_gray');
|
|
CLI::write("✅ Simulación completa. No se hizo ninguna modificación.", 'green');
|
|
} else {
|
|
CLI::write("⏳ Restaurando...", 'yellow');
|
|
system($cmd, $retval);
|
|
|
|
if ($retval !== 0) {
|
|
CLI::error("❌ Error al restaurar la base de datos (código $retval).");
|
|
} else {
|
|
CLI::write("✅ Backup restaurado correctamente.", 'green');
|
|
}
|
|
}
|
|
|
|
array_map('unlink', glob($extractPath . '*'));
|
|
rmdir($extractPath);
|
|
}
|
|
}
|