Merge branch 'devel' of https://github.com/mbusb/multibootusb into devel

pull/166/head
mbusb 7 years ago
commit 7d45a6dfba

@ -8,7 +8,9 @@
import os import os
import sys import sys
import urllib.request, urllib.error, urllib.parse import urllib.request
import urllib.error
import urllib.parse
import subprocess import subprocess
@ -22,7 +24,7 @@ class Install():
def mbusb(self): def mbusb(self):
try: try:
from PyQt5 import QtGui # from PyQt5 import QtGui
if subprocess.call("python3 setup.py install --record ./.install_files.txt", shell=True) == 0: if subprocess.call("python3 setup.py install --record ./.install_files.txt", shell=True) == 0:
print("Installation finished.") print("Installation finished.")
print("Find multibootusb under system menu or run from terminal using the following command...") print("Find multibootusb under system menu or run from terminal using the following command...")
@ -52,7 +54,8 @@ class Install():
print("You can uninstall multibootusb at any time using follwing command (with root/sudo previlage)") print("You can uninstall multibootusb at any time using follwing command (with root/sudo previlage)")
print("\nsudo ./uninstall.sh\n") print("\nsudo ./uninstall.sh\n")
def internet_on(self): @staticmethod
def internet_on():
try: try:
ret = urllib.request.urlopen('https://www.google.com', timeout=1) ret = urllib.request.urlopen('https://www.google.com', timeout=1)
print("Interconnection exist.") print("Interconnection exist.")
@ -64,7 +67,8 @@ class Install():
return result return result
def supported_pac_manager(self): @staticmethod
def supported_pac_manager():
pac_managers = ["pacman", "yum", "apt-get", "zypper", "urpmi"] pac_managers = ["pacman", "yum", "apt-get", "zypper", "urpmi"]
result = "0" result = "0"
for pac_man in pac_managers: for pac_man in pac_managers:
@ -76,10 +80,12 @@ class Install():
return False return False
def install_dependency_package(self): @staticmethod
def install_dependency_package():
if subprocess.call("which pacman", shell=True) == 0: if subprocess.call("which pacman", shell=True) == 0:
subprocess.call("pacman -Sy --noconfirm", shell=True) subprocess.call("pacman -Sy --noconfirm", shell=True)
if subprocess.call("pacman -S --needed --noconfirm p7zip python-pyqt5 mtools python3-six parted util-linux python-dbus") == 0: # Thank you Neitsab for "--needed" argument. # Thank you Neitsab for "--needed" argument.
if subprocess.call("pacman -S --needed --noconfirm p7zip python-pyqt5 mtools python3-six parted util-linux python-dbus") == 0:
result = True result = True
elif subprocess.call("which yum", shell=True) == 0: elif subprocess.call("which yum", shell=True) == 0:
subprocess.call("yum check-update", shell=True) subprocess.call("yum check-update", shell=True)
@ -98,10 +104,7 @@ class Install():
if subprocess.call("urpmi install -auto mtools util-linux p7zip python3-pyudev python3-six parted python3-qt5", shell=True) == 0: if subprocess.call("urpmi install -auto mtools util-linux p7zip python3-pyudev python3-six parted python3-qt5", shell=True) == 0:
result = True result = True
if result is not True: return bool(result)
return False
else:
result
install = Install() install = Install()

@ -102,7 +102,7 @@ def runAsAdmin(cmdLine=None, wait=True):
cmd = '"%s"' % (cmdLine[0],) cmd = '"%s"' % (cmdLine[0],)
# XXX TODO: isn't there a function or something we can call to massage command line params? # XXX TODO: isn't there a function or something we can call to massage command line params?
params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]]) params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]])
cmdDir = '' # cmdDir = ''
showCmd = win32con.SW_SHOWNORMAL showCmd = win32con.SW_SHOWNORMAL
#showCmd = win32con.SW_HIDE #showCmd = win32con.SW_HIDE
lpVerb = 'runas' # causes UAC elevation prompt. lpVerb = 'runas' # causes UAC elevation prompt.
@ -146,19 +146,22 @@ def adminCmd(cmd, fork=False, gui=False):
else: else:
if os.system('which pkexec') == 0: if os.system('which pkexec') == 0:
if gui: if gui:
cmd = ['export DISPLAY=$DISPLAY; export XAUTHORITY=$XAUTHORITY; '] + cmd # By default, pkexec disallows X11 apps. Restore DISPLAY & XAUTHORITY to allow it. man 1 pkexec/"SECURITY NOTES" section # By default, pkexec disallows X11 apps. Restore DISPLAY & XAUTHORITY
# to allow it. man 1 pkexec/"SECURITY NOTES" section
cmd = ['export DISPLAY=$DISPLAY; export XAUTHORITY=$XAUTHORITY; '] + cmd
sudo_cmd = ['pkexec', '/bin/sh', '-c'] sudo_cmd = ['pkexec', '/bin/sh', '-c']
elif os.system('which gksudo') == 0: elif os.system('which gksudo') == 0:
sudo_cmd = ["gksudo", "--", "/bin/sh", "-c"] sudo_cmd = ["gksudo", "--", "/bin/sh", "-c"]
elif os.system('which gksu') == 0: elif os.system('which gksu') == 0:
sudo_cmd = ["gksu"] sudo_cmd = ["gksu"]
elif os.system('which kdesudo') == 0: elif os.system('which kdesudo') == 0:
sudo_cmd = ["kdesudo", "-t", "-c"] # http://www.unix.com/man-page/debian/1/kdesudo/ sudo_cmd = ["kdesudo", "-t", "-c"] # http://www.unix.com/man-page/debian/1/kdesudo/
elif os.system('which kdesu') == 0: elif os.system('which kdesu') == 0:
sudo_cmd = ["kdesu", "-t", "-c"] # http://linux.die.net/man/1/kdesu sudo_cmd = ["kdesu", "-t", "-c"] # http://linux.die.net/man/1/kdesu
else: else:
QtWidgets.QMessageBox.information('No root...', QtWidgets.QMessageBox.information('No root...',
'Could not find any of: pkexec, sudo, gksu, kdesu, gksudo, or kdesudo. Please install one then restart multibootusb.') 'Could not find any of: pkexec, sudo, gksu, kdesu, gksudo, or kdesudo.\n'
'Please install one then restart multibootusb.')
sys.exit(0) sys.exit(0)
final_cmd = ' '.join(sudo_cmd + ['"' + ' '.join(cmd).replace('"', '\\"') + '"']) final_cmd = ' '.join(sudo_cmd + ['"' + ' '.join(cmd).replace('"', '\\"') + '"'])
gen.log("Executing ==> " + final_cmd) gen.log("Executing ==> " + final_cmd)

