miércoles, 17 de febrero de 2010

Curso Script SecureCRT - Monitorización y Gestión de Equipos Cisco y Teldat mediante Scripts - Parte 2

En esta segunda entrega vamos a ir mucho más al grano. Como se dijo en la primera parte, se entiende que el lector tiene cierto nivel de programación, por lo que se da por sabido lo que es un objeto y cómo utilizarlo, y que el código expuesto será comprensible. De este modo, vamos a realizar una rápido vistazo a las capacidades de los objetos que nos aporta SecureCRT, y un ejemplo de uso aplicando estos objetos y otros propios de Office-Windows con un código comentado.
Objetos de SecureCrt:

No vamos a enumerar cada una de las propiedades y métodos de cada objeto del programa, principalmente porque dicha información es accesible desde la ayuda de la aplicación en: Contenido - ActiveX Scripting - Scripts Objets Reference. El nivel de inglés utilizado en dicha ayuda en bastante básico, aunque no descarto realizar mi propia versión de dicha ayuda en castellano.

Usaremos los objetos para interactuar con SecureCRT, y por medio de ellos podremos inciar sesión, pedir datos al usuario, enviar o leer datos a pantalla, y muchas cosas más que iremos viendo. Algo que no podemos hacer es acceder directamente a los datos que se transiferen, esto es: podremos leer y escribir de pantalla como el mismo texto que vería un operador accediendo manualmente, sin opción de aceder al propio flujo de datos que se está transmitiendo.

Una lista de objetos de uso común podría ser:

- crt.Session.Connect -> para iniciar una seisón Telnet o SSH. Siempre debemos tener una conexión activa en SecureCrt para poder escribir comandos, de este modo lo normal es que lo primero que hagamos sea conectar a un servido de gestión desde el cual a su vez conectaremos o lanzaremos comandos a los equipos administrados. Si la propia máquina que usamos puede hacer de servidor de gestión, podemos habilitar en ella el acceso por Telnet y abrir desde SecureCrt sesión Telnet a la IP local (127.0.0.1), para después lanzar los comandos.

- crt.Screen.Send -> para enviar texto a pantalla.

- crt.Screen.WaitForString -> para esperar texto de respuesta en pantalla

- crt.Screen.Get -> para capturar en una variable el texto en pantalla

Los métodos siguen la convención de llamada como procedimiento o función de Visual Basic, de forma que según expresemos los parametros entre parentesis o no, se devolverá un valor de retorno:

- crt.Screen.WaitForString "#",2 -> espera el carácter "#" en pantalla o dos segundos, y continua el código

- aux = crt.Screen.WairForString("#",2) -> devuelve True si aparece "#" antes de dos segundos, caso contrario devuelve False. Almacena el valor devuelto en la variable "aux" y continúa el código.

Pero vamos a lo que nos interesa: un código de ejemplo completo y útil. El siguiente código conecta a una base de datos Access y realiza ping a una lista de equipos contenidos en ella. Cuando termina muestra un fichero de texto con los equipos que no han respondido. El código estará comentado para una correcta comprensión de los objetos de SecureCRT utilizados.

Este código puede parecer de poca utilidad porque hay muchos programas como HostMonitor que realizan un ping periodico a las IP's que le indiquemos. Pero hay casos (como en mi trabajo) que no se dispone de una máquina en la red a administar en la que tengamos derechos para instalar nada, o solo tenemos acceso telnet al servidor de gestion, y la unica forma de automatizar tareas es realizar inventos como este.

El código supone la conexón SSH a un Sever de gestión Unix desde el cual lanzaremos los comandos Ping. Los datos de los equipos a los que probar ping están almacenados en una base de datos Access en una tabla llamada "equipos":


