From b1e7a3ae1f5b97d2eda4b2eb0b4ee77220b66544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alin=20Tr=C4=83istaru?= Date: Fri, 14 Apr 2017 13:56:11 +0300 Subject: [PATCH] fix persistence logic --- scripts/config.py | 2 ++ scripts/mbusb_gui.py | 66 ++++++++++++++++++++++++++---------------- scripts/persistence.py | 52 +++++++++++++++++---------------- 3 files changed, 70 insertions(+), 50 deletions(-) diff --git a/scripts/config.py b/scripts/config.py index e80a187..aaf134e 100644 --- a/scripts/config.py +++ b/scripts/config.py @@ -12,6 +12,8 @@ usb_mount = "" usb_uuid = "" usb_label = "" persistence = 0 +persistence_available = False +persistence_max_size = 0 distro = "" status_text = "" percentage = 0 diff --git a/scripts/mbusb_gui.py b/scripts/mbusb_gui.py index c084a7e..2ad356f 100644 --- a/scripts/mbusb_gui.py +++ b/scripts/mbusb_gui.py @@ -44,10 +44,9 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): self.ui.tabWidget.setCurrentIndex(0) # self.qemu = Qemu() -# FIXME -# self.ui.label_persistence_value.setVisible(False) -# self.ui.label_persistence.setVisible(False) -# self.ui.slider_persistence.setVisible(False) + self.ui.label_persistence_value.setVisible(False) + self.ui.label_persistence.setVisible(False) + self.ui.slider_persistence.setVisible(False) config.usb_disk = None config.image_path = None @@ -64,6 +63,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): self.ui.button_install_distro.clicked.connect(self.onCreateClick) self.ui.button_uninstall_distro.clicked.connect(self.OnUninstallClick) self.ui.slider_persistence.valueChanged.connect(self.update_slider_text) +# self.ui.slider_persistence.sliderReleased.connect(self.ui_update_persistence) # ISO Imager Tab self.ui.button_write_image_to_disk.clicked.connect(self.dd_write) @@ -145,6 +145,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): if config.usb_disk: log("Selected device " + config.usb_disk) + config.persistence_max_size = persistence.max_disk_persistence(config.usb_disk) self.usb_details = usb.details(config.usb_disk) config.usb_mount = self.usb_details['mount_point'] @@ -164,6 +165,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): self.ui.usb_mount.setText(self.usb_details['mount_point']) self.update_list_box(config.usb_disk) + self.ui_update_persistence() else: self.ui.usb_dev.clear() self.ui.usb_vendor.clear() @@ -258,32 +260,46 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): self.ui.label_image_type_value.setText(str(config.distro)) self.ui.label_image_type_value.setVisible(True) if config.distro: - per_availability = persistence.persistence_distro(config.distro, config.usb_disk, config.image_path)[0] - per_max_size = persistence.persistence_distro(config.distro, config.usb_disk, config.image_path)[1] + per_availability = persistence.persistence_distro(config.distro, config.image_path) if per_availability is not None: - self.ui.label_persistence_value.setVisible(True) - self.ui.label_persistence.setVisible(True) - self.ui.slider_persistence.setVisible(True) - self.ui.label_persistence_value.setEnabled(True) - self.ui.label_persistence.setEnabled(True) - self.ui.slider_persistence.setEnabled(True) - self.ui.slider_persistence.setTickInterval(10) - self.ui.slider_persistence.setSingleStep(10) - ui_per_max_size = per_max_size / 1024 / 1024 - # config.persistence = per_max_size - self.ui.slider_persistence.setMaximum(ui_per_max_size) - log('Persistence Max Size: ' + str(bytes2human(per_max_size))) + config.persistence_available = True + if config.usb_disk: + per_max_size = persistence.max_disk_persistence(config.usb_disk) + config.persistence_max_size = per_max_size + log('Persistence Max Size: ' + str(bytes2human(per_max_size))) else: - self.ui.label_persistence_value.setEnabled(False) - self.ui.label_persistence.setEnabled(False) - self.ui.slider_persistence.setEnabled(False) - self.ui.label_persistence_value.setVisible(False) - self.ui.label_persistence.setVisible(False) - self.ui.slider_persistence.setVisible(False) + config.persistence_available = False log('Persistence is not available for ' + iso_name(config.image_path)) + + self.ui_update_persistence() else: log("File not selected...") + def ui_update_persistence(self): + log("===== config.persistence_available = " + str(config.persistence_available)) + log("===== config.persistence_max_size = " + str(config.persistence_max_size)) + log("===== config.persistence = " + str(config.persistence)) + if config.persistence_available and config.persistence_max_size: + self.ui.label_persistence_value.setVisible(True) + self.ui.label_persistence.setVisible(True) + self.ui.slider_persistence.setVisible(True) + self.ui.label_persistence_value.setEnabled(True) + self.ui.label_persistence.setEnabled(True) + self.ui.slider_persistence.setEnabled(True) + self.ui.slider_persistence.setTickInterval(10) + self.ui.slider_persistence.setSingleStep(10) + self.ui.slider_persistence.setMaximum(config.persistence_max_size / 1024 / 1024) +# log("===== getMaximum = " + self.ui.slider_persistence.getMaximum() + else: + self.ui.label_persistence_value.setEnabled(False) + self.ui.label_persistence.setEnabled(False) + self.ui.slider_persistence.setEnabled(False) + self.ui.label_persistence_value.setVisible(False) + self.ui.label_persistence.setVisible(False) + self.ui.slider_persistence.setVisible(False) + + + def update_slider_text(self): slide_value = self.ui.slider_persistence.value() * 1024 * 1024 self.ui.label_persistence_value.setText(bytes2human(slide_value)) @@ -450,7 +466,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QMainWindow, Ui_MainWindow): copy_mbusb_dir_usb(config.usb_disk) if not os.path.exists(os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path))): config.persistence = self.ui.slider_persistence.value() * 1024 * 1024 - log("Persistence chosen is " + str(config.persistence) + " MB") + log("Persistence chosen is " + str(bytes2human(config.persistence)) + " MB") install_size = iso_size(config.image_path) + config.persistence if install_size >= disk_usage(config.usb_mount).free: log("ERROR: Not enough space available on " + config.usb_disk) diff --git a/scripts/persistence.py b/scripts/persistence.py index 952ecec..a121e7d 100644 --- a/scripts/persistence.py +++ b/scripts/persistence.py @@ -16,40 +16,42 @@ from . import iso from . import gen from . import config - -def persistence_distro(distro, usb_disk, iso_link): +def max_disk_persistence(usb_disk): """ - Function to detect if distro can have persistence option. - :param distro: Detected distro name. - :return: Distro name as string or None otherwise. + Detect max persistence value for filesystem on usb_disk + :param usb_disk: Disk filesystem to check + :return: Max persistence supported (bytes) """ - iso_size = iso.iso_size(iso_link) + assert usb_disk is not None + fat_max_size = (4096 * 1024 * 1024) usb_details = usb.details(usb_disk) - usb_sf = usb_details['file_system'] - usb_free_size = usb_details['size_free'] config.usb_uuid = usb_details['uuid'] config.usb_label = usb_details['label'] - if usb_sf == 'vfat' or 'FAT32': - if usb_free_size > fat_max_size: - _max_size = fat_max_size - else: - _max_size = usb_free_size + + if usb_details['file_system'] in ['vfat', 'FAT32'] and usb_details['size_free'] > fat_max_size: + _max_size = fat_max_size else: - _max_size = usb_free_size - if distro == "ubuntu": - gen.log("Persistence option is available.") - return "ubuntu", _max_size - # FIXME to get debian persistence workable... - # Able to add successfully but unable to keep persistence data. - elif distro == "debian" or distro == "debian-install": - gen.log("Persistence option is available.") - return "debian", _max_size - elif distro == "fedora": + _max_size = usb_details['size_free'] + + return _max_size + +def persistence_distro(distro, iso_link): + """ + Function to detect if distro can have persistence option. + :param distro: Detected distro name. + :return: Distro name as string or None otherwise. + """ + assert distro is not None + assert iso_link is not None + + iso_size = iso.iso_size(iso_link) + + if distro in ["ubuntu", "debian", "debian-install", "fedora"]: gen.log("Persistence option is available.") - return "fedora", _max_size + return distro else: - return None, None + return None def create_persistence():