@ -1,5 +1,4 @@
import os import os
import platform
import inspect import inspect
from . import config from . import config
@ -8,8 +7,8 @@ try:
except: except:
try: try:
from .colorama import init as colorama_init, Fore, Back, Style from .colorama import init as colorama_init, Fore, Back, Style
except: except Exception as e:
pass raise e
finally: finally:
try: try:
colorama_init(autoreset=True) colorama_init(autoreset=True)
@ -38,7 +37,8 @@ def fnCall():
Prints filename:line:function for parent and grandparent. Prints filename:line:function for parent and grandparent.
""" """
if not config.debug: return if not config.debug:
return
print(colors.OKGREEN + colors.BOLD + "=== DEBUG === | %s:%d:%s() called from %s:%d:%s()" % ( print(colors.OKGREEN + colors.BOLD + "=== DEBUG === | %s:%d:%s() called from %s:%d:%s()" % (
inspect.stack()[1][1].split(os.sep)[-1], inspect.stack()[1][1].split(os.sep)[-1],
@ -48,4 +48,3 @@ def fnCall():
inspect.stack()[2][2], inspect.stack()[2][2],
inspect.stack()[2][3], inspect.stack()[2][3],
)+colors.RESET) )+colors.RESET)

@ -7,14 +7,12 @@
# under the terms of GNU General Public License, v.2 or above # under the terms of GNU General Public License, v.2 or above
import os import os
import string
import platform import platform
import re import re
from .iso import * from .iso import *
from .isodump3 import ISO9660 from .isodump3 import ISO9660
from .gen import * from .gen import *
from . import _7zip from . import _7zip
from . import config
def distro(iso_cfg_ext_dir, iso_link): def distro(iso_cfg_ext_dir, iso_link):
@ -23,8 +21,8 @@ def distro(iso_cfg_ext_dir, iso_link):
:param iso_cfg_ext_dir: Directory where *.cfg files are extracted. :param iso_cfg_ext_dir: Directory where *.cfg files are extracted.
:return: Detected distro name as string. :return: Detected distro name as string.
""" """
iso9660fs = ISO9660(iso_link) # iso9660fs = ISO9660(iso_link)
# iso_file_list = iso9660fs.readDir("/") # iso_file_list = iso9660fs.readDir("/")
iso_file_list = _7zip.list_iso(iso_link) iso_file_list = _7zip.list_iso(iso_link)
if platform.system() == "Linux" or platform.system() == "Windows": if platform.system() == "Linux" or platform.system() == "Windows":
for path, subdirs, files in os.walk(iso_cfg_ext_dir): for path, subdirs, files in os.walk(iso_cfg_ext_dir):
@ -32,7 +30,7 @@ def distro(iso_cfg_ext_dir, iso_link):
if name.endswith(('.cfg', '.CFG', '.txt', '.TXT', '.lst')): if name.endswith(('.cfg', '.CFG', '.txt', '.TXT', '.lst')):
try: try:
# errors='ignore' is required as some files also contain non utf character # errors='ignore' is required as some files also contain non utf character
string = open(os.path.join(path, name), errors='ignore').read() string = open(os.path.join(path, name), errors='ignore').read()
except IOError: except IOError:
return "Read Error." return "Read Error."
else: else:
@ -143,15 +141,13 @@ def distro(iso_cfg_ext_dir, iso_link):
if distro: if distro:
return distro return distro
# FIXME: See the below comments. # FIXME: See the below comments.
''' # else:
else: # # FIXME: The idea of detecting as generic is to work like a unetbootin if other methods fails.
# FIXME: The idea of detecting as generic is to work like a unetbootin if other methods fails. # # This simply extracts distro to root of the USB and install syslinux on isolinux.bin directory.
# This simply extracts distro to root of the USB and install syslinux on isolinux.bin directory. # # All works fine but unable to boot the distro successfully. Also, see the generic section from
# All works fine but unable to boot the distro successfully. Also, see the generic section from # # syslinux, update_cfg and install_distro modules.
# syslinux, update_cfg and install_distro modules. # if self.isolinux_bin_exist():
if self.isolinux_bin_exist(): # return "generic"
return "generic"
'''
else: else:
return None return None

@ -194,7 +194,7 @@ def copy_mbusb_dir_usb(usb_disk):
:param usb_mount_path: Path to USB mount. :param usb_mount_path: Path to USB mount.
:return: :return:
""" """
from .iso import iso_size # from .iso import iso_size
from .usb import details from .usb import details
usb_details = details(usb_disk) usb_details = details(usb_disk)
@ -243,17 +243,17 @@ def read_input_yes():
return False return False
def strings(filename, min=4): def strings(filename, _min=4):
with open(filename, errors="ignore") as f: with open(filename, errors="ignore") as f:
result = "" result = ""
for c in f.read(): for c in f.read():
if c in string.printable: if c in string.printable:
result += c result += c
continue continue
if len(result) >= min: if len(result) >= _min:
yield result yield result
result = "" result = ""
if len(result) >= min: # catch result at EOF if len(result) >= _min: # catch result at EOF
yield result yield result
@ -392,7 +392,7 @@ def write_to_file(filepath, text):
Simple function to write a text file Simple function to write a text file
:param filepath: Path to file :param filepath: Path to file
:param text: Text to be written on to file :param text: Text to be written on to file
:return: :return:
""" """
with open(filepath, 'w') as f: with open(filepath, 'w') as f:
f.write(text.strip()) f.write(text.strip())

