140 lines
5.2 KiB
JavaScript
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);
|
|
} |