2
0
mirror of https://github.com/mbusb/multibootusb synced 2024-11-18 15:25:46 +00:00
multibootusb/scripts/_7zip.py
mbusb 815241572c Improvements and memdisk for ISO boot:
1. Catch 7zip error while listing ISO content
2. Way to detect .ISO and .IMG files for direct booting using memdisk
3. Added a class for finding available RAM size
4. Added feature for selecting ISO, IMG, Zip and all files options in file chooser dialog
5. Added generic menu entry for memdisk
6. Corrected path to menu.lst file for distrs based on grub4dos
7. Fix for crash when multicard reader is inserted on the system without a SD card
8. Correctly detect USB disk information using udisk2-dbus without crash
2017-05-14 22:32:56 +05:30

141 lines
4.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name: 7zip.py
# Purpose: Wrapper module to list and extract ISO files using 7zip
# 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 os
import platform
import subprocess
from . import config
from . import gen
if platform.system() == 'Windows':
_7zip = gen.quote(gen.resource_path(os.path.join('data', 'tools', '7zip', '7z.exe')))
else:
_7zip = '7z'
def extract_iso(src, dst, pattern=None, suppress_out=True):
"""
Simple wrapper function to extract ISO file to destination
:param src: Path to ISO file
:param dst: Path to directory where the files are to be extracted
:param patter: The pattern to match the files to be extracted
:return:
"""
# 7z x -y -oC:\path_to_directory X:\path_to_iso_file.iso
# 7z e archive.zip -oC:\path_to_directory *.cfg *.bin -r
if platform.system() == 'Windows':
cli_option = ' -ssc- -bb1' # Linux does not accept this option (may be due to version diff).
if suppress_out != '':
# suppress_out = ' 2> nul'
suppress_out = ''
else:
cli_option = ' -ssc- '
if suppress_out != '':
suppress_out = ' 2> /dev/null'
if not os.path.exists(src):
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)
if pattern is None:
_cmd = _7zip + cli_option + ' x -y -o' + gen.quote(dst) + ' ' + gen.quote(src) + suppress_out
else:
_cmd = _7zip + cli_option + ' x -y ' + gen.quote(src) + ' -o' + dst + ' ' + gen.quote(pattern) + ' -r' + suppress_out
gen.log('Executing ==> ' + _cmd)
config.status_text = 'Status: Extracting ' + os.path.basename(src).strip()
with open(os.devnull, 'w') as devnull:
subprocess.call(_cmd, stdin=devnull, stdout=devnull, stderr=devnull, shell=True)
def list_iso(iso_link, suppress_out=True):
"""
List the content of ISO files. It does'nt work with non 'utf' characters (simply ignores them).
:param iso_link:Path to ISO link
:param suppress_out: Option to suppress output to stdout. Default True.
:return: Path to files and directories as a list
"""
if platform.system() == 'Windows':
if suppress_out is True:
suppress_out = ' 2> nul'
else:
if suppress_out is True:
suppress_out = ' 2> /dev/null'
if not os.path.exists(iso_link):
gen.log('Path to ISO link does not exist.')
return False
else:
file_list = []
_cmd = _7zip + ' l ' + gen.quote(iso_link) + suppress_out
try:
_cmd_out = subprocess.check_output(_cmd, stderr=subprocess.PIPE, shell=True).decode('utf-8', 'ignore').splitlines()
except Exception as e:
gen.log(e)
_cmd_out = ''
for line in _cmd_out:
if '...' in line:
line = line.split()
_path = line[-1]
file_list.append(_path)
'''
for line in _cmd_out:
line = line.split()
if '.....' in line:
if gen.has_digit(line[2]) or gen.has_digit(line[4]):
if len(line) > 6:
f_path = " ".join(line[5:])
file_list.append(f_path)
else:
f_path = line[-1]
file_list.append(f_path)
'''
return file_list
def test_iso(iso_link, suppress_out=True):
"""
Function to test if ISO file is corrupted. Relying only on 7zip.
:param iso_link: Path to ISO file
:return: True if test is positive
"""
# 7z t /path/to/iso/file.iso
# return value : 0 No error
# return value : 1 Warning (Non fatal error(s))
# return value : 2 Fatal error
# return value : 7 Command line error
# return value : 8 Not enough memory for operation
# return value : 255 User stopped the process
if platform.system() == 'Windows':
if suppress_out is True:
suppress_out = ' > nul'
else:
if suppress_out is True:
suppress_out = ' > /dev/null'
_cmd = _7zip + ' t ' + iso_link + suppress_out
gen.log('Executing ==> ' + _cmd)
rc = subprocess.call(_cmd, shell=True)
return bool(rc in [0, 1])
if __name__ == '__main__':
# slitaz-4.0.iso
# ubuntu-16.04-desktop-amd64.iso
# avg_arl_cdi_all_120_160420a12074.iso
# haiku-nightly.iso
# Hiren_BootCD.iso
file_list = list_iso('../../ubuntu_14_04_backup/Downloads/clonezilla-live-2.4.2-32-amd64.iso')
for f in file_list:
print(f)