@ -37,10 +37,10 @@ def mbusb_update_grub_cfg():
grub_cfg_path = None grub_cfg_path = None
syslinux_menu = None syslinux_menu = None
sys_cfg_path = None # sys_cfg_path = None
loopback_cfg_path = None loopback_cfg_path = None
mbus_grub_cfg_path = os.path.join(config.usb_mount, 'multibootusb', 'grub', 'grub.cfg') mbus_grub_cfg_path = os.path.join(config.usb_mount, 'multibootusb', 'grub', 'grub.cfg')
iso_grub_cfg = iso.iso_file_path(config.image_path, 'grub.cfg') # iso_grub_cfg = iso.iso_file_path(config.image_path, 'grub.cfg')
if iso.isolinux_bin_dir(config.image_path) is not False: if iso.isolinux_bin_dir(config.image_path) is not False:
iso_sys_cfg_path = os.path.join(iso.isolinux_bin_dir(config.image_path), 'syslinux.cfg') iso_sys_cfg_path = os.path.join(iso.isolinux_bin_dir(config.image_path), 'syslinux.cfg')
iso_iso_cfg_path = os.path.join(iso.isolinux_bin_dir(config.image_path), 'isolinux.cfg') iso_iso_cfg_path = os.path.join(iso.isolinux_bin_dir(config.image_path), 'isolinux.cfg')
@ -147,19 +147,16 @@ def grub_custom_menu(mbus_grub_cfg_path, distro):
if distro in ['sgrubd2', 'raw_iso']: if distro in ['sgrubd2', 'raw_iso']:
grub_raw_iso(mbus_grub_cfg_path) grub_raw_iso(mbus_grub_cfg_path)
''' # with open(mbus_grub_cfg_path, 'a') as f:
with open(mbus_grub_cfg_path, 'a') as f: # f.write("#start " + iso.iso_basename(config.image_path) + "\n")
f.write("#start " + iso.iso_basename(config.image_path) + "\n") # f.write(grub_raw_iso())
f.write(grub_raw_iso()) # f.write("#end " + iso.iso_basename(config.image_path) + "\n")
f.write("#end " + iso.iso_basename(config.image_path) + "\n") #
#
# elif iso_size_mb < 750.0:
elif iso_size_mb < 750.0: # grub_raw_iso(mbus_grub_cfg_path)
grub_raw_iso(mbus_grub_cfg_path)
'''
else: else:
return False return False
@ -207,10 +204,10 @@ def extract_kernel_line(search_text, match_line, isolinux_dir):
""" """
Function to check if kernel/linux line present in isolinux.cfg file is valid. Function to check if kernel/linux line present in isolinux.cfg file is valid.
If valid, then convert them in to grub accepted format If valid, then convert them in to grub accepted format
:param search_text: Type of text is to be searched. Typically kernel or linux :param search_text: Type of text is to be searched. Typically kernel or linux
:param match_line: Line containing kernel ot linux from isolinux supported .cfg files :param match_line: Line containing kernel ot linux from isolinux supported .cfg files
:param isolinux_dir: Path to isolinux directory of an ISO :param isolinux_dir: Path to isolinux directory of an ISO
:return: Valid grub2 accepted kernel/linux line after conversion. If nothing found return ''. :return: Valid grub2 accepted kernel/linux line after conversion. If nothing found return ''.
""" """
kernel_line = '' kernel_line = ''
@ -250,8 +247,8 @@ def extract_kernel_line(search_text, match_line, isolinux_dir):
def iso2grub2(iso_dir): def iso2grub2(iso_dir):
""" """
Function to convert syslinux configuration to grub2 accepted configuration format. Features implemented are similar Function to convert syslinux configuration to grub2 accepted configuration format. Features implemented are similar
to that of grub2 'loopback.cfg'. This 'loopback.cfg' file can be later on caled directly from grub2. The main to that of grub2 'loopback.cfg'. This 'loopback.cfg' file can be later on caled directly from grub2. The main
advantage of this function is to generate the 'loopback.cfg' file automatically without manual involvement. advantage of this function is to generate the 'loopback.cfg' file automatically without manual involvement.
:param iso_dir: Path to distro install directory for looping through '.cfg' files. :param iso_dir: Path to distro install directory for looping through '.cfg' files.
:param file_out: Path to 'loopback.cfg' file. By default it is set to root of distro install directory. :param file_out: Path to 'loopback.cfg' file. By default it is set to root of distro install directory.
:return: :return:
@ -277,11 +274,11 @@ def iso2grub2(iso_dir):
if ext_text: if ext_text:
for m in ext_text: for m in ext_text:
menuentry = '' menuentry = ''
kernel = '' # kernel = ''
kernel_line = '' kernel_line = ''
boot_options = '' boot_options = ''
initrd_line = '' initrd_line = ''
initrd = '' # initrd = ''
# Extract line containing 'menu label' and convert to menu entry of grub2 # Extract line containing 'menu label' and convert to menu entry of grub2
if 'menu label' in m.group().lower(): if 'menu label' in m.group().lower():
@ -308,7 +305,7 @@ def iso2grub2(iso_dir):
for _lines in kernel_text: for _lines in kernel_text:
kernel_line = extract_kernel_line(_lines[0][1], _lines[0][0], kernel_line = extract_kernel_line(_lines[0][1], _lines[0][0],
iso_bin_dir) iso_bin_dir)
if kernel_line is '': if kernel_line == '':
continue continue
else: else:
break break
@ -322,7 +319,7 @@ def iso2grub2(iso_dir):
for _lines in initrd_text: for _lines in initrd_text:
initrd_line = extract_kernel_line(_lines[0][1], _lines[0][0], initrd_line = extract_kernel_line(_lines[0][1], _lines[0][0],
iso_bin_dir) iso_bin_dir)
if initrd_line is '': if initrd_line == '':
continue continue
else: else:
break break

