Curiosity is insubordination in its purest form. -Vladimir Nabokov

jueves, 9 de octubre de 2008

Monitarizacion de varias maquinas remotas desde un win con VBS (CLD 3.1)

Monitorizar pings, tnspings, URLs sin y con autenticacion. VBS


'CLD.VBS 3.1 (CheckListDiari 3.1)
'vlan7 - http://www.vlan7.org - From Scratch
'Ejecutar el script VBS en local si lo ejecutais varias personas (cuestion de permisos)

'News from 3.0 to 3.1 / 8-Oct-2008
'High Speedup
'Se quitan 2 Sleeps de 1 segundo porque se comprueba que no son necesarios.
'Por cada web_login 1 segundo de espera menos.

'News from 2.1 to 3.0 / 7-Oct-2008
'Monitorizacion de servicios de maquinas Win remotas
'2 WScript.Echo porque servicios tardan

'News from 2.0 to 2.1 / 1-Oct-2008
'Monitorizacion de conectividad de maquinas UNIX _desde ellas mismas_ con FTPs (plink)
'Me doy cuenta de la necesidad de ejecutar el script VBS en local

'News from 1.5 to 2.0 / 29-Ago-2008
'Monitorizacion servicios windows (aun solo local -comentado-)
'pings / tnspings totalmente rotos en 1.4. Solucionado
'Los ficheros se cierran
'Limpieza

'News from 1.4 to 1.5 / 28-Ago-2008
'Speed-up

'News from 1.3 to 1.4 / 27-Ago-2008
'Concurrencia de comandos obj WshShell (not True). Mucho mas rapido

'News from 1.2 to 1.3 / 16-Jul-2008
'Añadida comprobacion BBDD abiertas + startup_time sqlplus

'News from 1.1 to 1.2 / 12-Jun-2008
'Añadida comprobacion login en webs con Please Wait

'News from 1.0 to 1.1 / 11-Jun-2008
'Añadida comprobacion de que las webs estan up y corriendo
'Pequeñas mejoras de estilo

'1.0 / 6-Jun-2008
'Comprueba pings / tnspings

'Entradas:
'pings.txt - Maquinas a las que hacer ping
'tnspings.txt - Maquinas a las que hacer tnsping
'webs_no_login.txt - WEBs sin login a comprobar que esten up y corriendo
'webs_login.txt - WEBs con login a comprobar que esten up, corriendo y login OK
'services.txt - Servicios a monitorizar running y sus maquinas

'Formato entradas:
'pings.txt, tnspings.txt, webs_no_login.txt - Un host/IP/URL por linea
'webs_login.txt - 3 lineas: URL login, URL accesible solo logeado, patron a buscar
'bbdd.txt - 2 lineas: Un sqlplus, nombre bd a mostrar. (Se pasa bbdd.sql a sqlplus)
'services.txt - 2 lineas: host/IP;user;password, servicio1;servicio2;...;servicion

'Salida:
'Escribe en una hoja Excel on-the-fly:
'pings, tnspings, webs_no_login - Escribe Online / *OFF*
'webs_login - Escribe Online / *OFF* + Login OK / Login *NO* OK
'bbdd - Escribe select status, startup_time from v$instance;
'Orden: pings, tnspings, webs_no_login, webs_login, bbdd

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add

objExcel.Cells(1, 1).Value = "Maquinas"
objExcel.Cells(1, 2).Value = "Resultado"

Set Fso = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")

Function EjecutaComando(Comando)
' Ejecuta comando argumento y devuelve salida comando
Dim objExec, strOutput, intVersion

On Error Resume Next
intVersion = Wscript.Version ' Get scripting host version
Set objExec = WshShell.Exec(Comando)

If intVersion < 5.6 Then
On Error Resume Next
strOutput = objExec.StdOut.ReadAll
Else
Do While True
strOutput = strOutput & objExec.StdOut.Read(1)
If objExec.StdOut.AtEndOfStream Then
Exit Do
End If
Loop
End If

EjecutaComando = strOutput
End Function

i = 2 'Fila

