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!

martes, 16 de febrero de 2010

Antes Spectrum y Amstrad, después Windows y Linux, ahora Apple y...¿Google?

Hace poco me he decidido a dar el salto a los terminales smartphone, con tarifa plana de datos, sobre todo tenida cuenta de que ya hay clientes CITRIX para Iphone y Windows Mobile, y en breve lo habrá para Android, lo que me permitiría acceso a mi trabajo en todo lugar y momento.

Pero claro, como para todo lo que cuesta dinero, me lo tomo con calma. Cuande termine de pagar mi flamante portatil dentro de unos meses será cuando dé dicho salto, y así me doy tiempo para tomar una decisión con perspectiva.

Pero entonces me encuentro cómo está el mercado. Con Iphone en pleno auge, Nexus One que acaba de salir con su Android 2.1 actualizado con Multitouch, y Microsoft presentando su versión 7 de Windows Mobile donde por fin deciden hacer un OS móvil con interfaz para móvil (aunque sigue sin gustarme tanto como los otros dos).

Todo esto me ha hecho reflexionar. He visto videos y videos, he leido decenas de analisis y comparativas, y me he dado cuenta de que nada ha cambiado. No voy a repetir todo eso porque es muy fácil encontrarlo en Google, pero he reflexionado, y nada ha cambiado. Es como cuando se peleaba por la competencia Spectrum y Amstrad, Sega y Nintendo, Windows y Linux (sí, incluso aquí, porque es increible la de gente que defiende Linux sin haberlo probado).
Las cifras hablan claras. Las especificaciones tecnicasde Google Nexus One está por encima de Iphone, asi como las de muchos más modelos del mercado. Android es un sistema abierto, lo que deriva en que es adaptable a cualquier tecnologia y standard actual o futuro. Pero Iphone tiene dos cosas que los demas no tienen: es bonito, y le ha gustado a los americanos. Y todos sabemos que tenemos que regirnos por eso....

Ironias aparte, el Iphone de Apple es a la telefonia, lo que Windows 95-98 fue a la informatica domestica: Un producto claramente inferior a la competencia, con carencias imperdonables, cuya unica virtud es haber llegado a mucha gente en poco tiempo, y haber creado un sentimiento "club" que hace que sus partidarios lo defiendan a muerte, con argumentos realmente pobres:

- "Para que quiero Flash si ya llega HTML5" - Joder, es como preguntar para qué quiero que reproduzca mp3, si yo sé cantar...
- "Para que quiero multitarea si tengo las notifiaciones push" - porque no es lo mismo trabajar que decir que estas trabajando
- "El Iphone es de Apple y si es de Apple es lo mejor porque Apple siempre hace lo mejor" (juro que he llegado a leer esto) - Con la Fe ciega empezó la Iglesia y terminó quemando peña.

Puedo entender algunas virtudes del Iphone, pero nunca entenderé cómo la misma persona que ha criticado a muerte a Microsoft y su politica, puede defender a una compañía que por comprar un teléfono te "casa" con Itunes y la AppStore, te niega el uso de programas que se han hecho un standard, te vende por 500 euros un aparato con prestaciones inferiores a TabletPC's de hace 7 años (Ipad), y muchos etceteras que me dejo fuera porque es tarde.

Menos mal que Google les está haciendo la guerra, y no con Nexus One ( que está vendiendo bien poco), sino con Android y su software Web. Porque Android es libertad, es código abierto, y el Nexus no es mas que una prueba de como usarlo bien, para que los demás fabricantes tomen ejemplo. Y lo mejor de esto es que Apple tiene que tragar con google en su Iphone, pero Android no tiene que tragar a Apple.

De todas formas uno está resignado a que en estas cosas, el consumidor manda, pero el consumidor es mucha gente, y aunque el individuo es inteligente, la masa tiende a no tener criterio, asi que Apple igual gana.

O no, que sé yo.

Curso Script SecureCrt - Monitorización y Gestión de Equipos Cisco y Teldat mediante Scripts - Parte 1

En esta primera entrega trataremos conceptos generales de Scripting bajo SecureCrt. En primer lugar, comentar que este curso supone conocimiento de equipos Cisco y Teldat, y no profundiza en el significado de los comandos de dichos equipos. Del mismo modo se entienden conocimientos básicos de programación en Visual Basic, y al decir básicos me refiero a que se explicará por ejemplo cómo declarar un objeto tipo hoja de Excel desde un script, pero no se explicará qué es una variable o cómo usar una estructura de control tipo FOR. Si hay demanda sobre ello (para lo cual, por supuesto, antes alguien tendrá que leer este blog), se realizarán cursos o manuales al respecto.

Comencemos.

Para quien no lo conozca, SecureCRT es uno de los mejores clientes Telnet/SSH modo texto del mercado, con el hecho de ser de pago como única lacra reseñable. Muchos administradores de equipos lo utilizan, o tienen acceso a él, por lo que es una buena herramienta sobre la que realizar scripting.

Como añadido, este programa implementa un motor de scripts y exporta una serie de objetos para facilitarnos el trabajo. El programa admite los lenguajes Perl, JavaScript y VisualBasicScript.

En este Blog se tratarán los Scripts SIEMPRE bajo VbScript, aunque tanto los conceptos generales como los objetos exportados por SecureCRT son comunes a los tres lenguajes.

