replace gzip and chmod operations with python-native implementations

This commit is contained in:
ulinja
2022-04-22 15:52:02 +02:00
parent df3c9c58d3
commit 4049cc0b9d

View File

@@ -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.