@ -12,13 +12,10 @@ import subprocess
import collections import collections
import platform import platform
import signal import signal
from PyQt5 import QtGui
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from PyQt5 import QtCore
from .gui.ui_multibootusb import Ui_MainWindow from .gui.ui_multibootusb import Ui_MainWindow
from .gen import * from .gen import *
from . import iso from . import iso
from . import usb
from . import config from . import config
from . import progressbar from . import progressbar
@ -28,15 +25,14 @@ if platform.system() == "Windows":
def dd_linux(): def dd_linux():
import time import time
input = "if=" + config.image_path _input = "if=" + config.image_path
in_file_size = float(os.path.getsize(config.image_path)) in_file_size = float(os.path.getsize(config.image_path))
output = "of=" + config.usb_disk _output = "of=" + config.usb_disk
os.system("umount " + config.usb_disk + "1") os.system("umount " + config.usb_disk + "1")
command = ['dd', input, output, "bs=1M", "oflag=sync"] command = ['dd', _input, _output, "bs=1M", "oflag=sync"]
log("Executing ==> " + " ".join(command)) log("Executing ==> " + " ".join(command))
dd_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) dd_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
# bar = progressbar.ProgressBar(redirect_stdout=True)
pbar = progressbar.ProgressBar( pbar = progressbar.ProgressBar(
maxval=100, maxval=100,
widgets=[ widgets=[
@ -73,10 +69,10 @@ def dd_win():
windd = resource_path(os.path.join("data", "tools", "dd", "dd.exe")) windd = resource_path(os.path.join("data", "tools", "dd", "dd.exe"))
if os.path.exists(resource_path(os.path.join("data", "tools", "dd", "dd.exe"))): if os.path.exists(resource_path(os.path.join("data", "tools", "dd", "dd.exe"))):
log("dd exist") log("dd exist")
input = "if=" + config.image_path _input = "if=" + config.image_path
in_file_size = float(os.path.getsize(config.image_path) / 1024 / 1024) in_file_size = float(os.path.getsize(config.image_path) / 1024 / 1024)
output = "of=\\\.\\" + config.usb_disk _output = "of=\\\.\\" + config.usb_disk
command = [windd, input, output, "bs=1M", "--progress"] command = [windd, _input, _output, "bs=1M", "--progress"]
log("Executing ==> " + " ".join(command)) log("Executing ==> " + " ".join(command))
dd_process = subprocess.Popen(command, universal_newlines=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE, dd_process = subprocess.Popen(command, universal_newlines=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
shell=False) shell=False)
@ -127,19 +123,8 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
self.ui.imager_iso_size.setText("ISO Size: " + self.iso_size + " MB") self.ui.imager_iso_size.setText("ISO Size: " + self.iso_size + " MB")
log("ISO Size is " + self.iso_size + " MB") log("ISO Size is " + self.iso_size + " MB")
# def onImagerComboChange(self): @staticmethod
# config.imager_usb_disk = str(self.ui.comboBox_2.currentText()) def imager_list_usb(partition=1):
# if bool(config.imager_usb_disk):
# self.ui.imager_disk_label.setText(self.imager_usb_detail(config.imager_usb_disk, partition=0).usb_type)
# self.ui.imager_total_size.setText(usb.bytes2human(int(self.imager_usb_detail(config.imager_usb_disk, partition=0).total_size)))
#
# if platform.system() == "Linux":
# self.ui.label_imager_uuid.setText("Disk Model:")
# self.ui.imager_uuid.setText(str(self.imager_usb_detail(config.imager_usb_disk, partition=0).model))
# else:
# self.ui.imager_uuid.setText(self.imager_usb_detail(config.imager_usb_disk, partition=0).model)
def imager_list_usb(self, partition=1):
""" """
Function to detect whole USB disk. It uses lsblk package on Linux. Function to detect whole USB disk. It uses lsblk package on Linux.
:param partition: What to return. By default partition is set. :param partition: What to return. By default partition is set.
@ -148,7 +133,7 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
disk = [] disk = []
if platform.system() == "Linux": if platform.system() == "Linux":
output = subprocess.check_output("lsblk -i", shell=True) output = subprocess.check_output("lsblk -i", shell=True)
if not partition == 1: if partition != 1:
for line in output.splitlines(): for line in output.splitlines():
line = line.split() line = line.split()
if (line[2].strip()) == b'1' and (line[5].strip()) == b'disk': if (line[2].strip()) == b'1' and (line[5].strip()) == b'disk':
@ -159,15 +144,15 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
if (line[2].strip()) == b'1' and line[5].strip() == b'part': if (line[2].strip()) == b'1' and line[5].strip() == b'part':
disk.append(str("/dev/" + str(line[0].strip()[2:]))) disk.append(str("/dev/" + str(line[0].strip()[2:])))
else: else:
if partition == 1 or not partition == 1: oFS = win32com.client.Dispatch("Scripting.FileSystemObject")
oFS = win32com.client.Dispatch("Scripting.FileSystemObject") oDrives = oFS.Drives
oDrives = oFS.Drives for drive in oDrives:
for drive in oDrives: if drive.DriveType == 1 and drive.IsReady:
if drive.DriveType == 1 and drive.IsReady: disk.append(drive)
disk.append(drive)
return disk return disk
def imager_usb_detail(self, usb_disk, partition=1): @staticmethod
def imager_usb_detail(usb_disk, partition=1):
""" """
Function to detect details of USB disk using lsblk Function to detect details of USB disk using lsblk
:param usb_disk: path to usb disk :param usb_disk: path to usb disk
@ -180,7 +165,7 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
output = subprocess.check_output("lsblk -ib " + usb_disk, shell=True) output = subprocess.check_output("lsblk -ib " + usb_disk, shell=True)
for line in output.splitlines(): for line in output.splitlines():
line = line.split() line = line.split()
if not partition == 1: if partition != 1:
if line[2].strip() == b'1' and line[5].strip() == b'disk': if line[2].strip() == b'1' and line[5].strip() == b'disk':
total_size = line[3] total_size = line[3]
if not total_size: if not total_size:
@ -194,7 +179,7 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
selected_usb_part = str(usb_disk) selected_usb_part = str(usb_disk)
oFS = win32com.client.Dispatch("Scripting.FileSystemObject") oFS = win32com.client.Dispatch("Scripting.FileSystemObject")
d = oFS.GetDrive(oFS.GetDriveName(oFS.GetAbsolutePathName(selected_usb_part))) d = oFS.GetDrive(oFS.GetDriveName(oFS.GetAbsolutePathName(selected_usb_part)))
selected_usb_device = d.DriveLetter # selected_usb_device = d.DriveLetter
label = (d.VolumeName).strip() label = (d.VolumeName).strip()
if not label.strip(): if not label.strip():
label = "No label." label = "No label."

@ -8,7 +8,6 @@
import os import os
import shutil import shutil
import sys
import platform import platform
import threading import threading
import subprocess import subprocess
@ -47,7 +46,7 @@ def install_distro():
if config.distro == "opensuse": if config.distro == "opensuse":
iso.iso_extract_file(config.image_path, install_dir, 'boot') iso.iso_extract_file(config.image_path, install_dir, 'boot')
status_text = "Copying ISO..." config.status_text = "Copying ISO..."
if platform.system() == "Windows": if platform.system() == "Windows":
subprocess.call(["xcopy", config.image_path, usb_mount], shell=True) # Have to use xcopy as python file copy is dead slow. subprocess.call(["xcopy", config.image_path, usb_mount], shell=True) # Have to use xcopy as python file copy is dead slow.
elif platform.system() == "Linux": elif platform.system() == "Linux":
@ -137,7 +136,7 @@ def install_progress():
thrd = threading.Thread(target=install_distro, name="install_progress") thrd = threading.Thread(target=install_distro, name="install_progress")
# thrd.daemon() # thrd.daemon()
# install_size = usb_size_used / 1024 # install_size = usb_size_used / 1024
install_size = iso_size(config.image_path) / 1024 # install_size = iso_size(config.image_path) / 1024
final_size = (usb_size_used + iso_size(config.image_path)) + config.persistence final_size = (usb_size_used + iso_size(config.image_path)) + config.persistence
thrd.start() thrd.start()
pbar = progressbar.ProgressBar(maxval=100).start() # bar = progressbar.ProgressBar(redirect_stdout=True) pbar = progressbar.ProgressBar(maxval=100).start() # bar = progressbar.ProgressBar(redirect_stdout=True)
@ -162,7 +161,7 @@ def install_patch():
os.sync() os.sync()
iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir") iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
isolinux_path = os.path.join(iso_cfg_ext_dir, isolinux_bin_path(config.image_path)) isolinux_path = os.path.join(iso_cfg_ext_dir, isolinux_bin_path(config.image_path))
iso_linux_bin_dir = isolinux_bin_dir(config.image_path) # iso_linux_bin_dir = isolinux_bin_dir(config.image_path)
config.syslinux_version = isolinux_version(isolinux_path) config.syslinux_version = isolinux_version(isolinux_path)
iso_file_list = iso.iso_file_list(config.image_path) iso_file_list = iso.iso_file_list(config.image_path)
os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path), isolinux_bin_dir(config.image_path)) os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path), isolinux_bin_dir(config.image_path))

