miércoles, 2 de mayo de 2012

Creando una app con python, Tkinter y libvirt

     Entre esta semana y la que pasó estuve dedicado a realizar una pequeña aplicación que se encargaba de conectarse con libvirt mediante python y Tkinter, como conozco bien el funcionamiento de virsh pensé que sería fácil, pero por el contrario me costo algunas horas de dedicación.

     La app que deseaba realizar consta de tres (3) botones uno para encender, uno para apagar y otro para verificar el estado de la máquina virtual, por lo tanto decidí aventurarme con python y tkinter para realizar dicha tarea; los dos primeros botones no presentaron ningún problema, ya que con os.sytem puedo ejecutar comandos de consola, pero para el tercer botón si que me costo varios días de dedicación a Internet y preguntándole a mis amigos programadores en python, sin embargo, luego de leer un buen rato y por recomendación de Carlos Ruíz (@carlosgr_arahat) un gran amigo y excelente programador, decidí trabajar con la API de libvirt con python, tal y como se comenta en este enlace.

     Me remangué las mangas y a programar, me dí cuenta de cuan oxidado estoy en este mundo, pero decidí no rendirme y terminar este proyecto, el cual culminé con éxito, aquí anexo el código para personas que como yo no tengan muchos conocimientos en programación y puedan obtener un buen resultado:

from Tkinter import *
import os
import tkMessageBox
from tkColorChooser import askcolor
from tkSimpleDialog import askfloat
from tkFileDialog   import askopenfilename
import libvirt


class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="Encender", fg="dark green", command=self.encender)
        self.button.pack(side=LEFT)

        self.button2 = Button(frame, text="Apagar", fg="dark red", command=self.apagar)
        self.button2.pack(side=LEFT)

    self.button3 = Button(frame, text="Estado", fg="black", command=self.estado)
    self.button3.pack(side=BOTTOM)

    def encender(self):
        os.system("virsh -c vbox:///session start Windows")
    def apagar(self):
        os.system("virsh -c vbox:///session destroy Windows")
    def estado(self):
    conn = libvirt.openReadOnly(None)
        dom0 = conn.lookupByName("Windows")
    estado = dom0.info()
    estado1 = estado[0]
    if estado1 == 1:
         tkMessageBox.showinfo(title="Estado de la Maquina virtual", message="La Maquina Virtual se Encuentra Encendida")
    else:
         tkMessageBox.showinfo(title="Estado de la Maquina virtual", message="La Maquina Virtual se Encuentra Apagada")

root = Tk()
root.title('Inicio de Maquina Virtual')
root.minsize(250,75)
texto = Label(root,text="Bienvenido al Gestor de Maquina Virtual\n" "A continuacion escoja encender para iniciar MV\n" "o Apagar para apagar la Maquina Virtual")
texto.pack()#side=TOP)
app = App(root)

root.mainloop()
    Como se puede apreciar es para trabajar con virtualbox, por lo tanto en la parte de los estados sólo me interesa es encendido o apagado, por eso lo dejé así, pero para un futuro no muy lejano pienso agregarle los demás estados.

    Por otra parte como se observa en el último botón (estado) me valgo del módulo libvirt para traerme el dom0.info() que me genera una lista de valores que luego sólo extraigo la primera posición que es un número del 0 al 8 y son los 9 estados de los dominios (sin estado, en ejecución, bloqueado, pausado por el usuario, se esta apagando, apagado, estrellado*, entre otros) más info aquí.

    Espero que les sea de ayuda esta información y que no pasen tantos días como yo haciendo esta tontería de aplicación.


*estrellado quiere decir que por algún error en el dominio este falló y dejó de funcionar.

domingo, 25 de marzo de 2012

python, wicd y python-updater



      El día de ayer actualicé mi distribución de funtoo GNU/Linux (cosa que hago regularmente semanal), cuando realizo la actualización me fijé que hay paquetes que se estan reinstalando y me percato que son versiones de python, así que no le presto mucha atención al asunto, la realidad está en que mi distro utiliza la versión 2.6 de python como base y no sé porque ya no esta soportada en las versiónes de los paquetes que tengo instalado, así que cuando se trata de iniciar el cliente de wicd (lo instalo, tal cual como me lo dice el manual de instalación de gentoo), este no inicia, lo trato de llamar desde la línea de comandos y me da el siguiente error:

$ wicd-client
Traceback (most recent call last):
  File "/usr/share/wicd/gtk/wicd-client.py", line 40, in
    import gtk
ImportError: No module named gtk

     Me da un error llamando al gtk, así que trato de hacer un emerge a pygtk, 

# emerge -av pygtk

 * IMPORTANT: 9 news items need reading for repository 'gentoo'.
 * Use eselect news to read news items.


These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] dev-python/pygtk-2.24.0-r2  USE="-doc -examples -test" PYTHON_ABIS="2.7 -2.6" 0 kB

Total: 1 package (1 reinstall), Size of downloads: 0 kB

     La versión 2.6 ya no esta compilada, en vez de compilar de nuevo con soporte para la 2.6, decidí avanzar en la versión del python (debido a que gentoo nos da la libertad de escojer la versión de python con la cual deseemos trabajar) utilicé eleslect

# eselect python list
Available Python interpreters:
  [1]   python2.6 *
  [2]   python2.7
  [3]   python3.2
     
     Como se ve estoy utilizando la versión 2.6, así que para escojer la versión 2.7, hago lo siguiente:

# eselect python set 2

# eselect python list
Available Python interpreters:
  [1]   python2.6
  [2]   python2.7 *
  [3]   python3.2

     Luego de esto, hago un python-updater para que se recompile todo con la nueva versión de python y problema solucionado.

   Por esta razón me gusta utilizar gentoo/funtoo, generalmente siempre estoy poniendo en práctica todos los conceptos que he aprendido a lo largo de mi historia con GNU/Linux y el software libre

domingo, 4 de marzo de 2012

Migrando de Oracle a Postgres con ora2pg

     En estos días estaba ayudando a un colega y gran amigo a instalar en su ubuntu GNU/LInux, el migrador de bases de datos de oracle a postgres ora2pg, el tuvo unos problemas con la parte de las librerias de perl y las variables de entorno, cosa que yo ya había sufrido el año pasado para la compilación de tOra desde los fuentes con soporte para oracle (para debian GNU/Linux claro), luego que se solvento este detalle el me hiso llegar un documento y expresamente me dijo públicalo en tu blog y es por eso que lo pongo en este post:

Migrar de oracle a PostgreSQL

Realizado por: Eduardo Marques
              Email: elportu@gmail.com
Revisado y Corregido por: Abraham Brito
                                 Email: powerman5020@gmail.com

Paso 1: Descargar el Oracle Instant Client de la página de Oracle.
  • Descargar la versión basic, dev, JDBC Supplement, SQL*Plus, SDK de la siguiente página:
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html?ssSourceSiteId=ocomen   (escoger  dependiendo de su sistema operativo)

Paso 2: Instalar paquete alíen
  • En los sistemas derivados de debian (como Ubuntu y mint) abrir una consola o terminal como root y ejecutar: 
# aptitude install alien
  • Nota en ubuntu pueden descargarlo directamente por el centro de software

Paso 3: Utilizamos alien para transformar los paquetes .rpm (de red hat y derivados) a .deb (binarios de debian)
  • Se abre una consola o terminal y como root ejecutamos el alien de la siguiente manera:
# alien -d nombre_depaquete.rpm
  • Instalar los paquetes generados por el alíen, nuevamente en una terminal como root ejecutar:
# dpkg -i nombre_paquete.deb
  • utilizando el editor de su preferencia creamos el archivo /etc/ld.so.conf.d/oracle.conf
  •  Y colocar la dirección donde se instalo oracle la cual puede ser la siguiente: “/usr/lib/oracle/11.2/client64/lib ” recuerde comprobar esta dirección puede cambiar si es otra versión de oracle o su sistema es 32bits
  • Instalar la librería libaio:
