update to version 8.4.0

pull/63/head v8.4.0
mbusb 8 years ago
parent a149f762f3
commit be4c8d9763

@ -1,3 +1,14 @@
Version - 8.4.0
---------------
* Bug fix in selection of persistence size
* Fixed crashing of application when selecting extended drive
* Introduction of log file (/tmp/multibootusb.log on linux and C:\Program Files (x86)\multibootusb\multibootusb.log under Windows)
* Added F Secure Rescue CD
* Added Tail
* Support for latest wifislax
* Fix for ROSA boot issue
* Various other minor bug fixes
Version - 8.3.0
---------------
* Added React OS

@ -65,7 +65,7 @@ class pkg():
print("Ensure thta you have python-stdeb package installed!")
stdcfg = """[DEFAULT]
Package: multibootusb
Depends3: python3-pyqt5, parted, util-linux, mtools, python3-dbus, p7zip-full
Depends3: python3-pyqt5, parted, util-linux, mtools, python3-dbus, p7zip-full, python3-six
Build-Depends: python3-all
Section: system
XS-Python-Version: = 3.5
@ -88,9 +88,9 @@ class pkg():
result = True
elif self.pkg_name == 'rpm' or self.pkg_name == 'suse' or self.pkg_name == 'mageia':
if self.pkg_name == 'suse' or self.pkg_name == 'mageia':
require = "python3-qt5, parted, util-linux, mtools, python3-dbus, p7zip, p7zip-plugins"
require = "python3-qt5, parted, util-linux, mtools, python3-dbus, p7zip, p7zip-plugins, python3-six"
else:
require = "PyQt5, parted, util-linux, mtools, python3-dbus, p7zip, p7zip-plugins"
require = "PyQt5, parted, util-linux, mtools, python3-dbus, p7zip, p7zip-plugins, python3-six"
setup_cfg = ("[bdist_rpm]\n"
"Group = Applications/System\n"
"Vendor = Sundar <feedback.multibootusb@gmail.com>\n"

@ -1 +1 @@
8.3.0
8.4.0

@ -6,6 +6,7 @@
# 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
import logging
import getopt
import sys
import os
@ -16,10 +17,12 @@ import platform
try:
from scripts.mbusb_cli import *
from scripts import admin
from scripts import gen
except:
try:
from .scripts.mbusb_cli import *
from .scripts import admin
from .scripts import gen
except:
import scripts
@ -44,16 +47,16 @@ def usage():
def start_gui():
from scripts import mbusb_gui
print('Starting multibootusb GUI...')
gen.log('Starting multibootusb GUI...')
if platform.system() == 'Linux':
if os.getuid() != 0:
print('\n\n\nAdmin privilege is required to run multibootusb.\n If you are running from source try '
'\'sudo python3 ./multibootusb\'\n or you can try \'multibootusb-pkexec\' (post install)\n\n\n')
gen.log('\n\nAdmin privilege is required to run multibootusb.\n If you are running from source try '
'\'sudo python3 ./multibootusb\'\n or you can try \'multibootusb-pkexec\' (post install)\n\n',
info=False, debug=True)
mbusb_gui.main_gui()
if __name__ == '__main__':
if platform.system() == 'Windows':
if not admin.isUserAdmin():
admin.runAsAdmin()

@ -1,8 +1,8 @@
;--------------------------------
;NSIS script for creating multibootusb setup file
Name "multibootusb 8.2.0"
OutFile "multibootusb-8.2.0-setup.exe"
Name "multibootusb 8.4.0"
OutFile "multibootusb-8.4.0-setup.exe"
SetCompressor lzma

@ -39,7 +39,7 @@ def extract_iso(src, dst, pattern=None, suppress_out=True):
suppress_out = ' 2> /dev/null'
if not os.path.exists(src):
print('ISO file could not be found on the location specified.')
gen.log('ISO file could not be found on the location specified.')
return False
if not os.path.exists(dst):
os.makedirs(dst, exist_ok=True)
@ -48,13 +48,13 @@ def extract_iso(src, dst, pattern=None, suppress_out=True):
_cmd = _7zip + cli_option + ' x -y -o' + gen.quote(dst) + ' ' + gen.quote(src) + suppress_out
else:
_cmd = _7zip + ' -y x ' + gen.quote(src) + ' -o' + dst + ' ' + gen.quote(pattern) + ' -r' + suppress_out
# print('Executing', _cmd)
# gen.log('Executing', _cmd)
_7zip_process = subprocess.Popen(_cmd, universal_newlines=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE,
stdout=subprocess.PIPE, shell=True)
config.status_text = 'Extracting ' + os.path.basename(src)
while True:
line = _7zip_process.stdout.readline()
# print(line)
# gen.log(line)
if line.startswith('- '):
config.status_text = 'Extracting ' + line[2:]
elif platform.system() == 'Linux': # line.startswith('Extracting'): # Under Linux it prints directly all the process (may be due to version diff).
@ -71,12 +71,12 @@ def list_iso(iso_link, suppress_out=True):
if suppress_out is True:
suppress_out = ' 2> /dev/null'
if not os.path.exists(iso_link):
print('Path to ISO link does not exist.')
gen.log('Path to ISO link does not exist.')
return False
else:
file_list = []
_cmd = _7zip + ' l ' + gen.quote(iso_link) + suppress_out
# print('Executing', _cmd)
# gen.log('Executing', _cmd)
_cmd_out = subprocess.check_output(_cmd, universal_newlines=True, stderr=subprocess.PIPE, shell=True).splitlines()
for line in _cmd_out:
line = line.split()
@ -109,7 +109,7 @@ def test_iso(iso_link, suppress_out=True):
_cmd = _7zip + ' t ' + iso_link + suppress_out
# print('Executing', _cmd)
# gen.log('Executing', _cmd)
rc = subprocess.call(_cmd, shell=True)

@ -38,6 +38,7 @@ import platform
import sys
import subprocess
from PyQt5 import QtWidgets
from . import gen
def isUserAdmin():
@ -46,7 +47,7 @@ def isUserAdmin():
(root on Unix), otherwise False.
Warning: The inner function fails unless you have Windows XP SP2 or
higher. The failure causes a traceback to be printed and this
higher. The failure causes a traceback to be gen.loged and this
function to return False.
"""
@ -57,7 +58,7 @@ def isUserAdmin():
return ctypes.windll.shell32.IsUserAnAdmin()
except:
traceback.print_exc()
print("Admin check failed, assuming not an admin.")
gen.log("Admin check failed, assuming not an admin.")
return False
elif platform.system() == "Linux":
return os.getuid() == 0
@ -103,7 +104,7 @@ def runAsAdmin(cmdLine=None, wait=True):
#showCmd = win32con.SW_HIDE
lpVerb = 'runas' # causes UAC elevation prompt.
#print("Running", cmd, params)
#gen.log("Running", cmd, params)
# ShellExecute() doesn't seem to allow us to fetch the PID or handle
# of the process, so we can't get anything useful from it. Therefore
@ -121,7 +122,7 @@ def runAsAdmin(cmdLine=None, wait=True):
procHandle = procInfo['hProcess']
obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE)
rc = win32process.GetExitCodeProcess(procHandle)
#print "Process handle %s returned code %s" % (procHandle, rc)
#gen.log "Process handle %s returned code %s" % (procHandle, rc)
else:
rc = None
@ -157,10 +158,10 @@ def adminCmd(cmd, fork=False, gui=False):
'Could not find any of: pkexec, sudo, gksu, kdesu, gksudo, or kdesudo. Please install one then restart multibootusb.')
sys.exit(0)
final_cmd = ' '.join(sudo_cmd + ['"' + ' '.join(cmd).replace('"', '\\"') + '"'])
print("Executing ==> " + final_cmd)
gen.log("Executing ==> " + final_cmd)
if fork:
return subprocess.Popen(final_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1, shell=True)
else:
ret = subprocess.call(final_cmd, shell=True)
print("Process returned ==> " + str(ret))
gen.log("Process returned ==> " + str(ret))
return ret