@ -7,10 +7,7 @@
# Licence: This file is a part of multibootusb package. You can redistribute it or modify # Licence: This file is a part of multibootusb package. You can redistribute it or modify
# under the terms of GNU General Public License, v.2 or above # under the terms of GNU General Public License, v.2 or above
import sys
import os import os
import string
import platform
import re import re
from .gen import * from .gen import *
from .isodump3 import ISO9660 from .isodump3 import ISO9660
@ -56,11 +53,7 @@ def isolinux_bin_exist(iso_link):
""" """
if os.path.exists(iso_link): if os.path.exists(iso_link):
iso_file_list = _7zip.list_iso(iso_link) iso_file_list = _7zip.list_iso(iso_link)
if any("isolinux.bin" in s.lower() for s in iso_file_list): return bool(any("isolinux.bin" in s.lower() for s in iso_file_list))
return True
else:
return False
def iso_size(iso_link): def iso_size(iso_link):
@ -74,10 +67,7 @@ def is_bootable(iso_link):
""" """
iso9660fs = ISO9660(iso_link) iso9660fs = ISO9660(iso_link)
isBootable = iso9660fs.checkISOBootable() isBootable = iso9660fs.checkISOBootable()
if isBootable: return bool(isBootable)
return True
else:
return False
def isolinux_bin_dir(iso_link): def isolinux_bin_dir(iso_link):
@ -162,14 +152,14 @@ def isolinux_version(isolinux_bin_path):
return str(number) return str(number)
def iso_extract_file(iso_link, dest_dir, filter): def iso_extract_file(iso_link, dest_dir, _filter):
""" """
Extract the specific file(s) from an ISO Extract the specific file(s) from an ISO
:param dest_dir: Path to destination directory. :param dest_dir: Path to destination directory.
:param filter: Filter to extract particular file(s) :param filter: Filter to extract particular file(s)
:return: Extract file(s) to destination. :return: Extract file(s) to destination.
""" """
_7zip.extract_iso(iso_link, dest_dir, filter) _7zip.extract_iso(iso_link, dest_dir, _filter)
def extract_cfg_file(iso_link): def extract_cfg_file(iso_link):
@ -232,4 +222,3 @@ if __name__ == '__main__':
iso_extract_full(iso_path, 'test') iso_extract_full(iso_path, 'test')
iso_extract_file(iso_path, 'test', 'isolinux.bin') iso_extract_file(iso_path, 'test', 'isolinux.bin')
log(isolinux_version(test_iso_bin_path)) log(isolinux_version(test_iso_bin_path))

@ -7,8 +7,6 @@
# under the terms of GNU General Public License, v.2 or above # under the terms of GNU General Public License, v.2 or above
import os import os
import re
import shutil
from . import usb from . import usb
from . import gen from . import gen
from .iso import * from .iso import *
@ -29,15 +27,13 @@ def read_input_uninstall():
def cli_install_distro(): def cli_install_distro():
''' # if platform.system() == 'Linux':
if platform.system() == 'Linux': # if os.getuid() != 0:
if os.getuid() != 0: # exit("You need to have root privileges to run this script.\nPlease try again using 'sudo'. Exiting.")
exit("You need to have root privileges to run this script.\nPlease try again using 'sudo'. Exiting.") # elif platform.system() == 'Windows':
elif platform.system() == 'Windows': #
# if admin.isUserAdmin():
if admin.isUserAdmin(): # admin.elevate()
admin.elevate()
'''
log('Starting multibootusb from Command line...') log('Starting multibootusb from Command line...')
if usb.is_block(config.usb_disk) is False: if usb.is_block(config.usb_disk) is False:
@ -65,7 +61,7 @@ def iso_install(iso_image):
""" """
Script for installing iso image to a disk. This can be called by other script for auto install of many distros Script for installing iso image to a disk. This can be called by other script for auto install of many distros
:param iso_image: Path to ISO image :param iso_image: Path to ISO image
:return: :return:
""" """
if size_not_enough(iso_image, config.usb_disk) is True: if size_not_enough(iso_image, config.usb_disk) is True:
log(config.usb_disk + ' does not have enough space...') log(config.usb_disk + ' does not have enough space...')

