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