diff --git a/man/ukify.xml b/man/ukify.xml index 9b7e20997a..1865c1bfed 100644 --- a/man/ukify.xml +++ b/man/ukify.xml @@ -140,6 +140,12 @@ Also see the description of / and . + + Other tools that may be useful for inspect UKIs: + llvm-objdump1 + and pe-inspect. + + diff --git a/src/kernel-install/60-ukify.install.in b/src/kernel-install/60-ukify.install.in index 978f179544..e10dc0f869 100755 --- a/src/kernel-install/60-ukify.install.in +++ b/src/kernel-install/60-ukify.install.in @@ -21,8 +21,8 @@ import argparse import os -import runpy import shlex +import types from shutil import which from pathlib import Path from typing import Optional @@ -209,22 +209,20 @@ def initrd_list(opts) -> list[Path]: return [*microcode, *opts.initrd, *initrd] -def call_ukify(opts): - # Punish me harder. - # We want this: - # ukify = importlib.machinery.SourceFileLoader('ukify', UKIFY).load_module() - # but it throws a DeprecationWarning. - # https://stackoverflow.com/questions/67631/how-can-i-import-a-module-dynamically-given-the-full-path - # https://github.com/python/cpython/issues/65635 - # offer "explanations", but to actually load a python file without a .py extension, - # the "solution" is 4+ incomprehensible lines. - # The solution with runpy gives a dictionary, which isn't great, but will do. - ukify = runpy.run_path(UKIFY, run_name='ukify') +def load_module(name: str, path: str) -> types.ModuleType: + module = types.ModuleType(name) + text = open(path).read() + exec(compile(text, path, 'exec'), module.__dict__) + return module + + +def call_ukify(opts) -> None: + ukify = load_module('ukify', UKIFY) # Create "empty" namespace. We want to override just a few settings, so it # doesn't make sense to configure everything. We pretend to parse an empty # argument set to prepopulate the namespace with the defaults. - opts2 = ukify['create_parser']().parse_args(['build']) + opts2 = ukify.create_parser().parse_args(['build']) opts2.config = uki_conf_location() opts2.uname = opts.kernel_version @@ -240,12 +238,10 @@ def call_ukify(opts): if BOOT_STUB: opts2.stub = BOOT_STUB - # opts2.summary = True - - ukify['apply_config'](opts2) - ukify['finalize_options'](opts2) - ukify['check_inputs'](opts2) - ukify['make_uki'](opts2) + ukify.apply_config(opts2) + ukify.finalize_options(opts2) + ukify.check_inputs(opts2) + ukify.make_uki(opts2) log(f'{opts2.output} has been created') diff --git a/src/ukify/ukify.py b/src/ukify/ukify.py index b33c8cf744..6e9d86b783 100755 --- a/src/ukify/ukify.py +++ b/src/ukify/ukify.py @@ -773,7 +773,7 @@ def make_uki(opts): if opts.pcr_public_keys and len(opts.pcr_public_keys) == 1: pcrpkey = opts.pcr_public_keys[0] elif opts.pcr_private_keys and len(opts.pcr_private_keys) == 1: - import cryptography.hazmat.primitives.serialization as serialization + from cryptography.hazmat.primitives import serialization privkey = serialization.load_pem_private_key(opts.pcr_private_keys[0].read_bytes(), password=None) pcrpkey = privkey.public_key().public_bytes( encoding=serialization.Encoding.PEM,