2011-10-23 13:28:28 +02:00
# -*- coding: utf-8 -*-
#!/usr/bin/env python
from gui import * # Importa la parte grafica
2011-10-23 16:38:52 +02:00
from subprocess import Popen
2011-10-23 13:28:28 +02:00
# 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
2011-10-23 16:38:52 +02:00
p = " " # Processo del file .sh
2011-10-23 13:28:28 +02:00
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 " )
2011-10-28 23:03:09 +02:00
nfileName = QtGui . QFileDialog . getOpenFileName ( None , " Scegli il file di boot da usare nell ' installazione " , " ~ " , " File .cpio.gz (*.cpio.gz) " , fileType )
2011-10-23 13:28:28 +02:00
path_Boot = nfileName
ui . t_file . setText ( QtGui . QApplication . translate ( " Dialog " , nfileName , None , QtGui . QApplication . UnicodeUTF8 ) )
elif ext == " iso " :
fileType = QtCore . QString ( " iso *.iso " )
2011-10-28 23:03:09 +02:00
nfileName = QtGui . QFileDialog . getOpenFileName ( None , " Scegli l ' iso da usare nell ' installazione " , " ~ " , " File .iso (*.iso) " , fileType ) #26/10 path_Boot -> "~"
2011-10-23 13:28:28 +02:00
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 ( )
2011-10-23 13:31:50 +02:00
# Chiudi la nuovola dell'help al cambio di passo
chiudi_nuvola ( )
2011-10-23 13:28:28 +02:00
elif passo == 2 :
ext = " iso "
path_Iso = " "
ui . b_indietro . setText ( QtGui . QApplication . translate ( " Dialog " , " Indietro " , None , QtGui . QApplication . UnicodeUTF8 ) )
visualizza_scegli_file ( )
2011-10-23 13:31:50 +02:00
# Chiudi la nuovola dell'help al cambio di passo
2011-10-23 16:38:52 +02:00
chiudi_nuvola ( )
2011-10-23 13:28:28 +02:00
elif passo == 3 :
visualizza_lista_usb ( )
lista_usb ( )
2011-10-23 13:31:50 +02:00
# Chiudi la nuovola dell'help al cambio di passo
2011-10-23 16:38:52 +02:00
chiudi_nuvola ( )
elif passo == 4 :
chiudi_nuvola ( )
2011-10-23 13:28:28 +02:00
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 ) )
## 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 ( ) :
2011-10-23 16:38:52 +02:00
global p
2011-10-23 13:28:28 +02:00
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 )
2011-10-23 16:38:52 +02:00
# Termina lo scipt e dbus insieme alla finestra
def closeEvent ( form , event ) :
installazione_terminata ( )
2011-10-23 13:28:28 +02:00
def installazione_terminata ( ) :
2011-10-23 16:38:52 +02:00
global p
2011-10-23 13:28:28 +02:00
print " Installazione terminata "
msg = QtGui . QMessageBox . information ( None , " Informazione " , " Installazione terminata correttamente " )
2011-10-23 16:38:52 +02:00
p . terminate ( )
mainloop . quit ( )
2011-10-23 13:28:28 +02:00
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 ( )
2011-10-23 16:38:52 +02:00
Dialog . show ( ) # Mostra il dialog precedentemente creato
2011-10-23 13:28:28 +02:00
return app . exec_ ( )
if __name__ == " __main__ " :
run ( )