usbinstall.py: switch to PyQt6 and major code refactoring

This commit is contained in:
Silvan Calarco 2024-07-20 12:06:17 +02:00
parent 5135626ca1
commit 972ecbcdf9

View File

@ -2,287 +2,33 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2011 michiamophil (openmamba user :-) # Copyright 2011 michiamophil (openmamba user :-)
# Copyright 2011-2020 Silvan Calarco # Copyright 2011-2024 Silvan Calarco
# ChangeLog:
# (michiamophil on 11/11/11) Rewritten all the graphic code and removed gui.py
from PyQt4 import QtGui, QtCore
from subprocess import Popen from subprocess import Popen
import signal import gettext
import gettext # To translate 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 from gi.repository import GLib
import dbus import dbus
import dbus.service import dbus.service
from dbus.mainloop.glib import DBusGMainLoop from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True) DBusGMainLoop(set_as_default=True)
#import dbus.glib
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ translator = gettext.translation('usbinstall', '/usr/share/locale')
#1)-------------------------------(VARIABILI)---------------------------------------- _ = translator.gettext
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
# 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)########################################
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
#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 <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/download.html?lang=en\">here</a>")
elif step == 2:
aiuto = _("Choose an usb key for the installation. <span style=\"color:red;\">All data will be lost</span>")
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 for dbus_start()
class set_dbus(dbus.service.Object): 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) dbus.service.Object.__init__(self, bus_name, object_path)
self.window = window
@dbus.service.method('org.openmamba.usbinstall') @dbus.service.method('org.openmamba.usbinstall')
def Set_progressBar(self, p): def Set_progressBar(self, p):
@ -292,10 +38,10 @@ class set_dbus(dbus.service.Object):
@dbus.service.method('org.openmamba.usbinstall') @dbus.service.method('org.openmamba.usbinstall')
def Exit(self, errMsg): def Exit(self, errMsg):
if errMsg == "": if errMsg == "":
end_with_success() window.end_with_success()
else: else:
msg = QtGui.QMessageBox.critical(window, _("Script Error"), _(errMsg)) window.msg = QMessageBox.critical(window, _("Script Error"), _(errMsg))
end_forced() window.end_forced()
return 0 return 0
@dbus.service.method('org.openmamba.usbinstall') @dbus.service.method('org.openmamba.usbinstall')
@ -303,114 +49,340 @@ class set_dbus(dbus.service.Object):
window.l_descr.setText(descr) window.l_descr.setText(descr)
return 0 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)########################################
# Contains program's graphic
class MainWindow(QDialog):
# Icons
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ img_help = "/usr/share/icons/gnome/24x24/status/dialog-question.png"
#5)------------------------------(PROGRAM CODE)-------------------------------------- img_fOpen = "/usr/share/icons/gnome/32x32/actions/document-open.png"
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ img_refresh = "/usr/share/icons/gnome/24x24/actions/view-refresh.png"
# Show all cloud objects img_pach1 = "/usr/share/openmamba/usbinstall/img/pach1.png"
def cloud_show(): img_cloud = "/usr/share/openmamba/usbinstall/img/nuvola.png"
window.i_cloud.show() img_exit = "/usr/share/openmamba/usbinstall/img/exit.png"
window.b_cloud.show() # Background images
window.l_cloud.show() img_background1 = "/usr/share/openmamba/usbinstall/img/back1.png"
img_background2 = "/usr/share/openmamba/usbinstall/img/back2.png"
# Hide all cloud objects img_background3 = "/usr/share/openmamba/usbinstall/img/back3.png"
def cloud_hide(): # Global path
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"
path_iso = "" path_iso = ""
window.t_file.setText(path_iso) # Clean path box path_dev = ""
window.b_back.setText(_("Cancel")) # General vars
set_objs("/usr/share/openmamba/usbinstall/img/back1.png", _("Step 1/3 - choice of ISO file"), _("Choose the openmamba ISO file")+":") dev_model = ""
obj_chang_hide() a_path_dev = [] # Array of choosen devices
list_obj1() # Show a set of object a_dev_model = [] # Their models.
step = 1
choose_type = "" # Type of dialog in choose_file()
def step2(): # Call when is called create_window()
set_objs("/usr/share/openmamba/usbinstall/img/back2.png", _("Step 2/3 - choice of USB key"), _("Choose the USB key")+":") def __init__(self):
obj_chang_hide() super().__init__()
list_obj2() self.add_elements()
get_list() # Get available devices self.add_events()
def step3(): # Write window and objects
global process_sh def add_elements(self):
set_objs("/usr/share/openmamba/usbinstall/img/back3.png", _("Step 3/3 - installation of openmamba to USB"), _("Installation in progress...")) # Window proprieties
# Hide all unnecessary objects self.resize(500, 405)
obj_chang_hide() self.setWindowIcon(QIcon.fromTheme("openmamba"))
window.b_help.hide() # Background image
window.line.hide() self.i_back = QLabel(self)
window.b_back.hide() self.i_back.setGeometry(QRect(10, 10, 480, 300))
window.b_next.hide() # Description label
# Show the progressBar self.l_descr = QLabel(self)
window.p_install.show() self.l_descr.setGeometry(QRect(10, 317, 351, 31))
dbus_start() # Orizontal line
process_sh = Popen(["pkexec", "/usr/sbin/usbinstall", path_dev, path_iso, "-d"]) 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) # Intercept close event
def list_obj1(): def closeEvent(self, event):
window.t_file.show() msg = QMessageBox.question(window, _("Attention"), _("Are you sure to abort?"),
window.pach1.show() QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No)
window.b_open_file.show() # Exit if was pressed yes button
if msg == QMessageBox.StandardButton.Yes:
self.end_forced()
else:
event.ignore()
# Show a list of object (step 2) # Events handler
def list_obj2(): def add_events(self):
window.c_usb.show() self.b_next.clicked.connect(self.go_on)
window.b_refresh.show() 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 # Event n°1
def obj_chang_hide(): def go_on(self):
window.t_file.hide() self.cloud_hide()
window.pach1.hide() # Step 1 to 2
window.b_open_file.hide() if self.step == 1:
window.c_usb.hide() if self.path_iso == "":
window.b_refresh.hide() 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(): # Event n°2
global process_sh, mainloop def go_back(self):
msg = QtGui.QMessageBox.information(window, _("Information"), _("Installation process completed")) self.step -= 1
mainloop.quit() self.cloud_hide()
app.exit(0) self.obj_chang_hide()
print (_("Installation process completed")) # 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 <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/download.html?lang=en\">here</a>")
elif self.step == 2:
aiuto = _("Choose an usb key for the installation. <span style=\"color:red;\">All data will be lost</span>")
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 # 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__": if __name__ == "__main__":
run() app = QApplication(['usbinstall'])
#5)##############################(PROGRAM CODE)###################################### window = MainWindow()
mainloop = GLib.MainLoop()
window.step1()
app.exec()