fiberhome: add prelimunary add ONU support

Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
rodrigo committed 2026-02-10 20:00:44 -03:00
1 parent ee22ecf693
commit e5f8bcf546
2 files changed
+244 -115

No files matched your search

+139 -105
View File
@@ -2,6 +2,7 @@ const NLPProcessor = require('../nlp/processor');
const SSHManager = require('../ssh/manager');
const { TopSappManager } = require('../topsapp');
const FiberhomeManager = require('../fiberhome/manager');
const FiberhomeTL1Manager = require('../fiberhome/manager_tl1');
const config = require('../config/config');
const logger = require('../utils/logger');
const DateProcessor = require('../utils/dateProcessor');
@@ -13,6 +14,7 @@ class BotHandler {
this.ssh = new SSHManager();
this.topsapp = new TopSappManager();
this.fiberhome = new FiberhomeManager();
this.fiberhomeTL1 = new FiberhomeTL1Manager();
this.dateProcessor = new DateProcessor();
this.userSessions = new Map(); // Armazena sessões de usuário
this.suporteSessions = new Map(); // Armazena sessões de suporte em andamento
@@ -895,10 +897,14 @@ Digite /help para ver todos os comandos disponíveis!
const result = await this.ssh.checkOnuSignalBySerial(oltId, serialNumber);
if (result.success) {
let message = `📡 *Sinal da ONU ${serialNumber}*\n\n`;
message += `🏢 **OLT:** ${olt.name} (${olt.host})\n`;
message += `📍 **Localização:** Slot ${result.slot}, ONU ${result.onuId}\n\n`;
message += `📊 **Informações do Sinal:**\n`;
// Escapar caracteres especiais do Markdown
const oltNameEscaped = olt.name.replace(/_/g, '\\_');
const serialEscaped = serialNumber.replace(/_/g, '\\_');
let message = `📡 *Sinal da ONU ${serialEscaped}*\n\n`;
message += `🏢 *OLT:* ${oltNameEscaped} (${olt.host})\n`;
message += `📍 *Localização:* Slot ${result.slot}, ONU ${result.onuId}\n\n`;
message += `📊 *Informações do Sinal:*\n`;
message += `\`\`\`\n${result.signalOutput}\n\`\`\``;
await this.bot.sendMessage(chatId, message, { parse_mode: 'Markdown' });
@@ -975,8 +981,11 @@ Digite /help para ver todos os comandos disponíveis!
{ text: '❌ Cancelar', callback_data: 'cancel_action' }
]);
// Escapar caracteres especiais do serial
const serialEscaped = serialNumber.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId,
`🗑️ **Remover ONU ${serialNumber}**\n\n` +
`🗑️ *Remover ONU ${serialEscaped}*\n\n` +
'🏢 Selecione a OLT onde a ONU está configurada:',
{
reply_markup: keyboard,
@@ -1013,8 +1022,11 @@ Digite /help para ver todos os comandos disponíveis!
{ text: '❌ Cancelar', callback_data: 'cancel_action' }
]);
// Escapar caracteres especiais
const serialEscaped = serialNumber.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId,
`➕ **Adicionar ONU ${serialNumber}**\n\n` +
`➕ *Adicionar ONU ${serialEscaped}*\n\n` +
'🏢 Selecione a OLT onde deseja adicionar a ONU:',
{
reply_markup: keyboard,
@@ -1056,10 +1068,13 @@ Digite /help para ver todos os comandos disponíveis!
{ text: '❌ Cancelar', callback_data: 'cancel_action' }
]);
// Escapar caracteres especiais
const serialEscaped = serialNumber.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId,
`➕ **Adicionar ONU com VLAN Customizada**\n\n` +
`📱 **Serial:** ${serialNumber}\n` +
`🏷️ **VLAN:** ${vlanId}\n\n` +
`➕ *Adicionar ONU com VLAN Customizada*\n\n` +
`📱 *Serial:* ${serialEscaped}\n` +
`🏷️ *VLAN:* ${vlanId}\n\n` +
'🏢 Selecione a OLT onde deseja adicionar a ONU:',
{
reply_markup: keyboard,
@@ -1081,6 +1096,8 @@ Digite /help para ver todos os comandos disponíveis!
return;
}
console.log(`📝 Criando sessão para usuário ${userId}, serial: ${serialNumber}`);
// Criar sessão para coletar informações
this.userSessions.set(userId, {
action: 'adicionar_onu_fiberhome_step1',
@@ -1088,12 +1105,17 @@ Digite /help para ver todos os comandos disponíveis!
timestamp: Date.now()
});
console.log(`✅ Sessão criada. Sessões ativas:`, this.userSessions.size);
// Escapar caracteres especiais
const serialEscaped = serialNumber.replace(/_/g, '\\_');
// Perguntar o alias/nome do usuário
await this.bot.sendMessage(chatId,
`➕ **Adicionar ONU Fiberhome**\n\n` +
`📱 **Serial:** ${serialNumber}\n` +
`➕ *Adicionar ONU Fiberhome*\n\n` +
`📱 *Serial:* ${serialEscaped}\n` +
`🔍 A porta PON será descoberta automaticamente\n\n` +
'👤 Digite o **nome/alias** do usuário:',
'👤 Digite o *nome/alias* do usuário:',
{ parse_mode: 'Markdown' }
);
}
@@ -1103,57 +1125,77 @@ Digite /help para ver todos os comandos disponíveis!
*/
async handleUserSessionInput(chatId, text, userId, session) {
try {
switch (session.action) {
case 'adicionar_onu_fiberhome_step1':
// Recebeu o nome do usuário, agora perguntar pelo tipo da ONU
session.usuario = text.trim();
session.action = 'adicionar_onu_fiberhome_step2';
this.userSessions.set(userId, session);
console.log(`🔄 Processando input de sessão. Action: ${session.action}, Type: ${session.type}, Text: ${text}`);
// Verificar se é sessão baseada em action (Fiberhome ONU)
if (session.action) {
switch (session.action) {
case 'adicionar_onu_fiberhome_step1':
// Recebeu o nome do usuário, adicionar sufixo e perguntar pelo tipo da ONU
const usuarioBase = text.trim();
session.usuario = usuarioBase.includes('@') ? usuarioBase : `${usuarioBase}@clicknetguarai.com.br`;
session.action = 'adicionar_onu_fiberhome_step2';
this.userSessions.set(userId, session);
const keyboard = {
inline_keyboard: [
[{ text: '🔌 AN5506-02-B (2 portas)', callback_data: 'fh_onu_type_AN5506-02-B' }],
[{ text: '🔌 AN5506-01-A (1 porta)', callback_data: 'fh_onu_type_AN5506-01-A' }],
[{ text: '❌ Cancelar', callback_data: 'cancel_action' }]
]
};
const keyboard = {
inline_keyboard: [
[{ text: '🔌 AN5506-02-B (2 portas)', callback_data: 'fh_onu_type_AN5506-02-B' }],
[{ text: '🔌 AN5506-01-A (1 porta)', callback_data: 'fh_onu_type_AN5506-01-A' }],
[{ text: '❌ Cancelar', callback_data: 'cancel_action' }]
]
};
await this.bot.sendMessage(chatId,
`📡 **Porta PON:** ${session.portAlias}\n\n` +
'🔌 Selecione o **tipo da ONU**:',
{ reply_markup: keyboard, parse_mode: 'Markdown' }
);
break;
await this.bot.sendMessage(chatId,
`👤 **Usuário:** ${session.usuario}\n\n` +
'🔌 Selecione o **tipo da ONU**:',
{ reply_markup: keyboard, parse_mode: 'Markdown' }
);
return;
case 'adicionar_onu_fiberhome_step5':
// Recebeu confirmação de VLAN customizada
const vlanInput = text.trim();
if (vlanInput && !isNaN(vlanInput)) {
const vlan = parseInt(vlanInput);
if (vlan >= 1 && vlan <= 4094) {
session.vlan = vlan;
case 'adicionar_onu_fiberhome_step3':
// Recebeu confirmação de VLAN customizada
const vlanInput = text.trim();
if (vlanInput && !isNaN(vlanInput)) {
const vlan = parseInt(vlanInput);
if (vlan >= 1 && vlan <= 4094) {
session.vlan = vlan;
} else {
await this.bot.sendMessage(chatId, '❌ VLAN inválida. Usando VLAN padrão 1002.');
session.vlan = 1002;
}
} else {
await this.bot.sendMessage(chatId, '❌ VLAN inválida. Usando VLAN padrão 1002.');
session.vlan = 1002;
}
} else {
session.vlan = 1002;
}
// Limpar sessão
this.userSessions.delete(userId);
// Limpar sessão
this.userSessions.delete(userId);
// Executar adição da ONU
await this.executarAdicaoOnuFiberhome(chatId, session);
break;
default:
// Sessão desconhecida, limpar
this.userSessions.delete(userId);
await this.bot.sendMessage(chatId, '❌ Sessão expirada. Por favor, comece novamente.');
break;
// Executar adição da ONU
await this.executarAdicaoOnuFiberhome(chatId, session);
return;
}
}
// Verificar se é sessão baseada em type (outros fluxos)
if (session.type) {
switch (session.type) {
case 'waiting_custom_command':
await this.executeCustomCommand(chatId, session.connectionId, text);
this.userSessions.delete(userId);
return;
case 'waiting_username_disconnect':
await this.handleDisconnectUser(chatId, text.trim());
this.userSessions.delete(userId);
return;
}
}
// Estado desconhecido
console.log(`❓ Estado de sessão desconhecido: action=${session.action}, type=${session.type}`);
this.userSessions.delete(userId);
await this.bot.sendMessage(chatId, '❓ Estado de sessão desconhecido. Tente novamente.');
} catch (error) {
console.error('❌ Erro ao processar input da sessão:', error);
this.userSessions.delete(userId);
@@ -1168,18 +1210,21 @@ Digite /help para ver todos os comandos disponíveis!
try {
const { serial, usuario, vlan, onuType } = session;
// Escapar caracteres especiais
const serialEscaped = serial.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId,
`⏳ Adicionando ONU Fiberhome...\n\n` +
`🔍 Descobrindo porta PON automaticamente...\n` +
`👤 **Usuário:** ${usuario}\n` +
`📱 **Serial:** ${serial}\n` +
`🔌 **Tipo:** ${onuType}\n` +
`🏷️ **VLAN:** ${vlan}`,
`👤 *Usuário:* ${usuario}\n` +
`📱 *Serial:* ${serialEscaped}\n` +
`🔌 *Tipo:* ${onuType}\n` +
`🏷️ *VLAN:* ${vlan}`,
{ parse_mode: 'Markdown' }
);
// Executar comando TL1 via Fiberhome Manager
const resultado = await this.fiberhome.adicionarOnuFiberhome(
const resultado = await this.fiberhomeTL1.adicionarOnuFiberhome(
serial,
usuario,
vlan,
@@ -1187,22 +1232,26 @@ Digite /help para ver todos os comandos disponíveis!
);
if (resultado.success) {
// Escapar caracteres especiais do Markdown
const oltEscaped = resultado.details.olt.replace(/_/g, '\\_');
const serialEscaped = serial.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId,
`✅ **ONU Fiberhome Adicionada com Sucesso!**\n\n` +
`👤 **Usuário:** ${usuario}\n` +
`🏢 **OLT:** ${resultado.details.olt}\n` +
`📡 **Porta descoberta:** Slot ${resultado.details.slot}, PON ${resultado.details.ponPort}\n` +
`📱 **Serial:** ${serial}\n` +
`🔌 **Tipo:** ${onuType}\n` +
`🏷️ **VLAN:** ${vlan}\n` +
`⚙️ **Portas configuradas:** ${resultado.details.portas}\n\n` +
`🔐 **Login Web:** admin / clicknet10\n\n` +
`✅ *ONU Fiberhome Adicionada com Sucesso!*\n\n` +
`👤 *Usuário:* ${usuario}\n` +
`🏢 *OLT:* ${oltEscaped}\n` +
`📡 *Porta descoberta:* Slot ${resultado.details.slot}, PON ${resultado.details.ponPort}\n` +
`📱 *Serial:* ${serialEscaped}\n` +
`🔌 *Tipo:* ${onuType}\n` +
`🏷️ *VLAN:* ${vlan}\n` +
`⚙️ *Portas configuradas:* ${resultado.details.portas}\n\n` +
`🔐 Login Web: \`admin / clicknet10\`\n\n` +
`⚡ A ONU foi reiniciada e estará disponível em alguns instantes.`,
{ parse_mode: 'Markdown' }
);
} else {
await this.bot.sendMessage(chatId,
`❌ **Erro ao adicionar ONU Fiberhome**\n\n` +
`❌ *Erro ao adicionar ONU Fiberhome*\n\n` +
`⚠️ ${resultado.error}`,
{ parse_mode: 'Markdown' }
);
@@ -1211,7 +1260,7 @@ Digite /help para ver todos os comandos disponíveis!
} catch (error) {
console.error('❌ Erro ao executar adição de ONU Fiberhome:', error);
await this.bot.sendMessage(chatId,
`❌ **Erro ao adicionar ONU Fiberhome**\n\n` +
`❌ *Erro ao adicionar ONU Fiberhome*\n\n` +
`⚠️ ${error.message}`,
{ parse_mode: 'Markdown' }
);
@@ -1548,25 +1597,8 @@ Digite /help para ver todos os comandos disponíveis!
}
/**
* Lida com input de usuário durante sessões específicas
* MÉTODO REMOVIDO - handleUserSessionInput duplicado foi mesclado acima
*/
async handleUserSessionInput(chatId, text, userId, session) {
switch (session.type) {
case 'waiting_custom_command':
await this.executeCustomCommand(chatId, session.connectionId, text);
break;
case 'waiting_username_disconnect':
await this.handleDisconnectUser(chatId, text.trim());
break;
default:
await this.bot.sendMessage(chatId, '❓ Estado de sessão desconhecido. Tente novamente.');
}
// Limpar sessão
this.userSessions.delete(userId);
}
/**
* Executa comando personalizado em uma conexão SSH
@@ -1635,7 +1667,10 @@ Digite /help para ver todos os comandos disponíveis!
* Executa verificação de sinal na OLT Fiberhome
*/
async handleCheckSignalFiberhome(chatId, serialNumber) {
await this.bot.sendMessage(chatId, `🔍 Procurando ONU ${serialNumber} na OLT Fiberhome...`);
// Escapar caracteres especiais
const serialEscaped = serialNumber.replace(/_/g, '\\_');
await this.bot.sendMessage(chatId, `🔍 Procurando ONU ${serialEscaped} na OLT Fiberhome...`);
try {
// Usar a mesma lógica do handleStatusONU
@@ -1650,26 +1685,26 @@ Digite /help para ver todos os comandos disponíveis!
if (resultado.success) {
// Formatar resposta similar às OLTs Datacom
let message = `📡 *Sinal da ONU ${serialNumber}*\n\n`;
message += `🏢 **OLT:** Fiberhome UNM2000 (131.0.192.9)\n`;
message += `📍 **Localização:** Slot ${resultado.slot}, PON ${resultado.pon}, ONU ${resultado.onuId}\n`;
message += `🔌 **Status:** ${resultado.online ? '🟢 Online' : '🔴 Offline'}\n\n`;
let message = `📡 *Sinal da ONU ${serialEscaped}*\n\n`;
message += `🏢 *OLT:* Fiberhome UNM2000 (131.0.192.9)\n`;
message += `📍 *Localização:* Slot ${resultado.slot}, PON ${resultado.pon}, ONU ${resultado.onuId}\n`;
message += `🔌 *Status:* ${resultado.online ? '🟢 Online' : '🔴 Offline'}\n\n`;
message += `📊 **Informações do Sinal:**\n`;
message += `📡 **RX Power:** ${resultado.rxPower}\n`;
message += `📤 **TX Power:** ${resultado.txPower}\n`;
message += `📏 **Distância:** ${resultado.distance}\n\n`;
message += `📊 *Informações do Sinal:*\n`;
message += `📡 *RX Power:* ${resultado.rxPower}\n`;
message += `📤 *TX Power:* ${resultado.txPower}\n`;
message += `📏 *Distância:* ${resultado.distance}\n\n`;
// Status das portas Ethernet (resumido)
if (resultado.portasEthernet.length > 0) {
const portasAtivas = resultado.portasEthernet.filter(p => p.status === 'active' || p.status === 'up').length;
message += `🔗 **Portas Ethernet:** ${portasAtivas}/${resultado.portasEthernet.length} ativas\n`;
message += `🔗 *Portas Ethernet:* ${portasAtivas}/${resultado.portasEthernet.length} ativas\n`;
}
// Serviços WAN
if (resultado.servicosWAN.length > 0) {
const servicosAtivos = resultado.servicosWAN.filter(s => s.status === 'active').length;
message += `🌐 **Serviços WAN:** ${servicosAtivos} ativo(s)\n`;
message += `🌐 *Serviços WAN:* ${servicosAtivos} ativo(s)\n`;
}
await this.bot.sendMessage(chatId, message, { parse_mode: 'Markdown' });
@@ -2639,7 +2674,7 @@ Digite /help para ver todos os comandos disponíveis!
// Recuperar sessão
const session = this.userSessions.get(userId);
if (!session || session.action !== 'adicionar_onu_fiberhome_step4') {
if (!session || session.action !== 'adicionar_onu_fiberhome_step2') {
await this.bot.answerCallbackQuery(callbackQuery.id, '❌ Sessão expirada');
await this.bot.sendMessage(chatId, '❌ Sessão expirada. Por favor, comece novamente.');
this.userSessions.delete(userId);
@@ -2647,6 +2682,8 @@ Digite /help para ver todos os comandos disponíveis!
}
session.onuType = onuType;
session.action = 'adicionar_onu_fiberhome_step3';
this.userSessions.set(userId, session);
await this.bot.answerCallbackQuery(callbackQuery.id);
@@ -2681,7 +2718,7 @@ Digite /help para ver todos os comandos disponíveis!
// Recuperar sessão
const session = this.userSessions.get(userId);
if (!session || session.action !== 'adicionar_onu_fiberhome_step2') {
if (!session || session.action !== 'adicionar_onu_fiberhome_step3') {
await this.bot.answerCallbackQuery(callbackQuery.id, '❌ Sessão expirada');
await this.bot.sendMessage(chatId, '❌ Sessão expirada. Por favor, comece novamente.');
this.userSessions.delete(userId);
@@ -2701,10 +2738,7 @@ Digite /help para ver todos os comandos disponíveis!
await this.executarAdicaoOnuFiberhome(chatId, session);
} else if (data === 'fh_vlan_custom') {
// Pedir VLAN customizada
session.action = 'adicionar_onu_fiberhome_step3';
this.userSessions.set(userId, session);
// Pedir VLAN customizada - manter sessão no step3 para receber input do usuário
await this.bot.editMessageText(
`🏷️ **VLAN Customizada**\n\n` +
`Digite o número da VLAN que deseja usar (1-4094):`,