Files
safekat/ci4/app/Commands/RestoreBackup.php
2025-06-12 14:57:48 +02:00

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);
}
}