@ -11,10 +11,10 @@ from . import config
def pc_tool_config(syslinux=True, grub=False): def pc_tool_config(syslinux=True, grub=False):
""" """
Menu entry for PC Tool ISO Menu entry for PC Tool ISO
:param syslinux: :param syslinux:
:param grub: :param grub:
:return: :return:
""" """
if syslinux is True: if syslinux is True:
return """KERNEL /system/stage1 return """KERNEL /system/stage1

@ -6,12 +6,10 @@
# Licence: This file is a part of multibootusb package. You can redistribute it or modify # Licence: This file is a part of multibootusb package. You can redistribute it or modify
# under the terms of GNU General Public License, v.2 or above # under the terms of GNU General Public License, v.2 or above
import sys
import os import os
import platform import platform
import tarfile import tarfile
import subprocess import subprocess
from . import usb
from . import iso from . import iso
from . import gen from . import gen
from . import config from . import config
@ -45,7 +43,7 @@ def persistence_distro(distro, iso_link):
assert distro is not None assert distro is not None
assert iso_link is not None assert iso_link is not None
iso_size = iso.iso_size(iso_link) # iso_size = iso.iso_size(iso_link)
if distro in ["ubuntu", "debian", "debian-install", "fedora"]: if distro in ["ubuntu", "debian", "debian-install", "fedora"]:
gen.log("Persistence option is available.") gen.log("Persistence option is available.")
@ -92,7 +90,7 @@ def create_persistence():
if subprocess.call(persistence_dd_cmd, shell=True) == 0: if subprocess.call(persistence_dd_cmd, shell=True) == 0:
gen.log("\nSuccessfully created persistence file...\n") gen.log("\nSuccessfully created persistence file...\n")
if not config.distro == 'fedora': if config.distro != 'fedora':
gen.log('Applying filesystem to persistence file...') gen.log('Applying filesystem to persistence file...')
config.status_text = 'Applying filesystem to persistence file. Please wait...' config.status_text = 'Applying filesystem to persistence file. Please wait...'
gen.log('Executing ==> ' + persistence_mkfs_cmd) gen.log('Executing ==> ' + persistence_mkfs_cmd)
@ -111,4 +109,3 @@ def extract_file(file_path, install_dir):
tar = tarfile.open(file_path, "r:bz2") tar = tarfile.open(file_path, "r:bz2")
tar.extractall(install_dir) tar.extractall(install_dir)
tar.close() tar.close()

@ -255,7 +255,8 @@ class FormatLabel(Timer):
context[name] = value context[name] = value
else: else:
context[name] = transform(value) context[name] = transform(value)
except: pass except:
raise
return self.format_string % context return self.format_string % context

@ -11,7 +11,6 @@
import os import os
import subprocess import subprocess
import platform import platform
from .admin import adminCmd
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from .gui.ui_multibootusb import Ui_MainWindow from .gui.ui_multibootusb import Ui_MainWindow
from .gen import * from .gen import *
@ -27,7 +26,7 @@ class Qemu(QtWidgets.QMainWindow, Ui_MainWindow):
QtWidgets.QMainWindow.__init__(self) QtWidgets.QMainWindow.__init__(self)
self.ui = Ui_MainWindow() self.ui = Ui_MainWindow()
self.ui.setupUi(self) self.ui.setupUi(self)
def on_Qemu_Boot_iso_Click(self): def on_Qemu_Boot_iso_Click(self):
""" """
Main function to boot a selected ISO. Main function to boot a selected ISO.
@ -102,9 +101,7 @@ class Qemu(QtWidgets.QMainWindow, Ui_MainWindow):
cmd = qemu + ' -hda ' + qemu_usb_disk + ram + ' -vga std' cmd = qemu + ' -hda ' + qemu_usb_disk + ram + ' -vga std'
try: try:
log('Executing ==> ' + cmd) log('Executing ==> ' + cmd)
# adminCmd([qemu, '-hda', usb_disk[:-1], '-m', ram, '-vga std'], gui=True)
subprocess.Popen(cmd, shell=True) subprocess.Popen(cmd, shell=True)
# adminCmd(qemu_cmd, gui=True)
except: except:
QtWidgets.QMessageBox.information(self, 'Error...', 'Error booting USB\n\nUnable to start QEMU.') QtWidgets.QMessageBox.information(self, 'Error...', 'Error booting USB\n\nUnable to start QEMU.')
@ -133,8 +130,9 @@ class Qemu(QtWidgets.QMainWindow, Ui_MainWindow):
return None return None
else: else:
return selected_ram return selected_ram
def check_qemu_exist(self): @staticmethod
def check_qemu_exist():
""" """
Check if QEMU is available on host system. Check if QEMU is available on host system.
:return: path to QEMU program or None otherwise. :return: path to QEMU program or None otherwise.
@ -150,7 +148,7 @@ class Qemu(QtWidgets.QMainWindow, Ui_MainWindow):
elif platform.system() == "Windows": elif platform.system() == "Windows":
qemu = resource_path(os.path.join("data", "tools", "qemu", "qemu-system-x86_64.exe")) qemu = resource_path(os.path.join("data", "tools", "qemu", "qemu-system-x86_64.exe"))
log(qemu) log(qemu)
if qemu: if qemu:
log("QEMU: using " + qemu) log("QEMU: using " + qemu)
else: else:
@ -158,24 +156,21 @@ class Qemu(QtWidgets.QMainWindow, Ui_MainWindow):
return qemu return qemu
@staticmethod
def get_physical_disk_number(self, usb_disk): def get_physical_disk_number(usb_disk):
""" """
Get the physical disk number as detected ny Windows. Get the physical disk number as detected ny Windows.
:param usb_disk: USB disk (Like F:) :param usb_disk: USB disk (Like F:)
:return: Disk number. :return: Disk number.
""" """
import wmi import wmi
c = wmi.WMI () c = wmi.WMI()
for physical_disk in c.Win32_DiskDrive (): for physical_disk in c.Win32_DiskDrive():
for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"): for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"): for logical_disk in partition.associators("Win32_LogicalDiskToPartition"):
if logical_disk.Caption == usb_disk: if logical_disk.Caption == usb_disk:
""" # log physical_disk.Caption
log physical_disk.Caption # log partition.Caption
log partition.Caption # log logical_disk.Caption
log logical_disk.Caption
"""
log("Physical Device Number is " + partition.Caption[6:-14]) log("Physical Device Number is " + partition.Caption[6:-14])
return str(partition.Caption[6:-14]) return str(partition.Caption[6:-14])

