Something that just occurred to me when looking at this patch is that ksvalidator is going to fail on processing any kickstart file with a %addon section (or any other section defined outside pykickstart). Do we expect to see such kickstart files outside of anaconda? If so, this is going to need work.
- for path in toplevel_addon_paths:
try:files = os.listdir(path)except OSError:files = []for addon_id in files:addon_ks_path = os.path.join(path, addon_id, "ks")if os.path.isdir(addon_ks_path):module_paths["ks"].append(("anaconda.addon.%s.ks.%%s" % addon_id, addon_ks_path))addon_spoke_path = os.path.join(path, addon_id, ui_subdir, "spokes")if os.path.isdir(addon_spoke_path):module_paths["spokes"].append(("anaconda.addon.%s.spokes.%%s" % addon_id, addon_spoke_path))addon_category_path = os.path.join(path, addon_id, ui_subdir, "categories")if os.path.isdir(addon_spoke_path):module_paths["categories"].append(("anaconda.addon.%s.categories.%%s" % addon_id, addon_category_path))
Do you mean pyanaconda.addon in all these paths?
diff --git a/pyanaconda/install.py b/pyanaconda/install.py index 6754a0a..4e552ea 100644 --- a/pyanaconda/install.py +++ b/pyanaconda/install.py @@ -52,7 +52,7 @@ def doConfiguration(storage, payload, ksdata, instClass): from pyanaconda import progress from pyanaconda.kickstart import runPostScripts
- progress.send_init(4)
progress.send_init(5)
# Now run the execute methods of ksdata that require an installed system # to be present first.
@@ -79,6 +79,9 @@ def doConfiguration(storage, payload, ksdata, instClass): ksdata.group.execute(storage, ksdata, instClass, u) ksdata.user.execute(storage, ksdata, instClass, u)
- with progress_report(_("Configuring addons")):
ksdata.addon.execute(storage, ksdata, instClass, u)- with progress_report(_("Running post install scripts")): runPostScripts(ksdata.scripts)
You may want to conditionalize these two so that they only happen if there are addons to begin with.
@@ -78,6 +80,7 @@ packagesSeen = False # so it needs to know about them in some additional way: have the topology ready. topology = None
class AnacondaKSScript(KSScript): def run(self, chroot): if self.inChroot: @@ -1342,11 +1345,38 @@ dataMap = {
superclass = returnClassForVersion()
class AnacondaKSHandler(superclass):
- def __init__ (self):
AddonClassType = AddonData
def __init__ (self, addon_paths = []): superclass.__init__(self, commandUpdates=commandMap, dataUpdates=dataMap) self.onPart = {}
# collect all kickstart addons for anaconda to addons dictionary# which maps addon_id to it's own data structure based on BaseData# with execute methodaddons = {}# collect all AddonData subclasses from# for p in addon_paths: <p>/<plugin id>/ks/*.(py|so)# and register them under <plugin id> namefor module_name, path in addon_paths:addon_id = os.path.basename(os.path.dirname(os.path.abspath(path)))if not os.path.isdir(path):continueclasses = collect(module_name, path, lambda cls: issubclass(cls, self.AddonClassType))print classesif classes:addons[addon_id] = classes[0](name = addon_id)# Prepare the final structures for 3rd party addonsself.addon = AddonRegistry(addons)def __str__(self):
return superclass.__str__(self) + "\n" + str(self.addon)class AnacondaPreParser(KickstartParser): # A subclass of KickstartParser that only looks for %pre scripts and # sets them up to be run. All other scripts and commands are ignored.
This will all get executed twice, just so you know: Once for processing the kickstart file in the special %pre step, and once for the real pass. That may not matter. I don't know how much stuff is expected to happen in this code and how many addons we realistically expect. It might also be best in its own method.
- Chris