cgnat: debug

Signed-off-by: Rodrigo Martins <rodrigo@martinsevieira.adv.br>
This commit is contained in:
Rodrigo Martins committed 2026-04-09 21:52:47 -03:00
1 parent 0ae32bb1a1
commit 8449bd0442
2 files changed
+44 -14

No files matched your search

+13 -9
View File
@@ -9006,7 +9006,7 @@ Digite /help para ver todos os comandos disponíveis!
{ parse_mode: 'Markdown' } { parse_mode: 'Markdown' }
); );
const result = await this.topsapp.obterAcessosPorEstacao( const result = await this.topsapp.obterAcessosPorIp(
session.privateIP, session.privateIP,
dataStr, dataStr,
dataStr dataStr
@@ -9020,23 +9020,24 @@ Digite /help para ver todos os comandos disponíveis!
return; return;
} }
const acessos = result.data?.dados || []; if (result.total === 0) {
const extra = result.totalGeral > 0
if (acessos.length === 0) { ? `\n\n_(${result.totalGeral} registros no período, nenhum com IP \`${session.privateIP}\`)_`
: '';
await this.bot.sendMessage(chatId, await this.bot.sendMessage(chatId,
`ℹ️ Nenhum acesso encontrado para o IP \`${session.privateIP}\` em ${dataStr}.`, `ℹ️ Nenhum acesso encontrado para o IP \`${session.privateIP}\` em ${dataStr}.${extra}`,
{ parse_mode: 'Markdown' } { parse_mode: 'Markdown' }
); );
return; return;
} }
// Filtrar por hora se informada // Filtrar por hora se informada
let filtrados = acessos; let filtrados = result.dados;
if (horaStr) { if (horaStr) {
const [hh, mm] = horaStr.split(':').map(Number); const [hh, mm] = horaStr.split(':').map(Number);
const refMs = hh * 3600000 + mm * 60000; const refMs = hh * 3600000 + mm * 60000;
const janela = 3600000; // ±1 hora const janela = 3600000; // ±1 hora
filtrados = acessos.filter(a => { filtrados = result.dados.filter(a => {
const inicioMatch = a.inicio ? a.inicio.match(/(\d{2}):(\d{2})/) : null; const inicioMatch = a.inicio ? a.inicio.match(/(\d{2}):(\d{2})/) : null;
if (!inicioMatch) return true; if (!inicioMatch) return true;
const aMs = parseInt(inicioMatch[1]) * 3600000 + parseInt(inicioMatch[2]) * 60000; const aMs = parseInt(inicioMatch[1]) * 3600000 + parseInt(inicioMatch[2]) * 60000;
@@ -9046,7 +9047,7 @@ Digite /help para ver todos os comandos disponíveis!
if (filtrados.length === 0) { if (filtrados.length === 0) {
await this.bot.sendMessage(chatId, await this.bot.sendMessage(chatId,
`ℹ️ Nenhum acesso encontrado para \`${session.privateIP}\` próximo às ${horaStr} em ${dataStr}.`, `ℹ️ Nenhum acesso de \`${session.privateIP}\` próximo às ${horaStr} em ${dataStr}.\n_(${result.total} registro(s) no dia fora desse horário)_`,
{ parse_mode: 'Markdown' } { parse_mode: 'Markdown' }
); );
return; return;
@@ -9077,8 +9078,11 @@ Digite /help para ver todos os comandos disponíveis!
} }
if (result.total === 0) { if (result.total === 0) {
const extra = result.totalGeral > 0
? `\n\n_(${result.totalGeral} conexões online, nenhuma com IP \`${privateIP}\`)_`
: `\n\n_(nenhuma conexão online no momento)_`;
await this.bot.sendMessage(chatId, await this.bot.sendMessage(chatId,
`ℹ️ Nenhuma conexão ativa encontrada para o IP \`${privateIP}\` no momento.`, `ℹ️ Nenhuma conexão ativa encontrada para o IP \`${privateIP}\`.${extra}`,
{ parse_mode: 'Markdown' } { parse_mode: 'Markdown' }
); );
return; return;
+31 -5
View File
@@ -1330,19 +1330,38 @@ class TopSappManager {
} }
/** /**
* Busca acessos por estação/IP privado CGNAT no TopSapp * Busca acessos por data no TopSapp e filtra pelo IP privado CGNAT client-side
* (estacao = nome NAS, não o IP — por isso filtramos pelo campo `ip` da resposta)
*/ */
async obterAcessosPorEstacao(estacao, dataInicial, dataFinal, location = '') { async obterAcessosPorIp(privateIP, dataInicial, dataFinal, location = '') {
if (!this.isReady()) { if (!this.isReady()) {
return { success: false, error: 'TopSapp não está configurado' }; return { success: false, error: 'TopSapp não está configurado' };
} }
try { try {
const credentials = this.config.getCredentialsByLocation(location); const credentials = this.config.getCredentialsByLocation(location);
const instance = this.api.getInstanceByLocation(location); const instance = this.api.getInstanceByLocation(location);
const params = { estacao }; const params = {};
if (dataInicial) params.dataInicial = dataInicial; if (dataInicial) params.dataInicial = dataInicial;
if (dataFinal) params.dataFinal = dataFinal; if (dataFinal) params.dataFinal = dataFinal;
return await this.api.obterAcessos(params, instance, credentials); const result = await this.api.obterAcessos(params, instance, credentials);
if (!result.success) return result;
const todos = result.data?.dados || [];
console.log(`🔍 CGNAT: ${todos.length} acessos retornados para o período`);
if (todos.length > 0) {
console.log(`🔍 CGNAT: campos do primeiro registro:`, Object.keys(todos[0]));
console.log(`🔍 CGNAT: amostra ip/estacao:`, todos.slice(0, 3).map(a => ({ ip: a.ip, estacao: a.estacao, usuario: a.usuario })));
}
const encontrados = todos.filter(a => a.ip === privateIP);
return {
success: true,
dados: encontrados,
total: encontrados.length,
totalGeral: todos.length,
instance: result.instance
};
} catch (error) { } catch (error) {
return { success: false, error: error.message }; return { success: false, error: error.message };
} }
@@ -1350,6 +1369,7 @@ class TopSappManager {
/** /**
* Busca qual serviço está usando um IP privado CGNAT agora (conexões ativas) * Busca qual serviço está usando um IP privado CGNAT agora (conexões ativas)
* Usa ObterClientesServicos com conexao: "online" e filtra client-side pelo campo ip
*/ */
async buscarConexaoAtivaPorIp(privateIP, location = '') { async buscarConexaoAtivaPorIp(privateIP, location = '') {
if (!this.isReady()) { if (!this.isReady()) {
@@ -1363,12 +1383,18 @@ class TopSappManager {
if (!result.success) return result; if (!result.success) return result;
const todos = result.data?.dados || []; const todos = result.data?.dados || [];
const encontrados = todos.filter(s => s.ip === privateIP); console.log(`🔍 CGNAT ativas: ${todos.length} conexões online retornadas`);
if (todos.length > 0) {
console.log(`🔍 CGNAT ativas: campos do primeiro registro:`, Object.keys(todos[0]));
console.log(`🔍 CGNAT ativas: amostra ip/usuario:`, todos.slice(0, 3).map(s => ({ ip: s.ip, usuario: s.usuario })));
}
const encontrados = todos.filter(s => s.ip === privateIP);
return { return {
success: true, success: true,
dados: encontrados, dados: encontrados,
total: encontrados.length, total: encontrados.length,
totalGeral: todos.length,
instance: result.instance instance: result.instance
}; };
} catch (error) { } catch (error) {