User improvements and version bump

1. Warn users when using partition/disk for dd and normal disto install through a message
2. Bumped the version to 8.6.0
3. Updated changelog for version 8.6.0
4. Changes logic for Slackware mini
5. Check for host pyudev and use inbuilt if not available
6. Updated setup.py for inclusion of newer files towards new release
pull/144/head
mbusb 7 years ago
parent 4ca22ff1fd
commit 11096af0d8

@ -1,3 +1,34 @@
Version - 8.6.0
---------------
==> A very big thanks to Alin Trăistaru. All credits goes to him for redesigning of GUI and code cleanups <==
-------------------------------------------------------------------------------------------------------------
* Fresh and friendly user interface (GUI)
* Initial support for UEFI/EFI boot
* Added GRUB2 boot loader
* Auto creation of loopback.cfg file for GRUB2 support
* Direct ISO write to USB now uses '"oflag=sync"' flag
* Use system pyudev library by default
* Fixed syslinux install failure in distro dir on ext2/3/4
* Fixed crash when writing ISO to USB on Windows
* Detect isolinux version 2 and install version 3 instead.
* Improvements to persistence logic
* Simplified USB disk detection
* Improved CentOS detection
* Improved user experience through rewording display messages
* Fix for creating persistence on mount points containing spaces
* Fixed kaspersky install issue
* Improved fedora detection script
* Added support for Virtualized USB. https://github.com/mbusb/multibootusb/issues/110
* Added PLOP boot manager
* Added Dam Small Linux
* Added netboot.iso
* Added latest memtest
* Added slack mini boot
* Added Fat Dog
* Added Finnix
Version - 8.5.0
---------------
* Added Solus OS

Binary file not shown.

@ -0,0 +1 @@
This file is created by multibootusb.

@ -36,6 +36,7 @@ else:
sourceforge_release_path = "multibootusb@frs.sourceforge.net:/home/frs/project/multibootusb/"
####################################################################################################
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
@ -90,7 +91,7 @@ class pkg():
if self.pkg_name == 'suse' or self.pkg_name == 'mageia':
require = "python3-qt5, parted, util-linux, mtools, python3-dbus, python3-pyudev, p7zip, p7zip-plugins, python3-six"
else:
require = "PyQt5, parted, util-linux, mtools, python3-dbus, python3-pyudev, p7zip, p7zip-plugins, python3-six"
require = "python3-PyQt5, parted, util-linux, mtools, python3-dbus, python3-pyudev, p7zip, p7zip-plugins, python3-six"
setup_cfg = ("[bdist_rpm]\n"
"Group = Applications/System\n"
"Vendor = Sundar <feedback.multibootusb@gmail.com>\n"

@ -1 +1 @@
8.5.0
8.6.0

@ -75,26 +75,27 @@ class Install():
if not result == "1":
return False
def install_dependency_package(self):
if subprocess.call("which pacman", shell=True) == 0:
subprocess.call("pacman -Sy --noconfirm", shell=True)
if subprocess.call("pacman -S --needed --noconfirm p7zip python-pyqt5 mtools parted util-linux python-dbus") == 0: # 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: # Thank you Neitsab for "--needed" argument.
result = True
elif subprocess.call("which yum", shell=True) == 0:
subprocess.call("yum check-update", shell=True)
if subprocess.call("dnf install mtools python3-PyQt5 util-linux parted p7zip p7zip-plugins python3-dbus -y", shell=True) == 0:
if subprocess.call("dnf install mtools python3-PyQt5 util-linux python3-six parted p7zip p7zip-plugins python3-pyudev python3-dbus -y", shell=True) == 0:
result = True
elif subprocess.call("which apt-get", shell=True) == 0:
subprocess.call("apt-get -q update", shell=True)
if subprocess.call("apt-get -q -y install python3-pyqt5 p7zip-full parted util-linux mtools python3-dbus", shell=True) == 0:
if subprocess.call("apt-get -q -y install python3-pyqt5 p7zip-full parted util-linux python3-pyudev mtools python3-dbus", shell=True) == 0:
result = True
elif subprocess.call("which zypper", shell=True) == 0:
subprocess.call("zypper refresh", shell=True)
if subprocess.call("zypper install -y mtools python3-qt5 p7zip p7zip-plugins util-linux parted", shell=True) == 0:
if subprocess.call("zypper install -y mtools python3-qt5 p7zip p7zip-plugins python3-pyudev python3-six util-linux parted", shell=True) == 0:
result = True
elif subprocess.call("which urpmi", shell=True) == 0:
subprocess.call("urpmi.update -a", shell=True)
if subprocess.call("urpmi install -auto mtools util-linux p7zip p7zip-plugins parted python3-qt5", shell=True) == 0:
if subprocess.call("urpmi install -auto mtools util-linux p7zip p7zip-plugins python3-pyudev python3-six parted python3-qt5", shell=True) == 0:
result = True
if result is not True:

@ -71,21 +71,24 @@ def distro(iso_cfg_ext_dir, iso_link):
return "fedora"
elif re.search(r'redhat', string, re.I):
return "redhat"
# elif re.search(r'suse', string, re.I):
# return "suse"
elif re.search(r'opensuse', string, re.I):
return "opensuse"
elif re.search(
r'slitaz|dban |ophcrack|tinycore|rescue.cpi|xpud|untangle|4mlinux|partition wizard|android-x86.png|'
r'riplinux|lebel dummy|http://pogostick.net/~pnh/ntpasswd/|AVG Rescue CD|ipxe.lkrn|SLACK_KERNEL=huge.s', string, re.I):
r'riplinux|lebel dummy|http://pogostick.net/~pnh/ntpasswd/|AVG Rescue CD|lkrn', string, re.I):
return "slitaz"
elif re.search(r'minimal Slackware|Slackware-HOWTO', string, re.I):
# for minimal slackware detection
return "slitaz"
# elif re.search(r'suse', string, re.I):
# return "suse"
elif re.search(r'class opensuse', string, re.I):
return "opensuse-install"
elif re.search(r'boot=casper', string, re.I):
return "ubuntu"
elif re.search(r'wifislax', string, re.I):
return "wifislax"
elif re.search(r'slax', string, re.I):
return "slax"
elif re.search(r'sms.jpg|vector|autoexec', string, re.I) and isolinux_bin_exist(iso_link):
elif re.search(r'sms.jpg|vector |autoexec', string, re.I) and isolinux_bin_exist(iso_link):
return "sms"
elif re.search(r'antix', string, re.I):
return "antix"
@ -108,6 +111,7 @@ def distro(iso_cfg_ext_dir, iso_link):
elif re.search(r'zenwalk|slack|salix', string, re.I) and re.search(r'live', string, re.I):
return "salix-live"
elif re.search(r'zenwalk|slack|salix', string, re.I):
print(os.path.join(path, name))
return "zenwalk"
elif re.search(r'ubuntu server', string, re.I):
return "ubuntu-server"

