Interface para Qemu
Publicado por Diogo Souza da Silva 15/03/2007
[ Hits: 9.927 ]
Homepage: www.manfiesto.blog.br
Minha primeira contribuição, uma interface grafica para o Qemu, escrita em pygtk.
Fiz para aprender como funciona a linguagem, e é minha primeira experiência com as linguagens. Ainda não está 100%, mas já quebra um belo galho. Toda dica, contribuição, critica e etc é bem vinda.
#!/usr/bin/python # -*- coding: utf-8 -*- # # Minha primeira experiencia em pygtk, uma interface simples para o qemu # Apenas para aprender como se faz. # Ele pega as opcoes definida na interface e de acordo com elas # preprara os parametros a serem enviados e finalemente chama o qemu # # O Qemu deve estar instalado corretamente para que o script funcione # E tambem o kqemu, caso queira usar essa opcao # # Muita coisa aqui nao foi feita da melhor forma possivel por ser meu primeiro script # Qualquer dica, conselho, reclamacao etc é bem vindo # # Por diogosouza.eu (at) gmail.com # Em 25-Fev-2007 # import pygtk pygtk.require('2.0') import gtk # Importado para passar instrucoes ao sistema operacional import os # classe principal class teste: # construtor da janela def __init__(self): #inicia variaveis que vou usar depois self.audio = "" self.tela = "" self.hora = "" self.cdx = "" self.hdx = "" self.floppyx = "" self.parametros ="qemu " self.booton = "--> cdrom ON" # Aqui e onde a janela e criada self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) self.win.connect('delete-event',gtk.main_quit) self.win.set_border_width(8) self.win.set_title('Qemu Facil') # Dividi a janela em quatro conteiners. O vbox e onde organizo tudo # no grid ficam as opcoes gerais, nos hbox os que sobraram self.vbox = gtk.VBox(False, 8) self.grid = gtk.Table(5,4) self.hbox = gtk.HBox(False, 8) self.hbox2 = gtk.HBox(False, 8) # Abaixo a construcao geral da janela self.grid.set_col_spacings(10) self.intro = gtk.Label("Qemu Facil - uma simples interface") self.label = gtk.Label('Usar') self.usar_cdrom = gtk.CheckButton("-->") self.usar_hd = gtk.CheckButton("-->") self.usar_floppy = gtk.CheckButton("-->") # Esses chamam as funcoes para definir as variaveis de acordo com as escolhas self.usar_cdrom.connect('toggled', self.activar_cdrom, "-->") self.usar_hd.connect('toggled', self.activar_hd, "-->") self.usar_floppy.connect('toggled', self.activar_floppy, "-->") self.label2 = gtk.Label('Boot') # Aqui eu ja tive de anexar logo a tabela e definir a função por serem radio # e eu nao sei trata-los de outra forma... self.boots = gtk.RadioButton(None, "") self.grid.attach(self.boots, 4 , 5, 1, 2) self.boots.connect('toggled', self.boot_cdrom, "-->") self.boots= gtk.RadioButton(self.boots, "") self.grid.attach(self.boots, 4, 5, 2, 3) self.boots.connect('toggled', self.boot_hd, "-->") self.boots = gtk.RadioButton(self.boots, "") self.grid.attach(self.boots, 4, 5, 3, 4) self.boots.connect('toggled', self.boot_floppy, "-->") self.label3 = gtk.Label('CDROM') self.label4 = gtk.Label('HardDisk') self.label5 = gtk.Label('Floppy') # Esses são quem guarda o endereço das imagens a serem usadas self.cdrom = gtk.Entry() self.hd = gtk.Entry() self.floppy = gtk.Entry() # Por default ficam os drivers físicos self.cdrom.set_text("/dev/cdrom") self.floppy.set_text("/dev/fd0") self.cdrom_busca = gtk.Button('Buscar') self.hd_busca = gtk.Button('Buscar') self.floppy_busca = gtk.Button('Buscar') self.cdrom_busca.connect("clicked", self.busca_cdrom) self.hd_busca.connect("clicked", self.busca_hd) self.floppy_busca.connect("clicked", self.busca_floppy) # Agora eu monto tudo no grid self.grid.attach(self.label, 0, 1, 0, 1) self.grid.attach(self.label2, 4, 5, 0, 1) self.grid.attach(self.usar_cdrom, 0, 1, 1, 2) self.grid.attach(self.label3, 1, 2, 1, 2) self.grid.attach(self.cdrom, 2, 3, 1, 2) self.grid.attach(self.cdrom_busca, 3, 4, 1, 2) self.grid.attach(self.usar_hd, 0, 1, 2, 3) self.grid.attach(self.label4, 1, 2, 2, 3) self.grid.attach(self.hd, 2, 3, 2, 3) self.grid.attach(self.hd_busca, 3, 4, 2, 3) self.grid.attach(self.usar_floppy, 0, 1, 3, 4) self.grid.attach(self.label5, 1, 2, 3, 4) self.grid.attach(self.floppy, 2, 3, 3, 4) self.grid.attach(self.floppy_busca, 3, 4, 3, 4) # Agora e o que entra no hbox, Memoria Ram e Kqemu self.label6 = gtk.Label('Ram(MB):') self.ram = gtk.combo_box_new_text() self.ram.append_text("64") self.ram.append_text("128") self.ram.append_text("256") self.ram.append_text("512") self.label7 = gtk.Label('Kqemu') self.kqemu = gtk.combo_box_new_text() self.kqemu.append_text("Sim - com kernel") self.kqemu.append_text("Sim - simples") self.kqemu.append_text("Nao usar") self.hbox.pack_start(self.label6) self.hbox.pack_start(self.ram) self.hbox.pack_start(self.label7) self.hbox.pack_start(self.kqemu) # Segundo hbox, Localtime, Audio e Fullscreen self.localtime_c = gtk.CheckButton("Hora Local") self.audio_c = gtk.CheckButton("Audio") self.fullscreen_c = gtk.CheckButton("Tela Cheia") self.localtime_c.connect('toggled', self.activar_hora, "-->") self.audio_c.connect('toggled', self.activar_audio, "-->") self.fullscreen_c.connect('toggled', self.activar_tela, "-->") self.hbox2.pack_start(self.localtime_c) self.hbox2.pack_start(self.audio_c) self.hbox2.pack_start(self.fullscreen_c) # Caso o usuario queira algo mais... self.label8 = gtk.Label("Parametros adcionais") self.extra = gtk.Entry() # Botão para chamar o qemu self.entrar = gtk.Button("Entrar") self.entrar.connect("clicked", self.emular) # Agora tudo entra no vbox na ordem certa self.vbox.pack_start(self.intro) self.vbox.pack_start(self.grid) self.vbox.pack_start(self.hbox) self.vbox.pack_start(self.hbox2) self.vbox.pack_start(self.label8) self.vbox.pack_start(self.extra) self.vbox.pack_start(self.entrar) self.win.add(self.vbox) self.win.show_all() # As funcoes a seguir sao do botao de busca das imagens # Ele abre uma caixa de selecao de arquivos e passa o arquivo # selecionado para a entrada devida, os gtk.Entry, que sao lidos mais tarde def file_ok_cdrom(self, w): self.fc = " %s " % self.filec.get_filename() self.cdrom.set_text(self.fc) self.filec.hide() def file_ok_hd(self, w): self.fh = " %s " % self.fileh.get_filename() self.hd.set_text(self.fh) self.fileh.hide() def file_ok_floppy(self, w): self.ff = " %s " % self.filef.get_filename() self.floppy.set_text(self.ff) self.filef.hide() def destroy(self, widget): self.filec.hide() self.fileh.hide() self.filef.hide() def busca_cdrom(self, widget, data=None): self.filec = gtk.FileSelection("File selection") self.filec.connect("destroy", self.destroy) self.filec.ok_button.connect("clicked", self.file_ok_cdrom) self.filec.cancel_button.connect("clicked",lambda w: self.filec.destroy()) self.filec.show() def busca_hd(self, widget, data=None): self.fileh = gtk.FileSelection("File selection") self.fileh.connect("destroy", self.destroy) self.fileh.ok_button.connect("clicked", self.file_ok_hd) self.fileh.cancel_button.connect("clicked",lambda w: self.fileh.destroy()) self.fileh.show() def busca_floppy(self, widget, data=None): self.filef = gtk.FileSelection("File selection") self.filef.connect("destroy", self.destroy) self.filef.ok_button.connect("clicked", self.file_ok_floppy) self.filef.cancel_button.connect("clicked",lambda w: self.filef.destroy()) self.filef.show() # As funcoes abaixo apenas servem para definir as variaveis que depois serao lidas # para passa-las ao qemu. Se ve quais Discos usar e em qual esta o Boot def activar_cdrom(self, widget, data=None): self.cdx = "%s cdrom %s" % (data, ("OFF", "ON")[widget.get_active()]) def activar_hd(self, widget, data=None): self.hdx = "%s hd %s" % (data, ("OFF", "ON")[widget.get_active()]) def activar_floppy(self, widget, data=None): self.floppyx = "%s floppy %s" % (data, ("OFF", "ON")[widget.get_active()]) def boot_cdrom(self, widget, data=None): self.booton = "%s cdrom %s" % (data, ("OFF", "ON")[widget.get_active()]) def boot_hd(self, widget, data=None): self.booton = "%s hd %s" % (data, ("OFF", "ON")[widget.get_active()]) def boot_floppy(self, widget, data=None): self.booton = "%s floppy %s" % (data, ("OFF", "ON")[widget.get_active()]) # Essa verifica as ultimas instruções passadas, Audio, Hora e TelaCheia def activar_audio(self, widget, data=None): self.audio = "%s audio %s" % (data, ("OFF", "ON")[widget.get_active()]) def activar_hora(self, widget, data=None): self.hora = "%s hora %s" % (data, ("OFF", "ON")[widget.get_active()]) def activar_tela(self, widget, data=None): self.tela = "%s tela %s" % (data, ("OFF", "ON")[widget.get_active()]) def emular(self, button): # Essa funcao e que chama o qemu com os devidos parametros # Ele primeiro verifica quais itens usar. self.parametros = "qemu " self.imagem = 0 self.boot = 0 self.mram = 0 self.active = self.ram.get_active() self.activek = self.kqemu.get_active() # Primeiro ve quais discos carregar e em qual boot # mas so deixa boot em disco carregado e so ativa disco com imagem selecionada if self.cdx == "--> cdrom ON" and self.cdrom.get_text() != "" : self.parametros = self.parametros +" -cdrom "+ self.cdrom.get_text() self.imagem = 1 if self.booton == "--> cdrom ON": self.parametros = self.parametros +" -boot d" self.boot = 1 if self.hdx == "--> hd ON" and self.hd.get_text() != "" : self.parametros = self.parametros +" -hda "+ self.hd.get_text() self.imagem = 1 if self.booton == "--> hd ON": self.parametros = self.parametros +" -boot c" self.boot = 1 if self.floppyx == "--> floppy ON" and self.floppy.get_text() != "": self.parametros = self.parametros +" -fda "+ self.floppy.get_text() self.imagem = 1 if self.booton == "--> floppy ON": self.parametros = self.parametros +" -boot a" self.boot = 1 # Depois define a RAM a ser usada if self.active == 0 : self.mram = "64" elif self.active == 1 : self.mram = "128" elif self.active == 2 : self.mram = "256" elif self.active == 3 : self.mram = "512" else: self.mram = "128" self.parametros = self.parametros +" -m "+ self.mram # Verifica se e ou nao para usar kqemu if self.activek == 0 : self.parametros = self.parametros +" -kernel-kqemu " elif self.activek == 2: self.parametros = self.parametros +" -no-kqemu " # E as opcoes extras if self.audio == "--> audio ON" : self.parametros = self.parametros +" -soundhw all " if self.tela == "--> tela ON" : self.parametros = self.parametros +" -full-screen " if self.hora == "--> hora ON" : self.parametros = self.parametros +" -localtime " # E por fim adciona os parametros extras self.parametros = self.parametros + " " + self.extra.get_text() # Agora verifica se o minimo foi configurado if self.boot == 1 and self.imagem == 1 : # Essa função envia a string ja definida para o sistema # e retorna o output para lugar nenhum(/dev/null) os.system(self.parametros) else: # Caso falte algum item ele exibe essa mensagem de erro. self.alert = gtk.MessageDialog(None, gtk.DIALOG_MODAL, buttons = gtk.BUTTONS_CLOSE, message_format = "Sistema nao esta pronto para iniciar, verifique suas opcoes") self.resp = self.alert.run() self.alert.show() if self.resp == gtk.RESPONSE_CLOSE: self.alert.destroy() # Abaixo o programa e iniciado def main(self): gtk.main() teste = teste() teste.main()
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI