Exemple #1
0
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
Exemple #2
0
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