# aptitude install libaio1
  • Crear el siguiente archivo de configuración etc/ld.so.conf.d/oracle.conf y colocar la dirección donde se instalo oracle la cual puede ser la siguiente: “/usr/lib/oracle/11.2/client/lib/”
  • se ejecuta como root el comando ldconfig para crear los enlaces  simbólicos especificados en el paso anterior.
  • Pruebe la conexión con oracle usando el comando:
# sqlplus64 usuario/clave@ip/sid
  • Si los pasos anteriores fallan verifique esta pagina: 
https://help.ubuntu.com/community/Oracle%20Instant%20Client


Paso 4: Instalar el ora2pg
  • Ejecutamos como root los siguientes comandos en consola en distribuciones como ubuntu recordemos ejecutar sudo su:
# aptitude install cpanminus
# perl -MCPAN -e 'install DBI'
# cpan -i DBD::Oracle 


       En algunos casos la ejecución de la instruccion cpan da un error por no encontrar la librería de oracle o el oracle home, para solventar este error debemos configurar unas variables de entorno para el usuario root:
  • Usando el editor de texto de su preferencia se edita /root/.bashrc 
  • agregar al final del archivo
“export ORACLE_HOME=/usr/lib/oracle/11.2/client64”
“export LD_LIBRARY_PATH=$ORACLE_HOME/lib”

Nota: Recordemos que en este caso se esta utilizando el cliente de 64 bits si usan el 32 bits solo quiten el numero 64
  • guardar y ejecutar nuevamente la orden
#  cpan -i DBD::Oracle
Paso 5: Configurar el ora2pg (archivo ora2pg.conf)

  • Descargar el paquete desde el siguiente enlace:
  • http://sourceforge.net/projects/ora2pg/

  • Abrir una terminal y como root colocarse en la ruta del archivo descargado por ejemplo “/home/usuario/Descargas/”
  • ahora como root, desempaquetar y descomprimir el archivo descargado, en este caso:
# tar ora2pg-8.9.tar.bz2

  • Posicionarse dentro de la carpeta resultante:
# cd ora2pg-8.9/

  • Luego se compila el ora2pg de la siguiente manera
    # perl Makefile.PL
    # make && make install
    # aptitude install yum
    # perl -MCPAN -e 'install DBD::Pg'
    # aptitude install libdbd-pg-perl

Paso 6: configurar archivo de conexión ora2pg 
  • con el editor de su preferencia se edita el archivo /etc/ora2pg/ora2pg.conf  y agregar los parametros de su servidor y base de datos

Paso 7: Revisar manual de ora2pg en la página web oficial del proyecto:

    http://ora2pg.darold.net/config.html

Y listo ya tienen ora2pg, para realizar las migraciones de sus bases de datos de oracle a postgres, espero que les haya funcionado igual de bien que a nosotros.

Gracias Eduardo por dejarme compartir tu manual

viernes, 17 de febrero de 2012

KVM, y el cambio de Kernel de GNU/Linux con Funtoo

     Como lo he comentado antes, decidí instalar Funtoo GNU/Linux, cosa que hasta el momento me ha ido muy bien, en verdad no tengo quejas, unas de los aspectos mas relevantes que resalto de esta distro, es que el cambio de la versión del kernel esta a la hora del día, en el momento que cambié mi versión del kernel, el KVM que recordemos es un módulo y depende del kernel, pierdo la conexión con el mismo, ya he cambiado varias veces de kernel (de hecho tengo la 3.2.5) y siempre tengo que hacer el mismo procedimiento para recuperar el acceso a las virtuales (igual siempre digo que lo voy a dejar aquí en mi blog, pero nunca lo hago; hasta hoy), el procedimiento que tuve que seguir fue el siguiente:

Primero la compilación del kernel con el módulo del kernel respectivo en mi caso kvm intel
segundo, reinstalo todos los paquetes relacionados con kvm:

       emerge -av qemu-kvm libvirtd

Tercero, coloco la siguiente línea el el archivo /etc/conf.d/modules
modules_3_2="kvm-intel"
para que levante el módulo al inicio

y de esta forma logré volver tener acceso a las virtuales sin ningún problema.