From a4bc2967e50eb7b85aff0fa7cf6e8bd3b3904e82 Mon Sep 17 00:00:00 2001 From: Lukas Greve Date: Fri, 27 Mar 2026 15:39:30 +0100 Subject: [PATCH] Change: Update recipe generation to use single universal template - Transition from multi-template (install/live recipe types) to single universal template (proteus) - Remove recipe_type parameter from RecipeGenerator - Update manifest format (remove recipe_type field) - Simplify CLI (remove --type argument, use --output for single generation) - Filename generation now uses primary modifier as first component --- cook/__pycache__/cli.cpython-314.pyc | Bin 22857 -> 0 bytes .../generate_recipe.cpython-314.pyc | Bin 1021 -> 0 bytes cook/__pycache__/manifest.cpython-314.pyc | Bin 7922 -> 0 bytes ...ython-update-package-names.cpython-314.pyc | Bin 2556 -> 0 bytes .../recipe_generator.cpython-314.pyc | Bin 32281 -> 0 bytes cook/__pycache__/validators.cpython-314.pyc | Bin 16749 -> 0 bytes cook/cli.py | 25 +-- cook/generate_recipe.py | 7 +- cook/manifest.py | 17 +- cook/recipe_generator.py | 179 ++++++++++-------- cook/recipe_templates.yaml | 168 ++++++++-------- ...cfg => bare-metal_hardware-support_43.cfg} | 8 +- ...hypervisor_amdcpu_hardware-support_43.cfg} | 8 +- ...pervisor_intelcpu_hardware-support_43.cfg} | 8 +- ..._server_43.cfg => gnome_bare-metal_43.cfg} | 11 +- ....cfg => gnome_bare-metal_encrypted_43.cfg} | 13 +- ...e-metal_encrypted_hardware-support_43.cfg} | 13 +- ...al_encrypted_hardware-support_rawhide.cfg} | 13 +- ...=> gnome_bare-metal_encrypted_rawhide.cfg} | 13 +- ... gnome_bare-metal_hardware-support_43.cfg} | 8 +- ...e_bare-metal_hardware-support_rawhide.cfg} | 11 +- ...er_43.cfg => gnome_bare-metal_rawhide.cfg} | 11 +- cook/recipes/gnome_virtual_43.cfg | 24 +++ cook/recipes/gnome_virtual_encrypted_43.cfg | 25 +++ ..._virtual_encrypted_hardware-support_43.cfg | 25 +++ ...ual_encrypted_hardware-support_rawhide.cfg | 25 +++ .../gnome_virtual_encrypted_rawhide.cfg | 25 +++ .../gnome_virtual_hardware-support_43.cfg | 24 +++ ...gnome_virtual_hardware-support_rawhide.cfg | 24 +++ ..._virtual_hypervisor-desktop_amdcpu_43.cfg} | 12 +- ...irtual_hypervisor-desktop_intelcpu_43.cfg} | 12 +- cook/recipes/gnome_virtual_rawhide.cfg | 24 +++ ...nstall_bare-metal_gnome_server_rawhide.cfg | 25 --- ...e_encrypted_hardware-support_server_43.cfg | 25 --- ...tall_virtual_gnome_encrypted_server_43.cfg | 25 --- ...rtual_gnome_hardware-support_server_43.cfg | 24 --- ..._gnome_hardware-support_server_rawhide.cfg | 25 --- .../install_virtual_gnome_server_43.cfg | 24 --- .../install_virtual_gnome_server_rawhide.cfg | 25 --- .../live_bare-metal_hardware-support_43.cfg | 20 -- ...tual_server_rawhide.cfg => virtual_43.cfg} | 11 +- ...nome_server_43.cfg => virtual_rawhide.cfg} | 13 +- cook/recipes_manifest.yaml | 22 +-- cook/validators.py | 28 +-- 44 files changed, 493 insertions(+), 507 deletions(-) delete mode 100644 cook/__pycache__/cli.cpython-314.pyc delete mode 100644 cook/__pycache__/generate_recipe.cpython-314.pyc delete mode 100644 cook/__pycache__/manifest.cpython-314.pyc delete mode 100644 cook/__pycache__/python-update-package-names.cpython-314.pyc delete mode 100644 cook/__pycache__/recipe_generator.cpython-314.pyc delete mode 100644 cook/__pycache__/validators.cpython-314.pyc rename cook/recipes/{install_virtual_server_43.cfg => bare-metal_hardware-support_43.cfg} (79%) rename cook/recipes/{install_bare-metal_hypervisor_amdcpu_hardware-support_server_43.cfg => bare-metal_hypervisor_amdcpu_hardware-support_43.cfg} (83%) rename cook/recipes/{install_bare-metal_hypervisor_intelcpu_hardware-support_server_43.cfg => bare-metal_hypervisor_intelcpu_hardware-support_43.cfg} (83%) rename cook/recipes/{install_bare-metal_gnome_encrypted_hardware-support_server_43.cfg => gnome_bare-metal_43.cfg} (82%) rename cook/recipes/{install_virtual_gnome_encrypted_hardware-support_server_rawhide.cfg => gnome_bare-metal_encrypted_43.cfg} (82%) rename cook/recipes/{install_bare-metal_gnome_encrypted_server_rawhide.cfg => gnome_bare-metal_encrypted_hardware-support_43.cfg} (82%) rename cook/recipes/{install_bare-metal_gnome_encrypted_hardware-support_server_rawhide.cfg => gnome_bare-metal_encrypted_hardware-support_rawhide.cfg} (82%) rename cook/recipes/{install_virtual_gnome_encrypted_server_rawhide.cfg => gnome_bare-metal_encrypted_rawhide.cfg} (82%) rename cook/recipes/{install_bare-metal_gnome_hardware-support_server_43.cfg => gnome_bare-metal_hardware-support_43.cfg} (82%) rename cook/recipes/{install_bare-metal_gnome_hardware-support_server_rawhide.cfg => gnome_bare-metal_hardware-support_rawhide.cfg} (82%) rename cook/recipes/{install_bare-metal_gnome_encrypted_server_43.cfg => gnome_bare-metal_rawhide.cfg} (82%) create mode 100644 cook/recipes/gnome_virtual_43.cfg create mode 100644 cook/recipes/gnome_virtual_encrypted_43.cfg create mode 100644 cook/recipes/gnome_virtual_encrypted_hardware-support_43.cfg create mode 100644 cook/recipes/gnome_virtual_encrypted_hardware-support_rawhide.cfg create mode 100644 cook/recipes/gnome_virtual_encrypted_rawhide.cfg create mode 100644 cook/recipes/gnome_virtual_hardware-support_43.cfg create mode 100644 cook/recipes/gnome_virtual_hardware-support_rawhide.cfg rename cook/recipes/{install_virtual_hypervisor-desktop_amdcpu_gnome_server_43.cfg => gnome_virtual_hypervisor-desktop_amdcpu_43.cfg} (85%) rename cook/recipes/{install_virtual_hypervisor-desktop_intelcpu_gnome_server_43.cfg => gnome_virtual_hypervisor-desktop_intelcpu_43.cfg} (85%) create mode 100644 cook/recipes/gnome_virtual_rawhide.cfg delete mode 100644 cook/recipes/install_bare-metal_gnome_server_rawhide.cfg delete mode 100644 cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_43.cfg delete mode 100644 cook/recipes/install_virtual_gnome_encrypted_server_43.cfg delete mode 100644 cook/recipes/install_virtual_gnome_hardware-support_server_43.cfg delete mode 100644 cook/recipes/install_virtual_gnome_hardware-support_server_rawhide.cfg delete mode 100644 cook/recipes/install_virtual_gnome_server_43.cfg delete mode 100644 cook/recipes/install_virtual_gnome_server_rawhide.cfg delete mode 100644 cook/recipes/live_bare-metal_hardware-support_43.cfg rename cook/recipes/{install_virtual_server_rawhide.cfg => virtual_43.cfg} (79%) rename cook/recipes/{install_bare-metal_gnome_server_43.cfg => virtual_rawhide.cfg} (73%) diff --git a/cook/__pycache__/cli.cpython-314.pyc b/cook/__pycache__/cli.cpython-314.pyc deleted file mode 100644 index 517bcf7a88a43c202e170917b9c89011d8933d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22857 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 OE%uKOn#h`B)&6fq(Q*a= diff --git a/cook/__pycache__/generate_recipe.cpython-314.pyc b/cook/__pycache__/generate_recipe.cpython-314.pyc deleted file mode 100644 index 7f268eedc3f12b82d47c17efbf3524b703ae92d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1021 zcmZuwL2DC16rRln3|sV|cu<7C(u0kfTr46*>Y-FDsFhH`OI^mm=p5`;cBt?W@|uVj7CPXqZ~MV+*-8C2(!14t6PUg}&KdBX5;J zsA~fh7CZgcnuRdP3_5++(@f}Ot2F|h3&oP&p~_)E3&>Dm!F@2wG+qfMhb>%QYvF^A z=~#*}m0D+t0=ZI6Bo{$8OpQGs!U^??!-`XrgcB4KtfMa4O9pVr-3)?-gfLK2Bj5)V zbrZScLp$Y?`iSPx3@eS&r^7EBpIXTdrjlBK>gla43baAbKQM|uP)O#lWI{b6j26@` z4t9b#GH$8l;Kk7cq9oq4+O5>0pY)@7H&kKXOVco?>8pNsekDyaBhqvp6OauTFYIex zVw!$sm*HN`udjJUeDmIug(v$qT;qryw?%)y<0y(QIya*3pL;C2`7_@5^6`6o>qocu O`PoIxy0>kQqW%KN^G19C diff --git a/cook/__pycache__/manifest.cpython-314.pyc b/cook/__pycache__/manifest.cpython-314.pyc deleted file mode 100644 index 72d0466a0509a5340324793052b076fbe584a143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7922 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 diff --git a/cook/__pycache__/python-update-package-names.cpython-314.pyc b/cook/__pycache__/python-update-package-names.cpython-314.pyc deleted file mode 100644 index aa2f62f7114de9e4d078a9664029b8a6e0165ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 zcmcgtO-vhC5Poa#+Ft))dojiVV;hLgPhye~hZsmJp+FHB8q0~QR_cNrdoi1WZLQaG zaC0ENgs7DQO(kemDQ?v&?xo^LdT7$Lk&>M3n8eORb7} z*?BYbzM1*<`A~&UjbPloH^G|>sWn=#(mh_T0+exnq1d)-WOWlQb!z**yDGIGcPc ze&S#7e+3>gf7SMhl0=h|haLHDB19q^^g?_*khwVQ=m_F9vPx{7vh_iw#ft2Yi+=Z;r=o4HR=-(Q;JAgZ zhN^zQfBuF66Vz&-+>M;y!+IA}BEC)Q|B2JIrW48)Hf)?qYEeKZR)6PL0lJEI9KLPK zTba9+0WkN69evUV3=%uuerNcP@9q{ookT`6`^39Pjbv?EXl`{ynyq}MP5+y>?8x4G<7yPIT_@pK2EfD z!LPaPP)oYHkKwA|6?5HNMxl#GXiJQLnRRR)o2sS(tP z@-kSe%Ip7{Hrgql`c#c#e&OJs;%wM2h9dK^3210pF&Jpa{mn zB`lDM4V)~K5ae7kDkwN6k(}TKHOD}9(NHYR2#N#~N;M~mi;yt$)b_RjP_)0?lR7E(p~vAq4*Vq?+Xv25=s87%Yq zIekX?#L&E^K}Kp_juaHbw2Nq9@f+IicTwoFx4v8c>Bye0RsCH&6$ zmvW36#AX!FHO8XGn%7t}*s`Ynxz%=K;G2P*t9$8#+w?8EVD-%mKhs-F&i10yn|FGb zj0I%{Jl{Ik zdi`*bI+&*pX3iFg|u8mO6$S~F~5bz~Zgglm~_W$Q~gab@W8(CmR_yjBF;lqX#4 z{TP%Mx|$aoh+zMz6NR#-dF3YEw5MW z76=7r@rwzj-zsr&wsyjNw?@?5JzfR#@0Om50hjELrUsbrH5dog r#QhFx&_+CYRzCR`Ou~rJVO2r(V_ew diff --git a/cook/__pycache__/recipe_generator.cpython-314.pyc b/cook/__pycache__/recipe_generator.cpython-314.pyc deleted file mode 100644 index 2a5a6883ca3fee8e8757cfe5b445b778c26a69b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32281 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 diff --git a/cook/__pycache__/validators.cpython-314.pyc b/cook/__pycache__/validators.cpython-314.pyc deleted file mode 100644 index 1a33c2fae864195cfb9decabc2d1c50d648b3d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16749 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 diff --git a/cook/cli.py b/cook/cli.py index 032c746..3014469 100644 --- a/cook/cli.py +++ b/cook/cli.py @@ -103,9 +103,6 @@ def main() -> None: action='store_true', help='Show what would be generated without writing files') - # Single generation mode options - parser.add_argument('--type', '-T', - help='Recipe type (e.g., virtual-desktop)') parser.add_argument('--output', '-o', type=Path, help='Output file (single generation)') @@ -167,8 +164,9 @@ def main() -> None: return # === SINGLE GENERATION MODE === - # If --type is specified, generate one recipe with the given options - if args.type: + # If --output is specified without --manifest, generate one recipe with the given options + # This makes --output without --manifest trigger single generation mode + if args.output and not args.manifest: generate_single(args, generator) return @@ -396,12 +394,8 @@ def generate_from_manifest(args: argparse.Namespace, generator: RecipeGenerator) # Generate all recipes from the manifest for recipe_config in manifest.get('recipes', []): - recipe_type = recipe_config.get('recipe_type', recipe_config['name']) - if recipe_type not in generator.templates: - print(f"Error: Unknown recipe type in manifest: {recipe_type}", file=sys.stderr) - sys.exit(1) - - # Get variants for this recipe type + # No recipe_type needed - use the universal template directly + name = recipe_config.get('name', 'unnamed') variants = recipe_config.get('variants', []) # Expand list-valued variants (e.g., version: ["43", "rawhide"]) @@ -411,11 +405,10 @@ def generate_from_manifest(args: argparse.Namespace, generator: RecipeGenerator) # Extract version and other modifiers from variant version = variant['version'] modifiers = {k: v for k, v in variant.items() if k not in ['name', 'version']} - modifiers = {k: v for k, v in variant.items() if k not in ['name', 'version']} # name kept for manifest organization only, not passed to generator # Generate the recipe content - content = generator.generate(recipe_type, version, **modifiers) + content = generator.generate(version, **modifiers) # Optional validation on generated content if args.validate and not args.dry_run: @@ -423,13 +416,13 @@ def generate_from_manifest(args: argparse.Namespace, generator: RecipeGenerator) semantic_issues = semantic_validator.validate(content, version) all_issues = issues + semantic_issues if all_issues: - print(f"Validation issues for {recipe_type} {version}:", file=sys.stderr) + print(f"Validation issues for {name} {version}:", file=sys.stderr) for issue in issues: print(f" - {issue}", file=sys.stderr) sys.exit(1) # Generate output filename based on recipe parameters - filename = generator.generate_filename(recipe_type, version, **modifiers) + filename = generator.generate_filename(version, **modifiers) output_path = args.output_dir / filename # Handle dry-run mode @@ -479,7 +472,7 @@ def generate_single(args: argparse.Namespace, generator: RecipeGenerator) -> Non modifiers = {k: v for k, v in modifiers.items() if v is not None} # Generate the recipe - content = generator.generate(args.type, args.version, **modifiers) + content = generator.generate(args.version, **modifiers) # Optional validation if args.validate: diff --git a/cook/generate_recipe.py b/cook/generate_recipe.py index 985167f..6f74e92 100644 --- a/cook/generate_recipe.py +++ b/cook/generate_recipe.py @@ -5,8 +5,11 @@ the recipe generator. It follows the common Python pattern of having a script that can be run directly or imported as a module. Usage: - # Run as script - python generate_recipe.py --type virtual-desktop --version 43 --output output.cfg + # Run as script for single generation + python generate_recipe.py --output my-recipe.cfg --version 43 --desktop gnome + + # Or using the universal template with modifiers + python generate_recipe.py --output single.cfg --version 43 --guest-agents true # Or from another Python script from generate_recipe import main diff --git a/cook/manifest.py b/cook/manifest.py index 8aa5d96..cb8a6d3 100644 --- a/cook/manifest.py +++ b/cook/manifest.py @@ -14,14 +14,19 @@ are used in batch recipe generation mode. It has two main responsibilities: Manifest Example: recipes: - - name: virtual-desktop + - name: desktop variants: - version: 43 desktop: gnome + storage: encrypted - version: ["43", "rawhide"] storage: ["standard", "encrypted"] - The above would generate 4 recipes (2 versions × 2 storage types). + The above would generate 3 recipes (1 desktop + 2 rawhide variants). + +With the universal template (proteus), recipes are generated using a single +template that supports all system types. The 'name' field is purely for +organization and doesn't affect the generated filenames. The key insight is that list values in variants represent "multiple values for this field", and we want to generate one recipe for each combination. This is @@ -89,9 +94,10 @@ class ManifestProcessor: This method performs schema-level validation of a manifest dictionary. It checks that: 1. The top-level 'recipes' key exists - 2. Each recipe configuration has a 'name' field + 2. Each recipe configuration has a 'name' field (for organization only) 3. Each recipe configuration has a 'variants' field 4. Each variant has a 'version' field + 5. No 'recipe_type' field exists (old format, removed with universal template) This is a basic structural check that catches obvious errors before trying to process the manifest. It doesn't validate the content of @@ -117,6 +123,11 @@ class ManifestProcessor: if 'variants' not in recipe_config: errors.append(f"Recipe '{recipe_config.get('name', 'unnamed')}' " "missing 'variants' key") + + # Check for old recipe_type field (which is no longer used) + if 'recipe_type' in recipe_config: + errors.append(f"Recipe '{recipe_config.get('name', 'unnamed')}' " + "has 'recipe_type' field which is no longer used with universal template") return errors diff --git a/cook/recipe_generator.py b/cook/recipe_generator.py index e1cbbc3..04518f6 100644 --- a/cook/recipe_generator.py +++ b/cook/recipe_generator.py @@ -56,17 +56,18 @@ class RecipeGenerator: This is the core class that powers the recipe generation system. It works by: 1. Loading template definitions from a YAML file (recipe_templates.yaml) - 2. Taking a recipe type (like "virtual-desktop") and version (like "43") - 3. Accepting optional modifiers (like desktop environment, storage type, security mode) - 4. Building a list of %include directives that reference ingredient fragments - 5. Outputting a complete kickstart file with header and include statements - - The templates define which ingredients are required, optional, conditional, or version-specific. - Modifiers control which optional ingredients get included based on user preferences. + 2. The template defines all the base ingredients and modifier options + 3. Accepting version (Fedora version) and optional modifiers + 4. Building a list of %include directives pointing to ingredient fragments + 5. Outputting a complete kickstart file with header and includes + + Think of it as a "recipe assembler" - the template is the master recipe, + modifiers are your customizations, and the output is a complete installation + script that pulls in the right ingredient fragments. Example usage: generator = RecipeGenerator(Path('recipe_templates.yaml')) - recipe = generator.generate('virtual-desktop', '43', desktop='gnome', storage='encrypted') + recipe = generator.generate('43', desktop='gnome', storage='encrypted') # Returns a string containing the complete kickstart recipe """ @@ -83,26 +84,24 @@ class RecipeGenerator: def _load_templates(self, path: Path) -> Dict: """Load recipe templates from YAML file. - This method reads the templates YAML file and extracts the 'templates' section. - The YAML file contains a top-level 'templates' key with all recipe type definitions. + This method reads the templates YAML file and loads it as a single universal template. + The YAML file now contains the proteus template directly without a 'templates' wrapper. Args: path: Path to the templates YAML file (can be absolute or relative) Returns: - Dictionary mapping recipe types to their template definitions. + The template dictionary (entire YAML content). Example structure: { - 'virtual-desktop': { - 'description': 'Virtual machine with desktop', - 'required': ['ingredients/base.cfg', ...], - 'modifiers': {'desktop': {...}, 'storage': {...}}, - 'optional': {...}, - 'versioned': {...}, - 'conditional': {...}, - 'flags': {...} - }, - ... + 'name': 'proteus', + 'description': 'Universal template...', + 'required': {...}, + 'modifiers': {...}, + 'optional': {...}, + 'versioned': {...}, + 'conditional': {...}, + 'flags': {...} } Raises: @@ -116,8 +115,8 @@ class RecipeGenerator: template_path = self.project_root / path with open(template_path, encoding='utf-8') as f: data = yaml.safe_load(f) - # Extract the 'templates' section - the YAML file has this as top-level key - return data['templates'] + # Return the entire YAML content as the single universal template + return data except FileNotFoundError: print(f"Error: Templates file not found: {template_path}") exit(2) @@ -125,16 +124,13 @@ class RecipeGenerator: print(f"Error: Invalid YAML in {template_path}: {e}") exit(2) - def generate(self, recipe_type: str, version: str, **modifiers) -> str: + def generate(self, version: str, **modifiers) -> str: """Generate a complete kickstart recipe from a template with modifiers. - This is the main entry point for recipe generation. It takes a recipe type - (like "virtual-desktop"), a Fedora version, and any number of modifier options, - then returns a complete kickstart file as a string. + This is the main entry point for recipe generation. It takes a Fedora version + and any number of modifier options, then returns a complete kickstart file as a string. Args: - recipe_type: The type of recipe to generate. Must match a key in the templates. - Examples: 'virtual-desktop', 'server', 'hypervisor' version: Fedora version string, typically '43' or 'rawhide'. This affects which versioned ingredients are included. **modifiers: Keyword arguments for recipe customization: @@ -153,13 +149,9 @@ class RecipeGenerator: - %include directives for all required and selected ingredients Raises: - SystemExit: If the recipe_type is not found in templates + SystemExit: If the template is invalid or missing required ingredients """ - if recipe_type not in self.templates: - print(f"Error: Unknown recipe type: {recipe_type}") - exit(1) - - template = self.templates[recipe_type] + template = self.templates # Build the output in two parts: # 1. Header with ASCII art and description @@ -180,13 +172,13 @@ class RecipeGenerator: describes what type of system it will install. Args: - description: Human-readable description of the recipe type - (e.g., "Virtual desktop environment") + description: Human-readable description of the template + (e.g., "Universal template for generating kickstart recipes") Returns: List of strings representing the header lines, including: - The ASCII art banner (from HEADER_ASCII_ART constant) - - A comment line with the recipe description + - A comment line with the template description - An empty line to separate header from content """ header = HEADER_ASCII_ART.copy() @@ -240,18 +232,44 @@ class RecipeGenerator: # === 1. REQUIRED INGREDIENTS === # These are always included, regardless of user options - # Example: base system, bootloader, partition scheme - for item in template.get('required', []): - if isinstance(item, dict): - # Dict format allows conditional logic within required - fragment_path = list(item.values())[0] - else: - # Simple string path - fragment_path = item - - if fragment_path not in seen: - includes.append(f"%include {fragment_path}") - seen.add(fragment_path) + # The template uses nested dict structure: required[section][value] = path or [paths] + # For each section, use either: + # - A modifier value that overrides the default + # - The default value from the first/only key in the section + + for section_name, section_config in template.get('required', {}).items(): + if isinstance(section_config, dict): + # Find the value to use for this section + # Check modifiers first, then use default + default_value = None + override_value = None + + # Get the default value (first key in dict, or only key) + keys = list(section_config.keys()) + if keys: + default_value = keys[0] + + # Check if any modifier overrides this section + for mod_key, mod_value in modifiers.items(): + mod_key_normalized = mod_key.replace("_", "-") + if mod_key_normalized == section_name and isinstance(mod_value, str): + if mod_value in section_config: + override_value = mod_value + break + + # Use override if available, otherwise use default + value_to_use = override_value if override_value else default_value + + if value_to_use and value_to_use in section_config: + fragment_path = section_config[value_to_use] + if isinstance(fragment_path, list): + for fp in fragment_path: + if fp is not None and fp not in seen: + includes.append(f"%include {fp}") + seen.add(fp) + elif fragment_path and fragment_path not in seen: + includes.append(f"%include {fragment_path}") + seen.add(fragment_path) # === 2. MODIFIER INGREDIENTS === # Process user-specified options like desktop, storage, security @@ -437,9 +455,10 @@ class RecipeGenerator: mod_key_normalized = mod_key.replace('_', '-') if mod_key_normalized in template.get('flags', {}): fragment_path = template['flags'][mod_key_normalized] - if mod_value is True and fragment_path not in seen: - includes.append(f"%include {fragment_path}") - seen.add(fragment_path) + if mod_value is True: + if fragment_path not in seen: + includes.append(f"%include {fragment_path}") + seen.add(fragment_path) return includes @@ -467,36 +486,42 @@ class RecipeGenerator: return modifiers[alt_key] return default - def generate_filename(self, recipe_type: str, version: str, **modifiers) -> str: + def generate_filename(self, version: str, **modifiers) -> str: """Generate recipe filename from parameters. Creates a descriptive filename that encodes the recipe's configuration. This allows users to identify what a recipe does just from its name. - Filename format: - {recipe_type}-{guest_type}-{variant}-{desktop}-{security}-{storage}-{version}.cfg + Filename format (using Approach A - primary modifier first): + {primary_modifier}-{other_modifiers}-{version}.cfg Examples: - - virtual-desktop_gnome_43.cfg - - server_encrypted_43.cfg - - hypervisor_kvm_devel_43.cfg + - gnome_43.cfg (desktop=gnome is primary modifier) + - encrypted_43.cfg (storage=encrypted is primary modifier) + - server_43.cfg (initial_setup=server with no desktop) + - gnome_encrypted_43.cfg (when multiple modifiers are set) - The method only adds suffixes for non-default values: - - GNOME is default → only add if different (labwc) - - secure is default → only add if devel - - standard is default → only add if encrypted + The method prioritizes modifiers to create intuitive filenames: + - If `desktop` is present, it becomes the primary modifier + - Otherwise, `storage` or `initial_setup` can be primary + - `version` is always included at the end Args: - recipe_type: Base recipe type (e.g., 'virtual-desktop') version: Fedora version (e.g., '43' or 'rawhide') **modifiers: All the modifier values that affect the recipe Returns: Filename string ending in .cfg """ - # Build base parts - start with recipe type - parts = [recipe_type.replace('_', '-')] - + # Build base parts - start with version (required) + parts = [] + + # Determine primary modifier (Approach A) + # If desktop is present, use it as primary modifier + desktop = self._get_modifier(modifiers, 'desktop') + if desktop: + parts.append(desktop) + # Add guest_agents suffix (for both True and False) # Distinguishes between virtual machines and bare metal installs guest_agents = self._get_modifier(modifiers, 'guest_agents') @@ -516,7 +541,7 @@ class RecipeGenerator: # Add hypervisor_type suffix # For hypervisors, include the type (kvm, xen, etc.) if modifiers.get('hypervisor_type'): - ht = modifiers['hypervisor_type'] + ht = modifiers.get('hypervisor_type') if isinstance(ht, list): # Multiple hypervisor types for h in ht: @@ -526,17 +551,6 @@ class RecipeGenerator: # Single hypervisor type parts.append(ht) - # Add desktop - desktop = self._get_modifier(modifiers, 'desktop') - if desktop: - parts.append(desktop) - - # Add security suffix (devel only, since secure is default) - # Security defaults to 'secure', so only 'devel' gets noted - security = self._get_modifier(modifiers, 'security') - if security == 'off': - parts.append('devel') - # Add storage suffix (encrypted only, since standard is default) # Standard storage is default, encrypted gets noted storage = self._get_modifier(modifiers, 'storage') @@ -552,10 +566,7 @@ class RecipeGenerator: # Add initial_setup suffix (non-server values) # Server is default, other setup types get noted initial_setup = self._get_modifier(modifiers, 'initial_setup') - if initial_setup == 'server': - # Server is the default for non-desktop, non-hypervisor - parts.append('server') - elif initial_setup and initial_setup != 'server': + if initial_setup and initial_setup != 'server': parts.append(f'{initial_setup}-setup') # Add bootloader suffix (systemd-boot only) @@ -564,7 +575,7 @@ class RecipeGenerator: if bootloader == 'systemd-boot': parts.append('systemd-boot') - # Add version - always included + # Add version - always included at the end parts.append(str(version)) # Join all parts with underscores and add .cfg extension diff --git a/cook/recipe_templates.yaml b/cook/recipe_templates.yaml index b8163e2..0f69ebf 100644 --- a/cook/recipe_templates.yaml +++ b/cook/recipe_templates.yaml @@ -1,96 +1,76 @@ -# Recipe Templates for Phyllome OS Kickstart Generator -# Each template defines the structure for a recipe type +# Proteus is a template generator for Phyllome OS # Fragment paths use relative paths from project root +# Required elements can all be replaced by a listed modifier +# Optional elements add features -templates: - # Install recipe - for desktop, server, or hypervisor - install: - description: "An install recipe for desktop, server, or hypervisor" - base: core - required: - - core: core/base.ks - - { path: repo/fedora-43-mirrors.ks, replaceable: true } - - { path: storage/standard.ks, replaceable: true } - - { path: bootloader/grub.ks, replaceable: true } - - core/locale.ks - - core/services.ks - - core/network.ks - - packages/core-group.ks - - packages/fedora-remix.ks - - packages/hand-picked.ks - - { path: core/security/enabled.ks, replaceable: true } - - { path: initial-setup/server/config.ks, replaceable: true } - modifiers: - version: - "43": repo/fedora-43-mirrors.ks - "rawhide": repo/rawhide-mirrors.ks - storage: - standard: storage/standard.ks - encrypted: storage/encrypted.ks - desktop: - gnome: - - desktop/gnome/config.ks - - desktop/gnome/packages.ks - - desktop/gnome/post-scripts.ks - labwc: - - desktop/labwc/config.ks - security: - secure: core/security/enabled.ks - "off": core/security/disabled.ks - initial-setup: - server: initial-setup/server/config.ks - desktop: initial-setup/desktop/config.ks - gnome: initial-setup/gnome/config.ks - generic-wayland: initial-setup/generic-wayland/config.ks - hypervisor_type: - amdcpu: hypervisor/amdcpu.ks - intelcpu: hypervisor/intelcpu.ks - intelgpu: hypervisor/intelgpu.ks - hypervisor: - base: - - hypervisor/base/packages.ks - - hypervisor/base/services.ks - - hypervisor/base/post-scripts.ks - desktop: - - packages/virtual-machine-manager/packages.ks - - packages/virtual-machine-manager/post-scripts.ks - bootloader: - grub: bootloader/grub.ks - systemd-boot: bootloader/systemd-boot.ks - optional: - hardware-support: packages/hardware-support.ks - guest-agents: guest-agents/base.ks - - # Live recipe - for live-desktop or live-server - live: - description: "A live recipe for live-desktop or live-server" - base: live-core - required: - - live-core: live/core/base.ks - - { path: repo/fedora-43-mirrors.ks, replaceable: true } - - { path: live/core/storage.ks, replaceable: true } - - { path: live/core/bootloader/grub.ks, replaceable: true } - - core/locale.ks - - core/services.ks - - core/network.ks - - live/core/packages.ks - - live/post/base.ks - - live/post/session.ks - - repo/rpmfusion-nonfree.ks - modifiers: - version: - "43": repo/fedora-43-mirrors.ks - "rawhide": repo/rawhide-mirrors.ks - storage: - standard: live/core/storage.ks - encrypted: live/core/storage.ks - bootloader: - grub: live/core/bootloader/grub.ks - systemd-boot: live/core/bootloader/systemd-boot.ks - optional: - hardware-support: packages/hardware-support.ks - guest-agents: guest-agents/base.ks - hypervisor: live/hypervisor.ks - security: - secure: core/security/enabled.ks - "off": core/security/disabled.ks +name: proteus +description: "Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system" +required: + repository: + "f43": repo/fedora-43-mirrors.ks + core: + "base": core/base.ks + bootloader: + "grub": bootloader/grub.ks + storage: + "ext4": storage/standard.ks + locale: + "fr_CH": core/locale.ks + services: + "minimal": core/services.ks + network: + "network-manager": core/network.ks + packages: + "core": packages/core.ks + brand: + "fedora-remix": packages/fedora-remix.ks + extra: + "extra": packages/hand-picked.ks + security: + "enabled": core/security/enabled.ks + initial-setup: + "server": initial-setup/server/config.ks +modifiers: + repository: + "rawhide": repo/rawhide-mirrors.ks + storage: + "encrypted": storage/encrypted.ks + security: + "disabled": core/security/disabled.ks + initial-setup: + gnome: initial-setup/gnome/config.ks + generic-wayland: initial-setup/generic-wayland/config.ks + live: + core: + "live-base": livecore/base.ks + bootloader: + "systemd-boot": live/core/bootloader/systemd-boot.ks + packages: + "live-core": live/core/packages.ks +optional: + hardware-support: packages/hardware-support.ks + guest-agents: guest-agents/base.ks + hypervisor: live/hypervisor.ks + desktop: + gnome: + - desktop/gnome/config.ks + - desktop/gnome/packages.ks + - desktop/gnome/post-scripts.ks + labwc: + - desktop/labwc/config.ks + hypervisor_type: + amdcpu: hypervisor/amdcpu.ks + intelcpu: hypervisor/intelcpu.ks + intelgpu: hypervisor/intelgpu.ks + hypervisor: + base: + - hypervisor/base/packages.ks + - hypervisor/base/services.ks + - hypervisor/base/post-scripts.ks + desktop: + - packages/virtual-machine-manager/packages.ks + - packages/virtual-machine-manager/post-scripts.ks + post: + live: + - base: live/post/base.ks + - session: live/post/session.ks diff --git a/cook/recipes/install_virtual_server_43.cfg b/cook/recipes/bare-metal_hardware-support_43.cfg similarity index 79% rename from cook/recipes/install_virtual_server_43.cfg rename to cook/recipes/bare-metal_hardware-support_43.cfg index 5bb4b12..4155c99 100644 --- a/cook/recipes/install_virtual_server_43.cfg +++ b/cook/recipes/bare-metal_hardware-support_43.cfg @@ -5,16 +5,16 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks diff --git a/cook/recipes/install_bare-metal_hypervisor_amdcpu_hardware-support_server_43.cfg b/cook/recipes/bare-metal_hypervisor_amdcpu_hardware-support_43.cfg similarity index 83% rename from cook/recipes/install_bare-metal_hypervisor_amdcpu_hardware-support_server_43.cfg rename to cook/recipes/bare-metal_hypervisor_amdcpu_hardware-support_43.cfg index 4a563da..22775ef 100644 --- a/cook/recipes/install_bare-metal_hypervisor_amdcpu_hardware-support_server_43.cfg +++ b/cook/recipes/bare-metal_hypervisor_amdcpu_hardware-support_43.cfg @@ -5,16 +5,16 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks diff --git a/cook/recipes/install_bare-metal_hypervisor_intelcpu_hardware-support_server_43.cfg b/cook/recipes/bare-metal_hypervisor_intelcpu_hardware-support_43.cfg similarity index 83% rename from cook/recipes/install_bare-metal_hypervisor_intelcpu_hardware-support_server_43.cfg rename to cook/recipes/bare-metal_hypervisor_intelcpu_hardware-support_43.cfg index b761365..2b177da 100644 --- a/cook/recipes/install_bare-metal_hypervisor_intelcpu_hardware-support_server_43.cfg +++ b/cook/recipes/bare-metal_hypervisor_intelcpu_hardware-support_43.cfg @@ -5,16 +5,16 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks diff --git a/cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_43.cfg b/cook/recipes/gnome_bare-metal_43.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_43.cfg rename to cook/recipes/gnome_bare-metal_43.cfg index a35c1f8..9078a54 100644 --- a/cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_43.cfg +++ b/cook/recipes/gnome_bare-metal_43.cfg @@ -5,21 +5,20 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_rawhide.cfg b/cook/recipes/gnome_bare-metal_encrypted_43.cfg similarity index 82% rename from cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_rawhide.cfg rename to cook/recipes/gnome_bare-metal_encrypted_43.cfg index 9bdbc47..c9c7509 100644 --- a/cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_rawhide.cfg +++ b/cook/recipes/gnome_bare-metal_encrypted_43.cfg @@ -5,22 +5,21 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include storage/encrypted.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_encrypted_server_rawhide.cfg b/cook/recipes/gnome_bare-metal_encrypted_hardware-support_43.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_encrypted_server_rawhide.cfg rename to cook/recipes/gnome_bare-metal_encrypted_hardware-support_43.cfg index 9bdbc47..c9c7509 100644 --- a/cook/recipes/install_bare-metal_gnome_encrypted_server_rawhide.cfg +++ b/cook/recipes/gnome_bare-metal_encrypted_hardware-support_43.cfg @@ -5,22 +5,21 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include storage/encrypted.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_rawhide.cfg b/cook/recipes/gnome_bare-metal_encrypted_hardware-support_rawhide.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_rawhide.cfg rename to cook/recipes/gnome_bare-metal_encrypted_hardware-support_rawhide.cfg index 9bdbc47..c9c7509 100644 --- a/cook/recipes/install_bare-metal_gnome_encrypted_hardware-support_server_rawhide.cfg +++ b/cook/recipes/gnome_bare-metal_encrypted_hardware-support_rawhide.cfg @@ -5,22 +5,21 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include storage/encrypted.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_encrypted_server_rawhide.cfg b/cook/recipes/gnome_bare-metal_encrypted_rawhide.cfg similarity index 82% rename from cook/recipes/install_virtual_gnome_encrypted_server_rawhide.cfg rename to cook/recipes/gnome_bare-metal_encrypted_rawhide.cfg index 9bdbc47..c9c7509 100644 --- a/cook/recipes/install_virtual_gnome_encrypted_server_rawhide.cfg +++ b/cook/recipes/gnome_bare-metal_encrypted_rawhide.cfg @@ -5,22 +5,21 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include storage/encrypted.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_hardware-support_server_43.cfg b/cook/recipes/gnome_bare-metal_hardware-support_43.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_hardware-support_server_43.cfg rename to cook/recipes/gnome_bare-metal_hardware-support_43.cfg index fc6ca67..9078a54 100644 --- a/cook/recipes/install_bare-metal_gnome_hardware-support_server_43.cfg +++ b/cook/recipes/gnome_bare-metal_hardware-support_43.cfg @@ -5,16 +5,16 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks diff --git a/cook/recipes/install_bare-metal_gnome_hardware-support_server_rawhide.cfg b/cook/recipes/gnome_bare-metal_hardware-support_rawhide.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_hardware-support_server_rawhide.cfg rename to cook/recipes/gnome_bare-metal_hardware-support_rawhide.cfg index ff12e44..9078a54 100644 --- a/cook/recipes/install_bare-metal_gnome_hardware-support_server_rawhide.cfg +++ b/cook/recipes/gnome_bare-metal_hardware-support_rawhide.cfg @@ -5,21 +5,20 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_encrypted_server_43.cfg b/cook/recipes/gnome_bare-metal_rawhide.cfg similarity index 82% rename from cook/recipes/install_bare-metal_gnome_encrypted_server_43.cfg rename to cook/recipes/gnome_bare-metal_rawhide.cfg index a35c1f8..9078a54 100644 --- a/cook/recipes/install_bare-metal_gnome_encrypted_server_43.cfg +++ b/cook/recipes/gnome_bare-metal_rawhide.cfg @@ -5,21 +5,20 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks \ No newline at end of file +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_43.cfg b/cook/recipes/gnome_virtual_43.cfg new file mode 100644 index 0000000..9078a54 --- /dev/null +++ b/cook/recipes/gnome_virtual_43.cfg @@ -0,0 +1,24 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_encrypted_43.cfg b/cook/recipes/gnome_virtual_encrypted_43.cfg new file mode 100644 index 0000000..c9c7509 --- /dev/null +++ b/cook/recipes/gnome_virtual_encrypted_43.cfg @@ -0,0 +1,25 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include storage/encrypted.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_encrypted_hardware-support_43.cfg b/cook/recipes/gnome_virtual_encrypted_hardware-support_43.cfg new file mode 100644 index 0000000..c9c7509 --- /dev/null +++ b/cook/recipes/gnome_virtual_encrypted_hardware-support_43.cfg @@ -0,0 +1,25 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include storage/encrypted.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_encrypted_hardware-support_rawhide.cfg b/cook/recipes/gnome_virtual_encrypted_hardware-support_rawhide.cfg new file mode 100644 index 0000000..c9c7509 --- /dev/null +++ b/cook/recipes/gnome_virtual_encrypted_hardware-support_rawhide.cfg @@ -0,0 +1,25 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include storage/encrypted.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_encrypted_rawhide.cfg b/cook/recipes/gnome_virtual_encrypted_rawhide.cfg new file mode 100644 index 0000000..c9c7509 --- /dev/null +++ b/cook/recipes/gnome_virtual_encrypted_rawhide.cfg @@ -0,0 +1,25 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include storage/encrypted.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_hardware-support_43.cfg b/cook/recipes/gnome_virtual_hardware-support_43.cfg new file mode 100644 index 0000000..9078a54 --- /dev/null +++ b/cook/recipes/gnome_virtual_hardware-support_43.cfg @@ -0,0 +1,24 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_hardware-support_rawhide.cfg b/cook/recipes/gnome_virtual_hardware-support_rawhide.cfg new file mode 100644 index 0000000..9078a54 --- /dev/null +++ b/cook/recipes/gnome_virtual_hardware-support_rawhide.cfg @@ -0,0 +1,24 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_hypervisor-desktop_amdcpu_gnome_server_43.cfg b/cook/recipes/gnome_virtual_hypervisor-desktop_amdcpu_43.cfg similarity index 85% rename from cook/recipes/install_virtual_hypervisor-desktop_amdcpu_gnome_server_43.cfg rename to cook/recipes/gnome_virtual_hypervisor-desktop_amdcpu_43.cfg index 46c852d..c28989e 100644 --- a/cook/recipes/install_virtual_hypervisor-desktop_amdcpu_gnome_server_43.cfg +++ b/cook/recipes/gnome_virtual_hypervisor-desktop_amdcpu_43.cfg @@ -5,23 +5,23 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include packages/virtual-machine-manager/packages.ks +%include packages/virtual-machine-manager/post-scripts.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks %include desktop/gnome/post-scripts.ks -%include packages/virtual-machine-manager/packages.ks -%include packages/virtual-machine-manager/post-scripts.ks %include hypervisor/amdcpu.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_hypervisor-desktop_intelcpu_gnome_server_43.cfg b/cook/recipes/gnome_virtual_hypervisor-desktop_intelcpu_43.cfg similarity index 85% rename from cook/recipes/install_virtual_hypervisor-desktop_intelcpu_gnome_server_43.cfg rename to cook/recipes/gnome_virtual_hypervisor-desktop_intelcpu_43.cfg index 33bbfbf..e80135f 100644 --- a/cook/recipes/install_virtual_hypervisor-desktop_intelcpu_gnome_server_43.cfg +++ b/cook/recipes/gnome_virtual_hypervisor-desktop_intelcpu_43.cfg @@ -5,23 +5,23 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks %include initial-setup/server/config.ks +%include packages/virtual-machine-manager/packages.ks +%include packages/virtual-machine-manager/post-scripts.ks %include desktop/gnome/config.ks %include desktop/gnome/packages.ks %include desktop/gnome/post-scripts.ks -%include packages/virtual-machine-manager/packages.ks -%include packages/virtual-machine-manager/post-scripts.ks %include hypervisor/intelcpu.ks \ No newline at end of file diff --git a/cook/recipes/gnome_virtual_rawhide.cfg b/cook/recipes/gnome_virtual_rawhide.cfg new file mode 100644 index 0000000..9078a54 --- /dev/null +++ b/cook/recipes/gnome_virtual_rawhide.cfg @@ -0,0 +1,24 @@ +# __ ____ ____ _____ +# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ +# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ +# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / +# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ +# /_/ /____/ + +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system + +%include repo/fedora-43-mirrors.ks +%include core/base.ks +%include bootloader/grub.ks +%include storage/standard.ks +%include core/locale.ks +%include core/services.ks +%include core/network.ks +%include packages/core.ks +%include packages/fedora-remix.ks +%include packages/hand-picked.ks +%include core/security/enabled.ks +%include initial-setup/server/config.ks +%include desktop/gnome/config.ks +%include desktop/gnome/packages.ks +%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_server_rawhide.cfg b/cook/recipes/install_bare-metal_gnome_server_rawhide.cfg deleted file mode 100644 index ff12e44..0000000 --- a/cook/recipes/install_bare-metal_gnome_server_rawhide.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_43.cfg b/cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_43.cfg deleted file mode 100644 index a35c1f8..0000000 --- a/cook/recipes/install_virtual_gnome_encrypted_hardware-support_server_43.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_encrypted_server_43.cfg b/cook/recipes/install_virtual_gnome_encrypted_server_43.cfg deleted file mode 100644 index a35c1f8..0000000 --- a/cook/recipes/install_virtual_gnome_encrypted_server_43.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include storage/encrypted.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_hardware-support_server_43.cfg b/cook/recipes/install_virtual_gnome_hardware-support_server_43.cfg deleted file mode 100644 index fc6ca67..0000000 --- a/cook/recipes/install_virtual_gnome_hardware-support_server_43.cfg +++ /dev/null @@ -1,24 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_hardware-support_server_rawhide.cfg b/cook/recipes/install_virtual_gnome_hardware-support_server_rawhide.cfg deleted file mode 100644 index ff12e44..0000000 --- a/cook/recipes/install_virtual_gnome_hardware-support_server_rawhide.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_server_43.cfg b/cook/recipes/install_virtual_gnome_server_43.cfg deleted file mode 100644 index fc6ca67..0000000 --- a/cook/recipes/install_virtual_gnome_server_43.cfg +++ /dev/null @@ -1,24 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_gnome_server_rawhide.cfg b/cook/recipes/install_virtual_gnome_server_rawhide.cfg deleted file mode 100644 index ff12e44..0000000 --- a/cook/recipes/install_virtual_gnome_server_rawhide.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# An install recipe for desktop, server, or hypervisor - -%include core/base.ks -%include repo/fedora-43-mirrors.ks -%include storage/standard.ks -%include bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include packages/core-group.ks -%include packages/fedora-remix.ks -%include packages/hand-picked.ks -%include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file diff --git a/cook/recipes/live_bare-metal_hardware-support_43.cfg b/cook/recipes/live_bare-metal_hardware-support_43.cfg deleted file mode 100644 index 3cde725..0000000 --- a/cook/recipes/live_bare-metal_hardware-support_43.cfg +++ /dev/null @@ -1,20 +0,0 @@ -# __ ____ ____ _____ -# ____ / /_ __ __/ / /___ ____ ___ ___ / __ \/ ___/ -# / __ \/ __ \/ / / / / / __ \/ __ `__ \/ _ \ / / / /\__ \ -# / /_/ / / / / /_/ / / / /_/ / / / / / / __/ / /_/ /___/ / -# / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ -# /_/ /____/ - -# A live recipe for live-desktop or live-server - -%include live/core/base.ks -%include repo/fedora-43-mirrors.ks -%include live/core/storage.ks -%include live/core/bootloader/grub.ks -%include core/locale.ks -%include core/services.ks -%include core/network.ks -%include live/core/packages.ks -%include live/post/base.ks -%include live/post/session.ks -%include repo/rpmfusion-nonfree.ks \ No newline at end of file diff --git a/cook/recipes/install_virtual_server_rawhide.cfg b/cook/recipes/virtual_43.cfg similarity index 79% rename from cook/recipes/install_virtual_server_rawhide.cfg rename to cook/recipes/virtual_43.cfg index 3ddfc5c..4155c99 100644 --- a/cook/recipes/install_virtual_server_rawhide.cfg +++ b/cook/recipes/virtual_43.cfg @@ -5,18 +5,17 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks -%include initial-setup/server/config.ks -%include repo/rawhide-mirrors.ks \ No newline at end of file +%include initial-setup/server/config.ks \ No newline at end of file diff --git a/cook/recipes/install_bare-metal_gnome_server_43.cfg b/cook/recipes/virtual_rawhide.cfg similarity index 73% rename from cook/recipes/install_bare-metal_gnome_server_43.cfg rename to cook/recipes/virtual_rawhide.cfg index fc6ca67..4155c99 100644 --- a/cook/recipes/install_bare-metal_gnome_server_43.cfg +++ b/cook/recipes/virtual_rawhide.cfg @@ -5,20 +5,17 @@ # / .___/_/ /_/\__, /_/_/\____/_/ /_/ /_/\___/ \____//____/ # /_/ /____/ -# An install recipe for desktop, server, or hypervisor +# Universal template to generate kickstart recipes for a server, a desktop or a hypervisor system -%include core/base.ks %include repo/fedora-43-mirrors.ks -%include storage/standard.ks +%include core/base.ks %include bootloader/grub.ks +%include storage/standard.ks %include core/locale.ks %include core/services.ks %include core/network.ks -%include packages/core-group.ks +%include packages/core.ks %include packages/fedora-remix.ks %include packages/hand-picked.ks %include core/security/enabled.ks -%include initial-setup/server/config.ks -%include desktop/gnome/config.ks -%include desktop/gnome/packages.ks -%include desktop/gnome/post-scripts.ks \ No newline at end of file +%include initial-setup/server/config.ks \ No newline at end of file diff --git a/cook/recipes_manifest.yaml b/cook/recipes_manifest.yaml index 7f48a78..fefb749 100644 --- a/cook/recipes_manifest.yaml +++ b/cook/recipes_manifest.yaml @@ -11,13 +11,12 @@ # Example: version: ["43", "rawhide"] + storage: ["standard", "encrypted"] # creates 4 variants: (43,standard), (43,encrypted), (rawhide,standard), (rawhide,encrypted) # -# NOTE: The 'name' field is for organization only and doesn't affect generated filenames. -# The recipe type is always 'install' or 'live' from recipe_templates.yaml +# NOTE: The 'name' field is no longer used with the universal template. +# It can be kept for organization but doesn't affect generated filenames. recipes: - # Install desktop variants + # Desktop variants - name: desktop - recipe_type: install variants: - version: ["43", "rawhide"] desktop: gnome @@ -28,9 +27,8 @@ recipes: initial-setup: server security: secure - # Install server variants + # Server variants - name: server - recipe_type: install variants: - version: ["43", "rawhide"] storage: standard @@ -40,9 +38,8 @@ recipes: initial-setup: server security: secure - # Install hypervisor variants + # Hypervisor variants - name: hypervisor - recipe_type: install variants: - version: 43 storage: standard @@ -54,9 +51,8 @@ recipes: initial-setup: server security: secure - # Install desktop-hypervisor variants + # Desktop-hypervisor variants - name: desktop-hypervisor - recipe_type: install variants: - version: 43 desktop: gnome @@ -70,16 +66,14 @@ recipes: security: secure # Live desktop variants - - name: desktop - recipe_type: live + - name: desktop-live variants: - version: 43 hardware-support: true guest-agents: false # Live server variants - - name: server - recipe_type: live + - name: server-live variants: - version: 43 hardware-support: true diff --git a/cook/validators.py b/cook/validators.py index 8d4ce13..d0d6a93 100644 --- a/cook/validators.py +++ b/cook/validators.py @@ -72,28 +72,30 @@ class TemplateValidator: - Verifies 'required' key exists (base ingredients) 2. Required Ingredients Check: - - Iterates through template['required'] list - - Resolves each path relative to project_root + - Iterates through template['required'] nested dict structure + - For each section and value, checks if path(s) are valid - Checks if the file actually exists - - Reports missing files as errors - 3. Versioned Ingredients Check: + 3. Modifier Ingredients Check: + - Checks template['modifiers'] structure + - For each modifier and value, checks referenced files exist + + 4. Optional Ingredients Check: + - Checks paths in template['optional'] + - Verifies referenced files exist on disk + + 5. Versioned Ingredients Check: - Checks paths in template['versioned'] - If the path contains {version}, it's deferred to generation time - Otherwise checks if the resolved file exists - 4. Conditional Ingredients Check: - - Iterates through template['conditional'] - - For each modifier and value, checks referenced files exist - - Handles both single paths and lists of paths - - 5. Flag Ingredients Check: + 6. Flag Ingredients Check: - Checks all paths in template['flags'] - - Flags are boolean on/off switches + - Flags are simple boolean on/off switches Args: - template: The template dictionary to validate - Structure: {'description': str, 'required': [...], ...} + template: The entire template YAML content + Structure: {'name': str, 'description': str, 'required': {...}, ...} Returns: List of validation error strings (empty if valid)