setHelp('Este comando gera um dump SQL do banco de dados atual.') ->addOption('path', 'p', InputOption::VALUE_OPTIONAL, 'Diretório para salvar o backup', 'storage/backups') ->addOption('compress', 'c', InputOption::VALUE_NONE, 'Comprimir o backup (gzip)'); } protected function execute(InputInterface $input, OutputInterface $output): int { $output->writeln('Iniciando backup do banco de dados...'); $host = $_ENV['DB_HOST'] ?? 'localhost'; $port = $_ENV['DB_PORT'] ?? '3306'; $database = $_ENV['DB_DATABASE'] ?? 'syscms'; $username = $_ENV['DB_USERNAME'] ?? 'root'; $password = $_ENV['DB_PASSWORD'] ?? ''; $backupDir = $input->getOption('path'); // Se o caminho for relativo, resolvemos a partir da raiz do projeto if (!str_starts_with($backupDir, '/')) { $backupDir = dirname(__DIR__, 3) . '/' . ltrim($backupDir, '/'); } if (!is_dir($backupDir)) { if (!mkdir($backupDir, 0755, true)) { $output->writeln("Não foi possível criar o diretório de backup: {$backupDir}"); return Command::FAILURE; } } $filename = $database . '_' . date('Y-m-d_H-i-s') . '.sql'; $fullPath = rtrim($backupDir, '/') . '/' . $filename; // Escapamos a senha para o shell $escapedPassword = escapeshellarg($password); // Usamos mysqldump para criar o backup // Note: Se o mysqldump não estiver no PATH, este comando pode falhar $command = "mysqldump --host={$host} --port={$port} --user={$username} --password={$escapedPassword} {$database} > " . escapeshellarg($fullPath); if ($input->getOption('compress')) { $command .= " && gzip " . escapeshellarg($fullPath); $fullPath .= '.gz'; } exec($command . " 2>&1", $outputArray, $resultCode); if ($resultCode === 0) { $output->writeln("Backup concluído com sucesso: {$fullPath}"); return Command::SUCCESS; } else { $output->writeln("Erro ao realizar o backup (Código: {$resultCode})."); $output->writeln("Saída: " . implode("\n", $outputArray) . ""); return Command::FAILURE; } } }