You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
7.8 KiB
Python
233 lines
7.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# Name: multibootusb
|
|
# Purpose: Main file which will determine if cli or gui is to be opened
|
|
# 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, version 2 or above.
|
|
import os
|
|
import getopt
|
|
import sys
|
|
import platform
|
|
import shutil
|
|
|
|
# The following line is required for distros based on rpm so as to avoid import errors when running from
|
|
# installed system
|
|
sys.path.append('/usr/local/lib/python3.4/dist-packages')
|
|
sys.path.append('/usr/local/lib/python3.5/dist-packages') # for version 8.9.0 onwards
|
|
|
|
# Ensure that above issue doesn't occur on debian based distro as well
|
|
if '/usr/lib/python3/dist-packages/scripts/' not in sys.path:
|
|
sys.path.append('/usr/lib/python3/dist-packages/scripts/')
|
|
|
|
# May users install multibootusb on python 2.7 and report as multibootusb issue
|
|
# We need to know which version are they using so the below lines are required.
|
|
# We need to do this here otherwise it failes on import error
|
|
python_version = sys.version
|
|
_platform = platform.platform()
|
|
print('Using python version ', python_version, 'on platform', _platform)
|
|
|
|
# Had trouble in importing scripts directory. Had to add few lines below to ensure it works on source as well as
|
|
# post install
|
|
try:
|
|
from scripts.mbusb_cli import *
|
|
from scripts import admin
|
|
from scripts import gen
|
|
from scripts import config
|
|
from scripts import osdriver
|
|
except ImportError:
|
|
try:
|
|
from .scripts.mbusb_cli import *
|
|
from .scripts import admin
|
|
from .scripts import gen
|
|
from .scripts import config
|
|
from .scripts import osdriver
|
|
except ImportError:
|
|
import scripts
|
|
|
|
gui = True
|
|
uninstall = False
|
|
|
|
|
|
def running_from():
|
|
"""
|
|
Print version and path location (installed or source code) info for debugging later.
|
|
"""
|
|
gen.log('Using python version ' + python_version + 'on platform ' + _platform, _print=False)
|
|
if os.path.exists('scripts'):
|
|
gen.log('Running multibootusb version ' + gen.mbusb_version() + ' from source...')
|
|
else:
|
|
gen.log('Running multibootusb version ' + gen.mbusb_version() + ' from installed system...')
|
|
|
|
|
|
def usage():
|
|
print('''
|
|
An advanced multiboot live usb creator which can be used from the command line
|
|
or via a GUI.
|
|
|
|
Usage: python3 multibootusb [option(s)]
|
|
|
|
Options:
|
|
-h or --help : Print this help message and exit
|
|
-c or --command : Invoke command line usage. This option is required;
|
|
if omitted, the GUI will be launched.
|
|
-i or --iso : Path to ISO file(s). If many ISOs are supplied,
|
|
they should be separated by ',' with no spaces in
|
|
between.
|
|
-t or --target : Path to target USB device partition (e.g. "/dev/sdb1").
|
|
-y or --yes : Default yes for user input during install.
|
|
Will not wait for user.
|
|
-u or --uninstall : List and uninstall distro from an USB disk.
|
|
-r or --raw : Write ISO image diretly to USB disk. Will destroy data.
|
|
-s or --syslinux : Install syslinux to target USB disk default directory.
|
|
-d or --debug : Enable debug messages (very verbose!)
|
|
|
|
Example for making a bootable USB from the command line:
|
|
|
|
Linux:
|
|
python3 multibootusb -c -i ../../favourite.iso -t /dev/sdb1
|
|
|
|
Windows:
|
|
python3 multibootusb -c -i ../../favourite.iso -t G:
|
|
|
|
Example for uninstalling a distro from a USB:
|
|
|
|
Linux:
|
|
python3 multibootusb -c -u -t /dev/sdb1
|
|
|
|
Windows:
|
|
python3 multibootusb -c -u -t G:
|
|
|
|
Example for installing multiple distros without user intervention:
|
|
|
|
Linux:
|
|
python3 multibootusb -c -y -i ../../favourite.iso,../../other-distro.iso -t /dev/sdb1
|
|
|
|
Windows:
|
|
python3 multibootusb -c -y -i ../../favourite.iso,../../other-distro.iso -t G:
|
|
|
|
Example for writing ISO image to target USB disk (will destroy data on USB disk):
|
|
|
|
Linux:
|
|
python3 multibootusb -c -r -i ../../favourite.iso -t /dev/sdb
|
|
|
|
Windows:
|
|
python3 multibootusb -c -r -i ../../favourite.iso -t G:
|
|
|
|
Example for installing syslinux to target USB disk:
|
|
|
|
Linux:
|
|
python3 multibootusb -c -s -t /dev/sdb1
|
|
|
|
Windows:
|
|
python3 multibootusb -c -s -t G:
|
|
''')
|
|
sys.exit(2)
|
|
|
|
|
|
def start_gui():
|
|
from scripts import mbusb_gui
|
|
gen.log('Starting multibootusb GUI...')
|
|
if platform.system() == 'Linux':
|
|
if os.getuid() != 0:
|
|
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()
|
|
sys.exit(0)
|
|
try:
|
|
opts, args = getopt.getopt(
|
|
sys.argv[1:], 'i:t:yvhcudrsp:',
|
|
['iso=', 'target=', 'yes', 'version', 'help', 'command',
|
|
'uninstall', 'debug', 'raw', 'syslinux', 'persistence-size='])
|
|
except getopt.GetoptError:
|
|
usage()
|
|
sys.exit(2)
|
|
for opt, arg in opts:
|
|
if opt in ('-h', '--help'):
|
|
usage()
|
|
sys.exit(2)
|
|
elif opt in ('-v', '--version'):
|
|
print_version()
|
|
sys.exit()
|
|
elif opt in ('-i', '--iso'):
|
|
if ',' not in arg:
|
|
config.image_path = arg
|
|
else:
|
|
config.image_path = arg.split(',')
|
|
elif opt in ('-t', '--target'):
|
|
# Convert to upper if windows drive name is given
|
|
config.usb_disk = len(arg) == 2 and arg[0].isalpha() and arg[1] == ':'\
|
|
and arg.upper() or arg
|
|
elif opt in ('-c', '--command'):
|
|
gui = False
|
|
elif opt in ('-u', '--uninstall'):
|
|
uninstall = True
|
|
elif opt in ('-d', '--debug'):
|
|
config.debug = True
|
|
elif opt in ('-y', '--yes'):
|
|
config.yes = True
|
|
elif opt in ('-r', '--raw'):
|
|
config.cli_dd = True
|
|
elif opt in ('-s', '--syslinux'):
|
|
config.cli_syslinux = True
|
|
elif opt in ('-p', '--persistence-size'):
|
|
config.persistence = int(arg) * 1024 * 1024
|
|
else:
|
|
gui = True
|
|
#start_gui()
|
|
'''
|
|
usage()
|
|
sys.exit()
|
|
'''
|
|
|
|
def main():
|
|
|
|
if config.debug is True:
|
|
from scripts.debug import colors
|
|
log(colors.HEADER + "=== DEBUG ENABLED ===")
|
|
|
|
|
|
if gui is False:
|
|
check_admin()
|
|
if uninstall is True and config.usb_disk != '':
|
|
cli_uninstall_distro()
|
|
elif uninstall is True and config.usb_disk == '':
|
|
log('\nYou must provide \'-t\' option to point to your USB disk for uninstalling a distro.\n'
|
|
'See the usage example below.')
|
|
usage()
|
|
elif config.image_path == '' and config.usb_disk == '':
|
|
log('\nNo option provided. See the usage below.')
|
|
usage()
|
|
elif config.cli_syslinux is True and config.usb_disk != '':
|
|
cli_install_syslinux()
|
|
elif config.image_path == '' or config.usb_disk == '':
|
|
log('\nOptions \'-i\' and \'-t\' must be supplied together. See the usage below.')
|
|
usage()
|
|
elif config.cli_dd is True:
|
|
cli_dd()
|
|
else:
|
|
running_from()
|
|
cli_install_distro()
|
|
|
|
elif gui is True:
|
|
running_from()
|
|
start_gui()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
osdriver.initialize()
|
|
try:
|
|
main()
|
|
finally:
|
|
from scripts import usb
|
|
for p in config.remounted_partitions:
|
|
log('Unmouting %s at exit' % p)
|
|
usb.unmount(p)
|