@ -64,7 +64,7 @@ def distro(iso_cfg_ext_dir, iso_link):
return "solydx"
elif re.search(r'knoppix', string, re.I):
return "knoppix"
elif re.search(r'root=live', string, re.I):
elif re.search(r'root=live:CDLABEL=', string, re.I):
return "fedora"
elif re.search(r'redhat', string, re.I):
return "redhat"
@ -74,7 +74,7 @@ def distro(iso_cfg_ext_dir, iso_link):
re.I):
return "opensuse"
elif re.search(
r'slitaz|dban|ophcrack|tinycore|rescue.cpi|xpud|untangle|4mlinux|partition wizard|'
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', string, re.I):
return "slitaz"
elif re.search(r'boot=casper', string, re.I):
@ -123,6 +123,8 @@ def distro(iso_cfg_ext_dir, iso_link):
return "Windows"
elif re.search(r'ReactOS', string, re.I):
return "ReactOS"
elif re.search(r'fsecure', string, re.I):
return "fsecure"
distro = detect_iso_from_file_list(iso_link)
if distro:
@ -159,11 +161,11 @@ def detect_iso_from_file_list(iso_link):
elif any("menu.lst" in s.lower() for s in iso_file_list):
return "grub4dos"
else:
print(iso_file_list)
log(iso_file_list)
if __name__ == '__main__':
iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
#iso_link = '../../../DISTROS/2016/debian-live-8.3.0-amd64-lxde-desktop.iso'
iso_link = '/media/sundar/Data/DISTROS/ubuntu_14_04_backup/Downloads/clonezilla-live-2.4.2-32-amd64.iso'
iso_extract_file(iso_link, iso_cfg_ext_dir, 'cfg')
print(distro(iso_cfg_ext_dir))
log(distro(iso_cfg_ext_dir))

@ -1,21 +1,54 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*
# Name: gen.py
# Name: log.py
# Purpose: This 'general' module contain many functions required to be called at many places
# Authors: Sundar
# 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
import logging
import sys
import os
import platform
import shutil
import string
import zipfile
import tempfile
def scripts_dir_path():
return os.path.dirname(os.path.realpath(__file__))
def log(message, info=True, error=False, debug=False):
"""
Dirty function to log messages to file and also print on screen.
:param message:
:param info:
:param error:
:param debug:
:return:
"""
# LOG_FILE_PATH = os.path.join(multibootusb_host_dir(), 'multibootusb.log')
LOG_FILE_PATH = mbusb_log_file()
if os.path.exists(LOG_FILE_PATH):
log_file_size = os.path.getsize(LOG_FILE_PATH) / (1024.0 * 1024.0)
if log_file_size > 1:
print('Removing log file as it crosses beyond 1mb')
os.remove(LOG_FILE_PATH)
logging.basicConfig(filename=LOG_FILE_PATH,
filemode='a',
format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
datefmt='%H:%M:%S',
level=logging.DEBUG)
print(message)
if info is True:
logging.info(message)
elif error is not False:
logging.error(message)
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.
@ -25,11 +58,11 @@ def resource_path(relativePath):
try:
basePath = sys._MEIPASS # Try if we are running as standalone executable
# print('Running stand alone executable.')
# log('Running stand alone executable.')
except:
basePath = '/usr/share/multibootusb' # Check if we run in installed environment
#if os.path.exists('/usr/share/multibootusb'):
#print('Running from installed machine.')
#log('Running from installed machine.')
if not os.path.exists(basePath):
#basePath = os.path.abspath(".")
basePath = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
@ -48,10 +81,10 @@ def resource_path(relativePath):
def print_version():
"""
Simple print the version number of the multibootusb application
Simple log the version number of the multibootusb application
:return:
"""
print('multibootusb version : ', mbusb_version())
log('multibootusb version : ', mbusb_version())
def quote(text):
@ -95,13 +128,28 @@ def sys_64bits():
return sys.maxsize > 2**32
def mbusb_log_file():
"""
Function to genrate path to log file.
Under linux path is created as /tmp/multibootusb.log
Under Windows the file is created under
"""
if platform.system() == "Linux":
home_dir = os.path.expanduser('~')
# log_file = os.path.join(home_dir, "multibootusb.log")
log_file = os.path.join(tempfile.gettempdir(), "multibootusb.log")
elif platform.system() == "Windows":
# log_file = os.path.join(tempfile.gettempdir(), "multibootusb", "multibootusb.log")
log_file = os.path.join("multibootusb.log")
return log_file
def multibootusb_host_dir():
"""
Cross platform way to detect multibootusb directory on host system.
:return: Path to multibootusb directory of host system.
"""
import tempfile
if platform.system() == "Linux":
home_dir = os.path.expanduser('~')
mbusb_dir = os.path.join(home_dir, ".multibootusb")
@ -133,7 +181,7 @@ def clean_iso_cfg_ext_dir(iso_cfg_ext_dir):
else:
os.remove(os.path.join(iso_cfg_ext_dir, f))
else:
print('iso_cfg_ext_dir directory does not exist.')
log('iso_cfg_ext_dir directory does not exist.')
def copy_mbusb_dir_usb(usb_disk):
@ -149,13 +197,13 @@ def copy_mbusb_dir_usb(usb_disk):
usb_mount_path = usb_details['mount_point']
if not os.path.exists(os.path.join(usb_mount_path, "multibootusb")):
try:
print('Copying multibootusb directory to', usb_mount_path)
log('Copying multibootusb directory to ' + usb_mount_path)
shutil.copytree(resource_path(os.path.join("data", "multibootusb")), os.path.join(usb_mount_path, "multibootusb"))
return True
except:
return False
else:
print('multibootus directory already exist. Not copying.')
log('multibootus directory already exist. Not copying.')
def read_input_yes():
@ -212,7 +260,7 @@ def prepare_mbusb_host_dir():
if not os.path.exists(home):
os.makedirs(home)
else:
print("Cleaning old multibootusb directory...")
log("Cleaning old multibootusb directory...")
shutil.rmtree(home)
os.makedirs(home)
@ -223,50 +271,50 @@ def prepare_mbusb_host_dir():
os.makedirs(os.path.join(home, "iso_cfg_ext_dir"))
if os.path.exists(os.path.join(home, "syslinux", "bin", "syslinux4")):
print("Syslinux exist in multibootusb directory...")
log("Syslinux exist in multibootusb directory...")
else:
print("Extracting syslinux to multibootusb directory...")
log("Extracting syslinux to multibootusb directory...")
if platform.system() == "Linux":
if sys_64bits() is True:
print('Host OS is 64 bit...')
print("Extracting syslinux 64 bit...")
# print(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_linux_64.zip")))
log('Host OS is 64 bit...')
log("Extracting syslinux 64 bit...")
# log(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_linux_64.zip")))
with zipfile.ZipFile(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_linux_64.zip")), "r") as z:
z.extractall(home)
else:
print("Extracting syslinux 32 bit...")
log("Extracting syslinux 32 bit...")
with zipfile.ZipFile(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_linux.zip")), "r") as z:
z.extractall(home)
else:
with zipfile.ZipFile(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_windows.zip")), "r") as z:
z.extractall(home)
print("Extracting syslinux modules to multibootusb directory...")
log("Extracting syslinux modules to multibootusb directory...")
with zipfile.ZipFile(resource_path(os.path.join("data", "tools", "syslinux", "syslinux_modules.zip")), "r") as z:
z.extractall(os.path.join(home, "syslinux"))
if os.listdir(os.path.join(home, "iso_cfg_ext_dir")):
print(os.listdir(os.path.join(home, "iso_cfg_ext_dir")))
print("iso extract directory is not empty.")
print("Removing junk files...")
log(os.listdir(os.path.join(home, "iso_cfg_ext_dir")))
log("iso extract directory is not empty.")
log("Removing junk files...")
for files in os.listdir(os.path.join(home, "iso_cfg_ext_dir")):
if os.path.isdir(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files))):
print (os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
log (os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
os.chmod(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)), 0o777)
shutil.rmtree(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
else:
try:
print (os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
log (os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
os.chmod(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)), 0o777)
os.unlink(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
os.remove(os.path.join(os.path.join(home, "iso_cfg_ext_dir", files)))
except OSError:
print("Can't remove the file. Skipping it.")
log("Can't remove the file. Skipping it.")
if __name__ == '__main__':
print(quote("""Test-string"""))
print(has_digit("test-string-with-01-digit"))
print(sys_64bits())
print(multibootusb_host_dir())
print(iso_cfg_ext_dir())
log(quote("""Test-string"""))
log(has_digit("test-string-with-01-digit"))
log(sys_64bits())
log(multibootusb_host_dir())
log(iso_cfg_ext_dir())
strings_test = strings('../../text-stings.bin')
print(strings_test)
log(strings_test)

@ -33,7 +33,7 @@ def dd_linux():
output = "of=" + config.imager_usb_disk
os.system("umount " + config.imager_usb_disk + "1")
command = ['dd', input, output, "bs=1M"]
print("Executing ==> ", command)
log("Executing ==> " + command)
dd_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
pbar = progressbar.ProgressBar(maxval=100).start() # bar = progressbar.ProgressBar(redirect_stdout=True)
while dd_process.poll() is None:
@ -50,9 +50,9 @@ def dd_linux():
break
if dd_process.poll() is not None:
print("Executing ==> sync")
log("Executing ==> sync")
os.system("sync")
print("ISO has been written to USB disk...")
log("ISO has been written to USB disk...")
return
@ -60,25 +60,25 @@ def dd_win():
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"))):
print("dd exist")
log("dd exist")
input = "if=" + config.imager_iso_link
in_file_size = float(os.path.getsize(config.imager_iso_link) / 1024 / 1024)
output = "of=\\\.\\" + config.imager_usb_disk
command = [windd, input, output, "bs=1M", "--progress"]
print("Executing ==> ", command)
log("Executing ==> " + command)
dd_process = subprocess.Popen(command, universal_newlines=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
shell=False)
while dd_process.poll() is None:
for line in iter(dd_process.stderr.readline, ''):
line = line.strip()
if 'error' in line.lower() or 'invalid' in line.lower():
print("Error writing to disk...")
log("Error writing to disk...")
break
if line and line[-1] == 'M':
copied = float(line.strip('M').replace(',', ''))
config.imager_percentage = round((copied / float(in_file_size) * 100))
print("ISO has been written to USB disk...")
log("ISO has been written to USB disk...")
return
@ -107,26 +107,26 @@ class Imager(QtWidgets.QDialog, Ui_Dialog):
self.ui.lineEdit_3.insert(str(config.imager_iso_link))
self.add_iso_gui_label_text()
else:
print("File not selected...")
log("File not selected...")
def add_iso_gui_label_text(self):
"""
Simple function to add text label to GUI widgets.
:return:
"""
print("Testing ISO...")
log("Testing ISO...")
if iso.is_bootable(config.imager_iso_link) is True:
self.ui.imager_bootable.setText("Bootable ISO :: Yes")
print("ISO is bootable.")
log("ISO is bootable.")
else:
self.ui.imager_bootable.setText("Bootable ISO :: No")
print("ISO is not bootable.")
log("ISO is not bootable.")
if os.path.exists(config.imager_iso_link):
print("Path " + config.imager_iso_link + " is exist...")
log("Path " + config.imager_iso_link + " is exist...")
self.iso_size = str(round(os.path.getsize(config.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")
log("ISO Size is " + self.iso_size + " MB")
def onImagerComboChange(self):
config.imager_usb_disk = str(self.ui.comboBox_2.currentText())
@ -206,7 +206,7 @@ class Imager(QtWidgets.QDialog, Ui_Dialog):
usb_type = "Removable"
model = label
except:
print("Error detecting USB details.")
log("Error detecting USB details.")
return _ntuple_diskusage(total_size, usb_type, model)
@ -219,7 +219,7 @@ class Imager(QtWidgets.QDialog, Ui_Dialog):
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)
# log(usb_size)
return usb_size
else:
usb_size = self.usb.disk_usage(self.usb.get_usb(usb_disk).mount).total

@ -31,7 +31,7 @@ def install_distro():
_iso_file_list = iso.iso_file_list(config.iso_link)
if not os.path.exists(os.path.join(usb_mount, "multibootusb")):
print("Copying multibootusb directory to ", usb_mount)
log("Copying multibootusb directory to " + usb_mount)
shutil.copytree(resource_path(os.path.join("data", "tools", "multibootusb")),
os.path.join(config.usb_mount, "multibootusb"))
@ -42,7 +42,7 @@ def install_distro():
with open(os.path.join(install_dir, "iso_file_list.cfg"), 'w') as f:
for file_path in _iso_file_list:
f.write(file_path + "\n")
print("Installing ", iso_name(config.iso_link), "on", install_dir)
log("Installing " + iso_name(config.iso_link) + " on " + install_dir)
if config.distro == "opensuse":
iso.iso_extract_file(config.iso_link, install_dir, 'boot')
@ -50,10 +50,10 @@ def install_distro():
if platform.system() == "Windows":
subprocess.call(["xcopy", config.iso_link, usb_mount], shell=True) # Have to use xcopy as python file copy is dead slow.
elif platform.system() == "Linux":
print(config.iso_link, usb_mount)
log("Copying " + config.iso_link + " to " + usb_mount)
shutil.copy(config.iso_link, usb_mount)
elif config.distro == "Windows" or config.distro == "alpine":
print("Extracting iso to " + usb_mount)
log("Extracting iso to " + usb_mount)
iso_extract_full(config.iso_link, usb_mount)
elif config.distro == "trinity-rescue":
iso.iso_extract_file(config.iso_link, usb_mount, '*trk3')
@ -95,10 +95,11 @@ def install_distro():
iso.iso_extract_full(config.iso_link, install_dir)
if platform.system() == 'Linux':
print('ISO extracted successfully. Sync is in progress...')
log('ISO extracted successfully. Sync is in progress...')
os.system('sync')
if config.persistence != 0:
log('Creating Persistence...')
config.status_text = 'Creating Persistence...'
persistence.create_persistence()
@ -161,8 +162,8 @@ def install_patch():
try:
os.remove(os.path.join(config.usb_mount, "multibootusb",
iso_basename(config.iso_link), isolinux_bin_dir(config.iso_link), module))
print("Copying ", module)
print((resource_path(
log("Copying " + module)
log((resource_path(
os.path.join(multibootusb_host_dir(), "syslinux", "modules", config.syslinux_version, module)),
os.path.join(config.usb_mount, "multibootusb", iso_basename(config.iso_link),
isolinux_bin_dir(config.iso_link), module)))
@ -171,10 +172,10 @@ def install_patch():
os.path.join(config.usb_mount, "multibootusb", iso_basename(config.iso_link),
isolinux_bin_dir(config.iso_link), module))
except Exception as err:
print(err)
print("Could not copy ", module)
log(err)
log("Could not copy " + module)
else:
print('Patch not required...')
log('Patch not required...')
if __name__ == '__main__':

@ -91,8 +91,9 @@ def isolinux_bin_dir(iso_link):
if any("isolinux.bin" in s.lower() for s in iso_file_list):
for f in iso_file_list:
if 'isolinux.bin' in f.lower():
bin_dir = os.path.dirname(f)
break
if 'efi' not in f.lower(): # Certain distros place their isolinux.bin in to /EFI/BOOT director and we don't want to include them
bin_dir = os.path.dirname(f)
break
return bin_dir
@ -157,7 +158,7 @@ def isolinux_version(isolinux_bin_path):
if re.search(r'isolinux ', strin, re.I):
for number in version:
if re.search(r'isolinux ' + number, strin, re.I):
print("\n\nFound syslinux version " + number + "\n\n")
log("\n\nFound syslinux version " + number + "\n\n")
return str(number)
@ -196,18 +197,18 @@ if __name__ == '__main__':
#iso_path = '../../../DISTROS/2016/debian-live-8.3.0-amd64-lxde-desktop.iso'
iso_path = '../../../DISTROS/2015/super_grub2_disk_hybrid_2.02s3.iso'
test_iso_bin_path = os.path.join('test', 'isolinux', 'isolinux.bin')
print('iso_name(iso_path) : ', iso_name(iso_path))
print('iso_basename(iso_path) : ', iso_basename(iso_path))
print('Integrity of ISO is : ', integrity(iso_path))
log('iso_name(iso_path) : ', iso_name(iso_path))
log('iso_basename(iso_path) : ', iso_basename(iso_path))
log('Integrity of ISO is : ', integrity(iso_path))
f_list = (iso_file_list(iso_path))
if f_list:
for f in f_list:
print(f)
print('isolinux_bin_exist(iso_path) : ', isolinux_bin_exist(iso_path))
#print('is_bootable : ', is_bootable(iso_path))
print('isolinux_bin_dir() : ', isolinux_bin_dir(iso_path))
print('isolinux_bin_path(iso_path) : ', isolinux_bin_path(iso_path))
log(f)
log('isolinux_bin_exist(iso_path) : ', isolinux_bin_exist(iso_path))
#log('is_bootable : ', is_bootable(iso_path))
log('isolinux_bin_dir() : ', isolinux_bin_dir(iso_path))
log('isolinux_bin_path(iso_path) : ', isolinux_bin_path(iso_path))
iso_extract_full(iso_path, 'test')
iso_extract_file(iso_path, 'test', 'isolinux.bin')
print(isolinux_version(test_iso_bin_path))
log(isolinux_version(test_iso_bin_path))

@ -27,6 +27,7 @@ import re
import stat
from ctypes import *
from . import config
from . import gen
BLOCK_SIZE = 2048
@ -125,7 +126,7 @@ class ISO9660:
if flag == 255:
break
except Exception as e:
print("Got exception when init iso file:", sys.exc_info()[0])
gen.log("Got exception when init iso file:", sys.exc_info()[0])
self.priVol = None
self.rootDir = None
break
@ -151,15 +152,15 @@ class ISO9660:
BLOCK_SIZE = priVol.blockSize
# Check RRIP
#print ("loc extent(%d)"%(dirRec.locExtent))
#gen.log ("loc extent(%d)"%(dirRec.locExtent))
self.priVol = priVol # readDirItems will use self.priVol
root_dir = self.readDirItems(dirRec.locExtent, priVol.rootTotal)[0]
rripNode = self.__rripLoop__(root_dir.suspBuf, root_dir.lenDr-root_dir.sysUseStar)
if rripNode.offset != -1:
self.rripOffset = rripNode.offset
#print ("RRIP: rrip_offset %d"%(self.rripOffset))
#gen.log ("RRIP: rrip_offset %d"%(self.rripOffset))
else:
print (" This disc don't support RRIP")
gen.log (" This disc don't support RRIP")
self.rootDir = root_dir
# Rrip extension
@ -167,7 +168,7 @@ class ISO9660:
if self.rripOffset > 0:
entry_buf = desc_buf[self.rripOffset:]
print ("__rripLoop__ offset:%d"%(self.rripOffset))
gen.log ("__rripLoop__ offset:%d"%(self.rripOffset))
else:
entry_buf = desc_buf
@ -180,7 +181,7 @@ class ISO9660:
len_entry = 0
while True:
#print (("\n%d, %d\n")%(len_buf, head))
#gen.log (("\n%d, %d\n")%(len_buf, head))
head += len_entry
if len_buf - head < 4: # less than one entry
break
@ -191,7 +192,7 @@ class ISO9660:
len_entry = struct.unpack("B", entry_buf[2:3])[0]
ver = struct.unpack("B", entry_buf[3:4])[0]
#if len_entry == 0:
# print "Got a entry in __rripLoop__ (%c,%c) of SUSP with length:(%d),version:(%d)-->"%(sig1,sig2,len_entry, ver),
# gen.log "Got a entry in __rripLoop__ (%c,%c) of SUSP with length:(%d),version:(%d)-->"%(sig1,sig2,len_entry, ver),
if len_entry == 0:
break;
@ -199,7 +200,7 @@ class ISO9660:
ck1 = struct.unpack("B", entry_buf[4:5])[0]
ck2 = struct.unpack("B", entry_buf[5:6])[0]
skip = struct.unpack("B", entry_buf[6:7])[0]
#print "-->(0x%x==0xBE,0x%x==EF,%d)" %(ck1, ck2, skip)
#gen.log "-->(0x%x==0xBE,0x%x==EF,%d)" %(ck1, ck2, skip)
if ck1 == 0xBE and ck2 == 0xEF:
rr.offset = skip
continue
@ -208,12 +209,12 @@ class ISO9660:
ce_blk = struct.unpack("<L", entry_buf[4:8])[0]
ce_off = struct.unpack("<L", entry_buf[12:16])[0]
ce_len = struct.unpack("<L", entry_buf[20:24])[0]
#print "-->(%d,%d,%d)" %(ce_blk, ce_off, ce_len)
#gen.log "-->(%d,%d,%d)" %(ce_blk, ce_off, ce_len)
continue
if sig1 == ord('N') and sig2 == ord('M'):
flag = struct.unpack("B", entry_buf[4:5])[0]
#print "-->(flag:(0x%x), name:(%s))" %(flag, entry_buf[5:len_entry])
#gen.log "-->(flag:(0x%x), name:(%s))" %(flag, entry_buf[5:len_entry])
if flag == 0x02: # FLAG_CURRENT
rr.altname += "."
elif flag == 0x04: # FLAG_PARENT
@ -244,11 +245,11 @@ class ISO9660:
if sig1 == ord('S') and sig2 == ord('T'):
return rr
#print "\n"
#gen.log "\n"
# while (True) end #
if ce_len > 0:
#print " Read CE block, (%d, %d, %d)"%(ce_blk, ce_len, ce_off)
#gen.log " Read CE block, (%d, %d, %d)"%(ce_blk, ce_len, ce_off)
self.isoFile.seek(ce_blk*BLOCK_SIZE + ce_off)
entry_buf = self.isoFile.read(ce_len)
len_buf = ce_len
@ -276,7 +277,7 @@ class ISO9660:
s1 = struct.unpack('B', h[0:1])[0]
s2 = struct.unpack('B', h[1:2])[0]
#print "-->(0x%x,0x%x)" %(s1, s2)
#gen.log "-->(0x%x,0x%x)" %(s1, s2)
if (s1 == 0x55) and (s2 == 0xAA):
result = True # "Bootable"
@ -313,7 +314,7 @@ class ISO9660:
pdir_loc = item.locExtent
pdir_len = item.lenData
found = True
#print "found (%s)"%(dircomps[i_dircomp])
#gen.log "found (%s)"%(dircomps[i_dircomp])
break
if found: # advacne
if i_dircomp < len(dircomps)-1:
@ -321,7 +322,7 @@ class ISO9660:
else:
return item
else:
print ("can't find " + dircomps[i_dircomp])
gen.log ("can't find " + dircomps[i_dircomp])
return None
def readDirrecord(self, desc_buf):
@ -374,7 +375,7 @@ class ISO9660:
if rripNode.altname != "":
dirRec.fIdentifier = rripNode.altname
dirRec.lenFi = len(rripNode.altname)
#print "rrip_altname: %s"%(dirRec.fIdentifier)
#gen.log "rrip_altname: %s"%(dirRec.fIdentifier)
# if rripNode end #
# if self.rripOffset != -1 end #
# if dirRec.lenDr > .. end #
@ -464,7 +465,7 @@ class ISO9660:
if pattern != "":
p = r'{0}'.format(pattern)
pp = re.compile(p)
#print "writeDir: flag(%x)"%(d.fFlag)
#gen.log "writeDir: flag(%x)"%(d.fFlag)
if d.fFlag & 0x02 == 0x02:
# Check if a clean directory.
#try:
@ -482,7 +483,7 @@ class ISO9660:
return E_FAILURE
def writeDir_r(self, det_dir, dire, pp, r, all_type):
#print "writeDir_r:(%s)"%(det_dir)
#gen.log "writeDir_r:(%s)"%(det_dir)
dirs = self.readDirItems(dire.locExtent, dire.lenData)
for d in dirs:
if not d.fIdentifier in [".", ".."]:
@ -490,7 +491,7 @@ class ISO9660:
match = False
else:
match = True
#print "mathing %s, %s, (%x)"%(match, d.fIdentifier, d.fFlag)
#gen.log "mathing %s, %s, (%x)"%(match, d.fIdentifier, d.fFlag)
p = det_dir + "/" + d.fIdentifier
if d.fFlag & 0x02 == 0x02:
if not os.path.exists(p):
@ -514,7 +515,7 @@ class ISO9660:
sys.stderr.write("can't write file\n")
return E_FAILURE
#print "write file (%s)"%(detFile)
#gen.log "write file (%s)"%(detFile)
config.status_text = detFile
dirname = os.path.dirname(detFile)
@ -550,7 +551,7 @@ class ISO9660:
loc = dirRec.locExtent
length = dirRec.lenData
self.isoFile.seek(BLOCK_SIZE * loc)
#print "file length(%d)"%(length)
#gen.log "file length(%d)"%(length)
r_size = BLOCK_SIZE*1024*50 #100M cache
try:
@ -580,7 +581,7 @@ class ISO9660:
d = self.searchDir(dir_path)
if d != None:
if (d.fFlag & 0x02) == 0x02:
#print "readDir (%x, %x)"%(d.locExtent, d.lenData)
#gen.log "readDir (%x, %x)"%(d.locExtent, d.lenData)
if dir_path.endswith("/"):
dir_path = dir_path[0:-1]
self.readDir_r(file_list, dir_path, d, r)
@ -614,26 +615,26 @@ class ISO9660:
# find last file item to check
for dr in reversed(path_table):
#print dr.fIdentifier
#gen.log dr.fIdentifier
dirs = self.readDirItems(dr.locExtent, BLOCK_SIZE)
if len(dirs) > 2:
dot = dirs[0]
dirs2 = self.readDirItems(dot.locExtent, dot.lenData) # get the whole items.
for dr2 in reversed(dirs2): # search last file item.
if dr2.fFlag == 0:
#print "get last file(%s)"%(dr2.fIdentifier)
#gen.log "get last file(%s)"%(dr2.fIdentifier)
try:
#self.isoFile.seek(BLOCK_SIZE * dr2.locExtent+dr2.lenData)
lastfile_end = BLOCK_SIZE * dr2.locExtent + dr2.lenData
self.isoFile.seek(0, os.SEEK_END)
iso_end = self.isoFile.tell()
#print ("%d-->%d")%(lastfile_end, iso_end)
#gen.log ("%d-->%d")%(lastfile_end, iso_end)
if iso_end >= lastfile_end:
return True
else:
return False
except(IOError):
#print "exception when seek. iso is broken"
#gen.log "exception when seek. iso is broken"
return False
elif len(dirs) < 2: # Dir record is broken. At least, should have two entries.
return False
@ -643,11 +644,11 @@ class ISO9660:
def dump_dir_record(dirs):
""" Dump all the file dirctory records contained in desc_buf """
print("Dump file/deirectory record")
print("===========================", end="\n")
gen.log("Dump file/deirectory record")
gen.log("===========================", end="\n")
if dirs != None:
for f in dirs:
print("length of directory record:(0x%x), length of extend attribute:(%d), \
gen.log("length of directory record:(0x%x), length of extend attribute:(%d), \
location of record:(%d)BLOCK->(0x%x), data length(%d) size of file unit:(%d), \
interleave gap size:(%d), file flag:(0x%x),name length:(%d) identify:(%s)\n" \
%(f.lenDr, f.lenEattr, f.locExtent, f.locExtent*BLOCK_SIZE,f.lenData, \
@ -656,16 +657,16 @@ interleave gap size:(%d), file flag:(0x%x),name length:(%d) identify:(%s)\n" \
def dump_pathtable_L(path_table):
""" Dump path table of L typde """
print("Dump path table")
print("================", end="\n")
gen.log("Dump path table")
gen.log("================", end="\n")
#path_table = readPathtableL()
i = 0
for t in path_table:
i = i + 1
if t.lenDi == 1:
if t.fIdentifier in [0, 1]:
print("is a root directory(%d)" %(is_root))
print("%d->length of identify:(%d), length of extend attribute:(%d), \
gen.log("is a root directory(%d)" %(is_root))
gen.log("%d->length of identify:(%d), length of extend attribute:(%d), \
local:(%d)->(0x%x), parent dir number:(%d), identify:(%s)\n" \
%(i, t.lenDi, t.lenEattr, t.locExtent, t.locExtent*BLOCK_SIZE, t.pdirNr, t.fIdentifier))
@ -673,42 +674,42 @@ def dump_primary_volume(privol=None):
""" Dump primary volume descriptor """
if privol == None:
print("Can't dump, maybe iso is broken")
gen.log("Can't dump, maybe iso is broken")
return
print("===== Dump primary volume descriptor ==")
print("System Identifier:(%s)" %(privol.sysIdentifier.decode()))
print("Volume Identifier:(%s)" %privol.volIdentifier.decode())
print("Volume Space size:(0x%x)BLOCKS(2kB)" %privol.volSize)
print("Volume sequence number:(%d)" %(privol.volSeq))
print("logic block size:(0x%x)" %(privol.blockSize))
print("Volume path talbe L's BLOCK number is :(0x%x-->0x%x), size(%d)" %(privol.ptLRd, privol.ptLRd*BLOCK_SIZE, privol.ptSize))
# print "Abstract File Identifier: (%s)" %(volume_dsc[739:776])
# print "Bibliographic File Identifier: (%s)" %(volume_dsc[776:813])
print("pathtable locate (%d)" %(privol.ptLRd))
print("File Structure Version:(%d)" %(privol.fsVer))
print("Root directory is at (%d)block, have(0x%x)bytes" %(privol.rootLoc, privol.rootTotal))
gen.log("===== Dump primary volume descriptor ==")
gen.log("System Identifier:(%s)" %(privol.sysIdentifier.decode()))
gen.log("Volume Identifier:(%s)" %privol.volIdentifier.decode())
gen.log("Volume Space size:(0x%x)BLOCKS(2kB)" %privol.volSize)
gen.log("Volume sequence number:(%d)" %(privol.volSeq))
gen.log("logic block size:(0x%x)" %(privol.blockSize))
gen.log("Volume path talbe L's BLOCK number is :(0x%x-->0x%x), size(%d)" %(privol.ptLRd, privol.ptLRd*BLOCK_SIZE, privol.ptSize))
# gen.log "Abstract File Identifier: (%s)" %(volume_dsc[739:776])
# gen.log "Bibliographic File Identifier: (%s)" %(volume_dsc[776:813])
gen.log("pathtable locate (%d)" %(privol.ptLRd))
gen.log("File Structure Version:(%d)" %(privol.fsVer))
gen.log("Root directory is at (%d)block, have(0x%x)bytes" %(privol.rootLoc, privol.rootTotal))
# dump_dir_record(None, 23, 1)
def dump_boot_record(volume_dsc):
""" Dump boot record """
print("===== Dump boot record ==")
gen.log("===== Dump boot record ==")
std_identifier = volume_dsc[1:6]
print("Standard Identifier:(%s)" %std_identifier)
gen.log("Standard Identifier:(%s)" %std_identifier)
vol_ver = struct.unpack('B', volume_dsc[6])
print("Volume descriptor version:(%d)" %vol_ver)
gen.log("Volume descriptor version:(%d)" %vol_ver)
bootsys_identifier = volume_dsc[7:39]
print("boot system identifier(%s)" %bootsys_identifier)
gen.log("boot system identifier(%s)" %bootsys_identifier)
boot_identifier = volume_dsc[39:71]
print("boot identifier(%s)" %boot_identifier)
gen.log("boot identifier(%s)" %boot_identifier)
def usage():
""" Prompt user how to use """
print("""
gen.log("""
Usage: isodump dump-what [options] iso-file
[dump-what]
-----------
@ -749,7 +750,7 @@ if __name__ == '__main__':
iso9660fs = ISO9660(argv[-1])
integrity = iso9660fs.checkIntegrity()
if integrity == False:
print("iso file is broken")
gen.log("iso file is broken")
sys.exit(-1)
dump_what = argv[1]
@ -761,7 +762,7 @@ if __name__ == '__main__':
dump_pathtable_L(path_table)
if dump_what == "dir-record":
if len(argv) == 5:
print("dump dir-record (%s, %s)"%(argv[2], argv[3]))
gen.log("dump dir-record (%s, %s)"%(argv[2], argv[3]))
dirs = iso9660fs.readDirItems(int(argv[2]), int(argv[3]))
dump_dir_record(dirs)
else:
@ -792,14 +793,14 @@ if __name__ == '__main__':
isodir = dump_what[4:]
if o_path == "":
print("dump_dir(%s)"%(isodir))
gen.log("dump_dir(%s)"%(isodir))
filelist = iso9660fs.readDir(isodir, r)
if filelist == []:
print("can't read any file from (%s)"%(isodir))
gen.log("can't read any file from (%s)"%(isodir))
else:
for f in filelist:
print(f)
gen.log(f)
else:
print("writeDir(%s)->(%s) with pattern(%s)"%(isodir, o_path, pattern))
gen.log("writeDir(%s)->(%s) with pattern(%s)"%(isodir, o_path, pattern))
sys.exit(iso9660fs.writeDir(isodir, o_path, pattern, r, True))

@ -23,7 +23,7 @@ def read_input_uninstall():
try:
response = int(input("Please enter the number against the distro you need to uninstall: "))
except ValueError:
print('\nPlease provide valid integer from the above list.\n')
log('\nPlease provide valid integer from the above list.\n')
return response
@ -39,25 +39,25 @@ def cli_install_distro():
admin.elevate()
'''
print('Starting multibootusb from Command line...')
log('Starting multibootusb from Command line...')
if usb.is_block(config.usb_disk) is False:
print(config.usb_disk, 'is not a valid device partition...')
log(config.usb_disk, 'is not a valid device partition...')
exit(1)
elif integrity(config.iso_link) is not True:
print(config.iso_link, ' failed to pass integrity check...')
log(config.iso_link, ' failed to pass integrity check...')
exit(1)
elif size_not_enough(config.iso_link, config.usb_disk) is True:
print(config.usb_disk, 'does not have enough space...')
log(config.usb_disk, 'does not have enough space...')
else:
prepare_mbusb_host_dir()
extract_cfg_file(config.iso_link)
_distro = distro(iso_cfg_ext_dir(), config.iso_link)
print('Detected distro type is', _distro)
log('Detected distro type is', _distro)
if _distro is not None:
print('\nSelected ISO is :', quote(iso_name(config.iso_link)))
print('Selected target device is:', quote(config.usb_disk), '\n')
print('Please confirm the option.')
print('Y/y/Yes/yes/YES or N/n/No/no/NO')
log('\nSelected ISO is :', quote(iso_name(config.iso_link)))
log('Selected target device is:', quote(config.usb_disk), '\n')
log('Please confirm the option.')
log('Y/y/Yes/yes/YES or N/n/No/no/NO')
if read_input_yes() is True:
config.distro = _distro
copy_mbusb_dir_usb(config.usb_disk)
@ -66,7 +66,7 @@ def cli_install_distro():
syslinux_default(config.usb_disk)
update_distro_cfg_files(config.iso_link, config.usb_disk, _distro)
else:
print('Sorry', iso_name(config.iso_link), 'is not supported at the moment\n'
log('Sorry', iso_name(config.iso_link), 'is not supported at the moment\n'
'Please report tissue at https://github.com/mbusb/multibootusb/issues')
@ -74,7 +74,7 @@ def cli_uninstall_distro():
distro_list = install_distro_list()
if distro_list is not None:
for index, _distro_dir in enumerate(distro_list):
print(index, '--->>', _distro_dir)
log(index, '--->>', _distro_dir)
user_input = read_input_uninstall()
if user_input is not False:
for index, _distro_dir in enumerate(distro_list):
@ -82,4 +82,4 @@ def cli_uninstall_distro():
config.uninstall_distro_dir_name = _distro_dir
unin_distro()
else:
print('No distro installed on', config.usb_disk)
log('No distro installed on', config.usb_disk)

@ -121,7 +121,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
if bool(config.usb_disk):
self.update_gui_oncombobox(config.usb_disk)
else:
print("No USB disk found...")
log("No USB disk found...")
def onRefereshClick(self):
"""
@ -162,7 +162,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
self.ui.listWidget.addItem(name)
else:
if config.usb_mount == 'No_Mount':
print("UBS disk is not mounted and can't update list widget...")
log("UBS disk is not mounted and can't update list widget...")
#QtWidgets.QMessageBox.information(self, 'No Install...',
# 'syslinux.cfg does not exist for updating list widget.')
@ -187,13 +187,13 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
self.ui.slider_persistence.setTickInterval(10)
self.ui.slider_persistence.setSingleStep(10)
ui_per_max_size = per_max_size / 1024 / 1024
config.persistence = per_max_size
# config.persistence = per_max_size
self.ui.slider_persistence.setMaximum(ui_per_max_size)
print('Persistence Max Size: ', bytes2human(per_max_size))
log('Persistence Max Size: ' + str(bytes2human(per_max_size)))
else:
print('Persistence is not available for', iso_name(config.iso_link))
log('Persistence is not available for ' + iso_name(config.iso_link))
else:
print("File not selected...")
log("File not selected...")
def update_slider_text(self):
slide_value = self.ui.slider_persistence.value() * 1024 * 1024
@ -225,14 +225,14 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
if platform.system() == "Linux" or platform.system() == "Windows":
if self.ui.install_sys_all.isChecked() or self.ui.install_sys_only.isChecked():
print("Installing default syslinux on ", config.usb_disk)
log("Installing default syslinux on ", config.usb_disk)
ret = syslinux_default(config.usb_disk)
if ret is True:
if self.ui.install_sys_all.isChecked():
print("Copying multibootusb directory to " + config.usb_mount)
log("Copying multibootusb directory to " + config.usb_mount)
for dirpath, dirnames, filenames in os.walk(resource_path(os.path.join("tools", "multibootusb"))):
for f in filenames:
print("Copying " + f)
log("Copying " + f)
shutil.copy(resource_path(os.path.join(dirpath, f)), os.path.join(self.usb.get_usb(config.usb_disk).mount, "multibootusb"))
QtWidgets.QMessageBox.information(self, 'Install Success...',
'Syslinux installed successfully on ' + config.usb_disk)
@ -251,23 +251,23 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
# Function to edit syslinux.cfg file on editors like gedit, notepad etc.
# Suggest me more editor which can be included in to this function.
sys_cfg_file = os.path.join(config.usb_mount, "multibootusb", "syslinux.cfg")
print("Locating " + sys_cfg_file)
log("Locating " + sys_cfg_file)
editor = ''
if not os.path.exists(sys_cfg_file):
print("syslinux.cfg file not found...")
log("syslinux.cfg file not found...")
QtWidgets.QMessageBox.information(self, 'File not found...', 'Sorry. Unable to locate syslinux.cfg file.\n'
'You can only edit syslinux.cfg file generated by multibootusb.')
else:
if platform.system() == "Linux":
for e in config.editors_linux:
if subprocess.call('which ' + e, shell=True) == 0:
print("Editor found is " + e)
log("Editor found is " + e)
editor = e
break
elif platform.system() == "Windows":
for e in config.editors_win:
if not shutil.which(e) is None:
print("Editor found is " + e)
log("Editor found is " + e)
editor = e
break
if not editor:
@ -288,7 +288,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
:return:
"""
if self.ui.listWidget.currentItem() is None:
print("Please select a distro from the list.")
log("Please select a distro from the list.")
QtWidgets.QMessageBox.information(self, 'No selection.', 'Please select a distro from the list.')
else:
config.uninstall_distro_dir_name = str(self.ui.listWidget.currentItem().text()).strip()
@ -299,7 +299,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
if reply == QtWidgets.QMessageBox.Yes:
if not os.path.exists(os.path.join(config.usb_mount, 'multibootusb', config.uninstall_distro_dir_name)):
print("Distro install directory not found. Just updating syslinux.cfg file.")
log("Distro install directory not found. Just updating syslinux.cfg file.")
update_sys_cfg_file()
#self.uninstall.update_sys_cfg_file()
else:
@ -327,25 +327,42 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
:return:
"""
if not config.usb_disk:
log("No USB device found.\n\nInsert USB and use Refresh USB button to detect USB.")
QtWidgets.QMessageBox.information(self, "No Device...",
"No USB device found.\n\nInsert USB and use Refresh USB button to detect USB.")
elif not config.iso_link:
log("No ISO found.\n\nPlease use step 2 to choose an ISO.")
QtWidgets.QMessageBox.information(self, "No ISO...", "No ISO found.\n\nPlease use step 2 to choose an ISO.")
elif usb.details(config.usb_disk)['mount_point'] == 'No_Mount':
log("USB disk is not mounted.\nPlease mount USB disk and press refresh USB button.")
QtWidgets.QMessageBox.information(self, "No Mount...", "USB disk is not mounted.\n"
"Please mount USB disk and press refresh USB button.")
else:
# clean_iso_cfg_ext_dir(os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")) # Need to be cleaned.
# extract_cfg_file(config.iso_link) # Extract files from ISO
# config.distro = distro(iso_cfg_ext_dir(), config.iso_link) # Detect supported distro
usb_details = usb.details(config.usb_disk)
log("USB Disk is " + config.usb_disk)
log("USB Label is " + config.usb_label)
log("USB UUID is " + config.usb_uuid)
log("USB Mount path is " + config.usb_mount)
log("Total size of the disk is " + str(usb.bytes2human(usb_details['size_total'])))
log("Total used size is " + str(usb.bytes2human(usb_details['size_used'])))
log("Total size left on the disk is " + str(usb.bytes2human(usb_details['size_free'])))
log("FileSystem is " + usb_details['file_system'])
log("Vendor is " + usb_details['vendor'])
log("Model is " + usb_details['model'])
log("Name of the ISO file is " + iso_name(config.iso_link))
if os.path.exists(config.iso_link):
self.ui.lineEdit.clear()
if config.distro:
print("Distro type detected is ", config.distro)
log("Distro type detected is " + config.distro)
copy_mbusb_dir_usb(config.usb_disk)
if not os.path.exists(os.path.join(config.usb_mount, "multibootusb", iso_basename(config.iso_link))):
config.persistence = self.ui.slider_persistence.value() * 1024 * 1024
install_size = iso_size(config.iso_link) + config.persistence
# print("Persistence choosen is " + str(persistence_size) + " MB")
log("Persistence choosen is " + str(config.persistence) + " MB")
if install_size >= disk_usage(config.usb_mount).free:
QtWidgets.QMessageBox.information(self, "No Space.", "No space available on " +
config.usb_disk)
@ -368,7 +385,7 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
else:
QtWidgets.QMessageBox.information(self, 'No support...',
'Sorry.\n' + os.path.basename(config.iso_link) +
' is not supported at the moment\n'
' is not supported at the moment.\n'
'Please email this issue to feedback.multibootusb@gmail.com')
# Added to refresh usb disk remaining size after distro installation
@ -456,11 +473,11 @@ class AppGui(qemu.Qemu, Imager, QtWidgets.QDialog, Ui_Dialog):
"Do you really want to quit multibootusb?", QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
print("Closing multibootusb...")
log("Closing multibootusb...")
event.accept()
sys.exit(0)
else:
print("Close event cancelled.")
log("Close event cancelled.")
event.ignore()
@ -501,7 +518,7 @@ class GuiInstallProgress(QtCore.QThread):
config.status_text = ""
self.finished.emit()
print("Distro extraction completed...")
log("Distro extraction completed...")
return
@ -537,7 +554,7 @@ class GuiUninstallProgress(QtCore.QThread):
config.status_text = ""
self.finished.emit()
print("Distro uninstall is complete...")
log("Distro uninstall is complete...")
return

@ -1,4 +1,4 @@
#!/usr/bin/python2.7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name: persistence.py
# Purpose: Module to deal with persistence of a selected distro.
@ -38,15 +38,15 @@ def persistence_distro(distro, usb_disk, iso_link):
else:
_max_size = usb_free_size
if distro == "ubuntu":
print("Persistence option is available.")
gen.log("Persistence option is available.")
return "ubuntu", _max_size
# FIXME to get debian persistence workable...
# Able to add successfully but unable to keep persistence data.
elif distro == "debian" or distro == "debian-install":
print("Persistence option is available.")
gen.log("Persistence option is available.")
return "debian", _max_size
elif distro == "fedora":
print("Persistence option is available.")
gen.log("Persistence option is available.")
return "fedora", _max_size
else:
return None, None
@ -84,17 +84,18 @@ def create_persistence():
iso.iso_basename(config.iso_link), fs_name) +\
' bs=1M count=' + str(int(persistence))
print('Executing ==>', persistence_dd_cmd)
gen.log('Executing ==>' + persistence_dd_cmd)
config.status_text = 'Creating persistence file...'
if subprocess.call(persistence_dd_cmd, shell=True) == 0:
print("\nSuccessfully created persistence file...\n")
gen.log("\nSuccessfully created persistence file...\n")
if not config.distro == 'fedora':
print('Executing ==>', persistence_mkfs_cmd)
gen.log('Applying filesystem to persistence file...')
gen.log('Executing ==> ' + persistence_mkfs_cmd)
config.status_text = 'Applying filesystem to persistence file...'
if subprocess.call(persistence_mkfs_cmd, shell=True) == 0:
print("\nSuccessfully applied filesystem...\n")
gen.log("\nSuccessfully applied filesystem...\n")
def extract_file(file_path, install_dir):

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name: qemu.py
# Purpose: Module to boot ISO and USB disks using QEMU.
@ -34,14 +34,14 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
qemu_iso_link = QtWidgets.QFileDialog.getOpenFileName(self, 'Select an iso...', "", "ISO Files (*.iso)")[0]
else:
print("QEMU does not exist.\nPlease install qemu package to avail this feature.")
log("QEMU does not exist.\nPlease install qemu package to avail this feature.")
QtWidgets.QMessageBox.information(self, 'No QEMU...', 'Please install qemu package to avail this feature.')
qemu_iso_link = None
if not qemu_iso_link is None:
self.ui.lineEdit_2.insert(qemu_iso_link)
else:
print ("File not selected.")
log ("File not selected.")
def on_Qemu_Boot_iso_Click(self):
"""
@ -54,7 +54,7 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
qemu = self.check_qemu_exist()
qemu_iso_link = str(self.ui.lineEdit_2.text())
if qemu is None:
print("QEMU does not exist.\nPlease install qemu package to avail this feature.")
log("QEMU does not exist.\nPlease install qemu package to avail this feature.")
QtWidgets.QMessageBox.information(self, 'No QEMU...', 'Please install qemu to avail this feature.')
else:
ram = self.qemu_iso_ram()
@ -62,14 +62,14 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
self.ui.lineEdit_2.clear()
if platform.system() == "Windows":
try:
print("Executing ==> " + qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram)
log("Executing ==> " + qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram)
subprocess.Popen(qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram, shell=True)
except:
QtWidgets.QMessageBox.information(self, 'Error...', 'Unable to start QEMU.')
else:
print(qemu + ' -m ' + ram + ' -cdrom ' + str(qemu_iso_link) + ' -boot d')
log(qemu + ' -m ' + ram + ' -cdrom ' + str(qemu_iso_link) + ' -boot d')
try:
print("Executing ==> " + qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram)
log("Executing ==> " + qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram)
subprocess.Popen(qemu + " -cdrom " + str(qemu_iso_link) + " -boot d -m " + ram, shell=True)
except:
QtWidgets.QMessageBox.information(self, 'Error...', 'Error booting ISO\n'
@ -87,7 +87,7 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
qemu = self.check_qemu_exist()
if qemu is None:
print("QEMU does not exist.\nPlease install qemu package to avail this feature.")
log("QEMU does not exist.\nPlease install qemu package to avail this feature.")
QtWidgets.QMessageBox.information(self, 'No QEMU...', 'Please install qemu to avail this feature.')
else:
ram = self.qemu_usb_ram()
@ -99,7 +99,7 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
parent_dir = os.getcwd()
os.chdir(resource_path(os.path.join("data", "tools", "qemu")))
try:
print("Executing ==> " + qemu + " -L . -boot c -m " + ram + " -hda //./PhysicalDrive" + disk_number)
log("Executing ==> " + qemu + " -L . -boot c -m " + ram + " -hda //./PhysicalDrive" + disk_number)
subprocess.Popen("qemu-system-x86_64.exe -L . -boot c -m " + ram + " -hda //./PhysicalDrive" + disk_number, shell=True)
except:
QtWidgets.QMessageBox.information(self, 'Error...', 'Error booting USB\n'
@ -108,7 +108,7 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
elif platform.system() == "Linux":
try:
qemu_cmd = qemu + ' -hda ' + usb_disk[:-1] + ' -m ' + ram + ' -vga std'
print('Executing ==>', qemu_cmd)
log('Executing ==> ' + qemu_cmd)
# adminCmd([qemu, '-hda', usb_disk[:-1], '-m', ram, '-vga std'], gui=True)
subprocess.Popen(qemu_cmd, shell=True)
# adminCmd(qemu_cmd, gui=True)
@ -158,10 +158,10 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
"""
if platform.system() == "Linux":
if subprocess.call('which qemu-system-x86_64', shell=True) == 0:
print("qemu-system-x86_64 exists...")
log("qemu-system-x86_64 exists...")
qemu = "qemu-system-x86_64"
elif subprocess.call('which qemu', shell=True) == 0:
print("qemu exists")
log("qemu exists")
qemu = "qemu"
else:
qemu = None
@ -171,7 +171,7 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
else:
return None
elif platform.system() == "Windows":
print(resource_path(os.path.join("data", "tools", "qemu", "qemu-system-x86_64.exe")))
log(resource_path(os.path.join("data", "tools", "qemu", "qemu-system-x86_64.exe")))
return resource_path(os.path.join("data", "tools", "qemu", "qemu-system-x86_64.exe"))
@ -188,9 +188,9 @@ class Qemu(QtWidgets.QDialog, Ui_Dialog):
for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"):
if logical_disk.Caption == usb_disk:
"""
print physical_disk.Caption
print partition.Caption
print logical_disk.Caption
log physical_disk.Caption
log partition.Caption
log logical_disk.Caption
"""
print("Physical Device Number is " + partition.Caption[6:-14])
log("Physical Device Number is " + partition.Caption[6:-14])
return str(partition.Caption[6:-14])

@ -24,18 +24,18 @@ mbr_bin = resource_path(os.path.join("data", "tools", "mbr.bin"))
def set_boot_flag(usb_disk):
if platform.system() == "Linux":
print("\nChecking boot flag on " + usb_disk[:-1], '\n')
log ("\nChecking boot flag on " + usb_disk[:-1], '\n')
cmd_out = subprocess.check_output("parted -m -s " + usb_disk[:-1] + " print", shell=True)
if b'boot' in cmd_out:
print("\nDisk " + usb_disk[:-1] + " already has boot flag.\n")
log ("\nDisk " + usb_disk[:-1] + " already has boot flag.\n")
return True
else:
print("\nExecuting ==> parted " + usb_disk[:-1] + " set 1 boot on", '\n')
log ("\nExecuting ==> parted " + usb_disk[:-1] + " set 1 boot on", '\n')
if subprocess.call("parted " + usb_disk[:-1] + " set 1 boot on", shell=True) == 0:
print("\nBoot flag set to bootable " + usb_disk[:-1], '\n')
log ("\nBoot flag set to bootable " + usb_disk[:-1], '\n')
return True
else:
print("\nUnable to set boot flag on " + usb_disk[:-1], '\n')
log ("\nUnable to set boot flag on " + usb_disk[:-1], '\n')
return False
@ -50,17 +50,17 @@ def syslinux_default(usb_disk, version=4):
usb_fs = usb_details['file_system']
usb_mount = usb_details['mount_point']
mbr_install_cmd = 'dd bs=440 count=1 conv=notrunc if=' + mbr_bin + ' of=' + usb_disk[:-1]
# print(usb_fs)
# log (usb_fs)
if usb_fs in extlinux_fs:
extlinu_cmd = extlinux_path + ' --install ' + os.path.join(usb_mount, 'multibootusb')
if os.access(extlinux_path, os.X_OK) is False:
subprocess.call('chmod +x ' + extlinux_path, shell=True)
print("\nExecuting ==> " + extlinu_cmd)
log ("\nExecuting ==> " + extlinu_cmd)
if subprocess.call(extlinu_cmd, shell=True) == 0:
print("\nDefault Extlinux install is success...\n")
print('\nExecuting ==> ' + mbr_install_cmd)
log ("\nDefault Extlinux install is success...\n")
log ('\nExecuting ==> ' + mbr_install_cmd)
if subprocess.call(mbr_install_cmd, shell=True) == 0:
print("\nmbr install is success...\n")
log ("\nmbr install is success...\n")
if set_boot_flag(usb_disk) is True:
return True
@ -70,25 +70,25 @@ def syslinux_default(usb_disk, version=4):
syslinux_cmd = syslinux_path + ' -i -d multibootusb ' + usb_disk
if os.access(syslinux_path, os.X_OK) is False:
subprocess.call('chmod +x ' + syslinux_path, shell=True)
print("\nExecuting ==> " + syslinux_cmd + "\n")
log ("\nExecuting ==> " + syslinux_cmd + "\n")
if subprocess.call(syslinux_cmd, shell=True) == 0:
print("\nDefault syslinux install is success...\n")
log ("\nDefault syslinux install is success...\n")
if subprocess.call(mbr_install_cmd, shell=True) == 0:
print("\nmbr install is success...\n")
log ("\nmbr install is success...\n")
if set_boot_flag(usb_disk) is True:
return True
else:
print("\nFailed to install default syslinux...\n")
log ("\nFailed to install default syslinux...\n")
return False
elif platform.system() == "Windows":
syslinux = resource_path(os.path.join(multibootusb_host_dir(), "syslinux", "bin", "syslinux4.exe"))
print('Executing ==>', syslinux + ' -maf -d multibootusb ' + usb_disk)
log ('Executing ==>' + syslinux + ' -maf -d multibootusb ' + usb_disk)
if subprocess.call(syslinux + ' -maf -d multibootusb ' + usb_disk, shell=True) == 0:
print("\nDefault syslinux install is success...\n")
log ("\nDefault syslinux install is success...\n")
return True
else:
print("\nFailed to install default syslinux...\n")
log ("\nFailed to install default syslinux...\n")
return False
@ -104,7 +104,7 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
usb_mount = usb_details['mount_point']
isolinux_bin_dir(iso_link)
if isolinux_bin_exist(iso_link) is False:
print('Distro does not use isolinux for booting ISO.')
log ('Distro does not use isolinux for booting ISO.')
else:
# iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
_iso_cfg_ext_dir = iso_cfg_ext_dir()
@ -120,8 +120,8 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
distro_syslinux_install_dir = os.path.join(install_dir, iso_linux_bin_dir.strip("/")).replace(usb_mount, "")
distro_sys_install_bs = os.path.join(install_dir, iso_linux_bin_dir.strip("/"), distro + '.bs')
print(distro_sys_install_bs)
#print(distro_syslinux_install_dir)
log (distro_sys_install_bs)
#log (distro_syslinux_install_dir)
if usb_fs in syslinux_fs:
if config.syslinux_version == str(3):
@ -141,16 +141,16 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
subprocess.call('chmod +x ' + syslinux_path, shell=True) == 0
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'
print("Executing ==> ", sys_cmd)
log ("Executing ==> " + sys_cmd)
if subprocess.call(sys_cmd, shell=True) == 0:
print("\nSyslinux install on distro directory is success...\n")
print('Executing ==> ', dd_cmd, '\n')
log ("\nSyslinux install on distro directory is success...\n")
log ('Executing ==> ' + dd_cmd + '\n')
if subprocess.call(dd_cmd, shell=True) == 0:
print("\nBootsector copy is success...\n")
log ("\nBootsector copy is success...\n")
else:
print("\nFailed to copy boot sector...\n")
log ("\nFailed to copy boot sector...\n")
else:
print("\nFailed to install syslinux on distro directory...\n")
log ("\nFailed to install syslinux on distro directory...\n")
elif platform.system() == "Windows":
syslinux_path = resource_path(os.path.join(multibootusb_host_dir(), "syslinux", "bin")) + \
"\syslinux" + config.syslinux_version + ".exe"
@ -158,11 +158,11 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
distro_sys_install_bs = distro_sys_install_bs.replace("/", "\\")
sys_cmd = syslinux_path + option + distro_syslinux_install_dir + ' ' + usb_disk + ' ' + \
distro_sys_install_bs
print("\nExecuting ==> ", sys_cmd, '\n')
log ("\nExecuting ==> " + sys_cmd, '\n')
if subprocess.call(sys_cmd, shell=True) == 0:
print("\nSyslinux install was successful on distro directory...\n")
log ("\nSyslinux install was successful on distro directory...\n")
else:
print("\nFailed to install syslinux on distro directory...\n")
log ("\nFailed to install syslinux on distro directory...\n")
elif usb_fs in extlinux_fs:
if platform.system() == "Linux":
distro_syslinux_install_dir = os.path.join(install_dir, iso_linux_bin_dir.strip("/"))
@ -171,18 +171,18 @@ def syslinux_distro_dir(usb_disk, iso_link, distro):
dd_cmd = 'dd if=' + usb_disk + ' ' + 'of=' + usb_mount + quote(distro_sys_install_bs) + ' count=1'
if os.access(syslinux_path, os.X_OK) is False:
subprocess.call('chmod +x ' + syslinux_path, shell=True) == 0
print("Executing ==> ", ext_cmd)
log ("Executing ==> " + ext_cmd)
if subprocess.call(ext_cmd, shell=True) == 0:
print("\nSyslinux install on distro directory is success...\n")
print('Executing ==> ', dd_cmd, '\n')
log ("\nSyslinux install on distro directory is success...\n")
log ('Executing ==> ' + dd_cmd, '\n')
if subprocess.call(dd_cmd, shell=True) == 0:
print("\nBootsector copy is success...\n")
log ("\nBootsector copy is success...\n")
else:
print("\nFailed to install syslinux on distro directory...\n")
log ("\nFailed to install syslinux on distro directory...\n")
if __name__ == '__main__':
if os.geteuid() != 0:
print('Please running this script with sudo/root/admin privilage.')
log ('Please running this script with sudo/root/admin privilage.')
exit(1)
else:
syslinux_distro_dir('/dev/sdb1', '../../../DISTROS/2016/debian-live-8.3.0-amd64-lxde-desktop.iso', 'debian')

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name: uninstall_distro.py
# Purpose: Module to uninstall distros installed by multibootusb
@ -13,6 +13,7 @@ import threading
import platform
from .usb import *
from . import config
from . import gen
def install_distro_list():
@ -38,7 +39,7 @@ def unin_distro():
usb_details = details(config.usb_disk)
usb_mount = usb_details['mount_point']
config.uninstall_distro_dir_name = config.uninstall_distro_dir_name.replace('\n', '')
print(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "multibootusb.cfg"))
gen.log(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "multibootusb.cfg"))
if os.path.exists(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "multibootusb.cfg")):
with open(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "multibootusb.cfg"), "r") as multibootusb_cfg:
config.distro = multibootusb_cfg.read().replace('\n', '')
@ -69,7 +70,7 @@ def delete_frm_file_list():
os.unlink(os.path.join(usb_mount, "ldlinux.sys"))
if os.path.exists(os.path.join(usb_mount, f)):
print("Removing " + (os.path.join(usb_mount, f)))
gen.log("Removing " + (os.path.join(usb_mount, f)))
if os.path.isfile(os.path.join(usb_mount, f)):
os.remove(os.path.join(usb_mount, f))
elif os.path.isdir(os.path.join(usb_mount, f)):
@ -83,8 +84,8 @@ def delete_frm_file_list():
if os.path.exists(os.path.join(usb_mount, generic.strip("/"))):
os.remove(os.path.join(usb_mount, generic.strip("/")))
if platform.system() == 'Linux':
print('Removed files from', config.uninstall_distro_dir_name)
print('Syncing....')
gen.log('Removed files from' + config.uninstall_distro_dir_name)
gen.log('Syncing....')
os.system('sync')
@ -107,7 +108,7 @@ def uninstall_distro():
if os.path.exists(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "iso_file_list.cfg")):
with open(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name, "iso_file_list.cfg"), "r") as f:
config.iso_file_list = f.readlines()
# print iso_file_list
# gen.log iso_file_list
for path, subdirs, files in os.walk(os.path.join(usb_mount, "multibootusb", config.uninstall_distro_dir_name)):
for name in files:
@ -149,9 +150,9 @@ def update_sys_cfg_file():
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.")
gen.log("syslinux.cfg file not found for updating changes.")
else:
print("Updating syslinux.cfg file...")
gen.log("Updating syslinux.cfg file...")
string = open(sys_cfg_file).read()
string = re.sub(r'#start ' + config.uninstall_distro_dir_name + '.*?' + '#end ' + config.uninstall_distro_dir_name + '\s*', '', string, flags=re.DOTALL)
config_file = open(sys_cfg_file, "w")
@ -176,7 +177,7 @@ def uninstall_progress():
config.distro = multibootusb_cfg.read().replace('\n', '')
else:
config.distro = ""
print("Installed distro type is", config.distro)
gen.log("Installed distro type is " + config.distro)
if config.distro == "opensuse":
if os.path.exists(os.path.join(usb_mount, config.uninstall_distro_dir_name) + ".iso"):

@ -30,7 +30,7 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
isolinux_path = os.path.join(iso_cfg_ext_dir, isolinux_bin_path(iso_link)[1:])
config.status_text = "Updating config files..."
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
print('Updating distro specific config files...')
log('Updating distro specific config files...')
for dirpath, dirnames, filenames in os.walk(install_dir):
for f in filenames:
if f.endswith(".cfg") or f.endswith('.CFG') or f.endswith('.lst'):
@ -38,7 +38,7 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
try:
string = open(cfg_file, errors='ignore').read()
except IOError:
print("Unable to read ", cfg_file)
log("Unable to read ", cfg_file)
else:
if not distro == "generic":
replace_text = r'\1/multibootusb/' + iso_basename(iso_link) + '/'
@ -111,7 +111,7 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
string = re.sub(r'initrd=',
r'from=/multibootusb/' + iso_basename(iso_link) + '/slax fromusb initrd=', string)
elif distro == "knoppix":
string = re.sub(r'initrd=', 'knoppix_dir=/multibootusb/' + iso_basename(iso_link) + '/KNOPPIX initrd=', string)
string = re.sub(r'initrd=', 'knoppix_dir=/multibootusb/' + iso_basename(iso_link) + '/KNOPPIX initrd=', string)
#string = re.sub(r'(append)',
# r'\1 knoppix_dir=/multibootusb/' + iso_basename(iso_link) + '/KNOPPIX',
# string)
@ -165,9 +165,16 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
string = re.sub(r'prompt', '#prompt', string)
string = re.sub(r'ui gfxboot.com', '#ui gfxboot.com', string)
string = re.sub(r'timeout', '#timeout', string)
elif distro == "porteus" or distro == "wifislax":
string = re.sub(r'initrd=',
'from=' + '/multibootusb/' + iso_basename(iso_link) + ' initrd=', string)
elif distro == "wifislax":
string = re.sub(r'vmlinuz',
'vmlinuz from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
string = re.sub(r'vmlinuz2',
'vmlinuz2 from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
elif distro == "porteus":
string = re.sub(r'APPEND',
'APPEND from=/multibootusb/' + iso_basename(iso_link) + ' noauto', string)
string = re.sub(r'vmlinuz2',
'vmlinuz2 from=multibootusb/' + iso_basename(iso_link) + ' noauto', string)
elif distro == "hbcd":
if not 'multibootusb' in string:
string = re.sub(r'/HBCD', '/multibootusb/' + iso_basename(iso_link) + '/HBCD', string)
@ -188,6 +195,9 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
#string = re.sub(r'initrd', 'from=/multibootusb/' + iso_basename(iso_link) + '/' + ' initrd', string)
elif distro == 'alt-linux':
string = re.sub(r':cdrom', ':disk', string)
elif distro == 'fsecure':
string = re.sub(r'APPEND ramdisk_size', 'APPEND noprompt ' + 'knoppix_dir=/multibootusb/' + iso_basename(iso_link)
+ '/KNOPPIX ramdisk_size', string)
config_file = open(cfg_file, "w")
config_file.write(string)
@ -201,7 +211,7 @@ def update_mbusb_cfg_file(iso_link, usb_uuid, usb_mount, distro):
Update main multibootusb suslinux.cfg file after distro is installed.
:return:
"""
print('Updating multibootusb config file...')
log('Updating multibootusb config file...')
sys_cfg_file = os.path.join(usb_mount, "multibootusb", "syslinux.cfg")
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
if os.path.exists(sys_cfg_file):
@ -299,16 +309,8 @@ def update_mbusb_cfg_file(iso_link, usb_uuid, usb_mount, distro):
for dirpath, dirnames, filenames in os.walk(install_dir):
for f in filenames:
if f.endswith("isolinux.cfg") or f.endswith("ISOLINUX.CFG"):
shutil.copy2(os.path.join(dirpath, f), os.path.join(dirpath, "syslinux.cfg"))
'''
else:
if distro == "ubuntu" and config.sys_version == "6":
config_file.write("CONFIG " + "/multibootusb/" + iso_basename(iso_link) +
"/isolinux/isolinux.cfg" + "\n")
config_file.write("APPEND " + "/multibootusb/" + iso_basename(iso_link) +
"/isolinux" + "\n")
'''
if not os.path.exists(os.path.join(dirpath, "syslinux.cfg")) or not os.path.exists(os.path.join(dirpath, "SYSLINUX.CFG")):
shutil.copy2(os.path.join(dirpath, f), os.path.join(dirpath, "syslinux.cfg"))
def kaspersky_config(distro):

@ -12,6 +12,8 @@ import os
import shutil
import collections
import ctypes
import subprocess
from . import gen
if platform.system() == 'Windows':
import psutil
import win32com.client
@ -37,8 +39,8 @@ def is_block(usb_disk):
return True
try:
mode = os.stat(usb_disk).st_mode
print(mode)
print(stat.S_ISBLK(mode))
gen.log(mode)
gen.log(stat.S_ISBLK(mode))
except:
return False
@ -93,7 +95,7 @@ def list(partition=1, fixed=None):
try:
# pyudev is good enough to detect USB devices on modern Linux machines.
print("Using pyudev for detecting USB drives...")
gen.log("Using pyudev for detecting USB drives...")
context = pyudev.Context()
if fixed is None:
for device in context.list_devices(subsystem='block', DEVTYPE='partition',
@ -101,7 +103,7 @@ def list(partition=1, fixed=None):
ID_BUS="usb"):
# if device['ID_BUS'] == "usb" and device['DEVTYPE'] == "partition":
if device['ID_BUS'] in ("usb", "scsi") and device['DEVTYPE'] == "partition":
# print(device['DEVNAME'])
# gen.log(device['DEVNAME'])
devices.append(str(device['DEVNAME']))
else:
for device in context.list_devices(subsystem='block', DEVTYPE='partition'):
@ -111,7 +113,7 @@ def list(partition=1, fixed=None):
try:
# You should come here only if your system does'nt have udev installed.
# We will use udiskd2 for now.
print("Falling back to Udisks2..")
gen.log("Falling back to Udisks2..")
ud_manager_obj = bus.get_object(
'org.freedesktop.UDisks2', '/org/freedesktop/UDisks2')
ud_manager = dbus.Interface(
@ -128,7 +130,7 @@ def list(partition=1, fixed=None):
try:
# You must be using really old distro. Otherwise, the code
# should not reach here.
print("Falling back to Udisks1...")
gen.log("Falling back to Udisks1...")
ud_manager_obj = bus.get_object(
"org.freedesktop.UDisks", "/org/freedesktop/UDisks")
ud_manager = dbus.Interface(
@ -146,7 +148,7 @@ def list(partition=1, fixed=None):
'org.freedesktop.UDisks.Device', "DeviceFile")
devices.append(device_file)
except:
print("No USB device found...")
gen.log("No USB device found...")
elif platform.system() == "Windows":
if fixed is not None:
@ -175,7 +177,7 @@ def list(partition=1, fixed=None):
if devices:
return devices
else:
print("No USB device found...")
gen.log("No USB device found...")
return None
@ -190,13 +192,20 @@ def details_udev(usb_disk_part):
This is the easiest and reliable method to find USB details.
Also, it is a standalone package and no dependencies are required.
"""
# print "Using PyUdev for detecting USB details..."
# gen.log "Using PyUdev for detecting USB details..."
context = pyudev.Context()
for device in context.list_devices(subsystem='block', DEVTYPE='partition',
ID_FS_USAGE="filesystem", ID_TYPE="disk",
ID_BUS="usb"):
# if device['ID_BUS'] == "usb" and device['DEVTYPE'] == "partition":
if device['ID_BUS'] in ("usb", "scsi") and device['DEVTYPE'] == "partition":
fdisk_cmd_out = subprocess.check_output('fdisk -l ' + usb_disk_part, shell=True)
if b'Extended' in fdisk_cmd_out:
mount_point = ''
uuid = 'No_UUID'
file_system = 'No_FS'
vendor = 'No_Vendor'
model = 'No_Model'
label = 'No_Label'
elif device['ID_BUS'] in ("usb", "scsi") and device['DEVTYPE'] == "partition":
if (device['DEVNAME']) == usb_disk_part:
uuid = str(device['ID_FS_UUID'])
file_system = str(device['ID_FS_TYPE'])
@ -399,4 +408,4 @@ if __name__ == '__main__':
usb_devices = list()
if usb_devices is not None:
for dev in usb_devices:
print(details(dev))
gen.log(details(dev))

Loading…
Cancel
Save