viernes, 24 de febrero de 2017

Crear un interfaz gráfica para nuestro código Python. (Versión 2)

En un artículo anterior describía como crear la interface gráfica a un código Python. Un procedimiento un poco largo que al cabo de cierto tiempo cuando estas más familiarizado descubres otras formas de generarlo.
 
Creamos el proyecto en QT Creator:


 

 


 

 


 

 


 Cuando se instala QT Creator también instala en la carpeta de Python esta carpeta:

C:\Python27\Lib\site-packages\PyQt4


Una vez que tengamos creado lanzamos:

C:\Python27\Lib\site-packages\PyQt4\pyuic4.bat path-completo\mainwindow.ui -o path-completo\mainwindows.py

La herramienta pyuic convierte el archivo Qt Designer con extensión .ui a un archivo de código fuente Python .py.







 
 
 

jueves, 23 de febrero de 2017

¿La programación es una solución para gestión del Networking?


La transformación digital producirá cambios importantes en los puestos de trabajos actuales y para los próximos años. La automatización conjuntamente con la inteligencia artificial destruirá muchos empleos de trabajo. Desde mi punto de vista es un buen momento para plantearse una transformación y poder absorber con mejor perspectivas los nuevos cambios.

El crecimiento vertiginoso de Internet y las redes en empresas hace imposible gestionarlo como se estaba haciendo hasta ahora. Todos los entornos físicos están sometidos a migraciones en espacios virtuales para facilitar su configuración. El volumen de aplicaciones se multiplica y su dinamismo produce grandes cambios en la forma que gestionamos las redes.
Los mayores problemas son los congestionamientos y la falta predictibilidad en la gestión de los recursos disponibles.La cantidad de información es cada vez mayor lo que a veces hace difícil el correcto diagnóstico de problemas en poco tiempo.

El factor tiempo es el elemento clave que se valora y el protagonismo que antes tenía  la solución tecnológica de un desarrollo o solución de un problema es desprestigiado. El software asumirá todas las carencias en todas las disciplinas de redes. Es muy probable que  ingenieros que no sepan codificar un lenguaje de programación serán dejados de lado.

Se está produciendo cambios importantes en la industria del networking, tendencia como SDN empiezan a tomar forma.  Desarrollar estas habilidades en programación será cada vez más esenciales. La automatización de tareas es una buena inversión para seguir el ritmo impulsado por los cambios y las exigencias por parte de las redes.
Además programar es muy interesante y podemos desarrollar nuestra lado creativo.

Ptyhon es un buen lenguaje con una curva de aprendizaje muy rápida gracias a toda la documentación disponible en Internet y la gran cantidad de ejemplos.
En este pequeño Blog  quiero compartir los diferentes temas que he abordado y explicar cómo he pensado desarrollarlos aportando el código para cada caso.

El propósito de este proyecto nació de una iniciativa propia para inventariar grandes cantidades de dispositivos de forma automática. El programa desarrollado se llama Assit IT y  está enfocado para recoger información de dispositivos Cisco o Teldat por SNMPv2, SNMPv3, SSH o Telnet.  Básicamente recoge información de los dispositivos y lo transcribimos en un fichero xls.

miércoles, 22 de febrero de 2017

Entender lo que es un SOCKS Proxy.

Antes de empezar a ver ejemplos de código, creo que es interesante entender bien que es lo que nos puede aportar la utilización de un SOCKS Proxy. En la gran mayoría de entornos para acceder a toda la electrónica de red se utiliza una servidor de salto que tiene visibilidad a las distintas redes de gestión (OOB) que tengamos disponibles. Desde dicho servidor se puede acceder por SSH, telnet a los distintos dispositivos para acceder a la consola y gestionarlos.

Para desarrollar  una aplicación que tenga que gestionar, despegar configuración o recogerlas es necesario acceder a las consolas de los dispositivos. Lo primero que tenemos que tener un es un túnel al servidor de salto y redirigir todas las peticiones para que sean lanzadas desde allí. Para poner en marcha esto explicaré primero como hacerlo con SecureCRT.


Para configurar SecureCRT de tal forma que podamos añadir una sesión cliente de cualquier dispositivo que queramos acceder hay que tener esencialmente:

- Un túnel SSH desde nuestro ordenador al servidor de salto.
- Un Proxy Sock5 local con o sin autenticación.

Lo primero un (Túnel SSH)  es una sesión normal SSH que tendrá permanecer abierta, lo guardamos y lo renombramos con [Túnel]. El segundo paso importante es crear el proxy sock (Tipo sock5) y definir un puerto de escucha. Por último todas las sesiones nueva que crearemos especificaremos que haga el uso del proxy creado desde SecurCRT.

Configuración del túnel:

SecureCRT Túnel SSH + Proxy Sock5.
 - Creación del túnel:

Creamos una sesión normal que al final lo guardaremos como túnel. Se puede crear varios túnel con varios servidores de salto y varios proxy sock5 el único requisito que este último no coincidan los puertos.




SecureCRT Túnel SSH + Proxy Sock5.
  - Creación del túnel:




IP del servidor de salto.

Se trata de la sesión túnel dejamos vacío el desplegable de Firewall.




Creamos el Proxy Sock (tipo sock5):


SecureCRT Túnel SSH + Proxy Sock5.
 - Creamos el Proxy Sock5





En la misma sesión que estamos creado para el túnel SSH añadimos la configuración del proxy Sock.



SecureCRT Túnel SSH + Proxy Sock5.
  - Creamos el Proxy Sock5



Podemos el nombre para identificarlo y escogemos el puerto. Este puerto recibirá las peticiones que redirecionará al servidor de salto.

Importante escoger le opción Dynamic Port Forwarding que nos permitirá conectar a distintos dispositivos a la vez.








SecureCRT Túnel SSH + Proxy Sock5.
   - Creamos el Proxy Sock5


Resultado una vez creado.





SecureCRT Túnel SSH + Proxy Sock5.
  - Creación del túnel:

Es opcional pero si queremos mantener la sesión SSH abierta y que no sea cerrada por inactividad o  "Timeout".

Podemos habilitar el protocolo no-op que será enviado cada cierto tiempo siempre cuando el servidor tenga la opción habilitada.

La otra opción y que nunca falla es enviar un carácter en este caso un espacio en blanco cada x tiempo. No olvidar poner el espacio en blanco como carácter para que sea enviado.






SecureCRT Túnel SSH + Proxy Sock5.
 - Configuración global (SecureCRT)

Damos de alta el servicio para la escuche de peticiones.





SecureCRT Túnel SSH + Proxy Sock5.
   - Configuración global (SecureCRT)


Añadimos el servicio a nivel local.


SecureCRT Túnel SSH + Proxy Sock5.
  - Configuración global (SecureCRT)

Damos de alta el servicio para la escuche de peticiones.

- Ponemos un nombre.
- IP: 127.0.0.1
- Puerto: 10022




Ahora creamos una sesión para acceder al router1 por ejemplo:


SecureCRT Túnel SSH + Proxy Sock5.
 - Creamos una nueva sesión (cliente)


Este será un nueva sesión para acceder a al dispositivo usando el túnel que previamente hemos creado.

- IP del dispositivo al cual queremos acceder.

- Firewall: Especificamos para esta sesión la utilización del proxy que previamente hemos creado. En cada nueva sesión se tendrá que hacer lo mismo.




SecureCRT Túnel SSH + Proxy Sock5.
  - Creamos una nueva sesión (cliente)

Es opcional podemos especificar un script en este caso en Vbs para que autenticarse de forma automática.

Facilito el código del fichero Autologin.vbs al final de este documento.


Fichero: Autologin.vbs

 #$language = "VBScript"
#$interface = "1.0"

' Script Autorellenar el usuario/contraseña.
' Version = 1.5

Option Explicit

crt.Screen.Synchronous = True

' Declare standard global variables
Dim strUName, strUPwd, objFSO, objFile

Const ForReading = 1
Const Pathlocation = "C:\Blog\Scripts"
Const CiscoIosPrompt = "Username: "
Const CiscoIosPrompt2 = "username: "
Const DellChassisPrompt = "User Name:"

Sub Main
' Create file object
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Call to Procedure to see if credentials are known
Call checkCred(strUName, strUPwd, objFSO)
' return terminal session screen back to nondisruptive
crt.Screen.Synchronous = False

' Clear out file object
Set objFSO = Nothing
End Sub

Sub checkCred(strUName, strUPwd, objFSO)
' Declare procecure variables
Dim intKnown, intFileExist
intKnown = 0
intFileExist = 0
' Check if data file exist
If objFSO.FileExists(Pathlocation) Then intFileExist = 1

' Conditional check if credentials are known 
If strUName = "" Then intKnown = intKnown + 1
If strUPwd = "" Then intKnown = intKnown + 1
If (intKnown > 0) And (intFileExist = 1) Then 
Call readInInfo (strUName, strUPwd, objFSO, objFile)
Else
Call userCred(strUName, strUPwd)
End If
' Credentials should be known now call userLogin
Call userLogin(strUName, strUPwd)
End Sub

Sub readInInfo (strUName, strUPwd, objFSO, objFile)
' Declare procecure variables
Dim strTxtData, arrTxtData
' Open text file for reading
Set objFile = objFSO.OpenTextFile(Pathlocation, ForReading)
' Read in data from text file 
strTxtData = objFile.ReadAll
' Close out text file
objFile.Close
' Break out long string using split on delimiter of carriage return
arrTxtData = Split(strTxtData, vbCrLf)
' Place data in String from Array elements
strUName = arrTxtData(0)
strUPwd = arrTxtData(1)
End Sub

