usbinstall/usbinstall.py

316 lines
9.5 KiB
Python
Raw Normal View History

2011-10-23 13:28:28 +02:00
# -*- coding: utf-8 -*-
#!/usr/bin/env python
from gui import * # Importa la parte grafica
import subprocess
# La parte di dbus
import gobject
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
# Variabili globali
passo = 1
ext = "" # Vedi apri_file()
path_Boot = "" # Percorso file.cpio.gz
path_Iso = "" # Percorso file.iso
sel_usb_file= ""# Chiavetta per l'installazione (file)
sel_usb_nome= ""# Modello
usb_file = [] # Lista chiavette disponibili
usb_nome = [] # Rispettivi modelli
## Assegna gli eventi agli oggetti del form
def assegna_eventi():
app.connect(ui.b_avanti, QtCore.SIGNAL('clicked()'), avanti)
app.connect(ui.b_indietro, QtCore.SIGNAL('clicked()'), indietro)
app.connect(ui.b_apri_file, QtCore.SIGNAL('clicked()'), apri_file)
app.connect(ui.b_help, QtCore.SIGNAL('clicked()'), gestisci_nuvola)
app.connect(ui.n_chiudi, QtCore.SIGNAL('clicked()'), chiudi_nuvola)
app.connect(ui.b_refresh, QtCore.SIGNAL('clicked()'), lista_usb)
app.connect(ui.l_usb, QtCore.SIGNAL("activated(int)"), seleziona_usb)
## Gestione del bottone b_avanti
def avanti():
# Prima controlla che tutto sia a posto per passare al passo successivo
global passo, path_Boot, path_Iso, sel_usb_file, sel_usb_nome
if passo == 1:
if path_Boot == "":
msg_warn("E' necessario scegliere un file per il boot")
return
else:
passo += 1
passo2()
elif passo == 2:
if path_Iso == "":
msg_warn("E' necessario scegliere un file immagine di openmamba")
return
else:
passo += 1
passo3()
elif passo == 3:
if sel_usb_file == "":
msg_warn("E' necessario scegliere una chiavetta per l'installazione")
return
else:
msg = QtGui.QMessageBox.question(None, "Attenzione", "Tutti i dati presenti nella chiavetta " + sel_usb_nome + " saranno persi.\n"+"Sei sicuro di voler continuare?",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes)
# Continua solo se l'utente preme il bottone Yes
if msg == QtGui.QMessageBox.Yes:
passo += 1
passo4()
else:
return
## Gestione del bottone b_indietro
def indietro():
global passo
passo -= 1
if passo == 0:
app.exit(1)
print "Applicazione terminata premendo il bottone annulla"
elif passo == 1:
passo1()
elif passo == 2:
passo2()
elif passo == 3:
passo3()
## Dialogo in cui si scegle i file per l'installazione
## Inoltre setta le variabili path_Boot e path_Iso e aggiorna la casella di testo con il percorso
def apri_file():
global path_Boot, path_Iso, ext
if ext == "boot":
fileType = QtCore.QString("cpio *.cpio.gz")
nfileName = QtGui.QFileDialog.getOpenFileName(None, "Scegli il file di boot da usare nell'installazione", "/home/", "File .cpio.gz (*.cpio.gz)", fileType)
path_Boot = nfileName
ui.t_file.setText(QtGui.QApplication.translate("Dialog", nfileName, None, QtGui.QApplication.UnicodeUTF8))
elif ext == "iso":
fileType = QtCore.QString("iso *.iso")
nfileName = QtGui.QFileDialog.getOpenFileName(None, "Scegli l'iso da usare nell'installazione", "/home/", "File .iso (*.iso)", fileType)
path_Iso = nfileName
ui.t_file.setText(QtGui.QApplication.translate("Dialog", nfileName, None, QtGui.QApplication.UnicodeUTF8))
## Visualizza l'aiuto
def gestisci_nuvola():
global passo
# Aiuto in base al passo corrente
if passo == 1:
aiuto = "Questo archivio ha lo scopo di rendere la chiavetta bootabile." " Il file in questione è reperibile <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/media/bootusb.html?lang=it\">qui</a>"
elif passo == 2:
aiuto = "L'iso è il file contente il sistema operativo. E' possibile scaricarlo da <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/download.html\">questo</a> indirizzo"
elif passo == 3:
aiuto = "Selezionare la chiavetta in cui verrà installato openmamba. <span style=\"color:red;\">Tutti i dati contenuti nella chiavetta andranno persi</span>"
ui.n_testo.setText(QtGui.QApplication.translate("Dialog", aiuto, None, QtGui.QApplication.UnicodeUTF8))
ui.n_img.show() # Immagine della nuvola
ui.n_testo.show() # Testo della nuvola
ui.n_chiudi.show()
## Nasconde la nuvola
def chiudi_nuvola():
ui.n_img.hide()
ui.n_testo.hide()
ui.n_chiudi.hide()
## Lista periferiche usb e le aggiuge alla lista (widget)
def lista_usb():
import dbus
global usb_file, usb_nome
# Cancella i valori precedenti
usb_file = []
usb_nome = []
ui.l_usb.clear()
i = 0
# Riceve da dbus le chiavette collegate al pc
bus = dbus.SystemBus()
ud_manager_obj = bus.get_object('org.freedesktop.UDisks', '/org/freedesktop/UDisks')
ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.UDisks')
for dev in ud_manager.EnumerateDevices():
device_obj = bus.get_object('org.freedesktop.UDisks', dev)
device_props = dbus.Interface(device_obj, dbus.PROPERTIES_IFACE)
# Se lo spazio e' minore di 1GB salta l'usb corrente
if(device_props.Get('org.freedesktop.UDisks.Device', 'PartitionSize')) > 1073741823:
# Se e' un device rimuovibile (== chiavetta usb)
if(device_props.Get('org.freedesktop.UDisks.Device', 'DeviceIsRemovable')):
usb_file.append(device_props.Get('org.freedesktop.UDisks.Device', 'DeviceFile'))
usb_nome.append(device_props.Get('org.freedesktop.UDisks.Device', 'DriveModel'))
ui.l_usb.addItem(usb_file[i] + " " + usb_nome[i])
i += 1
# Imposta il primo come quello di default
if len(usb_file) != 0:
seleziona_usb(0)
else:
print "Nessuna chiavetta usb disponibile"
## Abbreviazione di un warning
def msg_warn(testo):
msg = QtGui.QMessageBox.warning(None, "Attenzione", testo)
## Aggiorna gli oggetti al cambio del passo
def aggiorna_oggetti(immagine, titolo, descrizione):
# Funzioni che servono solo qua dentro
def nascondi_oggetti():
ui.l_usb.hide()
ui.b_refresh.hide()
ui.t_file.hide()
ui.pach1.hide()
ui.b_apri_file.hide()
def visualizza_lista_usb():
ui.l_usb.show()
ui.b_refresh.show()
def visualizza_scegli_file():
ui.t_file.show()
ui.pach1.show()
ui.b_apri_file.show()
global passo, ext, path_Boot, path_Iso
nascondi_oggetti()
if passo == 1:
ext = "boot"
path_Boot = ""
ui.b_indietro.setText(QtGui.QApplication.translate("Dialog", "Annulla", None, QtGui.QApplication.UnicodeUTF8))
# Visualizzo gli oggetti del passo 1
visualizza_scegli_file()
elif passo == 2:
ext = "iso"
path_Iso = ""
ui.b_indietro.setText(QtGui.QApplication.translate("Dialog", "Indietro", None, QtGui.QApplication.UnicodeUTF8))
visualizza_scegli_file()
elif passo == 3:
visualizza_lista_usb()
lista_usb()
ui.t_file.setText(QtGui.QApplication.translate("Dialog", "", None, QtGui.QApplication.UnicodeUTF8))
ui.i_back.setPixmap(QtGui.QPixmap(immagine))
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", titolo, None, QtGui.QApplication.UnicodeUTF8))
ui.l_descrizione.setText(QtGui.QApplication.translate("Dialog", descrizione, None, QtGui.QApplication.UnicodeUTF8))
## Funzione principale, installa openmamba sull'usb scelto
def installazione_start():
a=0
## Setta la variabili globali sel_usb_* con l'usb scelto
def seleziona_usb(i):
global sel_usb_file, usb_file, sel_usb_nome, usb_nome
sel_usb_file = usb_file[i]
sel_usb_nome = usb_nome[i]
### Inizio dei vari passi
def passo1():
aggiorna_oggetti("img/back1.png", "Passo 1/4 - scelta del file di boot", "Scegli l\'archivio .cpio per il boot")
def passo2():
aggiorna_oggetti("img/back2.png", "Passo 2/4 - scelta del file iso", "Scegli il file iso di openmamba")
def passo3():
aggiorna_oggetti("img/back3.png", "Passo 3/4 - scelta della chiavetta", "Scegli la chiavetta usb")
def passo4():
from subprocess import Popen
aggiorna_oggetti("img/back4.png", "Passo 4/4 - installazione di openmamba su usb", "Installazione in corso...")
# Nasconde gli oggetti superflui:
ui.b_help.hide()
ui.line.hide()
ui.b_indietro.hide()
ui.b_avanti.hide()
# Mostra la progressBar
ui.p_installazione.show()
init_ascolto()
p = Popen(["./usbinstall.sh", "start", sel_usb_file, path_Boot, path_Iso])
print "Processo di installazione avviato"
def init_ascolto():
session_bus = dbus.SessionBus()
bus_name = dbus.service.BusName('org.openmamba.usbinstall', bus=session_bus)
dbus_loop = setta_dbus(bus_name)
bus = dbus.SessionBus(mainloop=dbus_loop)
class setta_dbus(dbus.service.Object):
def __init__(self, bus_name, object_path='/org/openmamba/usbinstall'):
dbus.service.Object.__init__(self, bus_name, object_path)
@dbus.service.method('org.openmamba.usbinstall')
def Pbar_aggiorna(self, p):
ui.p_installazione.setProperty("value", int(p))
if p == 100:
installazione_terminata()
return 0
@dbus.service.method('org.openmamba.usbinstall')
def Descrizione(self, desc):
ui.l_descrizione.setText(QtGui.QApplication.translate("Dialog",desc, None, QtGui.QApplication.UnicodeUTF8))
return 0
@dbus.service.method('org.openmamba.usbinstall')
def Esci(self):
mainloop.quit()
app.exit(0)
def installazione_terminata():
print "Installazione terminata"
msg = QtGui.QMessageBox.information(None, "Informazione", "Installazione terminata correttamente")
mainloop.quit()
app.exit(0)
# Inizializza la parte grafica
app = QtGui.QApplication([])
Dialog = QtGui.QDialog()
ui = Ui_MainWindow()
ui.setupUi(Dialog)
mainloop = gobject.MainLoop()
def run():
assegna_eventi()
passo1()
Dialog.show() # mostra il dialog precedentemente creato
return app.exec_()
if __name__ == "__main__":
run()