/** * 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); }