SSH: adiciona consulta usuario Juniper
Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
1 parent
89cf8844eb
commit
7f38d16821
3 files changed
+151
-2
No files matched your search
+51
-1
@@ -139,6 +139,11 @@ class BotHandler {
|
||||
await this.handleListUsers(chatId, target);
|
||||
break;
|
||||
|
||||
case 'consultar_usuario':
|
||||
console.log(`🔍 Executando handleConsultarUsuario com target: ${target}`);
|
||||
await this.handleConsultarUsuario(chatId, target);
|
||||
break;
|
||||
|
||||
case 'admin':
|
||||
case 'administracao':
|
||||
await this.handleAdmin(chatId);
|
||||
@@ -331,6 +336,7 @@ Digite /help para ver todos os comandos disponíveis!
|
||||
• "remover onu SERIAL"
|
||||
|
||||
� **JUNIPER:**
|
||||
• "consultar usuario USER"
|
||||
• "desconectar cliente USER"
|
||||
• "listar usuários conectados"
|
||||
|
||||
@@ -463,7 +469,12 @@ Digite /help para ver todos os comandos disponíveis!
|
||||
case 'juniper':
|
||||
helpMessage = `👥 **JUNIPER - GERENCIAR USUÁRIOS**
|
||||
|
||||
**🚫 DESCONECTAR:**
|
||||
**� CONSULTAR USUÁRIO:**
|
||||
• "consultar usuario USUARIO"
|
||||
• "ver usuario USUARIO"
|
||||
• "status usuario USUARIO"
|
||||
|
||||
**�🚫 DESCONECTAR:**
|
||||
• "desconectar cliente USUARIO"
|
||||
• "kick usuário USUARIO"
|
||||
• "remover cliente USUARIO"
|
||||
@@ -821,6 +832,45 @@ Digite /help para ver todos os comandos disponíveis!
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Consultar status de um assinante específico no concentrador Juniper
|
||||
*/
|
||||
async handleConsultarUsuario(chatId, username) {
|
||||
if (!username) {
|
||||
await this.bot.sendMessage(chatId, '❓ Especifique o login do usuário. Exemplo: "consultar usuario joao@provedor"');
|
||||
return;
|
||||
}
|
||||
|
||||
await this.bot.sendMessage(chatId, `🔍 Consultando usuário *${username}* no concentrador...`, { parse_mode: 'Markdown' });
|
||||
|
||||
try {
|
||||
const result = await this.ssh.getJuniperSubscriberInfo('juniper', username);
|
||||
|
||||
if (!result.success) {
|
||||
await this.bot.sendMessage(chatId, `❌ ${result.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!result.connected) {
|
||||
await this.bot.sendMessage(chatId, `🔴 *${username}* não está conectado no concentrador.`, { parse_mode: 'Markdown' });
|
||||
return;
|
||||
}
|
||||
|
||||
const message =
|
||||
`✅ *Usuário conectado!*\n\n` +
|
||||
`👤 *Login:* \`${result.username}\`\n` +
|
||||
`🌐 *Endereço IP:* \`${result.ip || 'N/A'}\`\n` +
|
||||
`🔌 *Interface PPPoE:* \`${result.interface || 'N/A'}\`\n` +
|
||||
`\n📋 *Linha bruta:*\n\`\`\`\n${result.rawLine}\n\`\`\``;
|
||||
|
||||
await this.bot.sendMessage(chatId, message, { parse_mode: 'Markdown' });
|
||||
|
||||
} catch (error) {
|
||||
console.error('Erro ao consultar usuário:', error);
|
||||
await this.bot.sendMessage(chatId, `❌ Erro interno: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verificar sinal de ONU
|
||||
*/
|
||||
|
||||
+27
-1
@@ -31,7 +31,8 @@ class NLPProcessor {
|
||||
'fiberhome_status': ['fiberhome status', 'status fiberhome', 'conexões fiberhome', 'fiberhome conexoes', 'fiberhome conectado'],
|
||||
'dados_cliente': ['dados cliente', 'dados cadastrais', 'cadastro cliente', 'informações cliente', 'info cliente', 'perfil cliente', 'ficha cliente', 'registro cliente', 'ver dados'],
|
||||
'listar_servicos': ['listar serviços', 'servicos cliente', 'planos cliente', 'contratos cliente', 'ver servicos', 'plano cliente', 'assinaturas', 'planos', 'serviços ativos', 'ver plano'],
|
||||
'abrir_suporte': ['abrir suporte', 'criar suporte', 'adicionar suporte', 'novo suporte', 'suporte', 'chamado', 'ticket', 'atendimento', 'suporte tecnico', 'atendimento tecnico', 'abrir chamado', 'registrar chamado', 'criar chamado', 'visita tecnica', 'agendar visita', 'reclamação', 'reclamacao']
|
||||
'abrir_suporte': ['abrir suporte', 'criar suporte', 'adicionar suporte', 'novo suporte', 'suporte', 'chamado', 'ticket', 'atendimento', 'suporte tecnico', 'atendimento tecnico', 'abrir chamado', 'registrar chamado', 'criar chamado', 'visita tecnica', 'agendar visita', 'reclamação', 'reclamacao'],
|
||||
'consultar_usuario': ['consultar usuario', 'consultar user', 'ver usuario', 'status usuario', 'status user', 'info usuario', 'info user', 'checar usuario', 'verificar usuario', 'pesquisar usuario', 'localizar usuario', 'buscar usuario', 'usuario conectado', 'user conectado', 'usuario online', 'user online', 'usuario ativo', 'user ativo']
|
||||
};
|
||||
|
||||
// Padrões de comandos
|
||||
@@ -77,6 +78,9 @@ class NLPProcessor {
|
||||
/^(desconectar|kick|expulsar|remover)\s+(.+)\s+(do|no)?\s*(concentrador|juniper)?$/i,
|
||||
// Padrão genérico para desconectar (detectar se é nome de usuário)
|
||||
/^(desconectar|kick|expulsar|remover)\s+([a-zA-Z0-9_.-]+)$/i,
|
||||
// Padrões para consultar usuário específico
|
||||
/^(consultar|ver|status|info|checar|verificar|pesquisar|localizar|buscar)\s+(usuario|user)\s+(.+)$/i,
|
||||
/^(usuario|user)\s+(.+)$/i,
|
||||
// Padrões para listar usuários
|
||||
/^(listar|mostrar)\s+(usuários|usuarios|clientes|users)(\s+conectados)?$/i,
|
||||
// Padrões gerais (devem vir por último)
|
||||
@@ -229,6 +233,28 @@ class NLPProcessor {
|
||||
};
|
||||
}
|
||||
|
||||
// Detectar consulta de usuário específico no Juniper
|
||||
if (/consultar|ver|status|info|checar|verificar|pesquisar|localizar|buscar/i.test(action) && /usuario|user/i.test(fullMatch)) {
|
||||
let username = match[3] || match[2];
|
||||
return {
|
||||
action: 'consultar_usuario',
|
||||
target: username ? username.trim() : null,
|
||||
confidence: 0.95,
|
||||
type: 'consultar_usuario_pattern'
|
||||
};
|
||||
}
|
||||
|
||||
// Detectar "usuario NOME" / "user NOME"
|
||||
if (/^usuario$|^user$/i.test(action)) {
|
||||
let username = match[2];
|
||||
return {
|
||||
action: 'consultar_usuario',
|
||||
target: username ? username.trim() : null,
|
||||
confidence: 0.9,
|
||||
type: 'consultar_usuario_simple'
|
||||
};
|
||||
}
|
||||
|
||||
// Detectar comandos de suporte
|
||||
if (/abrir|criar|adicionar|novo|suporte|chamado|ticket|atendimento/i.test(action) &&
|
||||
/suporte|chamado|ticket|atendimento/i.test(fullMatch)) {
|
||||
|
||||
@@ -395,6 +395,79 @@ class SSHManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Busca informações de um assinante específico no concentrador Juniper
|
||||
* @param {string} equipmentId - ID do equipamento Juniper
|
||||
* @param {string} username - Login do usuário a pesquisar
|
||||
* @returns {Promise} - Promise com status, IP e interface PPPoE do usuário
|
||||
*/
|
||||
async getJuniperSubscriberInfo(equipmentId, username) {
|
||||
try {
|
||||
const connection = await this.connect(equipmentId);
|
||||
|
||||
if (!connection.success) {
|
||||
throw new Error(`Falha na conexão: ${connection.message}`);
|
||||
}
|
||||
|
||||
const command = `show subscribers terse | find ${username}`;
|
||||
const result = await this.executeCommand(connection.connectionId, command);
|
||||
|
||||
this.disconnect(connection.connectionId);
|
||||
|
||||
if (!result.success && !result.output) {
|
||||
return {
|
||||
success: false,
|
||||
connected: false,
|
||||
message: `Erro ao consultar assinante: ${result.error}`,
|
||||
username
|
||||
};
|
||||
}
|
||||
|
||||
// Procurar linha que contenha o username
|
||||
const lines = result.output.split('\n');
|
||||
const userLine = lines.find(l => l.includes(username));
|
||||
|
||||
if (!userLine) {
|
||||
return {
|
||||
success: true,
|
||||
connected: false,
|
||||
message: `Usuário ${username} não está conectado`,
|
||||
username,
|
||||
ip: null,
|
||||
interface: null
|
||||
};
|
||||
}
|
||||
|
||||
// Formato típico da saída terse:
|
||||
// pp0.1234 inet 203.0.113.5/32 user@dominio PPPoE
|
||||
// Colunas: interface tipo endereço usuário [estado]
|
||||
const parts = userLine.trim().split(/\s+/);
|
||||
const iface = parts[0] || null;
|
||||
// Endereço IP fica na coluna que contém "/"
|
||||
const ipField = parts.find(p => p.includes('/') || /^\d{1,3}(\.\d{1,3}){3}$/.test(p));
|
||||
const ip = ipField ? ipField.split('/')[0] : null;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
connected: true,
|
||||
message: `Usuário ${username} está conectado`,
|
||||
username,
|
||||
ip,
|
||||
interface: iface,
|
||||
rawLine: userLine.trim()
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
connected: false,
|
||||
message: `Erro ao consultar assinante: ${error.message}`,
|
||||
username,
|
||||
error: error.message
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Busca informações de uma ONU pelo serial number na OLT
|
||||
* @param {string} equipmentId - ID do equipamento OLT
|
||||
|
||||
Reference in new issue
Block a user