' *** pings ***
Set InputFile = fso.OpenTextFile("pings.txt")
Do While Not (InputFile.atEndOfStream)
HostName = InputFile.ReadLine
strOutput = EjecutaComando("ping -n 1 " & HostName)
objExcel.Cells(i, 1).Value = HostName

patron = "Respuesta"
objExcel.Cells(i, 2).Value = "*OFF*"

arrLines = Split(strOutput, vbCrLf)
For Each strLine in arrLines
If InStr(strLine, patron) <> 0 Then 'Si patron encontrado
objExcel.Cells(i, 2).Value = "On Line"
End If
Next

i = i + 1 'Siguiente fila
Loop

InputFile.Close
i = i + 1 'Una linea en blanco

' *** tnspings ***
Set InputFile = fso.OpenTextFile("tnspings.txt")
Do While Not (InputFile.atEndOfStream)
HostName = InputFile.ReadLine
strOutput = EjecutaComando("tnsping " & HostName)
objExcel.Cells(i, 1).Value = HostName

patron = "correctamente"
objExcel.Cells(i, 2).Value = "*OFF*"

arrLines = Split(strOutput, vbCrLf)
For Each strLine in arrLines
If InStr(strLine, patron) <> 0 Then 'Si patron encontrado
objExcel.Cells(i, 2).Value = "On Line"
End If
Next

i = i + 1 'Siguiente fila
Loop

InputFile.Close
i = i + 1 'Una linea en blanco

' *** WEBs NO LOGIN***
Set InputFile = fso.OpenTextFile("webs_no_login.txt")
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
Do While Not (InputFile.atEndOfStream)
URL = InputFile.ReadLine

objExcel.Cells(i, 1).Value = URL

'Comprobamos conectividad

objHTTP.Open "GET", URL, False
objHttp.Send

If objHTTP.statusText = "OK" Then
objExcel.Cells(i, 2).Value = "On Line"
End If

objExcel.Cells(i, 3).Value = "No necesario login"

i = i + 1 'Siguiente fila
Loop

InputFile.Close
i = i + 1 'Una linea en blanco

' *** WEBs LOGIN ***
Set InputFile = fso.OpenTextFile("webs_login.txt")
Do While Not (InputFile.atEndOfStream)
URL = InputFile.ReadLine

objExcel.Cells(i, 1).Value = URL

'Comprobamos conectividad
objHTTP.Open "GET", url, False
objHttp.Send

If objHTTP.statusText = "OK" Then
objExcel.Cells(i, 2).Value = "On Line"
URL_login = InputFile.ReadLine 'URL test login
patron = InputFile.Readline 'Cadena a buscar
'WScript.Sleep 1000 'sleep de 1 segundo para que de tiempo a cargar pagina final

'Comprobamos login
objHTTP.Open "GET", URL_login, False
objHttp.Send
objExcel.Cells(i, 3).Value = "Login *NO* OK"

arrLines = Split(objHTTP.responseText, vbCrLf)
For Each strLine in arrLines
If InStr(strLine, patron) <> 0 then 'Si patron encontrado
objExcel.Cells(i, 3).Value = "Login OK"
end if
Next
End If
i = i + 1 'Siguiente fila
Loop

i = i + 1 'Una linea en blanco

' *** BBDD ***
Set InputFile = fso.OpenTextFile("bbdd.txt")
Do While Not (InputFile.atEndOfStream)
sqlplus = InputFile.ReadLine
sistema = InputFile.ReadLine
strOutput = EjecutaComando(sqlplus)
objExcel.Cells(i, 1).Value = sistema
patron = "OPEN"
objExcel.Cells(i, 2).Value = "Closed"
arrLines = Split(strOutput, vbCrLf)
For Each strLine in arrLines
If InStr(strLine, patron) <> 0 Then 'Si patron encontrado
objExcel.Cells(i, 2).Value = strline '"Open"
End If
Next
i = i + 1 'Siguiente fila
Loop

InputFile.Close
i = i + 1 'Una linea en blanco

