Acabo de hacer una serie de scripts VBS (voy a regalar el principal) que permiten que un sistema de monitorización lance alertas acerca de niveles de saturación de enlaces de red, en función a una lectura indirecta: el tiempo de respuesta de un paquete Ping.
Ping es un programa incluido en prácticamente todo sistema operativo de red que permite lanzar un paquete de datos contra un dispositivo de red (PC o cualquier otro) y recibir un “eco” de respuesta. Es empleado típicamente para probar que un enlace de comunicaciones está operativo a nivel físico.
Fig. 1 – Ejemplo de ping a Google.com![]()
Como se aprecia en la Fig. 1, puedo obtener una serie de datos útiles a partir de la salida del comando: la dirección IP, el tiempo en milisengundos que demora en llegar a mí el “eco”, algunas estadísticas, etc.
En muchas empresas, manejan SLA (Service Level Agreements) que requieren garantizar cierta disponibilidad de servicios. En muchos casos, incluye a los enlaces de red. Imagínate que tienes una computadora origen (punto A) en Lima y otra en, digamos, Tacna (punto B), y el enlace de red entre ellas (AB) es de misión crítica para la empresa. Entonces te interesa medir en qué momento el enlace empieza a saturarse, correcto? La saturación de enlace evidentemente afecta la velocidad de los paquetes de datos que viajan en él, de modo que si el tiempo de “eco” de Ping se incrementa mas allá de un valor que para ti es un promedio conocido, entonces podrás deducir (indirectamente) que el enlace AB está siendo saturado.
El siguiente script hace justamente eso: define valores de advertencia (Ej: LimiteAMBAR=300ms) y de criticidad (Ej: LimiteROJO=600ms), de modo que si detecta que el valor promedio de tiempo del paquete de eco ping AB (T) es menor a 300ms (LimiteAMBAR) entonces todo está bien y no hace nada; si por el contrario T está entre 300ms y 600ms (LimiteAMBAR < T < LimiteROJO) se escribirá un evento en el Visor de Sucesos de la estación A:
Fig 2. Latencia de red en estado de advertencia
Por último, si T es mayor a 600ms (LimiteRojo < T) entonces se considera que el estado es crítico y también se escribirá un evento en el visor de sucesos indicando esto:
Fig 3. Latencia de red en estado crítico
Claro que esto puede ser mucho mas elegante: desde el mensaje registrado hasta lo que puedes hacer en respuesta: yo elegí (por necesidad de la herramienta de monitorización que está atenta a la presencia de estos eventos registrados en el Visor de Sucesos) dejar un registro en el log del sistema, pero tu puedes por ejemplo, enviar un email si es que el enlace se satura mas de 5 veces al día, o cosas por el estilo. Lo mas difícil es obtener los números a partir del Ping y eso es lo principal de este script.
Hoy es viernes, un roncito?
‘===== ping4.vbs ==============
‘
‘ Este script ejecuta un ping hacia un determinado host.
‘ De acuerdo a los valores leidos en las estadísticas
‘ del ping, y en función a parámetros establecidos
‘ (LimiteROJO, LimiteAMBAR), se escribe un evento en
‘ el visor de sucesos de la estación que realiza el ping.
‘
‘ Este script recibe como parámetro el nombre o la IP
‘ del host hacia el cual se quiere hacer ping
‘
‘ Ej:
‘ ping4.vbs enerpeil2wdt674
‘
‘ Además, este script se puede ejecutar en un equipo que
‘ tenga el sistema operativo en INGLES
‘ (en otro idioma requiere modificaciones).
‘
‘ (C)2010 – Marcel Jeanneau
‘==============================
Dim objArg, nroPings
nroPings = 3 ‘##### DEFINIR EL NRO DE PINGS.
Set objArg = WScript.Arguments
strComputer = objArg(0)
strCommand = "ping -n " & nroPings & " " & strComputer
Dim strMinVal,strMaxVal,strAveVal
Dim numMinVal,numMaxVal,numAveVal
LimiteROJO = 600 ‘##### 600 milisegundos
LimiteAMBAR = 300 ‘##### 300 milisegundos
Set objShell = CreateObject("WScript.Shell")
Set objExecObject = objShell.Exec(strCommand)
strPingOutput = objExecObject.StdOut.ReadAll ‘### Esto lee la salida del ping y la almacena en strPingOutput
arrayPingOutput = Split(strPingOutput,VbCrlf,-1,1) ‘### arrayPingOutput almacena strPingOutput, una línea por c/posición del array
For each strLine in arrayPingOutput
If Instr(strLine, "Minimum") > 0 Then ‘### Esto es para ubicar la línea de estadísticas de strPingOutput
arrayPingStats = Split(strLine,",",-1,1) ‘### arrayPingStats almacena las estadísticas de strPingOutput, una línea por c/medición
strMinVal = ltrim(arrayPingStats(0)) ‘### Esto obtiene la linea Minimum = X ms, libre de espacios a la izquierda
strMinVal = Mid(strMinVal,11) ‘### Obtiene la cantidad de ms (ej 214ms)
arrayMin = Split(strMinVal,"ms",-1,1) ‘### Separar el nro del sufijo "ms"
numMinVal = CDbl(arrayMin(0)) ‘### Convertir el numero a double
‘ Wscript.Echo numMinVal
strMaxVal=ltrim(arrayPingStats(1))
strMaxVal = Mid(strMaxVal,11)
arrayMax = Split(strMaxVal,"ms",-1,1)
numMaxVal = CDbl(arrayMax(0))
‘ Wscript.Echo numMaxVal
strAveVal=ltrim(arrayPingStats(2))
strAveVal = Mid(strAveVal,11)
arrayAve = Split(strAveVal,"ms",-1,1)
numAveVal = CDbl(arrayAve(0))
‘ numAveVal = 450 ‘test evento warning
’ numAveVal = 650 ‘test evento error
‘ Wscript.Echo numAveVal
End If
Next
‘##### Aqui viene la logica para determinar como escribe los logs en el visor de sucesos
‘##### Actualmente solo se emplea el valor promedio (numAveVal)
If numAveVal <= LimiteAMBAR Then
‘Wscript.Echo("Latencia promedio OK, con valor de " & strAveVal)
ElseIf numAveVal >= LimiteAMBAR Then
If numAveVal < LimiteROJO Then
‘Wscript.Echo("Latencia promedio en AMBAR, con valor de " & numAveVal)
strLog = "Latencia promedio en AMBAR, con valor de " & numAveVal & " hacia el host " & strComputer
strLog = strLog & vbCrLf
objShell.LogEvent 2, strLog ‘### El 2 significa Warning
Else
‘Wscript.Echo("Latencia promedio en ROJO, con valor de " & numAveVal)
strLog = "Latencia promedio en ROJO, con valor de " & numAveVal & " hacia el host " & strComputer
strLog = strLog & vbCrLf
objShell.LogEvent 1, strLog ‘### El 1 significa Error
End If
End If
‘========== EOF =========
Ese codigo me parece conocido… Buen post!