@ -50,6 +50,7 @@ def log(message, info=True, error=False, debug=False):
elif debug is not False:
logging.debug(message)
def resource_path(relativePath):
"""
Function to detect the correct path of file when working with sourcecode/install or binary.

@ -104,21 +104,6 @@ class Imager(QtWidgets.QMainWindow, Ui_MainWindow):
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# def on_Imager_Browse_iso_Click(self):
# """
# Browse and choose an ISO.
# :return:
# """
# self.ui.lineEdit_3.clear()
# config.imager_iso_link = QtWidgets.QFileDialog.getOpenFileName(self, 'Select an iso...', "", "ISO Files (*.iso)")[0]
# if config.imager_iso_link:
# if platform.system() == "Windows":
# if "/" in config.imager_iso_link:
# config.imager_iso_link = config.imager_iso_link.strip().replace("/", "\\")
# self.ui.lineEdit_3.insert(str(config.imager_iso_link))
# self.add_iso_gui_label_text()
# else:
# log("File not selected...")
def add_iso_gui_label_text(self):
"""

@ -453,6 +453,11 @@ Are you SURE you want to enable it?",
log("ERROR: USB disk is not mounted.")
QtWidgets.QMessageBox.information(self, "No Mount...", "USB disk is not mounted.\n"
"Please mount USB disk and press refresh USB button.")
elif config.usb_disk[-1].isdigit() is False:
gen.log('Selected USB is a disk. Please select a disk partition from the drop down list')
QtWidgets.QMessageBox.information(self, 'No Partition...!', 'USB disk selected doesn\'t contain a partition.\n'
'Please select the partition (ending '
'with a digit eg. /dev/sdb1)\nfrom the drop down list.')
else:
# clean_iso_cfg_ext_dir(os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")) # Need to be cleaned.
# extract_cfg_file(config.image_path) # Extract files from ISO
@ -556,28 +561,34 @@ Are you SURE you want to enable it?",
QtWidgets.QMessageBox.information(self, 'No ISO...', 'Please select an ISO.')
else:
imager = Imager()
usb_disk_size = int(imager.imager_usb_detail(config.usb_disk, partition=0).total_size)
self.iso_size = os.path.getsize(config.image_path)
if self.iso_size >= usb_disk_size:
QtWidgets.QMessageBox.information(self, "No enough space on disk.", os.path.basename(config.image_path) +
" size is larger than the size of " + config.usb_disk)
#elif gen.process_exist('explorer.exe') is not False:
# # Check if windows explorer is running and inform user to close it.
# QtWidgets.QMessageBox.information(self, "Windows Explorer", "Windows Explorer is running\n"
# "You need to close it before writing ISO "
# "image to disk...")
if config.usb_disk[-1].isdigit() is True:
gen.log('Selected disk is a partitions. Please select a disk from the drop down list')
QtWidgets.QMessageBox.information(self, 'Wrong Disk...!', 'Disk selected is a partition.\nISO is to '
'be written to whole disk for proper functioning'
'.\n\nPlease select the disk from the drop down list.')
else:
reply = QtWidgets.QMessageBox.question \
(self, 'Review selection',
'Selected disk: %s\n' % config.usb_disk +
'Selected image: %s\n\n' % os.path.basename(config.image_path) +
'Proceed with writing image to disk?',
QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.dd_start()
config.process_exist = True
self.progress_thread_dd.start()
usb_disk_size = int(imager.imager_usb_detail(config.usb_disk, partition=0).total_size)
self.iso_size = os.path.getsize(config.image_path)
if self.iso_size >= usb_disk_size:
QtWidgets.QMessageBox.information(self, "No enough space on disk.", os.path.basename(config.image_path) +
" size is larger than the size of " + config.usb_disk)
#elif gen.process_exist('explorer.exe') is not False:
# # Check if windows explorer is running and inform user to close it.
# QtWidgets.QMessageBox.information(self, "Windows Explorer", "Windows Explorer is running\n"
# "You need to close it before writing ISO "
# "image to disk...")
else:
reply = QtWidgets.QMessageBox.question \
(self, 'Review selection',
'Selected disk: %s\n' % config.usb_disk +
'Selected image: %s\n\n' % os.path.basename(config.image_path) +
'Proceed with writing image to disk?',
QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.dd_start()
config.process_exist = True
self.progress_thread_dd.start()
def on_close_Click(self):
"""

