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