Files
los-vecinos-de-cisco/zabbix/Javascript/zabbix_lld_script.js
T
2025-12-09 12:45:15 +01:00

140 lines
5.2 KiB
JavaScript

/**
* Zabbix JavaScript para Low Level Discovery (LLD)
* Consulta HTTPS al servicio de monitorización de MACs Cisco
*
* Parámetros esperados:
* - {$CISCO_SERVICE_URL}: URL del servicio HTTPS (ej: https://cisco-monitor:8443)
* - {$CISCO_HOST}: IP o hostname del dispositivo Cisco
* - {$CISCO_USERNAME}: Usuario SSH
* - {$CISCO_PASSWORD}: Contraseña SSH
* - {$CISCO_TIMEOUT}: Timeout en segundos (opcional, default: 60)
*
* Uso en Zabbix:
* - Crear un item tipo "Script"
* - Configurar parámetros como macros del host
* - Usar este script en el discovery rule
*/
// Configuración
var serviceUrl = "{$CISCO_SERVICE_URL}";
var ciscoHost = "{$CISCO_HOST}";
var ciscoUsername = "{$CISCO_USERNAME}";
var ciscoPassword = "{$CISCO_PASSWORD}";
var timeout = parseInt("{$CISCO_TIMEOUT}") || 60;
// Validar parámetros requeridos
if (!serviceUrl || !ciscoHost || !ciscoUsername || !ciscoPassword) {
throw new Error("Faltan parámetros requeridos: CISCO_SERVICE_URL, CISCO_HOST, CISCO_USERNAME, CISCO_PASSWORD");
}
// Log de inicio
Zabbix.Log(4, "[Cisco MAC LLD] Iniciando consulta para host: " + ciscoHost);
Zabbix.Log(4, "[Cisco MAC LLD] Service URL: " + serviceUrl);
try {
// Preparar datos para POST
var postData = JSON.stringify({
"host": ciscoHost,
"username": ciscoUsername,
"password": ciscoPassword,
"port": 22,
"timeout": timeout
});
// Configurar request HTTP
var req = new HttpRequest();
// Configurar headers
req.addHeader('Content-Type: application/json');
req.addHeader('Accept: application/json');
req.addHeader('User-Agent: Zabbix-LLD-Script/1.0');
// Configurar timeout (método compatible con versiones anteriores de Zabbix)
if (typeof req.setTimeout === 'function') {
req.setTimeout(timeout * 1000);
} else if (typeof req.setConnectTimeout === 'function') {
req.setConnectTimeout(timeout);
req.setTimeout(timeout);
}
// Log de request
Zabbix.Log(4, "[Cisco MAC LLD] Enviando POST a: " + serviceUrl + "/cisco-mac-monitor");
Zabbix.Log(4, "[Cisco MAC LLD] POST data: " + postData);
// Hacer la consulta HTTPS POST
var response = req.post(serviceUrl + "/cisco-mac-monitor", postData);
// Log de response
Zabbix.Log(4, "[Cisco MAC LLD] Response status: " + req.getStatus());
Zabbix.Log(4, "[Cisco MAC LLD] Response length: " + response.length);
// Verificar código de estado HTTP
if (req.getStatus() !== 200) {
throw new Error("HTTP Error " + req.getStatus() + ": " + response);
}
// Validar que la respuesta no esté vacía
if (!response || response.trim().length === 0) {
throw new Error("Respuesta vacía del servicio");
}
// Intentar parsear JSON
var jsonResponse;
try {
jsonResponse = JSON.parse(response);
} catch (parseError) {
Zabbix.Log(3, "[Cisco MAC LLD] Error parsing JSON: " + parseError.message);
Zabbix.Log(3, "[Cisco MAC LLD] Raw response: " + response.substring(0, 500) + "...");
throw new Error("Error parsing JSON response: " + parseError.message);
}
// Validar estructura de respuesta
if (!jsonResponse.data || !Array.isArray(jsonResponse.data)) {
throw new Error("Respuesta JSON inválida: falta campo 'data' o no es array");
}
// Log de éxito
Zabbix.Log(4, "[Cisco MAC LLD] Éxito: " + jsonResponse.data.length + " elementos descubiertos");
Zabbix.Log(4, "[Cisco MAC LLD] Device: " + (jsonResponse.device_hostname || "unknown"));
Zabbix.Log(4, "[Cisco MAC LLD] Total ports: " + (jsonResponse.total_ports || 0));
Zabbix.Log(4, "[Cisco MAC LLD] Total MACs: " + (jsonResponse.total_macs || 0));
// Preparar respuesta para LLD
var lldResponse = {
"data": jsonResponse.data
};
// Log de algunos elementos de ejemplo para debug
if (jsonResponse.data.length > 0) {
Zabbix.Log(4, "[Cisco MAC LLD] Primer elemento: " + JSON.stringify(jsonResponse.data[0]));
if (jsonResponse.data.length > 1) {
Zabbix.Log(4, "[Cisco MAC LLD] Segundo elemento: " + JSON.stringify(jsonResponse.data[1]));
}
}
// Retornar JSON para LLD
return JSON.stringify(lldResponse);
} catch (error) {
// Log de error detallado
Zabbix.Log(2, "[Cisco MAC LLD] ERROR: " + error.message);
Zabbix.Log(2, "[Cisco MAC LLD] Host: " + ciscoHost);
Zabbix.Log(2, "[Cisco MAC LLD] Service URL: " + serviceUrl);
// En caso de error, retornar estructura vacía para evitar fallos en LLD
// Esto permite que Zabbix no falle completamente si hay problemas temporales
var errorResponse = {
"data": [],
"error": error.message,
"timestamp": new Date().toISOString(),
"host": ciscoHost
};
// Opcionalmente, lanzar error para que Zabbix lo registre
// Comentar la siguiente línea si prefieres que LLD retorne estructura vacía en caso de error
throw new Error("Cisco MAC LLD failed for " + ciscoHost + ": " + error.message);
// Retornar respuesta de error (solo se ejecuta si se comenta el throw anterior)
// return JSON.stringify(errorResponse);
}