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 18:31:44 -03:00
1 parent 600555596d
commit ee22ecf693
4 files changed
+724

No files matched your search

+273
View File
@@ -92,6 +92,7 @@ class BotHandler {
*/
async executeAction(chatId, intent, user) {
const { action, target, confidence, type } = intent;
const userId = user.id; // Extrair userId do objeto user
// Se a confiança é muito baixa, pedir esclarecimento
if (confidence < 0.3 && action) {
@@ -178,6 +179,11 @@ class BotHandler {
await this.handleAdicionarOnuVlan(chatId, target, intent.vlanId);
break;
case 'adicionar_onu_fiberhome':
console.log(`➕ Executando handleAdicionarOnuFiberhome com target: ${target}`);
await this.handleAdicionarOnuFiberhome(chatId, target, userId);
break;
case 'buscar_cliente':
console.log(`🔍 Executando handleBuscarCliente com target: ${target}`);
await this.handleBuscarCliente(chatId, target);
@@ -314,6 +320,7 @@ Digite /help para ver todos os comandos disponíveis!
📡 **OLT/ONU:**
• "ver sinal DACM91569513"
• "adicionar onu SERIAL"
• "adicionar onu fiberhome SERIAL"
• "remover onu SERIAL"
� **JUNIPER:**
@@ -411,6 +418,20 @@ Digite /help para ver todos os comandos disponíveis!
• "add onu vlan 700 ABCD12345678"
• "adicionar vlan 603 SERIAL_NUMBER"
**➕ ADICIONAR ONU FIBERHOME VIA TL1:**
• "adicionar onu fiberhome FHTT12345678"
• "fiberhome onu FHTT12345678"
• Processo interativo com:
- Nome/alias do usuário
- Nome da OLT
- Porta PON (ex: 7-1)
- Tipo da ONU (AN5506-02-B ou AN5506-01-A)
- VLAN (padrão: 1002)
• Configura automaticamente:
- WAN Services
- Login Web (admin/clicknet10)
- Reinicia a ONU
**🗑️ REMOVER ONU:**
• "remover onu DACM91569513"
• "deletar ABCD12345678"
@@ -1047,6 +1068,156 @@ Digite /help para ver todos os comandos disponíveis!
);
}
/**
* Comando para adicionar ONU Fiberhome via TL1
*/
async handleAdicionarOnuFiberhome(chatId, serialNumber, userId) {
if (!serialNumber) {
await this.bot.sendMessage(chatId,
'❌ Por favor, informe o serial da ONU Fiberhome.\n\n' +
'Exemplo: `adicionar onu fiberhome FHTT12345678`',
{ parse_mode: 'Markdown' }
);
return;
}
// Criar sessão para coletar informações
this.userSessions.set(userId, {
action: 'adicionar_onu_fiberhome_step1',
serial: serialNumber,
timestamp: Date.now()
});
// Perguntar o alias/nome do usuário
await this.bot.sendMessage(chatId,
`➕ **Adicionar ONU Fiberhome**\n\n` +
`📱 **Serial:** ${serialNumber}\n` +
`🔍 A porta PON será descoberta automaticamente\n\n` +
'👤 Digite o **nome/alias** do usuário:',
{ parse_mode: 'Markdown' }
);
}
/**
* Processar input do usuário durante sessões
*/
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);
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;
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;
} 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);
// 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;
}
} catch (error) {
console.error('❌ Erro ao processar input da sessão:', error);
this.userSessions.delete(userId);
await this.bot.sendMessage(chatId, '❌ Erro ao processar sua resposta. Tente novamente.');
}
}
/**
* Executar adição da ONU Fiberhome
*/
async executarAdicaoOnuFiberhome(chatId, session) {
try {
const { serial, usuario, vlan, onuType } = session;
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}`,
{ parse_mode: 'Markdown' }
);
// Executar comando TL1 via Fiberhome Manager
const resultado = await this.fiberhome.adicionarOnuFiberhome(
serial,
usuario,
vlan,
onuType
);
if (resultado.success) {
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` +
`⚡ 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` +
`⚠️ ${resultado.error}`,
{ parse_mode: 'Markdown' }
);
}
} 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` +
`⚠️ ${error.message}`,
{ parse_mode: 'Markdown' }
);
}
}
/**
* Comando não reconhecido
*/
@@ -1158,6 +1329,12 @@ Digite /help para ver todos os comandos disponíveis!
} else if (data.startsWith('add_onu_')) {
console.log(`🔍 Chamando handleAddOnuCallback`);
await this.handleAddOnuCallback(callbackQuery, data);
} else if (data.startsWith('fh_onu_type_')) {
console.log(`🔍 Chamando handleFiberhomeOnuTypeCallback`);
await this.handleFiberhomeOnuTypeCallback(callbackQuery, data);
} else if (data.startsWith('fh_vlan_')) {
console.log(`🔍 Chamando handleFiberhomeVlanCallback`);
await this.handleFiberhomeVlanCallback(callbackQuery, data);
} else if (data.startsWith('fiberhome_details_')) {
console.log(`🔍 Condição fiberhome_details_ atendida`);
const serialNumber = data.replace('fiberhome_details_', '');
@@ -1180,6 +1357,12 @@ Digite /help para ver todos os comandos disponíveis!
await this.bot.answerCallbackQuery(callbackQuery.id);
} else if (data === 'cancel_action') {
await this.bot.answerCallbackQuery(callbackQuery.id, 'Ação cancelada');
// Limpar sessão do usuário se existir
if (this.userSessions.has(userId)) {
this.userSessions.delete(userId);
}
await this.bot.editMessageText('❌ Ação cancelada.', {
chat_id: chatId,
message_id: callbackQuery.message.message_id
@@ -2444,6 +2627,96 @@ Digite /help para ver todos os comandos disponíveis!
}
}
/**
* Handle callback para tipo de ONU Fiberhome
*/
async handleFiberhomeOnuTypeCallback(callbackQuery, data) {
const chatId = callbackQuery.message.chat.id;
const userId = callbackQuery.from.id;
// Formato: fh_onu_type_AN5506-02-B ou fh_onu_type_AN5506-01-A
const onuType = data.replace('fh_onu_type_', '');
// Recuperar sessão
const session = this.userSessions.get(userId);
if (!session || session.action !== 'adicionar_onu_fiberhome_step4') {
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);
return;
}
session.onuType = onuType;
await this.bot.answerCallbackQuery(callbackQuery.id);
// Perguntar sobre VLAN
const keyboard = {
inline_keyboard: [
[{ text: '✅ Usar VLAN 1002 (padrão)', callback_data: 'fh_vlan_1002' }],
[{ text: '🔧 Usar outra VLAN', callback_data: 'fh_vlan_custom' }],
[{ text: '❌ Cancelar', callback_data: 'cancel_action' }]
]
};
await this.bot.editMessageText(
`🔌 **Tipo da ONU:** ${onuType}\n\n` +
`🏷️ **VLAN:**\n` +
`A VLAN padrão é 1002. Deseja usar esta VLAN ou configurar outra?`,
{
chat_id: chatId,
message_id: callbackQuery.message.message_id,
reply_markup: keyboard,
parse_mode: 'Markdown'
}
);
}
/**
* Handle callback para VLAN Fiberhome
*/
async handleFiberhomeVlanCallback(callbackQuery, data) {
const chatId = callbackQuery.message.chat.id;
const userId = callbackQuery.from.id;
// Recuperar sessão
const session = this.userSessions.get(userId);
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);
return;
}
await this.bot.answerCallbackQuery(callbackQuery.id);
if (data === 'fh_vlan_1002') {
// Usar VLAN padrão 1002
session.vlan = 1002;
// Limpar sessão
this.userSessions.delete(userId);
// Executar adição da ONU
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);
await this.bot.editMessageText(
`🏷️ **VLAN Customizada**\n\n` +
`Digite o número da VLAN que deseja usar (1-4094):`,
{
chat_id: chatId,
message_id: callbackQuery.message.message_id,
parse_mode: 'Markdown'
}
);
}
}
/**
* Handle callback para confirmar adição de ONU
*/
+174
View File
@@ -13,6 +13,9 @@ class FiberhomeManager {
username: '1',
password: '1',
timeout: 15000
},
olt: {
name: '131.0.192.9' // OLT configurada no TL1
}
};
@@ -377,6 +380,177 @@ class FiberhomeManager {
}
}
/**
* Descobrir porta PON onde a ONU está descoberta
* @param {string} serial - Serial da ONU (MAC address)
*/
async descobrirPortaPON(serial) {
try {
this.logger.debug('Descobrindo porta PON para ONU', { serial });
// Conectar ao UNM2000
const conectado = await this.conectarUNM2000();
if (!conectado) {
throw new Error('Não foi possível conectar ao UNM2000');
}
// Buscar em todas as portas PON possíveis (slots 1-20, portas 1-16)
for (let slot = 1; slot <= 20; slot++) {
for (let porta = 1; porta <= 16; porta++) {
const ponId = `NA-NA-${slot}-${porta}`;
const comando = `LST-UNREGONU::OLTID=${this.config.olt.name},PONID=${ponId}:${this.commandId++}::;`;
this.logger.debug('Consultando porta PON', { ponId });
const resultado = await this.executarComandoTL1(comando);
if (resultado.success && resultado.data) {
// Verificar se a ONU está na resposta
if (resultado.data.toUpperCase().includes(serial.toUpperCase())) {
this.logger.info('Porta PON descoberta', { serial, ponId });
return {
success: true,
portAlias: `${slot}-${porta}`,
slot,
porta
};
}
}
// Pequeno delay entre consultas para não sobrecarregar
await new Promise(resolve => setTimeout(resolve, 100));
}
}
// ONU não encontrada
this.logger.warn('ONU não encontrada em nenhuma porta PON', { serial });
return {
success: false,
error: 'ONU não encontrada em nenhuma porta PON. Verifique se a ONU está ligada e descoberta pela OLT.'
};
} catch (error) {
this.logger.error('Erro ao descobrir porta PON', { serial, error: error.message });
return {
success: false,
error: error.message
};
}
}
/**
* Adicionar ONU Fiberhome via TL1
* @param {string} serial - Serial da ONU (MAC address)
* @param {string} usuario - Nome/alias do usuário
* @param {number} vlan - VLAN ID (padrão: 1002)
* @param {string} onuType - Tipo da ONU (AN5506-02-B ou AN5506-01-A)
*/
async adicionarOnuFiberhome(serial, usuario, vlan = 1002, onuType = 'AN5506-02-B') {
try {
this.logger.info('Iniciando adição de ONU Fiberhome via TL1', {
serial, usuario, vlan, onuType
});
// Conectar ao UNM2000
const conectado = await this.conectarUNM2000();
if (!conectado) {
throw new Error('Não foi possível conectar ao UNM2000');
}
// Descobrir porta PON automaticamente
const descoberta = await this.descobrirPortaPON(serial);
if (!descoberta.success) {
throw new Error(descoberta.error);
}
const portAlias = descoberta.portAlias;
const nameOlt = this.config.olt.name;
this.logger.info('Porta PON descoberta', { portAlias, nameOlt });
// 1. ADD-ONU: Autenticar a ONU
const addOnuCmd = `ADD-ONU::OLTID=${nameOlt},PONID=NA-NA-${portAlias}:${this.commandId++}::AUTHTYPE=MAC,ONUTYPE=${onuType},NAME=${usuario},ONUID=${serial};`;
this.logger.debug('Executando ADD-ONU', { comando: addOnuCmd });
const resultadoAdd = await this.executarComandoTL1(addOnuCmd);
if (!resultadoAdd.success) {
throw new Error(`Falha ao adicionar ONU: ${resultadoAdd.error}`);
}
// Aguardar um pouco para a ONU ser registrada
await new Promise(resolve => setTimeout(resolve, 2000));
// 2. SET-WANSERVICE: Configurar WAN services
// Determina quantas portas configurar baseado no tipo da ONU
const numPortas = onuType === 'AN5506-02-B' ? 2 : 1;
for (let porta = 1; porta <= numPortas; porta++) {
const setWanCmd = `SET-WANSERVICE::OLTID=${nameOlt},PONID=NA-NA-${portAlias},ONUIDTYPE=MAC,ONUID=${serial}:${this.commandId++}::STATUS=1,MODE=2,CONNTYPE=1,VLAN=${vlan},COS=0,QOS=2,UPORT=${porta};`;
this.logger.debug(`Configurando WAN Service porta ${porta}`, { comando: setWanCmd });
const resultadoWan = await this.executarComandoTL1(setWanCmd);
if (!resultadoWan.success) {
this.logger.warn(`Aviso ao configurar WAN porta ${porta}: ${resultadoWan.error}`);
// Não lança erro, apenas registra o aviso
}
// Pequeno delay entre comandos
await new Promise(resolve => setTimeout(resolve, 1000));
}
// 3. CFG-WEBADMINISTRATOR: Configurar autenticação web
const cfgWebCmd = `CFG-WEBADMINISTRATOR::OLTID=${nameOlt},PONID=NA-NA-${portAlias},ONUIDTYPE=MAC,ONUID=${serial}:${this.commandId++}::WEBUSERNAME=admin,WEBPASSWORD=clicknet10;`;
this.logger.debug('Configurando autenticação web', { comando: cfgWebCmd });
const resultadoWeb = await this.executarComandoTL1(cfgWebCmd);
if (!resultadoWeb.success) {
this.logger.warn(`Aviso ao configurar autenticação web: ${resultadoWeb.error}`);
// Não lança erro, apenas registra o aviso
}
// Aguardar antes de reiniciar
await new Promise(resolve => setTimeout(resolve, 2000));
// 4. RESET-ONU: Reiniciar a ONU
const resetCmd = `RESET-ONU::OLTID=${nameOlt},PONID=NA-NA-${portAlias},ONUIDTYPE=MAC,ONUID=${serial}:${this.commandId++}::;`;
this.logger.debug('Reiniciando ONU', { comando: resetCmd });
const resultadoReset = await this.executarComandoTL1(resetCmd);
if (!resultadoReset.success) {
this.logger.warn(`Aviso ao reiniciar ONU: ${resultadoReset.error}`);
// Não lança erro, apenas registra o aviso
}
this.logger.info('ONU Fiberhome adicionada com sucesso', {
nameOlt, portAlias, serial, usuario, vlan
});
return {
success: true,
message: 'ONU adicionada com sucesso',
details: {
olt: nameOlt,
porta: portAlias,
slot: descoberta.slot,
ponPort: descoberta.porta,
serial: serial,
usuario: usuario,
vlan: vlan,
tipo: onuType,
portas: numPortas
}
};
} catch (error) {
this.logger.error('Erro ao adicionar ONU Fiberhome', {
serial, error: error.message
});
return {
success: false,
error: error.message
};
}
}
/**
* Desconectar TL1
*/
+27
View File
@@ -15,6 +15,7 @@ class NLPProcessor {
'remover_onu': ['remover onu', 'deletar onu', 'apagar onu', 'remove onu', 'delete onu'],
'adicionar_onu': ['adicionar onu', 'add onu', 'criar onu', 'cadastrar onu', 'registrar onu'],
'adicionar_onu_vlan': ['adicionar onu vlan', 'add onu vlan', 'criar onu vlan', 'cadastrar onu vlan'],
'adicionar_onu_fiberhome': ['adicionar onu fiberhome', 'add onu fiberhome', 'criar onu fiberhome', 'cadastrar onu fiberhome', 'registrar onu fiberhome'],
'ping': ['ping', 'testar', 'test', 'conectividade'],
'admin': ['admin', 'administração', 'administracao', 'painel'],
'usuarios_autorizados': ['usuarios autorizados', 'users autorizados', 'lista usuarios', 'listar usuarios autorizados'],
@@ -59,6 +60,9 @@ class NLPProcessor {
// Padrões específicos para adicionar ONU com VLAN customizada
/^(adicionar|add|criar|cadastrar|registrar)\s+(onu|ont)\s+vlan\s+(\d+)\s+([A-Z0-9]+)$/i,
/^(adicionar|add|criar)\s+vlan\s+(\d+)\s+([A-Z0-9]+)$/i,
// Padrões específicos para adicionar ONU Fiberhome via TL1
/^(adicionar|add|criar|cadastrar|registrar)\s+(onu|ont)\s+fiberhome\s+([A-Z0-9]+)$/i,
/^(fiberhome)\s+(onu|ont)\s+([A-Z0-9]+)$/i,
// Padrões específicos para adicionar ONU
/^(adicionar|add|criar|cadastrar|registrar)\s+(onu|ont)\s+([A-Z0-9]+)$/i,
/^(adicionar|add|criar|cadastrar|registrar)\s+([A-Z0-9]+)$/i,
@@ -285,6 +289,29 @@ class NLPProcessor {
// Padrões específicos para adicionar ONU
if (/adicionar|add|criar|cadastrar|registrar/i.test(action)) {
// Padrão especial: "adicionar onu fiberhome SERIAL"
if (/fiberhome/i.test(fullMatch)) {
let serialNumber;
// Formato: "adicionar onu fiberhome SERIAL"
if (match.length === 4 && /onu|ont/i.test(fullMatch)) {
serialNumber = match[3]; // Serial
}
// Formato: "fiberhome onu SERIAL"
else if (match.length === 4 && match[1] === 'fiberhome') {
serialNumber = match[3]; // Serial
}
if (serialNumber) {
return {
action: 'adicionar_onu_fiberhome',
target: serialNumber.trim().toUpperCase(),
confidence: 0.95,
type: 'add_onu_fiberhome_pattern'
};
}
}
// Padrão especial: "adicionar onu vlan XXX SERIAL" ou "add onu vlan XXX SERIAL"
if (/vlan/i.test(fullMatch)) {
let vlanId, serialNumber;