''''''''''''''''''''''INICIO DEL CODIGO (los comentarios en color Verde)

#$language = "VBScript"  'Siempre iniciaremos los scripts con estas dos lineas, o SecureCRT no podrá ejecutarlo.
#$interface = "1.0"

'No hay obligación de declarar constantes y variables ni se permite especificar el tipo, por lo que estas lineas realmente no hacen nada util. Se incluyen para especificar donde se usará cada variable y por hábitos de programación

Const ForReading = 1 'Constante para indicar apertura de fichero en modo lectura
Const ForWriting = 2 'Constante para indicar apertura de fichero en modo escritura
Const ForAppending = 8 'Constante para indicar apertura de fichero en modo apunte, es decir, escritura al final del fichero

dim fso,file,fsoerror,fileerror 'Variables para manejo de Ficheros
dim auxreadline,str,conterr 'Variables auxiliares y de control
Dim Rst, Cnn,sConn, sel 'Variables de manejo de BD
Dim shell 'Variables para manejo de shell de Windows

Sub main 'Inicio de rutina principal

'--------------------------------Conectar a servidor de gestión -------------------------------
Dim user, passwd, ip_ges

user = crt.Dialog.Prompt("Introduce tu usuario:", "Introducción de usuario", "", False) 'Muestra una ventana solicitando usuario
passwd = crt.Dialog.Prompt("Introduce tu Password:", "Introducción de password", "", True) 'Muestra una ventana solicitando password, y lo oculta gracias al parametro True
ip_ges = crt.Dialog.Prompt("Introduce IP:", "Introducción de IP", "", False) 'Muestra una ventana solicitando IP del servidor de gestión 

On Error Resume Next 'Si hay un error, no interrumpe el Script

cmd = "/SSH1 /L " & user & " /PASSWORD " & passwd & " /C 3DES " & ip_ges 'Montamos la cadena que define la conexión

crt.Session.Connect cmd 'Ordenamos la conexión al Server de Gestión

if Err.Number <> 0 Then 'Si hay algún error se ejecuta el codigo a continuacion

MsgBox "No se puede conectar con gestiap: " & Err.Description 'Mostramos el error en pantalla

exit sub 'Salimos del Script

end if

crt.Screen.WaitForString "$" 'Esperamos el Prompt de escritura del Server, en Unix suele ser $
'--------------------------------Fin Conectar Server de Gestión-------------------------------

Set Cnn = CreateObject("ADODB.Connection") 'Creamos en memoria un objeto ADO de Base de datos
sConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\mibbdd.mdb;" 'Definimos la cadena de conexion a  Base de Datos, indicando en Provider el driver de Base de datos (el de Acces en este caso) y en Data Source la ruta de dicha BBDD en nuestro disco duro
Cnn.Open(sConn) 'Abrimos la conexión con la BBDD
sel ="SELECT IP_Gestión,Equipo FROM equipos WHERE IP_Gestión<>''" 'Consulta SQL que vamos a filtrar a la BBDD. Capturamos IP y nombre de equipo de la tabla "equipos", excluyendo aquellos con la ip en blanco
Set Rst = Cnn.Execute(sel) 'Ejecutamos la consulta a BD y volcamos al objeto Rst el resultado
Set fsoerror = CreateObject("Scripting.FileSystemObject") 'Creamos un objeto de Fichero de texto
set fileerror = fsoerror.CreateTextFile("C:\errorlogping.txt", True) 'Abrimos un flujo a fichero en modo sobreeescritura y lo asignamos al objeto fileerror

Rst.MoveFirst 'Nos situamos en el primer registro de la consulta a BBDD
conterror = 0 'Inicializamos contador de equipos fallidos

Do While Not (Rst.BOF Or Rst.EOF) 'Comienzo del bucle para recorrer los registros de la consulta

str=trim(Rst.Fields("IP_Gestión").Value) 'Capturamos valor del campo IP_Gestion en variable auxiliar str

crt.Screen.Synchronous = True 'Comenzamos sincronizacion con pantalla. Esto sólo sirve para evitar agunos errores en la captura de datos de pantalla de SecureCRT

crt.Screen.Send "ping " & str & VbCr 'Enviamos a pantalla el ping a la IP capturada + Intro
if (crt.Screen.WaitForString(str & " is alive",3)=False) then 'Condicion1 - Caso de que no se produzca el ping en 3 seg. Hay que tener en cuenta que en el server de gestión que contemplamos, la respuesta a un ping correcto contiene la cadena "is alive" . Si esto no es asi el codigo dará siempre todos los ping por fallidos salvo que se modifique este codigo.
crt.Screen.Send Chr(3) & VbCr 'Enviamos Ctrl + C + Enter a pantalla para cortar el intento de ping y volver al prompt de Unix
fileerror.Write trim(Rst.Fields("Equipo").Value) & VbCrLf 'Volcamos al fichero de texto abierto el nombre del equipo fallido. Si se quiere volcar la IP en lugar del nombre, cambiar el campo en Rst.Fields
conterror = conterror + 1 'Incrementamos contador de equipos fallidos
end if 'Fin de condicion1
crt.Screen.WaitForString "$",2 'Esperamos al Prompt o 2 segundos
crt.Screen.Synchronous = False 'Terminamos sincronizacion con pantalla
Rst.MoveNext 'Avanzamos al siguiente registro de la consulta a BBDD

Loop 'Fin de vuelta del bucle

fileerror.Close 'Cerramos flujo a fichero
if conterror<>0 then 'Condicion2 - Si existe algun equipo fallido se ejecuta el código a continuacion

if (msgbox("No se ha podido conectar a " & conterror & " equipos" & VbCrLf & "¿Desea comprobar qué equipos no tienen acceso?",276,"No se ha podido conectar a algunos equipos")=6) then ' Condicion3 - Si se responde SI al mensaje en pantalla se ejecutará el coigo a continuacion, que muestra el fichero con equipos fallidos

Set shell = CreateObject("WScript.Shell") 'Creamos instancia del Shell de Windows
shell.Run """%systemroot%\notepad"" C:\errorlogping.txt" 'Ejecutamos Bloc de notas para mostrar el contenido del fichero de log de errores donde habiamos volcado los equipos fallidos

end if 'Fin de condicion3

else 'Condicion2 - Caso de que no fallara ningún equipo
msgbox "Todos los equipos responden a la prueba de ping",64,"Proceso finalizado" 'Mostramos en pantalla mensaje de fin de Script

end if 'Fin de condicion3

Rst.Close 'Cerramos objeto de consulta para liberarlo de memoria
Cnn.Close 'Cerramos conexion a BDpara liberarlo de memoria

End Sub 'Fin de rutina principal del Script

''''''''''''''''''''''FIN DEL CODIGO

Esto es todo por ahora, en la siguiente entrega mostraremos una función recursiva para hacer Telnet a equipos Cisco de forma recursiva y uso de ficheros excel desde el Script

Saludos!

5 comentarios:

  1. Hola...
    Gracias por la explicacion, estaba buscando otras cosas pero igual de aqui aprendi muchas cosas que no sabia.

    ResponderEliminar
  2. Buenas tardes, me gustaria saber como puedo obtener la hora del sistema mediante VBSCRIPT Muchas graicas

    ResponderEliminar
  3. Gracias muy buena idea si se puede armar un grupo para intercambiar info adelante

    ResponderEliminar