UNPKG

cartorio-plataforma-cli

Version:

CLI para gerenciar a Plataforma do Cartório de Criciúma com sistema de módulos

206 lines (176 loc) 6.56 kB
const inquirer = require('inquirer'); const chalk = require('chalk'); const { execSync } = require('child_process'); const ora = require('ora'); const path = require('path'); const boxen = require('boxen'); /** * Função que exibe logs dos componentes da plataforma */ module.exports = async function logs(options) { let env = options.env || 'local'; let follow = options.follow || false; let service = options.service || null; // Caminho base para o diretório plataforma-infra const baseDir = path.resolve(__dirname, '../..'); // Modo interativo if (options.interactive) { // Seleção do ambiente const { selectedEnv } = await inquirer.prompt([ { type: 'list', name: 'selectedEnv', message: 'Selecione o ambiente para visualizar logs:', choices: [ { name: 'Desenvolvimento (dev)', value: 'dev' }, { name: 'Local (local)', value: 'local' }, { name: 'Produção (prod)', value: 'prod' } ], default: env } ]); env = selectedEnv; // Obter a lista de serviços em execução const spinner = ora('Obtendo serviços em execução...').start(); let containers = []; try { const containerList = execSync(`cd "${baseDir}" && docker compose --profile ${env} --env-file .env.${env} ps --format json`).toString(); containers = JSON.parse(`[${containerList.trim().split('\n').join(',')}]`); spinner.succeed('Serviços em execução obtidos com sucesso!'); } catch (error) { spinner.fail('Erro ao obter serviços em execução'); console.error(error); return; } // Se não houver contêineres em execução if (containers.length === 0) { console.log(chalk.yellow('\nNenhum serviço em execução no ambiente selecionado.')); return; } // Agrupar serviços por categoria const infraServices = containers.filter(c => ['consul', 'postgres', 'traefik'].some(s => c.Service.includes(s))); const coreServices = containers.filter(c => ['root-config', 'plataforma-frontend', 'plataforma-backend'].some(s => c.Service.includes(s))); const moduleServices = containers.filter(c => ['modulo1', 'minutador'].some(s => c.Service.includes(s))); // Criar lista de choices para serviços const choices = [ { name: 'Todos os serviços', value: 'all' }, new inquirer.Separator('--- Serviços de Infraestrutura ---') ]; // Adicionar serviços de infraestrutura infraServices.forEach(container => { choices.push({ name: `⚙️ ${container.Service}`, value: container.Service }); }); // Adicionar divisor para serviços core choices.push(new inquirer.Separator('--- Serviços Core ---')); // Adicionar serviços core coreServices.forEach(container => { choices.push({ name: `🔵 ${container.Service}`, value: container.Service }); }); // Adicionar divisor para serviços de módulos choices.push(new inquirer.Separator('--- Serviços de Módulos ---')); // Adicionar serviços de módulos moduleServices.forEach(container => { choices.push({ name: `🟢 ${container.Service}`, value: container.Service }); }); // Perguntar de qual serviço exibir logs const { selectedService, followLogs, lines } = await inquirer.prompt([ { type: 'list', name: 'selectedService', message: 'De qual serviço você deseja visualizar logs?', choices: choices, pageSize: 15 }, { type: 'confirm', name: 'followLogs', message: 'Deseja acompanhar os logs em tempo real (follow)?', default: true }, { type: 'list', name: 'lines', message: 'Quantas linhas de log deseja exibir?', choices: [ { name: '50 linhas', value: 50 }, { name: '100 linhas', value: 100 }, { name: '500 linhas', value: 500 }, { name: 'Todas as linhas', value: 'all' } ], default: 100 } ]); service = selectedService === 'all' ? null : selectedService; follow = followLogs; // Exibir informações sobre os logs que serão mostrados console.log( boxen( chalk.blue(`📋 Exibindo logs dos componentes da plataforma`) + '\n\n' + chalk.white(`Ambiente: ${chalk.green(env)}`) + '\n' + chalk.white(`Serviço: ${chalk.yellow(service || 'Todos os serviços')}`) + '\n' + chalk.white(`Acompanhamento em tempo real: ${follow ? chalk.green('Sim') : chalk.red('Não')}`) + '\n' + chalk.white(`Número de linhas: ${chalk.cyan(lines === 'all' ? 'Todas' : lines)}`), { padding: 1, borderColor: 'blue', borderStyle: 'round' } ) ); // Comando para exibir logs let command = `cd "${baseDir}" && ENVIRONMENT=${env} docker compose --profile ${env} --env-file .env.${env} logs`; // Adicionar opções if (follow) { command += ' --follow'; } if (lines !== 'all') { command += ` --tail=${lines}`; } if (service) { command += ` ${service}`; } console.log(chalk.dim(`\nExecutando: ${command}\n`)); try { execSync(command, { stdio: 'inherit', }); } catch (error) { console.error(chalk.red('Erro ao exibir logs!')); console.error(error); process.exit(1); } return; } // Modo não interativo console.log( boxen( chalk.blue(`📋 Exibindo logs dos componentes da plataforma`) + '\n\n' + chalk.white(`Ambiente: ${chalk.green(env)}`) + '\n' + chalk.white(`Serviço: ${chalk.yellow(service || 'Todos os serviços')}`) + '\n' + chalk.white(`Acompanhamento em tempo real: ${follow ? chalk.green('Sim') : chalk.red('Não')}`), { padding: 1, borderColor: 'blue', borderStyle: 'round' } ) ); try { // Comando para exibir logs let command = `cd "${baseDir}" && ENVIRONMENT=${env} docker compose --profile ${env} --env-file .env.${env} logs`; // Adicionar opções if (follow) { command += ' --follow'; } if (service) { command += ` ${service}`; } console.log(chalk.dim(`\nExecutando: ${command}\n`)); execSync(command, { stdio: 'inherit', }); } catch (error) { console.error(chalk.red('Erro ao exibir logs!')); console.error(error); process.exit(1); } };