Merge pull request #359 from shinji-s/syslinux-bin

Recreate syslinux.bin upon distro installation.
pull/362/head
multibootusb 6 years ago committed by GitHub
commit f3623a2b06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

Binary file not shown.

@ -65,19 +65,19 @@ def resource_path(relativePath):
:param relativePath: Path to file/data.
:return: Modified path to file/data.
"""
try:
basePath = sys._MEIPASS # Try if we are running as standalone 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'):
#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__)))
for dir_ in [os.path.abspath('.'), os.path.abspath('..'), basePath]:
# This is not strictly needed because Windows recognize '/'
# as a path separator but we follow the discipline here.
relativePath = relativePath.replace('/', os.sep)
for dir_ in [
os.path.abspath('.'),
os.path.abspath('..'),
getattr(sys, '_MEIPASS', None),
os.path.dirname(os.path.dirname( # go up two levels
os.path.realpath(__file__))),
'/usr/share/multibootusb'.replace('/', os.sep),
]:
if dir_ is None:
continue
fullpath = os.path.join(dir_, relativePath)
if os.path.exists(fullpath):
return fullpath

@ -0,0 +1,53 @@
import os
import platform
import subprocess
from .gen import get_physical_disk_number, log, resource_path
class Base:
def run_dd(self, input, output, bs, count):
cmd = [self.dd_exe, 'if='+input, 'of='+output,
'bs=%d' % bs, 'count=%d'%count]
self.dd_add_args(cmd, input, output, bs, count)
if subprocess.call(cmd) != 0:
log('Failed to execute [%s]' % str(cmd))
else:
log("%s succeeded." % str(cmd))
class Windows(Base):
def __init__(self):
self.dd_exe = resource_path('data/tools/dd/dd.exe')
def dd_add_args(self, cmd_vec, input, output, bs, count):
pass
def physical_disk(self, usb_disk):
return r'\\.\physicaldrive%d' % get_physical_disk_number(usb_disk)
class Linux(Base):
def __init__(self):
self.dd_exe = 'dd'
def dd_add_args(self, cmd_vec, input, output, bs, count):
cmd_vec.append('conv=notrunc')
def physical_disk(self, usb_disk):
return usb_disk.rstrip('0123456789')
driverClass = {
'Windows' : Windows,
'Linux' : Linux,
}.get(platform.system(), None)
if driverClass is None:
raise Exception('Platform [%s] is not supported.' % platform.system())
osdriver = driverClass()
for func_name in [
'run_dd',
'physical_disk',
]:
globals()[func_name] = getattr(osdriver, func_name)

@ -13,6 +13,7 @@ from .gen import *
from . import usb
from .iso import *
from . import config
from . import osdriver
extlinux_path = os.path.join(multibootusb_host_dir(), "syslinux", "bin", "extlinux4")
syslinux_path = os.path.join(multibootusb_host_dir(), "syslinux", "bin", "syslinux4")
@ -117,6 +118,11 @@ def linux_install_default_bootsector(usb_disk, mbr_install_cmd):
return None
def create_syslinux_bs(usb_disk, usb_mount):
osdriver.run_dd(osdriver.physical_disk(usb_disk),
os.path.join(usb_mount, 'multibootusb', 'syslinux.bin'),
512, 1)
def syslinux_default(usb_disk):
"""
Install Syslinux of a selected drive
@ -132,14 +138,16 @@ def syslinux_default(usb_disk):
mbr_install_cmd = 'dd bs=440 count=1 conv=notrunc if=' + mbr_bin \
+ ' of=' + usb_disk[:-1]
else:
win_usb_disk_no = get_physical_disk_number(config.usb_disk)
win_usb_disk_no = get_physical_disk_number(usb_disk)
_windd = resource_path(os.path.join("data", "tools", "dd", "dd.exe"))
_input = "if=" + mbr_bin
_output = 'of=\\\.\\physicaldrive' + str(win_usb_disk_no)
mbr_install_cmd = _windd + ' ' + _input + ' ' + _output + ' count=1'
if usb_fs in extlinux_fs:
extlinu_cmd = extlinux_path + ' --install ' + os.path.join(usb_mount, 'multibootusb')
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)
log("\nExecuting ==> " + extlinu_cmd)
@ -153,12 +161,16 @@ def syslinux_default(usb_disk):
config.status_text = 'mbr install is successful...'
log("\nmbr install is success...\n")
if set_boot_flag(usb_disk) is True:
create_syslinux_bs(usb_disk, usb_mount)
return True
elif usb_fs in syslinux_fs:
if platform.system() == "Linux":
return linux_install_default_bootsector(usb_disk, mbr_install_cmd)
r = linux_install_default_bootsector(usb_disk, mbr_install_cmd)
if r:
create_syslinux_bs(usb_disk, usb_mount)
return r
elif platform.system() == "Windows":
syslinux = resource_path(os.path.join(multibootusb_host_dir(), "syslinux", "bin", "syslinux4.exe"))
config.status_text = 'Installing default syslinux version 4...'
@ -189,6 +201,7 @@ def syslinux_default(usb_disk):
else:
log('Disk uses GPT and mbr install is not required...')
'''
create_syslinux_bs(usb_disk, usb_mount)
return True
else:

Loading…
Cancel
Save