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 -*-
# 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 <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 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 <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
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()