first commit
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user