@ -7,7 +7,6 @@
# under the terms of GNU General Public License, v.2 or above # under the terms of GNU General Public License, v.2 or above
import os import os
import sys
import subprocess import subprocess
import platform import platform
from .gen import * from .gen import *
@ -39,7 +38,7 @@ def set_boot_flag(usb_disk):
return False return False
def syslinux_default(usb_disk, version=4): def syslinux_default(usb_disk):
""" """
Install Syslinux of a selected drive Install Syslinux of a selected drive
:param usb_disk: '/dev/sdx' on linux and 'E:' on Windows :param usb_disk: '/dev/sdx' on linux and 'E:' on Windows
@ -152,7 +151,7 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
if platform.system() == "Linux": if platform.system() == "Linux":
syslinux_path = os.path.join(multibootusb_host_dir(), "syslinux", "bin", "syslinux") + config.syslinux_version syslinux_path = os.path.join(multibootusb_host_dir(), "syslinux", "bin", "syslinux") + config.syslinux_version
if os.access(syslinux_path, os.X_OK) is False: if os.access(syslinux_path, os.X_OK) is False:
subprocess.call('chmod +x ' + syslinux_path, shell=True) == 0 subprocess.call('chmod +x ' + syslinux_path, shell=True)
sys_cmd = syslinux_path + option + quote(distro_syslinux_install_dir) + ' ' + usb_disk sys_cmd = syslinux_path + option + quote(distro_syslinux_install_dir) + ' ' + usb_disk
dd_cmd = 'dd if=' + usb_disk + ' ' + 'of=' + quote(distro_sys_install_bs) + ' count=1' dd_cmd = 'dd if=' + usb_disk + ' ' + 'of=' + quote(distro_sys_install_bs) + ' count=1'
log("Executing ==> " + sys_cmd) log("Executing ==> " + sys_cmd)
@ -194,7 +193,7 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
ext_cmd = syslinux_path + " --install " + distro_syslinux_install_dir ext_cmd = syslinux_path + " --install " + distro_syslinux_install_dir
dd_cmd = 'dd if=' + usb_disk + ' ' + 'of=' + quote(distro_sys_install_bs) + ' count=1' dd_cmd = 'dd if=' + usb_disk + ' ' + 'of=' + quote(distro_sys_install_bs) + ' count=1'
if os.access(syslinux_path, os.X_OK) is False: if os.access(syslinux_path, os.X_OK) is False:
subprocess.call('chmod +x ' + syslinux_path, shell=True) == 0 subprocess.call('chmod +x ' + syslinux_path, shell=True)
log("Executing ==> " + ext_cmd) log("Executing ==> " + ext_cmd)
if subprocess.call(ext_cmd, shell=True) == 0: if subprocess.call(ext_cmd, shell=True) == 0:
log("\nSyslinux install on distro directory is successful...\n") log("\nSyslinux install on distro directory is successful...\n")

@ -11,7 +11,8 @@ __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
# from __future__ import print_function # from __future__ import print_function
import os, re import os
import re
def node_mountpoint(node): def node_mountpoint(node):
@ -133,16 +134,6 @@ class UDisks2(object):
def mount(self, device_node_path): def mount(self, device_node_path):
d = self.device(device_node_path) d = self.device(device_node_path)
# euid = os.environ['SUDO_UID']
# egid = os.environ['SUDO_GID']
#
# if euid and egid:
# user, group = int(euid), int(egid)
# else:
# user, group = os.getuid(), os.getgid()
#
# mount_options = ['rw', 'noexec', 'nosuid', 'nodev', 'uid=%d' % user, 'gid=%d' % group]
mount_options = ['rw', 'noexec', 'nosuid', 'nodev'] mount_options = ['rw', 'noexec', 'nosuid', 'nodev']
try: try:
@ -158,8 +149,8 @@ class UDisks2(object):
mp = node_mountpoint(str(device_node_path)) mp = node_mountpoint(str(device_node_path))
if mp is None: if mp is None:
raise raise
finally:
return mp return mp
def unmount(self, device_node_path): def unmount(self, device_node_path):
d = self.device(device_node_path) d = self.device(device_node_path)

@ -147,7 +147,7 @@ def uninstall_distro():
gen.log('EFI image does not exist. Copying now...') gen.log('EFI image does not exist. Copying now...')
shutil.copy2(gen.resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")), shutil.copy2(gen.resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")),
os.path.join(config.usb_mount, 'EFI', 'BOOT')) os.path.join(config.usb_mount, 'EFI', 'BOOT'))
elif not gen.grub_efi_exist(efi_grub_img) is True: elif not gen.grub_efi_exist(efi_grub_img):
gen.log('EFI image overwritten by distro install. Replacing it now...') gen.log('EFI image overwritten by distro install. Replacing it now...')
shutil.copy2(gen.resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")), shutil.copy2(gen.resource_path(os.path.join("data", "EFI", "BOOT", "bootx64.efi")),
os.path.join(config.usb_mount, 'EFI', 'BOOT')) os.path.join(config.usb_mount, 'EFI', 'BOOT'))

@ -26,10 +26,7 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
usb_mount = usb_details['mount_point'] usb_mount = usb_details['mount_point']
usb_uuid = usb_details['uuid'] usb_uuid = usb_details['uuid']
usb_label = usb_details['label'] usb_label = usb_details['label']
patch = None # iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
if isolinux_bin_exist(config.image_path):
isolinux_path = os.path.join(iso_cfg_ext_dir, isolinux_bin_path(iso_link)[1:])
config.status_text = "Updating config files..." config.status_text = "Updating config files..."
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link)) install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
log('Updating distro specific config files...') log('Updating distro specific config files...')
@ -399,7 +396,7 @@ label hwinfo
def update_menu_lst(): def update_menu_lst():
sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg") sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg")
install_dir = os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path)) # install_dir = os.path.join(config.usb_mount, "multibootusb", iso_basename(config.image_path))
menu_lst = iso_menu_lst_path(config.image_path).replace("\\", "/") menu_lst = iso_menu_lst_path(config.image_path).replace("\\", "/")
with open(sys_cfg_file, "a") as f: with open(sys_cfg_file, "a") as f:
f.write("#start " + iso_basename(config.image_path) + "\n") f.write("#start " + iso_basename(config.image_path) + "\n")

