mirror of
https://github.com/mbusb/multibootusb
synced 2024-11-01 15:40:16 +00:00
d8b485efda
2. Added PLOP boot manager 3. Added netboot.iso 4. Added latest memtest 5. Added slack mini boot 6. Improved fedora detection script This commit provide initial and bare minimum support to UEFI boot. The support will be improved upon users feedback and raising issues.
231 lines
6.5 KiB
Python
231 lines
6.5 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*
|
|
# Name: iso.py
|
|
# Purpose: Module to manupulate ISO file
|
|
# Authors: Sundar
|
|
# Depends: isodump3.py (Authored by Johni Lee for MultiBootUSB)
|
|
# 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 sys
|
|
import os
|
|
import string
|
|
import platform
|
|
import re
|
|
from .gen import *
|
|
from .isodump3 import ISO9660
|
|
from . import _7zip
|
|
|
|
|
|
_iso_cfg_ext_dir = iso_cfg_ext_dir()
|
|
|
|
|
|
def iso_name(iso_link):
|
|
"""
|
|
Find the name of an ISO.
|
|
:return: Name of an ISO (with extension) as string. Returns If not returns None.
|
|
"""
|
|
if os.path.exists(iso_link):
|
|
try:
|
|
name = os.path.basename(str(iso_link))
|
|
except:
|
|
name = None
|
|
else:
|
|
name = None
|
|
|
|
return name
|
|
|
|
|
|
def iso_basename(iso_link):
|
|
"""
|
|
Find the base name of an ISO.
|
|
:return: Base name (without extension) of a selected ISO as string. If not returns None.
|
|
"""
|
|
try:
|
|
dir_name = str(os.path.splitext(os.path.basename(str(iso_link)))[0])
|
|
except:
|
|
dir_name = None
|
|
|
|
return dir_name
|
|
|
|
|
|
def isolinux_bin_exist(iso_link):
|
|
"""
|
|
Check if an "isolinux.bin" file exist.
|
|
:return: True if "isolinux.bin" file exist of False if not.
|
|
"""
|
|
if os.path.exists(iso_link):
|
|
iso_file_list = _7zip.list_iso(iso_link)
|
|
if any("isolinux.bin" in s.lower() for s in iso_file_list):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
|
|
def iso_size(iso_link):
|
|
return os.path.getsize(iso_link)
|
|
|
|
|
|
def is_bootable(iso_link):
|
|
"""
|
|
Check if an ISO has the ability to boot.
|
|
:return: True if ISO is bootable and False if not.
|
|
"""
|
|
iso9660fs = ISO9660(iso_link)
|
|
isBootable = iso9660fs.checkISOBootable()
|
|
if isBootable:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
def isolinux_bin_dir(iso_link):
|
|
"""
|
|
Detects "isolinux.bin" directory.
|
|
:return: path of "isolinux.bin" directory as string.
|
|
"""
|
|
if os.path.exists(iso_link):
|
|
bin_dir = False
|
|
iso_file_list = _7zip.list_iso(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():
|
|
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
|
|
|
|
|
|
def isolinux_bin_path(iso_link):
|
|
"""
|
|
Detects pat to "isolinux.bin".
|
|
:return: path of "isolinux.bin" as a string.
|
|
"""
|
|
iso_bin_path = False
|
|
if isolinux_bin_exist(iso_link) is not False:
|
|
iso_file_list = _7zip.list_iso(iso_link)
|
|
for f in iso_file_list:
|
|
if 'isolinux.bin' in f.lower():
|
|
iso_bin_path = f
|
|
break
|
|
|
|
return iso_bin_path
|
|
|
|
|
|
def iso_menu_lst_path(iso_link):
|
|
"""
|
|
Detects pat to "menu.lst" of grub4dos.
|
|
:return: path of "menu.lst" as a string.
|
|
"""
|
|
menu_lst_path = False
|
|
iso_file_list = _7zip.list_iso(iso_link)
|
|
for f in iso_file_list:
|
|
if 'menu.lst' in f.lower():
|
|
menu_lst_path = f
|
|
break
|
|
|
|
return menu_lst_path
|
|
|
|
|
|
def integrity(iso_link):
|
|
"""
|
|
Check the integrity of an ISO.
|
|
:return: True if integrity passes or False if it fails.
|
|
"""
|
|
return _7zip.test_iso(iso_link)
|
|
|
|
|
|
def iso_file_list(iso_link):
|
|
"""
|
|
Function to return the content of an ISO.
|
|
:return: List of files of an ISO as list.
|
|
"""
|
|
return _7zip.list_iso(iso_link)
|
|
|
|
|
|
def isolinux_version(isolinux_bin_path):
|
|
"""
|
|
Detect isolinux version shipped by distros.
|
|
:param isolinux_path: Path to "isolinux.bin"
|
|
:return: Version number as string.
|
|
"""
|
|
version = ["3", "4", "5", "6"]
|
|
if isolinux_bin_path is not None:
|
|
sl = list(strings(isolinux_bin_path))
|
|
for strin in sl:
|
|
if re.search(r'isolinux ', strin, re.I):
|
|
for number in version:
|
|
if re.search(r'isolinux ' + number, strin, re.I):
|
|
log("\n\nFound syslinux version " + number + "\n\n")
|
|
return str(number)
|
|
|
|
|
|
def iso_extract_file(iso_link, dest_dir, filter):
|
|
"""
|
|
Extract the specific file(s) from an ISO
|
|
:param dest_dir: Path to destination directory.
|
|
:param filter: Filter to extract particular file(s)
|
|
:return: Extract file(s) to destination.
|
|
"""
|
|
_7zip.extract_iso(iso_link, dest_dir, filter)
|
|
|
|
|
|
def extract_cfg_file(iso_link):
|
|
"""
|
|
Function to extract certain files for auto detecting supported distros
|
|
:param iso_link: Path to ISO file
|
|
:return:
|
|
"""
|
|
_pattern = ['.cfg', '.CFG', '.txt', '.TXT', 'isolinux.bin', 'ISOLINUX.BIN', '.lst']
|
|
# file_list = iso_file_list(iso_link)
|
|
for ext in _pattern:
|
|
_7zip.extract_iso(iso_link, _iso_cfg_ext_dir, pattern='*' + ext)
|
|
|
|
|
|
def iso_extract_full(iso_link, dest_dir):
|
|
"""
|
|
Extract an ISO to destination directory
|
|
:param dest_dir: Destination path as string.
|
|
:return: False if it fails or extract ISO files to destination directory.
|
|
"""
|
|
_7zip.extract_iso(iso_link, dest_dir)
|
|
|
|
|
|
def iso_file_path(iso_link, file_name):
|
|
"""
|
|
Function to check if file name exist in the ISO
|
|
:param iso_link:Path to ISO file
|
|
:param file_name: file name to be checked
|
|
:return: Path to file as string
|
|
"""
|
|
file_path = False
|
|
iso_file_list = _7zip.list_iso(iso_link)
|
|
for f in iso_file_list:
|
|
if file_name in f.lower():
|
|
file_path = f
|
|
break
|
|
|
|
return file_path
|
|
|
|
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')
|
|
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:
|
|
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')
|
|
log(isolinux_version(test_iso_bin_path))
|
|
|