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.