@ -20,7 +20,7 @@ if platform.system() == 'Linux':
if platform.system() == 'Windows': if platform.system() == 'Windows':
import psutil import psutil
import win32com.client import win32com.client
import wmi # import wmi
import pythoncom import pythoncom
@ -84,7 +84,7 @@ def disk_usage(mount_path):
raise NotImplementedError("Platform not supported.") raise NotImplementedError("Platform not supported.")
def list_devices(partition=1, fixed=False): def list_devices(fixed=False):
""" """
List inserted USB devices. List inserted USB devices.
:return: USB devices as list. :return: USB devices as list.
@ -97,7 +97,7 @@ def list_devices(partition=1, fixed=False):
try: try:
import pyudev import pyudev
except Exception as e: except Exception as e:
gen.log('Pydev is not installed on host system. Using the inbuilt one.') gen.log('PyUdev is not installed on host system, using built-in.')
from . import pyudev from . import pyudev
context = pyudev.Context() context = pyudev.Context()
@ -209,12 +209,9 @@ def details_udev(usb_disk_part):
import pyudev import pyudev
except: except:
from . import pyudev from . import pyudev
""" # Try with PyUdev to get the details of USB disks.
Try with PyUdev to get the details of USB disks. # This is the easiest and reliable method to find USB details.
This is the easiest and reliable method to find USB details. # Also, it is a standalone package and no dependencies are required.
Also, it is a standalone package and no dependencies are required.
"""
# gen.log "Using PyUdev for detecting USB details..."
context = pyudev.Context() context = pyudev.Context()
try: try:
device = pyudev.Device.from_device_file(context, usb_disk_part) device = pyudev.Device.from_device_file(context, usb_disk_part)
@ -280,7 +277,7 @@ def details_udisks2(usb_disk_part):
device = bd.Get('org.freedesktop.UDisks2.Block', 'Device', dbus_interface='org.freedesktop.DBus.Properties') device = bd.Get('org.freedesktop.UDisks2.Block', 'Device', dbus_interface='org.freedesktop.DBus.Properties')
device = bytearray(device).replace(b'\x00', b'').decode('utf-8') device = bytearray(device).replace(b'\x00', b'').decode('utf-8')
uuid = bd.Get('org.freedesktop.UDisks2.Block', 'IdUUID', dbus_interface='org.freedesktop.DBus.Properties') uuid = bd.Get('org.freedesktop.UDisks2.Block', 'IdUUID', dbus_interface='org.freedesktop.DBus.Properties')
file_system = bd.Get('org.freedesktop.UDisks2.Block', 'IdType', dbus_interface='org.freedesktop.DBus.Properties') file_system = bd.Get('org.freedesktop.UDisks2.Block', 'IdType', dbus_interface='org.freedesktop.DBus.Properties')
mount_point = bd.Get('org.freedesktop.UDisks2.Filesystem', 'MountPoints', dbus_interface='org.freedesktop.DBus.Properties') mount_point = bd.Get('org.freedesktop.UDisks2.Filesystem', 'MountPoints', dbus_interface='org.freedesktop.DBus.Properties')
if mount_point: if mount_point:
# mount_point = str(bytearray(mount_point[0]).decode('utf-8').replace(b'\x00', b'')) # mount_point = str(bytearray(mount_point[0]).decode('utf-8').replace(b'\x00', b''))
@ -367,18 +364,17 @@ def win_disk_details(disk_drive):
size_total = shutil.disk_usage(mount_point)[0] size_total = shutil.disk_usage(mount_point)[0]
size_used = shutil.disk_usage(mount_point)[1] size_used = shutil.disk_usage(mount_point)[1]
size_free = shutil.disk_usage(mount_point)[2] size_free = shutil.disk_usage(mount_point)[2]
'''
# The below code works only from vista and above. I have removed it as many people reported that the software # The below code works only from vista and above. I have removed it as many people reported that the software
# was not working under windows xp. Even then, it is significantly slow if 'All Drives' option is checked. # was not working under windows xp. Even then, it is significantly slow if 'All Drives' option is checked.
# Removing the code doesn't affect the functionality as it is only used to find vendor id and model of the drive. # Removing the code doesn't affect the functionality as it is only used to find vendor id and model of the drive.
c = wmi.WMI() # c = wmi.WMI()
for physical_disk in c.Win32_DiskDrive(InterfaceType="USB"): # for physical_disk in c.Win32_DiskDrive(InterfaceType="USB"):
for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"): # for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
for logical_disk in partition.associators("Win32_LogicalDiskToPartition"): # for logical_disk in partition.associators("Win32_LogicalDiskToPartition"):
if logical_disk.Caption == disk_drive: # if logical_disk.Caption == disk_drive:
vendor = (physical_disk.PNPDeviceID.split('&VEN_'))[1].split('&PROD_')[0] # vendor = (physical_disk.PNPDeviceID.split('&VEN_'))[1].split('&PROD_')[0]
model = (physical_disk.PNPDeviceID.split('&PROD_'))[1].split('&REV_')[0] # model = (physical_disk.PNPDeviceID.split('&PROD_'))[1].split('&REV_')[0]
'''
return {'uuid': uuid, 'file_system': file_system, 'label': label, 'mount_point': mount_point, return {'uuid': uuid, 'file_system': file_system, 'label': label, 'mount_point': mount_point,
'size_total': size_total, 'size_used': size_used, 'size_free': size_free, 'size_total': size_total, 'size_used': size_used, 'size_free': size_free,

@ -9,7 +9,6 @@
from distutils.core import setup from distutils.core import setup
#from setuptools import setup, find_packages #from setuptools import setup, find_packages
import os import os
import sys
from scripts.gen import mbusb_version from scripts.gen import mbusb_version

Loading…
Cancel
Save