Y ahora es cuando todo un ejército AntiWindows, AntiMicrosoft, y todo aquel convencido de que Bill Gates es el mismisimo anticristo, se alza y se encandaliza por elegir Visual Basic antes que Perl o JavaScript.

Vayamos por partes. Perl gusta a ciertos puristas de Linux, pero ellos mismos reconocen de forma implicita lo engorroso que es al estar migrando a Phyton para hacer las mismas cosas. JavaScript está muy bien, pero no olvidemos que la santa Sun Microsystem ha sido adquirida por la muy avara Oracle, que es a Bases de Datos lo que Microsoft a Sistemas Operativos, por lo que Sun también se ha demonizado, o lo hará en breve. Y, lo que me parece con mucho lo más importante: a lo largo del presente curso se tratarán llamadas hacia y desde Access y Excel, y al usar un lenguaje script de Microsoft nos evitamos muchos problemas en los cruces de datos.

De este modo, para crear un Script de tipo VB no tenemos más que crear un fichero de texto plano con Notepad y guardarlo con extensión *.vbs . Para ejecutarlo, lo haremos pulsando desde SecureCRT el menú "Script" - "Run" y eligiendo el fichero creado.

Es tradición utilizar el típico "HelloWorld" como primer código de ejemplo en un curso o manual de programación, desde que Ritchie y Kernighan lo utilizaran en la introducción a su famosisimo lenguaje C . Asi que comenzaremos igual:

- Abrir Notepad en blanco

- Copiar el código:

#$language = "VBScript"


#$interface = "1.0"


Sub Main


MsgBox "HelloWorld"


End Sub


- Guardar el fichero con extensión *.vbs

- Desde SecureCRT, menú "Script" - "Run" y elegir el fichero que acabamos de guardar.

Algo tan simple como esto es el primer paso dentro de un vía de trabajo muy potente. En posteriores partes del curso, comprobaremos como ordenar la ejecución de un script desde Access o Excel pasandole parametros, o al reves, como volcar datos leidos de equipos a ficheros de Office. Veremos que podemos descargar la configuración de nuestros equipos de forma automatica, o monitorizar sus interfaces. Y por supuesto, aunque yo enfoque esto a equipos Cisco y Teldat, porque es lo que más uso, podrá aplicarse a cualquier máquina administrada (como equipos Unix) sólo modificando parcialemnte el código.

Quisiera cerrar esta primera entrega con unas consideraciones generales sobre el lenguaje VbScript, adecuadas sobre todo a quien haya programado en Visual Basic o Visual Basic for Aplications:

- VBScript es, valga la redundancia, un lenguaje script, es decir, es por definición menos potente que sus "hermanos mayores"

- No se requiere la declaración de variables, ni se permite la declaración de tipos de variable; esto implica que todas se declaran de forma obligad como tipo Variant. Todo programador con cierta experiencia sabe que esto es una locura y puede dar múltiples problemas, pero puede arreglarse gracias a que, aunque no se permite la declaración de tipos, sí se permite el forzado con funciones como CInt() o CStr().

- La mayoría de funciones se implementan como en VB 6.0, no como .NET

- No se permite el uso de módulos, pero puede simularse (ya se explicará).

- No se permite la declaración o llamada a API's, aunque puede simularse (ya se explicará).

- VBScript es más un lenguaje estructurado que orientado a eventos, con el cambio de enfoque que eso conlleva.

Con esto concluye el primer acercamiento a la programación de Scripts para SecureCRT. En la próxima entrega veremos los objetos que SecureCRT nos ofrece y una pequeña aplicación para realizar Ping a una lista de equipos almacenados en BBDD y volcar a fichero aquellos que no respondan.


Hasta la proxima!!!

lunes, 15 de febrero de 2010

Saludo inaugural

Bueno, todo Blog debe empezar por una entrada, así que aparte de los saludos de rigor, yo utilizaré ésta para mi pequeña presentación, y mi particular declaración de intenciones.

Aunque no lo parezca por el título, este Blog pretende ser principalmente técnico, y principalmente referido a las Telecomunicaciones. Pues...¿no son siempre realmente lo que está en medio, lo que hace que los extremos se comuniquen entre sí? De todas formas también podré incluir comentarios de programación, móviles, cine, scene... lo que mi humor dicte a cada momento... pero claro, no es que haya querido ser poetico con el título, es que cualquiera que crea un Blog hoy en día lo tiene dificil para hallar una URL que esté libre.

El primer objetivo, y de hecho lo que ha promovido la creación de este Blog, se centrará en algunos articulos de Scripting de SecureCrt para gestión y monitorización de redes, ya que hay muy poco código en páginas en Español; incluso en inglés, abren puertas a lo que puede hacerse pero sin hallar códigos completos que sean realmente interesantes.

En cuanto a mí, de momento cuanto atañe a los primeros objetivos de este Blog, soy programador por formación académica, pero he trabajado en Telecomunicaciones desde que puse mi primer pie en el ámbito laboral. Por supuesto soy mucho más, soy mis aficiones, mi familia, mis amigos... Pero como decía el gran maestro Ende: "Eso es otra historia, y será contada en otro momento"