@ -177,6 +177,9 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
'append loader=syslinux isofrom_device=/dev/disk/by-uuid/' + usb_uuid +
' isofrom_system=/multibootusb/' + iso_basename(iso_link) + '/' + iso_name(iso_link),
string, flags=re.I)
elif distro == 'opensuse-install':
string = re.sub(r'splash=silent', 'splash=silent install=hd:/dev/disk/by-uuid/'
+ config.usb_uuid + '/multibootusb/' + iso_basename(iso_link), string)
elif distro == "pclinuxos":
string = re.sub(r'livecd=',
'fromusb livecd=' + '/multibootusb/' + iso_basename(iso_link) + '/',
@ -310,7 +313,6 @@ def update_mbusb_cfg_file(iso_link, usb_uuid, usb_mount, distro):
elif distro == 'grub4dos_iso':
update_grub4dos_iso_menu()
else:
# admin.adminCmd(["mount", "-o", "remount,rw", config.usb_disk])
config_file = open(sys_cfg_file, "a")
config_file.write("#start " + iso_basename(iso_link) + "\n")
config_file.write("LABEL " + iso_basename(iso_link) + "\n")

@ -20,7 +20,6 @@ if platform.system() == 'Linux':
if platform.system() == 'Windows':
import psutil
import win32com.client
import win32com.client
import wmi
import pythoncom
@ -95,7 +94,11 @@ def list_devices(partition=1, fixed=False):
try:
# pyudev is good enough to detect USB devices on modern Linux machines.
gen.log("Using pyudev for detecting USB drives...")
import pyudev
try:
import pyudev
except Exception as e:
gen.log('Pydev is not installed on host system. Using the inbuilt one.')
from . import pyudev
context = pyudev.Context()
for device in context.list_devices(subsystem='block', ID_BUS="usb"):
@ -109,7 +112,8 @@ def list_devices(partition=1, fixed=False):
devices.append(str(device['DEVNAME']))
gen.log("\t" + device['DEVNAME'])
except:
except Exception as e:
gen.log(e)
import dbus
bus = dbus.SystemBus()
try:
@ -120,15 +124,23 @@ def list_devices(partition=1, fixed=False):
'org.freedesktop.UDisks2', '/org/freedesktop/UDisks2')
ud_manager = dbus.Interface(
ud_manager_obj, 'org.freedesktop.DBus.ObjectManager')
for k, v in ud_manager.GetManagedObjects().iteritems():
for k, v in ud_manager.GetManagedObjects().items():
drive_info = v.get('org.freedesktop.UDisks2.Block', {})
if drive_info.get('IdUsage') == "filesystem" and not drive_info.get(
'HintSystem') and not drive_info.get('ReadOnly'):
device = drive_info.get('Device')
device = bytearray(device).replace(
b'\x00', b'').decode('utf-8')
devices.append(device)
except:
if fixed is True:
if drive_info.get('IdUsage') == "filesystem" and not drive_info.get('ReadOnly'):
device = drive_info.get('Device')
device = bytearray(device).replace(b'\x00', b'').decode('utf-8')
devices.append(device)
else:
if drive_info.get('IdUsage') == "filesystem" and not drive_info.get(
'HintSystem') and not drive_info.get('ReadOnly'):
device = drive_info.get('Device')
device = bytearray(device).replace(
b'\x00', b'').decode('utf-8')
devices.append(device)
except Exception as e:
gen.log(e, error=True)
try:
# You must be using really old distro. Otherwise, the code
# should not reach here.
@ -149,7 +161,8 @@ def list_devices(partition=1, fixed=False):
device_file = device_props.Get(
'org.freedesktop.UDisks.Device', "DeviceFile")
devices.append(device_file)
except:
except Exception as e:
gen.log(e, error=True)
gen.log("No USB device found...")
devices.sort()
@ -192,7 +205,10 @@ def details_udev(usb_disk_part):
assert usb_disk_part is not None
assert platform.system() == "Linux"
import pyudev
try:
import pyudev
except:
from . import pyudev
"""
Try with PyUdev to get the details of USB disks.
This is the easiest and reliable method to find USB details.

@ -12,6 +12,15 @@ import os
import sys
from scripts.gen import mbusb_version
def get_data(_dir):
data = []
for dirpath, dirnames, filenames in os.walk(_dir):
for f in filenames:
cfg_file = os.path.join(dirpath, f)
data.append(cfg_file)
return data
Version = mbusb_version()
print(Version)
setup(
@ -37,7 +46,7 @@ setup(
('/usr/share/multibootusb/data/tools/dd', ["data/tools/dd/dd.exe"]),
('/usr/share/multibootusb/data/tools/dd', ["data/tools/dd/diskio.dll"]),
('/usr/share/multibootusb/data/tools/mkfs', ["data/tools/mkfs/mke2fs.exe"]),
('/usr/share/multibootusb/data/tools/EFI', ["data/EFI/*"]),
('/usr/share/multibootusb/data/EFI', get_data('data/EFI')),
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/chain.c32"]),
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/bg.png"]),
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/extlinux.cfg"]),
@ -47,9 +56,6 @@ setup(
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/menu.lst"]),
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/syslinux.cfg"]),
('/usr/share/multibootusb/data/multibootusb', ["data/multibootusb/vesamenu.c32"]),
('/usr/share/multibootusb/data/multibootusb/grub', ["data/multibootusb/grub/*"]),
('/usr/share/multibootusb/data/tools/syslinux', ["data/tools/syslinux/syslinux_modules.zip"]),
('/usr/share/multibootusb/data/tools/syslinux', ["data/tools/syslinux/syslinux_linux.zip"]),
('/usr/share/multibootusb/data/tools/syslinux', ["data/tools/syslinux/syslinux_linux_64.zip"]),
('/usr/share/multibootusb/data/tools/syslinux', ["data/tools/syslinux/syslinux_windows.zip"])]
('/usr/share/multibootusb/data/multibootusb/grub', get_data('data/multibootusb/grub')),
('/usr/share/multibootusb/data/tools/syslinux', get_data('data/tools/syslinux'))]
)

Loading…
Cancel
Save