From 85fd06fa8a20a1861c9ec0d8e15da954fe5cdd43 Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Wed, 30 Sep 2020 09:11:36 +0000 Subject: Finalized magic function _prep_function(). Gets returned when a profile is imported through archinstall.select_profile() user-interaction helper function. Asks for additional user-input right away rather than half way into the installation. This makes sure user input is taken care of before starting the installation. Although it complicates the code layout a tiny bit. Profiles need a __name__ and a _prep_function combo in order to be safely executed by select_profile(). select_profile() will not attempt to run or execute the code in any way unless those to conditions are met. In theory :) --- archinstall/lib/profiles.py | 5 +++-- archinstall/lib/user_interaction.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'archinstall') diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py index 45d82531..f63fb96d 100644 --- a/archinstall/lib/profiles.py +++ b/archinstall/lib/profiles.py @@ -88,9 +88,10 @@ class Profile(): def load_instructions(self): if (absolute_path := self.path): if os.path.splitext(absolute_path)[1] == '.py': - spec = importlib.util.spec_from_file_location(absolute_path, absolute_path) + namespace = os.path.splitext(os.path.basename(absolute_path))[0] + spec = importlib.util.spec_from_file_location(namespace, absolute_path) imported = importlib.util.module_from_spec(spec) - sys.modules[os.path.basename(absolute_path)] = imported + sys.modules[namespace] = imported return Imported(spec, imported) else: raise ProfileError(f'Extension {os.path.splitext(absolute_path)[1]} is not a supported profile model. Only .py is supported.') diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py index 2a797490..4fc6c8d9 100644 --- a/archinstall/lib/user_interaction.py +++ b/archinstall/lib/user_interaction.py @@ -1,4 +1,5 @@ from .exceptions import * +from .profiles import Profile from .locale_helpers import search_keyboard_layout ## TODO: Some inconsistencies between the selection processes. @@ -43,6 +44,18 @@ def select_profile(options): selected_profile = options[options.index(selected_profile)] else: RequirementError("Selected profile does not exist.") + + profile = Profile(None, selected_profile) + with open(profile.path, 'r') as source: + source_data = source.read() + + # Some crude safety checks, make sure the imported profile has + # a __name__ check and if so, check if it's got a _prep_function() + # we can call to ask for more user input. + if '__name__' in source_data and '_prep_function' in source_data + with profile.load_instructions() as imported: + if hasattr(imported, '_prep_function'): + return profile, imported return selected_profile raise RequirementError("Selecting profiles require a least one profile to be given as an option.") -- cgit v1.2.3-70-g09d2