class Imager(QtGui.QDialog, Ui_Dialog): """ Raw write to USB disk using dd. """ def __init__(self): QtGui.QDialog.__init__(self) self.ui = Ui_Dialog() self.ui.setupUi(self) self.usb = USB() self.usb_disk = "" self.imager_iso_link = "" self.iso_size = "" self.process = QtCore.QProcess(self) def on_Imager_Browse_iso_Click(self): """ Browse and choose an ISO. :return: """ self.ui.lineEdit_3.clear() self.imager_iso_link = str(QtGui.QFileDialog.getOpenFileName(self, 'Select an iso...', "", "ISO Files (*.iso)")) if self.imager_iso_link: if platform.system() == "Windows": if "/" in self.imager_iso_link: self.imager_iso_link = self.imager_iso_link.strip().replace("/", "\\") self.ui.lineEdit_3.insert(str(self.imager_iso_link)) self.iso_imager = iso.ISO(self.imager_iso_link) config.imager_iso_link = self.imager_iso_link self.add_iso_gui_label_text() else: print ("File not selected...") def add_iso_gui_label_text(self): """ Simple function to add text label to GUI widgets. :return: """ print "Testing ISO..." if self.iso_imager.is_bootable(): self.ui.imager_bootable.setText("Bootable ISO :: Yes") print "ISO is bootable." else: self.ui.imager_bootable.setText("Bootable ISO :: No") print "ISO is not bootable." if os.path.exists(self.imager_iso_link): print "Path " + self.imager_iso_link + " is exist..." self.iso_size = str(os.path.getsize(self.imager_iso_link) / 1024 / 1024) self.ui.imager_iso_size.setText("ISO Size :: " + self.iso_size + " MB") print "ISO Size is " + self.iso_size + " MB" def imager_list_usb(self, partition=1): """ Function to detect whole USB disk. It uses lsblk package on Linux. :param partition: What to return. By default partition is set. :return: USB disk/partition as list """ disk = [] if platform.system() == "Linux": output = subprocess.check_output("lsblk -i", shell=True) if not partition == 1: for line in output.splitlines(): line = line.split() if str(line[2].strip()) == "1" and line[5].strip() == "disk": #print line[0].strip() disk.append(str("/dev/" + line[0].strip())) elif partition == 1: for line in output.splitlines(): line = line.split() if str(line[2].strip()) == "1" and line[5].strip() == "part": disk.append(str("/dev/" + line[0].strip()[2:])) else: if partition == 1 or not partition == 1: oFS = win32com.client.Dispatch("Scripting.FileSystemObject") oDrives = oFS.Drives for drive in oDrives: if drive.DriveType == 1 and drive.IsReady: disk.append(drive) return disk def imager_usb_detail(self, usb_disk, partition=1): """ Function to detect details of USB disk using lsblk :param usb_disk: path to usb disk :param partition: by default partition is set (but yet to code for it) :return: details of size, type and model as tuples """ _ntuple_diskusage = collections.namedtuple('usage', 'total_size usb_type model') if platform.system() == "Linux": output = subprocess.check_output("lsblk -ib " + usb_disk, shell=True) for line in output.splitlines(): line = line.split() if not partition == 1: if str(line[2].strip()) == "1" and line[5].strip() == "disk": total_size = line[3] if not total_size: total_size = "Unknown" usb_type = "Removable" model = subprocess.check_output("lsblk -in -f -o MODEL " + usb_disk, shell=True) if not model: model = "Unknown" else: try: selected_usb_part = str(usb_disk) oFS = win32com.client.Dispatch("Scripting.FileSystemObject") d = oFS.GetDrive(oFS.GetDriveName(oFS.GetAbsolutePathName(selected_usb_part))) selected_usb_device = d.DriveLetter label = (d.VolumeName).strip() if not label.strip(): label = "No label." total_size = d.TotalSize usb_type = "Removable" model = label except: print "Error detecting USB details." return _ntuple_diskusage(total_size, usb_type, model) def get_usb_size(self, usb_disk): """ Function to detect USB disk space. Useful but not used in multibootusb as of now. :param usb_disk: USB disk like "/dev/sdb" :return: Size of the disk as integer """ if platform.system() == "Linux": cat_output = subprocess.check_output("cat /proc/partitions | grep " + usb_disk[5:], shell=True) usb_size = int(cat_output.split()[2]) * 1024 print usb_size return usb_size else: usb_size = self.usb.disk_usage(self.usb.get_usb(usb_disk).mount).total return usb_size
class UnInstall(): """ Main class related to uninstalling distro. """ def __init__(self): self.usb = USB() def uninstall_distro(self): """ Uninstall selected distro from selected USB disk. :return: """ print os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "multibootusb.cfg") if os.path.exists(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "multibootusb.cfg")): with open(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "multibootusb.cfg"), "r") as multibootusb_cfg: distro = multibootusb_cfg.read().replace('\n', '') print "Uninstall distro type is " + distro else: distro = "" if os.path.exists(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "iso_file_list.cfg")): with open(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "iso_file_list.cfg"), "r") as f: iso_file_list = f.readlines() #print iso_file_list for path, subdirs, files in os.walk(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro)): for name in files: if name.endswith('ldlinux.sys'): os.chmod(os.path.join(path, name), 0777) os.unlink(os.path.join(path, name)) if distro == "opensuse": if os.path.exists(os.path.join(config.usb_mount, config.uninstall_distro + ".iso")): os.remove(os.path.join(config.usb_mount, config.uninstall_distro + ".iso")) elif distro == "windows": self.delete_frm_file_list(iso_file_list) if distro == "ipfire": files = os.listdir(config.usb_mount) for f in files: if f.endswith('.tlz'): os.remove(os.path.join(config.usb_mount, f)) if os.path.exists(os.path.join(config.usb_mount, "distro.img")): os.remove(os.path.join(config.usb_mount, "distro.img")) elif distro == "trinity-rescue": shutil.rmtree(os.path.join(config.usb_mount, "trk3")) elif distro == "alpine": self.delete_frm_file_list(iso_file_list) elif distro == "generic": self.delete_frm_file_list(iso_file_list) if os.path.exists(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro)): self.delete_frm_file_list(iso_file_list) shutil.rmtree(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro)) def delete_frm_file_list(self, iso_file_list): """ Generic way to remove files. :param iso_file_list: Path to file as list. :return: """ for f in iso_file_list: if platform.system() == "Windows": f = f.replace('\n', '').strip("/").replace("/", "\\") else: f = f.replace('\n', '').strip("/") print "Removing " + (os.path.join(config.usb_mount, f)) if os.path.isfile(os.path.join(config.usb_mount, f)): os.remove(os.path.join(config.usb_mount, f)) elif os.path.isdir(os.path.join(config.usb_mount, f)): shutil.rmtree(os.path.join(config.usb_mount, f)) if os.path.exists(os.path.join(config.usb_mount, "ldlinux.sys")): os.chmod(os.path.join(config.usb_mount, "ldlinux.sys"), 0777) os.unlink(os.path.join(config.usb_mount, "ldlinux.sys")) if os.path.exists(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "generic.cfg")): with open(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "generic.cfg"), "r") as generic_cfg: if platform.system() == "Windows": generic = generic_cfg.read().replace('\n', '').replace("/", "\\") else: generic = generic_cfg.read().replace('\n', '') if os.path.exists(os.path.join(config.usb_mount, generic.strip("/"))): os.remove(os.path.join(config.usb_mount, generic.strip("/"))) def update_sys_cfg_file(self): """ Main function to remove uninstall distro specific operations. :return: """ sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg") if not os.path.exists(sys_cfg_file): print "syslinux.cfg file not found for updating changes." else: print "Updating syslinux.cfg file..." string = open(sys_cfg_file).read() string = re.sub(r'#start ' + config.uninstall_distro + '.*?' + '#end ' + config.uninstall_distro + '\s*', '', string, flags=re.DOTALL) config_file = open(sys_cfg_file, "w") config_file.write(string) config_file.close() def uninstall_progress(self): """ Calculate uninstall progress percentage. :return: """ if os.path.exists(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "multibootusb.cfg")): with open(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro, "multibootusb.cfg"), "r") as multibootusb_cfg: distro = multibootusb_cfg.read().replace('\n', '') else: distro = "" print "Installed distro type is " + distro if distro == "opensuse": if os.path.exists(os.path.join(config.usb_mount, config.uninstall_distro) + ".iso"): folder_size_to_remove = os.path.getsize(os.path.join(config.usb_mount, config.uninstall_distro) + ".iso") else: folder_size_to_remove = 0 folder_size_to_remove += self.usb.disk_usage(str(config.usb_mount) + "/multibootusb/" + config.uninstall_distro).used elif distro == "windows" or distro == "Windows": folder_size_to_remove = self.usb.disk_usage(str(config.usb_mount) + "/SOURCES").used elif distro == "ipfire": folder_size_to_remove = self.usb.disk_usage(str(config.usb_mount) + "/multibootusb/" + config.uninstall_distro).used files = os.listdir(os.path.join(str(config.usb_mount))) for f in files: if f.endswith('.tlz'): folder_size_to_remove += os.path.getsize(os.path.join(config.usb_mount, f)) elif distro == "trinity-rescue": folder_size_to_remove = self.usb.disk_usage(os.path.join(config.usb_mount, "trk3")).used folder_size_to_remove += self.usb.disk_usage(config.usb_mount + "/multibootusb/" + config.uninstall_distro).used else: folder_size_to_remove = self.usb.disk_usage(os.path.join(config.usb_mount, "multibootusb", config.uninstall_distro)).used thrd = threading.Thread(target=self.uninstall_distro, name="uninstall_progress") initial_usb_size = self.usb.disk_usage(config.usb_mount).used thrd.start() while thrd.is_alive(): config.status_text = "Uninstalling " + config.uninstall_distro current_size = self.usb.disk_usage(config.usb_mount).used diff_size = int(initial_usb_size - current_size) config.percentage = round(float(diff_size)/folder_size_to_remove*100) if not thrd.is_alive(): config.persistence = 0 config.status_text = "" self.update_sys_cfg_file() print ("Distro directory has been removed successfully...")
class InstallDistro(): def __init__(self): from usb import USB self.usb = USB() def install(self): """ Install selected ISO to USB disk. :return: """ self.iso = iso.ISO(config.iso_link) install_dir = os.path.join(config.usb_mount, "multibootusb", self.iso.iso_basename()) if not os.path.exists(os.path.join(config.usb_mount, "multibootusb")): print "Copying multibootusb directory to " + config.usb_mount shutil.copytree(gen_fun.resource_path(os.path.join("tools", "multibootusb")), os.path.join(config.usb_mount, "multibootusb")) if not os.path.exists(install_dir): os.mkdir(install_dir) with open(os.path.join(install_dir, "multibootusb.cfg"), "w") as f: f.write(config.distro) with open(os.path.join(install_dir, "iso_file_list.cfg"), 'w') as f: for file_path in self.iso.iso_file_list(): f.write(file_path + "\n") print "Install dir is " + install_dir if config.distro == "opensuse": self.iso.iso_extract_file(install_dir, "boot") config.status_text = "Copying ISO..." if platform.system() == "Windows": subprocess.call(["xcopy", config.iso_link, config.usb_mount], shell=True) # Have to use xcopy as python file copy is dead slow. elif platform.system() == "Linux": print config.iso_link, config.usb_mount shutil.copy(config.iso_link, config.usb_mount) elif config.distro == "Windows": print "Extracting iso to " + config.usb_mount self.iso.iso_extract_full(config.usb_mount) elif config.distro == "trinity-rescue": self.iso.iso_extract_file(config.usb_mount, "trk3") elif config.distro == "ipfire": self.iso.iso_extract_file(install_dir, "boot") self.iso.iso_extract_file(config.usb_mount, ".tlz") self.iso.iso_extract_file(config.usb_mount, "distro.img") elif config.distro == "alpine": self.iso.iso_extract_full(config.usb_mount) elif config.distro == "zenwalk": self.iso.iso_extract_file(install_dir, "kernel") self.iso.iso_extract_file(install_dir, "kernel") if platform.system() == "Windows": subprocess.call(["xcopy",config.iso_link, install_dir], shell=True) elif platform.system() == "Linux": shutil.copy(config.iso_link, install_dir) elif config.distro == "salix-live": self.iso.iso_extract_file(install_dir, "boot") config.status_text = "Copying ISO..." if platform.system() == "Windows": subprocess.call("xcopy " + config.iso_link + " " + install_dir, shell=True) elif platform.system() == "Linux": shutil.copy(config.iso_link, install_dir) elif config.distro == "generic": with open(os.path.join(install_dir, "generic.cfg"), "w") as f: f.write(os.path.join(self.iso.isolinux_bin_dir(), "generic") + ".bs") self.iso.iso_extract_full(config.usb_mount) else: self.iso.iso_extract_full(install_dir) if not config.persistence == 0: import persistence config.status_text = "Extracting persistance file..." home = gen_fun.mbusb_dir() persistence.persistence_extract(config.distro, str(config.persistence), home, install_dir) def install_progress(self): """ Function to get the progress of install function as percentage. :return: """ thrd = threading.Thread(target=self.install, name="install_progress") #thrd.daemon() install_size = self.usb.disk_usage(config.usb_mount).used / 1024 thrd.start() while thrd.is_alive(): current_size = self.usb.disk_usage(config.usb_mount).used / 1024 diff_size = abs(int(current_size - install_size)) config.percentage = round(float(1.0 * diff_size) / config.install_size * 100) #print config.percentage
class InstallDistro(): def __init__(self): from usb import USB self.usb = USB() def install(self): """ Install selected ISO to USB disk. :return: """ self.iso = iso.ISO(config.iso_link) install_dir = os.path.join(config.usb_mount, "multibootusb", self.iso.iso_basename()) if not os.path.exists(os.path.join(config.usb_mount, "multibootusb")): print "Copying multibootusb directory to " + config.usb_mount shutil.copytree(gen_fun.resource_path(os.path.join("tools", "multibootusb")), os.path.join(config.usb_mount, "multibootusb")) if not os.path.exists(install_dir): os.mkdir(install_dir) with open(os.path.join(install_dir, "multibootusb.cfg"), "w") as f: f.write(config.distro) with open(os.path.join(install_dir, "iso_file_list.cfg"), 'w') as f: for file_path in self.iso.iso_file_list(): f.write(file_path + "\n") print "Install dir is " + install_dir if config.distro == "opensuse": self.iso.iso_extract_file(install_dir, "boot") config.status_text = "Copying ISO..." if platform.system() == "Windows": subprocess.call(["xcopy", config.iso_link, config.usb_mount], shell=True) # Have to use xcopy as python file copy is dead slow. elif platform.system() == "Linux": print config.iso_link, config.usb_mount shutil.copy(config.iso_link, config.usb_mount) elif config.distro == "Windows": print "Extracting iso to " + config.usb_mount self.iso.iso_extract_full(config.usb_mount) elif config.distro == "trinity-rescue": self.iso.iso_extract_file(config.usb_mount, "trk3") elif config.distro == "ipfire": self.iso.iso_extract_file(install_dir, "boot") self.iso.iso_extract_file(config.usb_mount, ".tlz") self.iso.iso_extract_file(config.usb_mount, "distro.img") elif config.distro == "zenwalk": self.iso.iso_extract_file(install_dir, "kernel") self.iso.iso_extract_file(install_dir, "kernel") if platform.system() == "Windows": subprocess.call(["xcopy",config.iso_link, install_dir], shell=True) elif platform.system() == "Linux": shutil.copy(config.iso_link, install_dir) elif config.distro == "salix-live": self.iso.iso_extract_file(install_dir, "boot") config.status_text = "Copying ISO..." if platform.system() == "Windows": subprocess.call("xcopy " + config.iso_link + " " + install_dir, shell=True) elif platform.system() == "Linux": shutil.copy(config.iso_link, install_dir) elif config.distro == "generic": with open(os.path.join(install_dir, "generic.cfg"), "w") as f: f.write(os.path.join(self.iso.isolinux_bin_dir(), "generic") + ".bs") self.iso.iso_extract_full(config.usb_mount) else: self.iso.iso_extract_full(install_dir) if not config.persistence == 0: import persistence config.status_text = "Extracting persistance file..." home = gen_fun.mbusb_dir() persistence.persistence_extract(config.distro, str(config.persistence), home, install_dir) def install_progress(self): """ Function to get the progress of install function as percentage. :return: """ print "\n\ninstall_progress " + config.usb_disk + "\n\n" thrd = threading.Thread(target=self.install, name="install_progress") #thrd.daemon() install_size = self.usb.disk_usage(config.usb_mount).used / 1024 thrd.start() while thrd.is_alive(): current_size = self.usb.disk_usage(config.usb_mount).used / 1024 diff_size = abs(int(current_size - install_size)) config.percentage = round(float(1.0 * diff_size) / config.install_size * 100) #print config.percentage
class Imager(QtGui.QDialog, Ui_Dialog): """ Raw write to USB disk using dd. """ def __init__(self): QtGui.QDialog.__init__(self) self.ui = Ui_Dialog() self.ui.setupUi(self) self.usb = USB() self.usb_disk = "" self.imager_iso_link = "" self.iso_size = "" self.process = QtCore.QProcess(self) def on_Imager_Browse_iso_Click(self): """ Browse and choose an ISO. :return: """ self.ui.lineEdit_3.clear() self.imager_iso_link = str( QtGui.QFileDialog.getOpenFileName(self, 'Select an iso...', "", "ISO Files (*.iso)")) if self.imager_iso_link: if platform.system() == "Windows": if "/" in self.imager_iso_link: self.imager_iso_link = self.imager_iso_link.strip( ).replace("/", "\\") self.ui.lineEdit_3.insert(str(self.imager_iso_link)) self.iso_imager = iso.ISO(self.imager_iso_link) config.imager_iso_link = self.imager_iso_link self.add_iso_gui_label_text() else: print("File not selected...") def add_iso_gui_label_text(self): """ Simple function to add text label to GUI widgets. :return: """ print "Testing ISO..." if self.iso_imager.is_bootable(): self.ui.imager_bootable.setText("Bootable ISO :: Yes") print "ISO is bootable." else: self.ui.imager_bootable.setText("Bootable ISO :: No") print "ISO is not bootable." if os.path.exists(self.imager_iso_link): print "Path " + self.imager_iso_link + " is exist..." self.iso_size = str( os.path.getsize(self.imager_iso_link) / 1024 / 1024) self.ui.imager_iso_size.setText("ISO Size :: " + self.iso_size + " MB") print "ISO Size is " + self.iso_size + " MB" def imager_list_usb(self, partition=1): """ Function to detect whole USB disk. It uses lsblk package on Linux. :param partition: What to return. By default partition is set. :return: USB disk/partition as list """ disk = [] if platform.system() == "Linux": output = subprocess.check_output("lsblk -i", shell=True) if not partition == 1: for line in output.splitlines(): line = line.split() if str(line[2].strip()) == "1" and line[5].strip( ) == "disk": #print line[0].strip() disk.append(str("/dev/" + line[0].strip())) elif partition == 1: for line in output.splitlines(): line = line.split() if str(line[2].strip()) == "1" and line[5].strip( ) == "part": disk.append(str("/dev/" + line[0].strip()[2:])) else: if partition == 1 or not partition == 1: oFS = win32com.client.Dispatch("Scripting.FileSystemObject") oDrives = oFS.Drives for drive in oDrives: if drive.DriveType == 1 and drive.IsReady: disk.append(drive) return disk def imager_usb_detail(self, usb_disk, partition=1): """ Function to detect details of USB disk using lsblk :param usb_disk: path to usb disk :param partition: by default partition is set (but yet to code for it) :return: details of size, type and model as tuples """ _ntuple_diskusage = collections.namedtuple( 'usage', 'total_size usb_type model') if platform.system() == "Linux": output = subprocess.check_output("lsblk -ib " + usb_disk, shell=True) for line in output.splitlines(): line = line.split() if not partition == 1: if str(line[2].strip()) == "1" and line[5].strip( ) == "disk": total_size = line[3] if not total_size: total_size = "Unknown" usb_type = "Removable" model = subprocess.check_output( "lsblk -in -f -o MODEL " + usb_disk, shell=True) if not model: model = "Unknown" else: try: selected_usb_part = str(usb_disk) oFS = win32com.client.Dispatch("Scripting.FileSystemObject") d = oFS.GetDrive( oFS.GetDriveName( oFS.GetAbsolutePathName(selected_usb_part))) selected_usb_device = d.DriveLetter label = (d.VolumeName).strip() if not label.strip(): label = "No label." total_size = d.TotalSize usb_type = "Removable" model = label except: print "Error detecting USB details." return _ntuple_diskusage(total_size, usb_type, model) def get_usb_size(self, usb_disk): """ Function to detect USB disk space. Useful but not used in multibootusb as of now. :param usb_disk: USB disk like "/dev/sdb" :return: Size of the disk as integer """ if platform.system() == "Linux": cat_output = subprocess.check_output( "cat /proc/partitions | grep " + usb_disk[5:], shell=True) usb_size = int(cat_output.split()[2]) * 1024 print usb_size return usb_size else: usb_size = self.usb.disk_usage( self.usb.get_usb(usb_disk).mount).total return usb_size