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