diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..9ae0bd1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,64 @@
+#Makefile per license-dialog
+#E' il primo che scrivo, quindi lascio il resto alla vostra immaginazione ;D
+
+PACKAGE=license-dialog
+
+distdir = $(PACKAGE)-$(VERSION)
+dist_archive = $(distdir).tar.bz2
+
+include VERSION
+
+#Directory
+bindir = /usr/bin
+datadir = /usr/share
+localesdir = ${datadir}/locale
+
+DESTDIR =
+INSTALL = /usr/bin/install
+INSTALL_PROGRAM = ${INSTALL} -m 755
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_DIR = ${INSTALL} -d -m 755
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+
+pck_catalogs := $(wildcard po/*.po)
+
+.SUFFIXES: .po .mo
+.po.mo:; msgfmt $< -o $@
+
+all: locales
+
+locales: $(pck_catalogs:.po=.mo)
+
+install-locales: locales
+ @for f in $(pck_catalogs); do\
+ lang=`echo $$f | sed 's,.*/\(.*\)\.po,\1,'`;\
+ echo "installing i18n file for language \`$$lang'...";\
+ dir="$(DESTDIR)$(localesdir)/$$lang/LC_MESSAGES";\
+ $(INSTALL_DIR) $$dir;\
+ $(INSTALL_DATA) $${f/.po/.mo} $$dir/license-dialog.mo;\
+ done
+
+install-dirs:
+ @$(INSTALL_DIR) $(DESTDIR)$(bindir)
+
+install: install-dirs install-locales
+ $(INSTALL_PROGRAM) src/license-dialog $(DESTDIR)$(bindir)/license-dialog
+
+clean:
+ rm -f $(pck_catalogs:.po=.mo)
+ rm -f $(dist_archive)
+
+dist: clean
+ #@git clean -f
+ #@git log > ChangeLog
+ @mkdir /tmp/$(distdir)
+ @cp -a * /tmp/$(distdir)/
+ @rm -f $(dist_archive);\
+ tar cf - -C /tmp $(distdir) | bzip2 -9 -c > $(dist_archive)
+ @rm -rf /tmp/$(distdir)
+ @echo "file \`$(dist_archive)' created"
+
+dist-rpm: dist
+ @rpm_sourcedir=`rpm --eval=%{_sourcedir}`;\
+ mv -f $(PACKAGE)-$(VERSION).tar.bz2 $$rpm_sourcedir;\
+ echo "File $$rpm_sourcedir/$(PACKAGE)-$(VERSION).tar.bz2 created."
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..61acab0
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+VERSION=0.3
diff --git a/gui.pyc b/gui.pyc
deleted file mode 100644
index 43bfc1a..0000000
Binary files a/gui.pyc and /dev/null differ
diff --git a/src/fdisk_template b/src/fdisk_template
new file mode 100644
index 0000000..ee07a99
--- /dev/null
+++ b/src/fdisk_template
@@ -0,0 +1,16 @@
+d
+4
+d
+3
+d
+2
+d
+n
+p
+1
+1
+
+
+a
+1
+w
diff --git a/src/gui.py b/src/gui.py
new file mode 100644
index 0000000..25842e4
--- /dev/null
+++ b/src/gui.py
@@ -0,0 +1,146 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'usbinstall.ui'
+#
+# Created: Fri Oct 14 18:57:57 2011
+# by: PyQt4 UI code generator 4.8.3
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+ _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+ _fromUtf8 = lambda s: s
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ # Codice per la finestra
+ MainWindow.setObjectName(_fromUtf8("MainWindow"))
+ MainWindow.resize(500, 405)
+ MainWindow.setWindowTitle(_fromUtf8(""))
+ self.centralwidget = QtGui.QWidget(MainWindow)
+ self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
+
+ # Immagine di sfondo
+ self.i_back = QtGui.QLabel(self.centralwidget)
+ self.i_back.setGeometry(QtCore.QRect(10, 10, 480, 300))
+ self.i_back.setText(_fromUtf8(""))
+ self.i_back.setObjectName(_fromUtf8("i_back"))
+
+ # Label della descrizione
+ self.l_descrizione = QtGui.QLabel(self.centralwidget)
+ self.l_descrizione.setGeometry(QtCore.QRect(10, 317, 251, 31))
+ self.l_descrizione.setText(_fromUtf8(""))
+ self.l_descrizione.setObjectName(_fromUtf8("l_descrizione"))
+
+ # Linea orizzontale di separazione
+ self.line = QtGui.QFrame(self.centralwidget)
+ self.line.setGeometry(QtCore.QRect(10, 350, 481, 20))
+ self.line.setFrameShape(QtGui.QFrame.HLine)
+ self.line.setFrameShadow(QtGui.QFrame.Sunken)
+ self.line.setObjectName(_fromUtf8("line"))
+
+ # Bottone Avanti
+ self.b_avanti = QtGui.QPushButton(self.centralwidget)
+ self.b_avanti.setGeometry(QtCore.QRect(400, 370, 90, 29))
+ self.b_avanti.setObjectName(_fromUtf8("b_avanti"))
+
+ # Bottone Indietro
+ self.b_indietro = QtGui.QPushButton(self.centralwidget)
+ self.b_indietro.setGeometry(QtCore.QRect(300, 370, 90, 29))
+ self.b_indietro.setText(_fromUtf8(""))
+ self.b_indietro.setObjectName(_fromUtf8("b_indietro"))
+
+ # Bottone di help
+ self.b_help = QtGui.QPushButton(self.centralwidget)
+ self.b_help.setGeometry(QtCore.QRect(464, 320, 26, 26))
+ self.b_help.setText(_fromUtf8(""))
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(_fromUtf8("img/dialog-question.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.b_help.setIcon(icon)
+ self.b_help.setIconSize(QtCore.QSize(24, 24))
+ self.b_help.setFlat(True)
+ self.b_help.setObjectName(_fromUtf8("b_help"))
+
+ # Casella di testo con il percorso del file scelto
+ self.t_file = QtGui.QLineEdit(self.centralwidget)
+ self.t_file.setGeometry(QtCore.QRect(212, 321, 222, 25))
+ self.t_file.setObjectName(_fromUtf8("t_file"))
+
+ # Immagine che rende piu lunga la casella di testo
+ self.pach1 = QtGui.QLabel(self.centralwidget)
+ self.pach1.setGeometry(QtCore.QRect(430, 320, 32, 27))
+ self.pach1.setText(_fromUtf8(""))
+ self.pach1.setPixmap(QtGui.QPixmap(_fromUtf8("img/pach1.png")))
+ self.pach1.setObjectName(_fromUtf8("pach1"))
+
+ # Bottone sopra la parte della finta casella di testo
+ self.b_apri_file = QtGui.QPushButton(self.centralwidget)
+ self.b_apri_file.setGeometry(QtCore.QRect(431, 320, 31, 27))
+ self.b_apri_file.setText(_fromUtf8(""))
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(_fromUtf8("img/document-open.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.b_apri_file.setIcon(icon1)
+ self.b_apri_file.setFlat(True)
+ self.b_apri_file.setObjectName(_fromUtf8("b_apri_file"))
+
+ # Immagine del fumetto
+ self.n_img = QtGui.QLabel(self.centralwidget)
+ self.n_img.setGeometry(QtCore.QRect(289, 200, 211, 121))
+ self.n_img.setText(_fromUtf8(""))
+ self.n_img.setPixmap(QtGui.QPixmap(_fromUtf8("img/nuvola.png")))
+ self.n_img.setObjectName(_fromUtf8("n_img"))
+ self.n_img.hide()
+
+ # Testo del fumetto
+ self.n_testo = QtGui.QLabel(self.centralwidget)
+ self.n_testo.setGeometry(QtCore.QRect(298, 200, 181, 101))
+ self.n_testo.setText(_fromUtf8(""))
+ self.n_testo.setOpenExternalLinks(True)
+ self.n_testo.setWordWrap(True)
+ self.n_testo.setObjectName(_fromUtf8("n_testo"))
+ self.n_testo.hide()
+
+ # Croce del fumetto
+ self.n_chiudi = QtGui.QPushButton(self.centralwidget)
+ self.n_chiudi.setGeometry(QtCore.QRect(471, 202, 14, 14))
+ self.n_chiudi.setText(_fromUtf8(""))
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(_fromUtf8("img/exit.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.n_chiudi.setIcon(icon1)
+ self.n_chiudi.setFlat(True)
+ self.n_chiudi.hide()
+
+ # Bottone del refresh della lista usb
+ self.b_refresh = QtGui.QPushButton(self.centralwidget)
+ self.b_refresh.setGeometry(QtCore.QRect(435, 320, 26, 26))
+ self.b_refresh.setText(_fromUtf8(""))
+ icon2 = QtGui.QIcon()
+ icon2.addPixmap(QtGui.QPixmap(_fromUtf8("img/view-refresh.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.b_refresh.setIcon(icon2)
+ self.b_refresh.setIconSize(QtCore.QSize(24, 24))
+ self.b_refresh.setFlat(True)
+ self.b_refresh.setObjectName(_fromUtf8("pushButton_5"))
+
+ # comboBox con la lista delle periferiche usb
+ self.l_usb = QtGui.QComboBox(self.centralwidget)
+ self.l_usb.setEnabled(True)
+ self.l_usb.setGeometry(QtCore.QRect(158, 320, 271, 25))
+ self.l_usb.setEditable(False)
+ self.l_usb.setObjectName(_fromUtf8("comboBox"))
+
+ #inizializza la progressbar
+ self.p_installazione = QtGui.QProgressBar(self.centralwidget)
+ self.p_installazione.setGeometry(QtCore.QRect(10, 354, 480, 36))
+ self.p_installazione.setProperty("value", 0)
+ self.p_installazione.setObjectName("progressBar")
+ self.p_installazione.hide()
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ self.b_avanti.setText(QtGui.QApplication.translate("MainWindow", "Avanti", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/src/img/back1.png b/src/img/back1.png
new file mode 100644
index 0000000..810c5fa
Binary files /dev/null and b/src/img/back1.png differ
diff --git a/src/img/back2.png b/src/img/back2.png
new file mode 100644
index 0000000..a3d3075
Binary files /dev/null and b/src/img/back2.png differ
diff --git a/src/img/back3.png b/src/img/back3.png
new file mode 100644
index 0000000..25c9eea
Binary files /dev/null and b/src/img/back3.png differ
diff --git a/src/img/back4.png b/src/img/back4.png
new file mode 100644
index 0000000..1f6d3b1
Binary files /dev/null and b/src/img/back4.png differ
diff --git a/src/img/dialog-question.png b/src/img/dialog-question.png
new file mode 100644
index 0000000..ec8de67
Binary files /dev/null and b/src/img/dialog-question.png differ
diff --git a/src/img/document-open.png b/src/img/document-open.png
new file mode 100644
index 0000000..fce8c44
Binary files /dev/null and b/src/img/document-open.png differ
diff --git a/src/img/exit.png b/src/img/exit.png
new file mode 100644
index 0000000..b3a4555
Binary files /dev/null and b/src/img/exit.png differ
diff --git a/src/img/mamba.png b/src/img/mamba.png
new file mode 100644
index 0000000..ea54640
Binary files /dev/null and b/src/img/mamba.png differ
diff --git a/src/img/nuvola.png b/src/img/nuvola.png
new file mode 100644
index 0000000..6f6167e
Binary files /dev/null and b/src/img/nuvola.png differ
diff --git a/src/img/pach1.png b/src/img/pach1.png
new file mode 100644
index 0000000..c5a1bd8
Binary files /dev/null and b/src/img/pach1.png differ
diff --git a/src/img/view-refresh.png b/src/img/view-refresh.png
new file mode 100644
index 0000000..53a5d14
Binary files /dev/null and b/src/img/view-refresh.png differ
diff --git a/src/usbinstall.py b/src/usbinstall.py
new file mode 100644
index 0000000..4cb2be3
--- /dev/null
+++ b/src/usbinstall.py
@@ -0,0 +1,322 @@
+# -*- coding: utf-8 -*-
+#!/usr/bin/env python
+
+from gui import * # Importa la parte grafica
+
+import gettext
+
+from subprocess import Popen
+# 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
+
+gettext.install('usbinstall', '/usr/share/locale', unicode=1)
+
+# Variabili globali
+passo = 1
+p = "" # Processo del file .sh
+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(_("A file .cpio is required"))
+ return
+ else:
+ passo += 1
+ passo2()
+
+ elif passo == 2:
+ if path_Iso == "":
+ msg_warn(_("An openmamba's iso is required"))
+ return
+ else:
+ passo += 1
+ passo3()
+
+ elif passo == 3:
+ if sel_usb_file == "":
+ msg_warn(_("You must choose a usb key"))
+ return
+ else:
+ msg = QtGui.QMessageBox.question(None, _("Attention"), _("All data on the key ") + sel_usb_nome + _(" will be lost. \n")+_("Are you sure to continue?"),
+ 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 _("Application terminated by pressing \"cancel\" button")
+
+ 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, _("Choose the boot file"), "~", "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, _("Choose the iso file"), "~", "File .iso (*.iso)", fileType) #26/10 path_Boot -> "~"
+ 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 = _("This archive is designed to make the usb bootable.") + _(" You can find this file here")
+ # Cambiata anche la lingua della pagina (lang=en)
+ elif passo == 2:
+ aiuto = _("The file .iso contains the operating system. You can download it from here")
+ elif passo == 3:
+ aiuto = _("Choose an usb key for the installation. All data will be lost")
+ 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 _("No usb available > 1 Gb")
+
+
+## Abbreviazione di un warning
+def msg_warn(testo):
+ msg = QtGui.QMessageBox.warning(None, _("Attention"), 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", _("Cancel"), None, QtGui.QApplication.UnicodeUTF8))
+ # Visualizzo gli oggetti del passo 1
+ visualizza_scegli_file()
+ # Chiudi la nuovola dell'help al cambio di passo
+ chiudi_nuvola()
+ elif passo == 2:
+ ext = "iso"
+ path_Iso = ""
+ ui.b_indietro.setText(QtGui.QApplication.translate("Dialog", _("Go back"), None, QtGui.QApplication.UnicodeUTF8))
+ visualizza_scegli_file()
+ # Chiudi la nuovola dell'help al cambio di passo
+ chiudi_nuvola()
+ elif passo == 3:
+ visualizza_lista_usb()
+ lista_usb()
+ # Chiudi la nuovola dell'help al cambio di passo
+ chiudi_nuvola()
+ elif passo == 4:
+ chiudi_nuvola()
+ 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", _("Step 1/4 - choice the boot file"), _("Choose the .cpio file"))
+
+def passo2():
+ aggiorna_oggetti("img/back2.png", _("Step 2/4 - choice the iso file"), _("Choose the openmamba .iso file"))
+
+def passo3():
+ aggiorna_oggetti("img/back3.png", _("Step 3/4 - choice of usb key"), _("Choose the usb key"))
+
+
+
+def passo4():
+ global p
+ aggiorna_oggetti("img/back4.png", _("Step 4/4 - installation of openmamba to usb"), _("Installation in progress..."))
+
+ # 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 _("Installation process started")
+
+
+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)
+
+# Termina lo scipt e dbus insieme alla finestra
+def closeEvent(form, event):
+ installazione_terminata()
+
+
+def installazione_terminata():
+ global p
+ msg = QtGui.QMessageBox.information(None, _("Information"), _("Installation process completed"))
+ p.terminate()
+ 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()
+ ui.b_avanti.setText(QtGui.QApplication.translate("Dialog", _("Go on"), None, QtGui.QApplication.UnicodeUTF8))
+ Dialog.show() # Mostra il dialog precedentemente creato
+
+ return app.exec_()
+
+if __name__ == "__main__":
+ run()
+
+
diff --git a/src/usbinstall.sh b/src/usbinstall.sh
new file mode 100755
index 0000000..73fd5ce
--- /dev/null
+++ b/src/usbinstall.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+# openmamba-usbinstall è uno script per la generazione automatica di una chiavetta di boot per openmamba snapshot.
+# Se i file necessari sono presenti sul disco fisso verranno utilizzati quelli altrimenti
+# scaricherà direttamente la versione attuale dal sito di openmamba.
+# se il file iso è presente nella home verrà usato direttamente altrimenti si aprirà un dialogo dove sarà possibile cercarlo.
+# (c) 2009 ercole 'ercolinux' carpanetto - ercole69@gmail.com
+# (c) 2009-2010 Silvan Calarco - silvan.calarco@mambasoft.it
+# rilasciato secondo la licenza GPL v.3
+
+ # 17/10/11 Script modificato organizzando il codice in funzioni, chiamate dal modulo installazione.py
+
+
+# formattazione della chiavetta e installazione dei file necessari al boot di openmamba
+
+
+#1 Smonta la partizione
+inst_dev_umount()
+{
+ sudo umount ${1}1
+}
+
+#2 Crea la partizione
+inst_new_part()
+{
+ sudo fdisk $1 <./fdisk_template
+}
+
+#3 Formatta la partizione (e la monta)
+inst_format()
+{
+
+ sudo mkfs.ext3 ${1}1 -L openmamba_live
+ mkdir -p ~/tmpmamba
+ sudo mount ${1}1 ~/tmpmamba
+ sudo chmod 777 ~/tmpmamba
+}
+
+#4 Estrae il file boot
+inst_extr_boot()
+{
+ cd ~/tmpmamba
+ gunzip -c < $1 | cpio -i
+}
+
+#5 Installa il bootloader
+inst_make_boot()
+{
+ cd ~/tmpmamba
+ sudo extlinux --install boot
+ sudo install-mbr -e 1 $1
+}
+
+#6 Copia la iso sull'usb
+inst_copy_iso()
+{
+ cd ~/tmpmamba
+ orig_size=$(stat -c %s $1)
+ cp "$1" ./ &
+ dest_size=0
+ sleep 2
+ while [ $orig_size -gt $dest_size ] ; do
+ dest_size=$(stat -c %s ./"`basename $1`")
+ percentuale=$((45 + ( 50 * $dest_size ) / $orig_size ))
+ pbar $percentuale
+ done
+ ln -fs `basename $1` ./openmamba-live.iso
+}
+
+
+#7 Smonta la chiavetta
+inst_dir_umount()
+{
+ # So it attend up to umount return without errors
+
+ while [ 1 ] ; do
+ sudo umount ${1}
+ if [ $? != 1 ]; then
+ break
+ fi
+ done
+ echo "Done"
+ rmdir ~/tmpmamba
+}
+
+# Aggiorna la progressbar $1 == %
+pbar()
+{
+ dbus-send --print-reply --session --dest=org.openmamba.usbinstall /org/openmamba/usbinstall org.openmamba.usbinstall.Pbar_aggiorna int32:$1
+}
+
+descrizione()
+{
+
+ dbus-send --print-reply --session --dest=org.openmamba.usbinstall /org/openmamba/usbinstall org.openmamba.usbinstall.Descrizione "string:$1"
+}
+
+
+if [ $1 == "start" ]; then
+ descrizione "Smonto la chiavetta"
+ inst_dev_umount $2
+ pbar 2
+
+ descrizione "Formattazione della chiavetta in corso..."
+ inst_new_part $2
+ pbar 5
+ inst_format $2
+ pbar 20
+
+ descrizione "Estrazione del file di boot in corso..."
+ inst_extr_boot $3
+ pbar 38
+
+ descrizione "Scrittura del bootloader in corso..."
+ inst_make_boot $2
+ pbar 45
+
+ descrizione "Copia del file iso di openmamba in corso..."
+ inst_copy_iso $4
+ pbar 98
+
+ descrizione "Smonto la chiavetta"
+ inst_dir_umount $2
+ pbar 100
+
+
+else
+ echo $1 "Parametri non validi"
+
+fi