From 972ecbcdf99806c22ca26c0b6871811ef1f219e7 Mon Sep 17 00:00:00 2001 From: Silvan Calarco Date: Sat, 20 Jul 2024 12:06:17 +0200 Subject: [PATCH] usbinstall.py: switch to PyQt6 and major code refactoring --- src/usbinstall.py | 712 ++++++++++++++++++++++------------------------ 1 file changed, 342 insertions(+), 370 deletions(-) diff --git a/src/usbinstall.py b/src/usbinstall.py index 4c46d70..7de572c 100755 --- a/src/usbinstall.py +++ b/src/usbinstall.py @@ -2,287 +2,33 @@ # -*- coding: utf-8 -*- # Copyright 2011 michiamophil (openmamba user :-) -# Copyright 2011-2020 Silvan Calarco -# ChangeLog: -# (michiamophil on 11/11/11) Rewritten all the graphic code and removed gui.py +# Copyright 2011-2024 Silvan Calarco - -from PyQt4 import QtGui, QtCore from subprocess import Popen -import signal -import gettext # To translate +import gettext +from PyQt6 import QtCore +from PyQt6.QtCore import QRect +from PyQt6.QtGui import QIcon, QPixmap +from PyQt6.QtWidgets import QApplication, QComboBox, QDialog,\ + QFileDialog, QFrame, QLabel,\ + QLineEdit, QMessageBox, QProgressBar, QPushButton from gi.repository import GLib import dbus import dbus.service from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) -#import dbus.glib -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -#1)-------------------------------(VARIABILI)---------------------------------------- -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -# Icons -img_help = "/usr/share/icons/gnome/24x24/status/dialog-question.png" -img_fOpen = "/usr/share/icons/gnome/32x32/actions/document-open.png" -img_refresh = "/usr/share/icons/gnome/24x24/actions/view-refresh.png" -img_pach1 = "/usr/share/openmamba/usbinstall/img/pach1.png" -img_cloud = "/usr/share/openmamba/usbinstall/img/nuvola.png" -img_exit = "/usr/share/openmamba/usbinstall/img/exit.png" -window_icon = "/usr/share/icons/hicolor/32x32/apps/mamba.png" -# Global path -path_cpio = "" -path_iso = "" -path_dev = "" -# General vars -dev_model = "" -a_path_dev = [] # Array of choosen devices -a_dev_model = [] # Their models. -step = 1 -choose_type = "" # Type of dialog in choose_file() -#1)###############################(VARIABILI)######################################## +translator = gettext.translation('usbinstall', '/usr/share/locale') +_ = translator.gettext - - -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -#2)-------------------------------(WINDOW CODE)-------------------------------------- -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -# Contains program's graphic -class create_window(QtGui.QDialog): - # Call when is called create_window() - def __init__(self): - super(create_window, self).__init__() # Register eventClose() - self.add_elements() - - # Write window and objects - def add_elements(self): - # Window proprieties - self.resize(500, 405) - self.setWindowIcon(QtGui.QIcon(window_icon)) - # Background image - self.i_back = QtGui.QLabel(self) - self.i_back.setGeometry(QtCore.QRect(10, 10, 480, 300)) - # Description label - self.l_descr = QtGui.QLabel(self) - self.l_descr.setGeometry(QtCore.QRect(10, 317, 351, 31)) - # Orizontal line - self.line = QtGui.QFrame(self) - self.line.setGeometry(QtCore.QRect(10, 350, 481, 20)) - self.line.setFrameShape(QtGui.QFrame.HLine) - self.line.setFrameShadow(QtGui.QFrame.Sunken) - # "Next" button - self.b_next = QtGui.QPushButton(self) - self.b_next.setGeometry(QtCore.QRect(400, 370, 90, 29)) - self.b_next.setText(_("Go on")) - # "Go Back" button - self.b_back = QtGui.QPushButton(self) - self.b_back.setGeometry(QtCore.QRect(300, 370, 90, 29)) - # "Help" button - self.b_help = QtGui.QPushButton(QtGui.QIcon(img_help), "", self) - self.b_help.setGeometry(QtCore.QRect(464, 320, 26, 26)) - self.b_help.setIconSize(QtCore.QSize(24, 24)) - self.b_help.setFlat(True) - # Path line edit - self.t_file = QtGui.QLineEdit(self) - self.t_file.setGeometry(QtCore.QRect(212, 321, 222, 25)) - # Pach line edit - self.pach1 = QtGui.QLabel(self) - self.pach1.setGeometry(QtCore.QRect(430, 320, 32, 27)) - self.pach1.setPixmap(QtGui.QPixmap(img_pach1)) - # Open file button - self.b_open_file = QtGui.QPushButton(QtGui.QIcon(img_fOpen), "", self) - self.b_open_file.setGeometry(QtCore.QRect(431, 320, 31, 27)) - self.b_open_file.setFlat(True) - # Help dialog image - self.i_cloud = QtGui.QLabel(self) - self.i_cloud.setGeometry(QtCore.QRect(289, 200, 211, 121)) - self.i_cloud.setPixmap(QtGui.QPixmap(img_cloud)) - self.i_cloud.hide() - # Help dialog text - self.l_cloud = QtGui.QLabel(self) - self.l_cloud.setGeometry(QtCore.QRect(298, 200, 181, 101)) - self.l_cloud.setOpenExternalLinks(True) - self.l_cloud.setWordWrap(True) - self.l_cloud.hide() - # Help dialog exit - self.b_cloud = QtGui.QPushButton(QtGui.QIcon(img_exit), "", self) - self.b_cloud.setGeometry(QtCore.QRect(471, 202, 14, 14)) - self.b_cloud.setFlat(True) - self.b_cloud.hide() - # Refresh button - self.b_refresh = QtGui.QPushButton(QtGui.QIcon(img_refresh), "", self) - self.b_refresh.setGeometry(QtCore.QRect(435, 320, 26, 26)) - self.b_refresh.setIconSize(QtCore.QSize(24, 24)) - self.b_refresh.setFlat(True) - # List of usb (combobox) - self.c_usb = QtGui.QComboBox(self) - self.c_usb.setGeometry(QtCore.QRect(158, 320, 271, 25)) - # Progressbar - self.p_install = QtGui.QProgressBar(self) - self.p_install.setGeometry(QtCore.QRect(10, 354, 480, 36)) - self.p_install.hide() - # Show the window - self.show() - - # Intercept close event - def closeEvent(self, event): - msg = QtGui.QMessageBox.question(window, _("Attention"), _("Are you sure to abort?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) - # Exit if was pressed yes button - if msg == QtGui.QMessageBox.Yes: - end_forced() - else: - event.ignore() - -#2)###############################(WINDOW CODE)###################################### - - - - - -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -#3)-----------------------------(EVENTS HANDLER)------------------------------------- -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -# Add SIGNINT event -#signal.signal(signal.SIGINT, zz) - -def add_events(): - app.connect(window.b_next, QtCore.SIGNAL('clicked()'), go_on) # Event n°1 - app.connect(window.b_back, QtCore.SIGNAL('clicked()'), go_back) # Event n°2 - app.connect(window.b_open_file, QtCore.SIGNAL('clicked()'), choose_file) # Event n°3 - app.connect(window.b_help, QtCore.SIGNAL('clicked()'), manage_cloud) # Event n°4 - app.connect(window.b_cloud, QtCore.SIGNAL('clicked()'), close_cloud) # Event n°5 - app.connect(window.b_refresh, QtCore.SIGNAL('clicked()'), get_list) # Event n°6 - app.connect(window.c_usb, QtCore.SIGNAL("activated(int)"), set_usb) # Event n°7 - -# Event n°1 -def go_on(): - global step, path_cpio, path_iso, path_dev, dev_model - cloud_hide() - # Step 1 to 2 - if step == 1: - if path_iso == "": - msg_warn(_("An openmamba's iso is required")) - return - else: - step += 1 - step2() - # Step 2 to 3 - elif step == 2: - if path_dev == "": - msg_warn(_("You must choose a usb key")) - return - else: - msg = QtGui.QMessageBox.question(window, _("Attention"), _("All data on the key ") + dev_model + _(" will be lost. \n")+ _("Are you sure to continue?"), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) - # Go on only if was pressed yes button - if msg == QtGui.QMessageBox.Yes: - step += 1 - step3() - else: - return - -# Event n°2 -def go_back(): - global step - step -= 1 - cloud_hide() - obj_chang_hide() - # Step 1 to 0 -> exit - if step == 0: - app.exit(1) - print (_("Application terminated by pressing \"cancel\" button")) - # Step 2 to 1 - elif step == 1: - step1() - # Step 3 to 2 - elif step == 2: - step2() - -# Event n°3 -def choose_file(): - global path_cpio, path_iso, choose_type - # if step is 1 - if choose_type == "iso": - nfileName = QtGui.QFileDialog.getOpenFileName(window, _("Choose the iso file"), "/home", "File .iso (*.iso)") - path_iso = nfileName - window.t_file.setText(nfileName) - -# Event n°4 -def manage_cloud(): - global step - if step == 1: - aiuto = _("The file .iso contains the operating system. You can download it from here") - elif step == 2: - aiuto = _("Choose an usb key for the installation. All data will be lost") - window.l_cloud.setText(aiuto) - cloud_show() - -# Event n°5 -def close_cloud(): - cloud_hide() - -# Event n°6 -def get_list(): - global a_path_dev, a_dev_model - - # Clear array and comboBox - a_path_dev = [] - a_dev_model = [] - window.c_usb.clear() - i = 0 - - # Get list form dbus - bus = dbus.SystemBus() - ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2') - ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager') - for k,v in ud_manager.GetManagedObjects().items(): - device_block = v.get('org.freedesktop.UDisks2.Block', {}) - device_partitiontable = v.get('org.freedesktop.UDisks2.PartitionTable', {}) - device = device_block.get('Device') - drive = device_block.get('Drive') - if not device or not drive or not device_partitiontable: - continue - device = bytearray(device).replace(b'\x00', b'').decode('utf-8') - device_drive = bus.get_object('org.freedesktop.UDisks2', drive) - try: - removable = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Removable', dbus_interface='org.freedesktop.DBus.Properties') - except: - continue - size = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Size', dbus_interface='org.freedesktop.DBus.Properties') - if removable and size > 891289600 and not device_block.get('ReadOnly') and \ - not device_block.get('HintSystem') and device_block.get('HintPartitionable'): - connectionbus = device_drive.Get('org.freedesktop.UDisks2.Drive', 'ConnectionBus', dbus_interface='org.freedesktop.DBus.Properties') - model = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Model', dbus_interface='org.freedesktop.DBus.Properties') - vendor = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Vendor', dbus_interface='org.freedesktop.DBus.Properties') - if removable: - a_path_dev.append(device) - a_dev_model.append(vendor + " " + model) - # And add element to comboBox - window.c_usb.addItem(a_dev_model[i] + " (" + "{0:.2f}".format(size / 1024.0 / 1024.0 / 1024.0) + " GiB)") - i += 1 - - # First dev is default - if len(a_path_dev) != 0: - set_usb(0) - else: - print (_("No usb available > 1 Gb")) - -# Event n°7 -def set_usb(i): - global path_dev, dev_model, a_path_dev, a_dev_model - path_dev = a_path_dev[i] - dev_model = a_dev_model[i] -#3)#############################(EVENTS HANDLER)##################################### - - - -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -#4)-------------------------------(DBUS CODE)---------------------------------------- -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ # Class for dbus_start() class set_dbus(dbus.service.Object): - def __init__(self, bus_name, object_path='/org/openmamba/usbinstall'): + window = None + + def __init__(self, bus_name, window, object_path='/org/openmamba/usbinstall'): dbus.service.Object.__init__(self, bus_name, object_path) + self.window = window @dbus.service.method('org.openmamba.usbinstall') def Set_progressBar(self, p): @@ -292,10 +38,10 @@ class set_dbus(dbus.service.Object): @dbus.service.method('org.openmamba.usbinstall') def Exit(self, errMsg): if errMsg == "": - end_with_success() + window.end_with_success() else: - msg = QtGui.QMessageBox.critical(window, _("Script Error"), _(errMsg)) - end_forced() + window.msg = QMessageBox.critical(window, _("Script Error"), _(errMsg)) + window.end_forced() return 0 @dbus.service.method('org.openmamba.usbinstall') @@ -303,114 +49,340 @@ class set_dbus(dbus.service.Object): window.l_descr.setText(descr) return 0 -def dbus_start(): - bus_name = dbus.service.BusName('org.openmamba.usbinstall', bus=dbus.SystemBus()) - dbus_loop = set_dbus(bus_name) - bus = dbus.SystemBus(mainloop=dbus_loop) -#4)###############################(DBUS CODE)######################################## - - - -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -#5)------------------------------(PROGRAM CODE)-------------------------------------- -#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ -# Show all cloud objects -def cloud_show(): - window.i_cloud.show() - window.b_cloud.show() - window.l_cloud.show() - -# Hide all cloud objects -def cloud_hide(): - window.i_cloud.hide() - window.b_cloud.hide() - window.l_cloud.hide() - -# Warning dialog abbreviation -def msg_warn(txt): - msg = QtGui.QMessageBox.warning(window, _("Attention"), txt) - -# Called when b_next was pressed -def set_objs(i_back, title, descr): - - window.i_back.setPixmap(QtGui.QPixmap(i_back)) - window.setWindowTitle(title) - window.l_descr.setText(descr) - - -def step1(): - global choose_type, path_iso - choose_type = "iso" +# Contains program's graphic +class MainWindow(QDialog): + # Icons + img_help = "/usr/share/icons/gnome/24x24/status/dialog-question.png" + img_fOpen = "/usr/share/icons/gnome/32x32/actions/document-open.png" + img_refresh = "/usr/share/icons/gnome/24x24/actions/view-refresh.png" + img_pach1 = "/usr/share/openmamba/usbinstall/img/pach1.png" + img_cloud = "/usr/share/openmamba/usbinstall/img/nuvola.png" + img_exit = "/usr/share/openmamba/usbinstall/img/exit.png" + # Background images + img_background1 = "/usr/share/openmamba/usbinstall/img/back1.png" + img_background2 = "/usr/share/openmamba/usbinstall/img/back2.png" + img_background3 = "/usr/share/openmamba/usbinstall/img/back3.png" + # Global path path_iso = "" - window.t_file.setText(path_iso) # Clean path box - window.b_back.setText(_("Cancel")) - set_objs("/usr/share/openmamba/usbinstall/img/back1.png", _("Step 1/3 - choice of ISO file"), _("Choose the openmamba ISO file")+":") - obj_chang_hide() - list_obj1() # Show a set of object + path_dev = "" + # General vars + dev_model = "" + a_path_dev = [] # Array of choosen devices + a_dev_model = [] # Their models. + step = 1 + choose_type = "" # Type of dialog in choose_file() -def step2(): - set_objs("/usr/share/openmamba/usbinstall/img/back2.png", _("Step 2/3 - choice of USB key"), _("Choose the USB key")+":") - obj_chang_hide() - list_obj2() - get_list() # Get available devices + # Call when is called create_window() + def __init__(self): + super().__init__() + self.add_elements() + self.add_events() -def step3(): - global process_sh - set_objs("/usr/share/openmamba/usbinstall/img/back3.png", _("Step 3/3 - installation of openmamba to USB"), _("Installation in progress...")) - # Hide all unnecessary objects - obj_chang_hide() - window.b_help.hide() - window.line.hide() - window.b_back.hide() - window.b_next.hide() - # Show the progressBar - window.p_install.show() - dbus_start() - process_sh = Popen(["pkexec", "/usr/sbin/usbinstall", path_dev, path_iso, "-d"]) + # Write window and objects + def add_elements(self): + # Window proprieties + self.resize(500, 405) + self.setWindowIcon(QIcon.fromTheme("openmamba")) + # Background image + self.i_back = QLabel(self) + self.i_back.setGeometry(QRect(10, 10, 480, 300)) + # Description label + self.l_descr = QLabel(self) + self.l_descr.setGeometry(QRect(10, 317, 351, 31)) + # Orizontal line + self.line = QFrame(self) + self.line.setGeometry(QRect(10, 350, 481, 20)) + self.line.setFrameShape(QFrame.Shape.HLine) + self.line.setFrameShadow(QFrame.Shadow.Sunken) + # "Next" button + self.b_next = QPushButton(self) + self.b_next.setGeometry(QRect(400, 370, 90, 29)) + self.b_next.setText(_("Go on")) + # "Go Back" button + self.b_back = QPushButton(self) + self.b_back.setGeometry(QRect(300, 370, 90, 29)) + # "Help" button + self.b_help = QPushButton(QIcon(self.img_help), "", self) + self.b_help.setGeometry(QRect(464, 320, 26, 26)) + self.b_help.setIconSize(QtCore.QSize(24, 24)) + self.b_help.setFlat(True) + # Path line edit + self.t_file = QLineEdit(self) + self.t_file.setGeometry(QRect(212, 321, 222, 25)) + # Pach line edit + self.pach1 = QLabel(self) + self.pach1.setGeometry(QRect(430, 320, 32, 27)) + self.pach1.setPixmap(QPixmap(self.img_pach1)) + # Open file button + self.b_open_file = QPushButton(QIcon(self.img_fOpen), "", self) + self.b_open_file.setGeometry(QRect(431, 320, 31, 27)) + self.b_open_file.setFlat(True) + # Help dialog image + self.i_cloud = QLabel(self) + self.i_cloud.setGeometry(QRect(289, 200, 211, 121)) + self.i_cloud.setPixmap(QPixmap(self.img_cloud)) + self.i_cloud.hide() + # Help dialog text + self.l_cloud = QLabel(self) + self.l_cloud.setStyleSheet("QLabel { color : blue; }"); + self.l_cloud.setGeometry(QRect(298, 200, 181, 101)) + self.l_cloud.setOpenExternalLinks(True) + self.l_cloud.setWordWrap(True) + self.l_cloud.hide() + # Help dialog exit + self.b_cloud = QPushButton(QIcon(self.img_exit), "", self) + self.b_cloud.setGeometry(QRect(471, 202, 14, 14)) + self.b_cloud.setFlat(True) + self.b_cloud.hide() + # Refresh button + self.b_refresh = QPushButton(QIcon(self.img_refresh), "", self) + self.b_refresh.setGeometry(QRect(435, 320, 26, 26)) + self.b_refresh.setIconSize(QtCore.QSize(24, 24)) + self.b_refresh.setFlat(True) + # List of usb (combobox) + self.c_usb = QComboBox(self) + self.c_usb.setGeometry(QRect(158, 320, 271, 25)) + # Progressbar + self.p_install = QProgressBar(self) + self.p_install.setGeometry(QRect(10, 354, 480, 36)) + self.p_install.hide() + # Show the window + self.show() -# Show a list of object (step 1) -def list_obj1(): - window.t_file.show() - window.pach1.show() - window.b_open_file.show() + # Intercept close event + def closeEvent(self, event): + msg = QMessageBox.question(window, _("Attention"), _("Are you sure to abort?"), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No) + # Exit if was pressed yes button + if msg == QMessageBox.StandardButton.Yes: + self.end_forced() + else: + event.ignore() -# Show a list of object (step 2) -def list_obj2(): - window.c_usb.show() - window.b_refresh.show() + # Events handler + def add_events(self): + self.b_next.clicked.connect(self.go_on) + self.b_back.clicked.connect(self.go_back) + self.b_open_file.clicked.connect(self.choose_file) + self.b_help.clicked.connect(self.manage_cloud) + self.b_cloud.clicked.connect(self.close_cloud) + self.b_refresh.clicked.connect(self.get_list) + self.c_usb.activated.connect(self.set_usb) -# Hide all object that when b_next or b_back was pressed are changing -def obj_chang_hide(): - window.t_file.hide() - window.pach1.hide() - window.b_open_file.hide() - window.c_usb.hide() - window.b_refresh.hide() + # Event n°1 + def go_on(self): + self.cloud_hide() + # Step 1 to 2 + if self.step == 1: + if self.path_iso == "": + self.msg_warn(_("An openmamba's iso is required")) + return + else: + self.step += 1 + self.step2() + # Step 2 to 3 + elif self.step == 2: + if self.path_dev == "": + self.msg_warn(_("You must choose a usb key")) + return + else: + msg = QMessageBox.question(window, _("Attention"), _("All data on the key ") + + self.dev_model + _(" will be lost. \n")+ _("Are you sure to continue?"), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No) + # Go on only if was pressed yes button + if msg == QMessageBox.StandardButton.Yes: + self.step += 1 + self.step3() + else: + return -def end_with_success(): - global process_sh, mainloop - msg = QtGui.QMessageBox.information(window, _("Information"), _("Installation process completed")) - mainloop.quit() - app.exit(0) - print (_("Installation process completed")) + # Event n°2 + def go_back(self): + self.step -= 1 + self.cloud_hide() + self.obj_chang_hide() + # Step 1 to 0 -> exit + if self.step == 0: + app.exit(1) + print (_("Application terminated by pressing \"cancel\" button")) + # Step 2 to 1 + elif self.step == 1: + self.step1() + # Step 3 to 2 + elif self.step == 2: + self.step2() + + # Event n°3 + def choose_file(self): + # if step is 1 + if self.choose_type == "iso": + nfileName = QFileDialog.getOpenFileName(window, _("Choose the iso file"), "/home", "File .iso (*.iso)") + self.path_iso = nfileName[0] + self.t_file.setText(nfileName[0]) + + # Event n°4 + def manage_cloud(self): + if self.step == 1: + aiuto = _("The file .iso contains the operating system. You can download it from here") + elif self.step == 2: + aiuto = _("Choose an usb key for the installation. All data will be lost") + self.l_cloud.setText(aiuto) + self.cloud_show() + + # Event n°5 + def close_cloud(self): + self.cloud_hide() + + # Event n°6 + def get_list(self): + # Clear array and comboBox + self.a_path_dev.clear() + self.a_dev_model.clear() + self.c_usb.clear() + i = 0 + + # Get list form dbus + bus = dbus.SystemBus() + ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2') + ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager') + for k,v in ud_manager.GetManagedObjects().items(): + device_block = v.get('org.freedesktop.UDisks2.Block', {}) + device_partitiontable = v.get('org.freedesktop.UDisks2.PartitionTable', {}) + device = device_block.get('Device') + drive = device_block.get('Drive') + if not device or not drive or not device_partitiontable: + continue + device = bytearray(device).replace(b'\x00', b'').decode('utf-8') + device_drive = bus.get_object('org.freedesktop.UDisks2', drive) + try: + removable = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Removable', + dbus_interface='org.freedesktop.DBus.Properties') + except: + continue + size = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Size', + dbus_interface='org.freedesktop.DBus.Properties') + if removable and size > 891289600 and not device_block.get('ReadOnly') and \ + not device_block.get('HintSystem') and device_block.get('HintPartitionable'): + model = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Model', + dbus_interface='org.freedesktop.DBus.Properties') + vendor = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Vendor', + dbus_interface='org.freedesktop.DBus.Properties') + if removable: + self.a_path_dev.append(device) + self.a_dev_model.append(vendor + " " + model) + # And add element to comboBox + self.c_usb.addItem(self.a_dev_model[i] + " (" + + "{0:.2f}".format(size / 1024.0 / 1024.0 / 1024.0) + " GiB)") + i += 1 + + # First dev is default + if len(self.a_path_dev) != 0: + self.set_usb(0) + else: + print (_("No usb available > 1 Gb")) + + # Event n°7 + def set_usb(self, i): + self.path_dev = self.a_path_dev[i] + dev_model = self.a_dev_model[i] + + # Show all cloud objects + def cloud_show(self): + self.i_cloud.show() + self.b_cloud.show() + self.l_cloud.show() + + # Hide all cloud objects + def cloud_hide(self): + self.i_cloud.hide() + self.b_cloud.hide() + self.l_cloud.hide() + + # Warning dialog abbreviation + def msg_warn(self, txt): + self.msg = QMessageBox.warning(window, _("Attention"), txt) + + # Called when b_next was pressed + def set_objs(self, i_back, title, descr): + self.i_back.setPixmap(QPixmap(i_back)) + self.setWindowTitle(title) + self.l_descr.setText(descr) + + def step1(self): + self.choose_type = "iso" + self.t_file.setText(self.path_iso) # Clean path box + self.b_back.setText(_("Cancel")) + self.set_objs(self.img_background1, + _("Step 1/3 - choice of ISO file"), _("Choose the openmamba ISO file")+":") + self.obj_chang_hide() + self.list_obj1() # Show a set of object + + def step2(self): + self.set_objs(self.img_background2, + _("Step 2/3 - choice of USB key"), _("Choose the USB key")+":") + self.b_back.setText(_("Back")) + self.obj_chang_hide() + self.list_obj2() + self.get_list() # Get available devices + + def step3(self): + self.set_objs(self.img_background3, + _("Step 3/3 - installation of openmamba to USB"), + _("Installation in progress...")) + # Hide all unnecessary objects + self.obj_chang_hide() + self.b_help.hide() + self.line.hide() + self.b_back.hide() + self.b_next.hide() + # Show the progressBar + self.p_install.show() + bus_name = dbus.service.BusName('org.openmamba.usbinstall', bus=dbus.SystemBus()) + self.dbus_loop = set_dbus(bus_name, self) + self.bus = dbus.SystemBus(mainloop=self.dbus_loop) + + print("calling pkexec /usr/sbin/usbinstall " + self.path_dev + " " + self.path_iso + " -d") + self.process_sh = Popen(["pkexec", "/usr/sbin/usbinstall", + self.path_dev, self.path_iso, "-d"]) + + # Show a list of object (step 1) + def list_obj1(self): + self.t_file.show() + self.pach1.show() + self.b_open_file.show() + + # Show a list of object (step 2) + def list_obj2(self): + self.c_usb.show() + self.b_refresh.show() + + # Hide all object that when b_next or b_back was pressed are changing + def obj_chang_hide(self): + self.t_file.hide() + self.pach1.hide() + self.b_open_file.hide() + self.c_usb.hide() + self.b_refresh.hide() + + def end_with_success(self): + self.msg = QMessageBox.information(window, _("Information"), + _("Installation process completed")) + mainloop.quit() + app.exit(0) + print (_("Installation process completed")) + + def end_forced(self): + mainloop.quit() + #print _("Installation aborted") + app.exit(1) -def end_forced(): - global process_sh, mainloop - mainloop.quit() - #print _("Installation aborted") - app.exit(1) # Program start -app = QtGui.QApplication(['usbinstall']) -gettext.install('usbinstall', '/usr/share/locale') -window = create_window() -mainloop = GLib.MainLoop() - -def run(): - add_events() - step1() - return app.exec_() if __name__ == "__main__": - run() -#5)##############################(PROGRAM CODE)###################################### + app = QApplication(['usbinstall']) + window = MainWindow() + mainloop = GLib.MainLoop() + window.step1() + app.exec()