' *** ftp_check.sh ***
objExcel.Cells(i, 1).Value = "remota"
i = i + 1 'Una linea en blanco
'%ComSpec% /c echo y |... necesario para pipear "yes" por si nos pide las claves ssh (la primera vez)
strOutput = EjecutaComando("%ComSpec% /c echo y |plink -ssh -pw password root@remota ""/bin/bash /ftp_check12.sh""")
arrLines = Split(strOutput, vbLf) 'UNIX solo usa caracter LF como nueva linea
For Each strLine in arrLines
objExcel.Cells(i, 1).Value = strline
i = i + 1 'Siguiente fila (siguiente FTP)
Next
'i = i + 1 'Una linea en blanco

WScript.Echo("Monitorizacion servicios Win remotos. Pulse 'Aceptar' y tenga paciencia")

' *** Servicios ***
Set InputFile = fso.OpenTextFile("services.txt")
Do While Not (InputFile.atEndOfStream)
Linea = InputFile.ReadLine
arrLines = Split(Linea, ";")
strComputer = arrLines(0)
Username = strComputer & "\" & arrLines(1)
Password = arrLines(2)

objExcel.Cells(i, 1).Value = strComputer

Linea = InputFile.ReadLine
arrServicios = Split(Linea, ";")

'Creamos el objeto SWbemLocator
Set objLocalizadorWMI = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocalizadorWMI.ConnectServer(strComputer, "root\cimv2", Username, Password)

j = 0
Do While j <= Ubound(arrServicios)
strQuery = "SELECT DisplayName,State FROM Win32_Service WHERE Name = '" + arrServicios(j)
strQuery = strQuery + "'"
'i = i + 1 'Siguiente fila (Servicios)
'objExcel.Cells(i, 2).Value = strQuery

Set colServices = objWMIService.ExecQuery(strQuery)
For Each objService in colServices
i = i + 1 'Siguiente fila (Servicio actual)
objExcel.Cells(i, 2).Value = objService.Name
objExcel.Cells(i, 3).Value = objService.State
Next
j = j + 1
Loop
i = i + 1 'Siguiente fila (Siguiente Servicio)
Loop
InputFile.Close

'Formato resaltado fila 1
objExcel.Range("A1:B1").Select
objExcel.Selection.Interior.ColorIndex = 19
objExcel.Selection.Font.ColorIndex = 11
objExcel.Selection.Font.Bold = True

'objExcel.Cells.EntireColumn.AutoFit
WScript.Echo("CLD finalizado. Pulse 'Aceptar' y revise la hoja Excel")

Related Posts by Categories



4 comentarios :

shinrage dijo...

Buen script, yo lo descargue, pero el listado de servicios no me funciona.

vlan7 dijo...

Gracias shinrage,

Fijate en la definicion del archivo services.txt:

'services.txt - 2 lineas: host/IP;user;password, servicio1;servicio2;...;servicion

Si lo lanzas contra una maquina remota, sobre todo si estas en un dominio, asegurate de que "user" sea igual a "NombreMaquina\Administrador" por ejemplo.

Por otra parte, los nombres de servicio tienen que ser iguales al DisplayName. Por ejemplo, "Horario de Windows" seria W32Time.

Si tienes cualquier problema, o simplemente quieres hacerme notar que ya lo has conseguido, no dudes en contactarme.

Suerte y Exitos.

vlan7 dijo...

Te pongo un ejemplo de archivo services.txt shinrage porque veo que te lo has currado haciendo funcionar todo lo demas:

Linea 1:
NombreMaquina;NombreMaquina\Administrador;password

Linea 2:
servicio1;servicio2;servicio3

Y asi para todos los servicios que quieras monitorizar, 2 lineas por maquina como ves.

Suerte,

vlan7

shinrage dijo...

Estoy en un dominio de novell. El problema es que tengo 1 excell con una lista de IP's a las cuales tengo que comprobar, primero que esten online, segundo que tengan el servicio de RADIA instalado. El nombre de pc.. pues en la lista que tengo no estan actualizados los nombres, tendria que comprobarlo con un nbtstat -a para ver si coinciden.

Actualice el services.txt segun me dijiste, pero ahora me tira permiso denegado x'D, gracias por contestar ^^ sigo probando.. :P