Sub userCred(strUName, strUPwd)
  ' Dialog prompts to collect the access credentials used in this script
   strUName = crt.Dialog.Prompt("Enter Username:", "Username - TACACS or LOCAL", "", False )
   strUPwd = crt.Dialog.Prompt("Enter Password:", "Password - TACACS or LOCAL", "", True )


End Sub



Sub userLogin(strUName, strUPwd)
' Declare procecure variables
Dim intLogin
  ' Login using provided credentials, check for different prompts
  ' WaitForStrings returns index of string as result, 
  ' used to check prompt response selections or 0 = timeout
  ' 
  intLogin = crt.Screen.WaitForStrings(CiscoIosPrompt, DellChassisPrompt, CiscoIosPrompt2, 3)
  If intLogin > 3 Then
MsgBox "No se puede detectar el tipo de prompt!"
Exit Sub
ElseIf intLogin = 0 Then
MsgBox "Timeout!, prompt no detectado :-)"
Exit Sub
Else
   'crt.Sleep 3000
   crt.Screen.WaitForString "Username: ", 1
crt.Screen.Send strUName & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "assword: ", 1
crt.Screen.Send strUPwd & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "username: ", 1
crt.Screen.Send strUPwd & chr(13)
End If
' Use condition to see if enable access is available, otherwise enable
If (crt.Screen.WaitForString("#", 1)) Or (crt.Screen.WaitForString("(enable)", 1)) Or (crt.Screen.WaitForString("*", 1))  Then
crt.Window.Activate()
Else
        'crt.Sleep 3000
crt.Screen.WaitForString "Username: "
   crt.Screen.Send strUName & chr(13)
crt.Sleep 2000
crt.Screen.WaitForString "assword: ", 1
crt.Screen.Send strUPwd & chr(13)
crt.Screen.WaitForString "#", 1
End If

End Sub




Estructura del fichero password.txt:

usuario-servidor de salto.
contraseña-servidor de salto.
usuario dispositivo-router1
contraseña dispositivo-router1 


Guardamos los usuarios y contraseña respetado la estructura con carro de retorno al finalizara cada línea.


martes, 21 de febrero de 2017

Crear un interfaz gráfica para nuestro código Python.

Introducción

El propósito de este documento describe la forma para añadir una interfaz gráfica para un código Python. Las herramientas necesarias son QT Designer sirve para  diseñar la interfaz gráfica. Para facilitar la edición del código Python y unificarlo en una misma herramienta de diseño se puede usar QT Creator (es un conjunto de herramientas). La fórmula para tener una interfaz gráfica es añadir un fichero Python al proyecto. Este fichero es una plantilla base, se añade al proyecto en QT Creator y también se usa para añadir el código Python de nuestra aplicación.

Crear una interfaz gráfica.

Abrimos QT creator y seguimos los pasos a continuación para crear un nuevo proyecto:














Figura 1. Crear un proyecto en QT Creator.










Figura 2. Seleccionamos la opción “Qt Widgets Application”




Figura 3. Escogemos la opción “Choose…”.




Figura 4. Nombre del proyecto y será el nombre de la carpeta también.




Figura 5. Ubicación de la carpeta donde queremos guardas los proyectos.



Figura 6. Escogemos la opción: Siguiente



Figura 7. Sin información,  dejar por defecto y escoger siguiente.




Figura 8. Opciones por defecto escogemos siguiente



Figura 9. Opciones por defecto, escogemos siguiente.




Figura 10. Proyecto creado en Qt Creator.

El proyecto está creado,  en Forms podemos diseñar la interfaz gráfica:

Figura 11. Diseño de la interfaz gráfica en la herramienta Qt Design.


Insertar un fichero nuevo en el proyecto.

Los próximos pasos consisten en añadir la plantilla base que también usaremos para añadir el código Python.


Figura 12. Añadir un nuevo fichero al proyecto.



Figura 13. Escoger el lenguaje del fichero nuevo.



Figura 14. Escogemos la extensión del fichero, en este caso .py




Figura 15. Escogemos el nombre que queremos para guardarlo.




Figura 16. Verificamos que estamos añadiendo al proyecto en curso.



Figura 17. El nuevo fichero Python es añadido en el proyecto en curso.



Insertar la plantilla base.

En punto anterior se añadió un nuevo fichero Python al proyecto y es el que usaremos para añadir esta plantilla. Es código Python vincula el fichero del código con la interfaz gráfica y introducimos el código de todos los objetos que añadimos en la interfaz gráfica.

Código que guardamos en el nuevo fichero python:
import sys
from PyQt4 import QtCore, QtGui, uic

qtCreatorFile = "" # Enter file here.

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())