replace gzip and chmod operations with python-native implementations
This commit is contained in:
@@ -8,7 +8,9 @@ local filesystem.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import gzip
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
@@ -110,34 +112,42 @@ def append_file_contents_to_initrd_archive(path_to_initrd_archive,
|
|||||||
if not path_to_input_file.is_file():
|
if not path_to_input_file.is_file():
|
||||||
raise FileNotFoundError(f"No such file: '{path_to_input_file}'.")
|
raise FileNotFoundError(f"No such file: '{path_to_input_file}'.")
|
||||||
|
|
||||||
# temporarily extract initrd archive and append the input file's contents
|
# make archive and its parent directory temporarily writable
|
||||||
|
path_to_initrd_archive.chmod(0o644)
|
||||||
|
path_to_initrd_archive.parent.chmod(0o644)
|
||||||
|
|
||||||
|
path_to_initrd_extracted = path_to_initrd_archive.with_suffix("")
|
||||||
|
|
||||||
|
# extract archive in-place
|
||||||
|
with gzip.open(path_to_initrd_archive, "rb") as file_gz:
|
||||||
|
with open(path_to_initrd_extracted) as file_raw:
|
||||||
|
shutil.copyfileobj(file_gz, file_raw)
|
||||||
|
path_to_initrd_archive.unlink()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# make archive temporarily writable
|
|
||||||
subprocess.run(["chmod", "+w", path_to_initrd_archive],
|
|
||||||
check=True)
|
|
||||||
# extract archive in-place
|
|
||||||
subprocess.run(["gunzip", path_to_initrd_archive],
|
|
||||||
check=True)
|
|
||||||
# append contents of input_file to extracted archive using cpio
|
# append contents of input_file to extracted archive using cpio
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
["echo", path_to_input_file,
|
["echo", path_to_input_file,
|
||||||
"|", "cpio", "-H", "newc", "-o", "-A",
|
"|", "cpio", "-H", "newc", "-o", "-A",
|
||||||
"-F", path_to_initrd_archive.with_suffix("")],
|
"-F", path_to_initrd_extracted],
|
||||||
shell=True,
|
shell=True,
|
||||||
check=True)
|
check=True)
|
||||||
# repack archive
|
|
||||||
subprocess.run(
|
|
||||||
["gzip", path_to_initrd_archive.with_suffix("")],
|
|
||||||
check=True)
|
|
||||||
# remove write permissions from repacked archive
|
|
||||||
subprocess.run(["chmod", "-w", path_to_initrd_archive],
|
|
||||||
check=True)
|
|
||||||
|
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
raise RuntimeError(f"Failed while appending contents of "
|
raise RuntimeError(f"Failed while appending contents of "
|
||||||
f"'{path_to_input_file}' to "
|
f"'{path_to_input_file}' to "
|
||||||
f"'{path_to_initrd_archive}'.")
|
f"'{path_to_initrd_archive}'.")
|
||||||
|
|
||||||
|
# repack archive
|
||||||
|
with gzip.open(path_to_initrd_archive, "wb") as file_gz:
|
||||||
|
with open(path_to_initrd_extracted, "rb") as file_raw:
|
||||||
|
shutil.copyfileobj(file_raw, file_gz)
|
||||||
|
path_to_initrd_extracted.unlink()
|
||||||
|
|
||||||
|
# revert write permissions from repacked archive and its parent dir
|
||||||
|
path_to_initrd_archive.chmod(0o444)
|
||||||
|
path_to_initrd_archive.parent.chmod(0o444)
|
||||||
|
|
||||||
|
|
||||||
def regenerate_iso_md5sums_file(path_to_extracted_iso_root):
|
def regenerate_iso_md5sums_file(path_to_extracted_iso_root):
|
||||||
"""Recalculates and rewrites the md5sum.txt file for the extracted ISO.
|
"""Recalculates and rewrites the md5sum.txt file for the extracted ISO.
|
||||||
@@ -171,29 +181,31 @@ def regenerate_iso_md5sums_file(path_to_extracted_iso_root):
|
|||||||
raise NotADirectoryError(f"No such directory: "
|
raise NotADirectoryError(f"No such directory: "
|
||||||
f"'{path_to_extracted_iso_root}'.")
|
f"'{path_to_extracted_iso_root}'.")
|
||||||
|
|
||||||
# recalculate and rewrite 'md5sum.txt' in ISO's root
|
path_to_md5sum_file = path_to_extracted_iso_root/"md5sum.txt"
|
||||||
|
|
||||||
|
# make md5sum file and its parent dir temporarily writable
|
||||||
|
path_to_md5sum_file.chmod(0o644)
|
||||||
|
path_to_md5sum_file.parent.chmod(0o644)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# make md5sum.txt temporarily writable
|
|
||||||
subprocess.run(
|
|
||||||
["chmod", "+w", path_to_extracted_iso_root/"md5sum.txt"],
|
|
||||||
check=True)
|
|
||||||
# find all files within ISO's root and regenerate md5sum.txt file
|
# find all files within ISO's root and regenerate md5sum.txt file
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
["find", path_to_extracted_iso_root,
|
["find", path_to_extracted_iso_root,
|
||||||
"-follow", "-type", "f", "!", "-name", "md5sum.txt", "-print0"
|
"-follow", "-type", "f", "!", "-name", "md5sum.txt", "-print0"
|
||||||
"|", "xargs", "-0", "md5sum",
|
"|", "xargs", "-0", "md5sum",
|
||||||
">", path_to_extracted_iso_root/"md5sum.txt"],
|
">", path_to_md5sum_file],
|
||||||
shell=True,
|
shell=True,
|
||||||
check=True)
|
check=True)
|
||||||
# remove write permissions from md5sum.txt
|
|
||||||
subprocess.run(
|
|
||||||
["chmod", "-w", path_to_extracted_iso_root/"md5sum.txt"],
|
|
||||||
check=True)
|
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
raise RuntimeError(f"Failed while regenerating "
|
raise RuntimeError(f"Failed while regenerating "
|
||||||
f"'md5sum.txt' within "
|
f"'md5sum.txt' within "
|
||||||
f"'{path_to_extracted_iso_root}'.")
|
f"'{path_to_extracted_iso_root}'.")
|
||||||
|
|
||||||
|
# revert write permissions from md5sum.txt and its parent dir
|
||||||
|
path_to_md5sum_file.chmod(0o444)
|
||||||
|
path_to_md5sum_file.parent.chmod(0o444)
|
||||||
|
|
||||||
|
|
||||||
def extract_mbr_from_iso(path_to_output_file, path_to_source_iso):
|
def extract_mbr_from_iso(path_to_output_file, path_to_source_iso):
|
||||||
"""Extracts the MBR-data from the ISO and writes it into the outputfile.
|
"""Extracts the MBR-data from the ISO and writes it into the outputfile.
|
||||||
|
|||||||
Reference in New Issue
Block a user