[
  {
    "path": ".ansible-lint",
    "content": "# .ansible-lint\nskip_list:\n  - '208'\n  - command-instead-of-module  # Using command rather than module.\n  - command-instead-of-shell  # Use shell only when shell functionality is required.\n  - no-changed-when  # Commands should not change things if nothing needs doing.\n  - risky-shell-pipe  # Shells that use pipes should set the pipefail option.\n  - literal-compare  # Don't compare to literal True/False.\n  - var-naming[no-role-prefix]  # Internal variables don't need role prefix.\n"
  },
  {
    "path": ".dockerignore",
    "content": ".git\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: netbootxyz\nopen_collective: netbootxyz\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: 'bug'\nassignees: ''\n\n---\n\n[]: This bug persists when memory is increased beyond 8GB.\n<!--\nPlease validate that the issue is not a symptom of insufficient memory.\nMany installation media are based on live-cd images that require more than\na few MB/GB of memory to run.\n-->\n\n**Describe the bug**\n<!-- A clear and concise description of what the bug is. -->\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n\n**Expected behavior**\n<!-- A clear and concise description of what the bug is. -->\n\n**Screenshots**\n<!-- If applicable, add screenshots to help explain your problem. -->\n\n**Additional context**\n<!-- Add any other context about the problem here. -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question in the Discussions area\n    url: https://github.com/netbootxyz/netboot.xyz/discussions\n    about: Recommended place for questions, operating system discussion, and ideas.\n  - name: Ask a question on the netboot.xyz Discord Server\n    url: https://discord.gg/An6PA2a\n    about: Join the official netboot.xyz Discord!\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\n<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->\n\n**Describe the solution you'd like**\n<!-- A clear and concise description of what you want to happen. -->\n\n**Describe alternatives you've considered**\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\n\n**Additional context**\n<!-- Add any other context or screenshots about the feature request here. -->\n"
  },
  {
    "path": ".github/workflows/claude.yml",
    "content": "name: Claude PR Assistant\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  issues:\n    types: [opened, assigned]\n  pull_request_review:\n    types: [submitted]\n\njobs:\n  claude-code-action:\n    if: |\n      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||\n      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||\n      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||\n      (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: read\n      issues: read\n      id-token: write\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 1\n\n      - name: Run Claude PR Action\n        uses: anthropics/claude-code-action@beta\n        with:\n          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}\n          timeout_minutes: \"60\"\n"
  },
  {
    "path": ".github/workflows/development.yml",
    "content": "name: development\n\non:\n  push:\n    branches:\n      - development\n  workflow_dispatch:\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}\n  GITHUB_SHA: ${{ github.sha }}\n\njobs:\n  development-build:\n    name: Build Development\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: read\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        ref: development\n\n    - name: Retrieve Certs\n      run: |\n        ./script/retrieve_certs\n      env:\n        GIT_USER: ${{ secrets.GIT_USER }}\n        GIT_AUTH: ${{ secrets.GIT_AUTH }}\n        GIT_URL: ${{ secrets.GIT_URL }}\n        CERTS_KEY: ${{ secrets.CERTS_KEY }}\n\n    - name: Build Development Release\n      run: |\n        ./script/build_release dev\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v6\n      with:\n        role-to-assume: ${{ secrets.AWS_ROLE_DEV }}\n        aws-region: ${{ secrets.AWS_ACCESS_REGION }}\n\n    - name: Deploy development release to bucket/SHA\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_DEV }}/$GITHUB_SHA\n\n    - name: Deploy development version file to bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3outver s3://${{ secrets.AWS_S3_BUCKET_DEV }}\n\n    - name: Notify Discord on failure\n      if: failure()\n      run: |\n        ./script/message failure\n\n    - name: Notify Discord on completion\n      if: success()\n      run: |\n        ./script/message dev-push\n"
  },
  {
    "path": ".github/workflows/pull-requests.yml",
    "content": "name: pull-requests\n\non:\n  pull_request:\n    branches:\n      - development\n      - RC\n      - master\n\njobs:\n  test-pr:\n    name: Test Pull Request\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v6\n\n    - uses: actions/setup-python@v6\n      with:\n        python-version: '3.14' # renovate: datasource=github-tags depName=python\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install ansible==13.4.0 # renovate: datasource=pypi depName=ansible\n        pip install ansible-lint==26.3.0 # renovate: datasource=pypi depName=ansible-lint\n\n    - name: Syntax Check\n      run: |\n        ansible-playbook site.yml --syntax-check\n\n    - name: Ansible lint\n      run: |\n        ansible-lint -v roles/netbootxyz/tasks\n\n  build-pr:\n    name: Build Pull Request\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v6\n\n    - uses: actions/setup-python@v6\n\n    - name: Build PR release\n      run: |\n        ./script/build_release pr\n"
  },
  {
    "path": ".github/workflows/release-candidate.yml",
    "content": "name: release-candidate\n\non:\n  push:\n    branches:\n      - RC\n  workflow_dispatch:\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}\n  GITHUB_SHA: ${{ github.sha }}\n\njobs:\n  rc-build:\n    name: Build Release Candidate\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: write\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        ref: RC\n\n    - name: Retrieve Certs\n      run: |\n        ./script/retrieve_certs\n      env:\n        GIT_USER: ${{ secrets.GIT_USER }}\n        GIT_AUTH: ${{ secrets.GIT_AUTH }}\n        GIT_URL: ${{ secrets.GIT_URL }}\n        CERTS_KEY: ${{ secrets.CERTS_KEY }}\n\n    - name: Set Release Tag\n      run: echo \"release_tag=$(cat version.txt)-RC\" >> $GITHUB_ENV\n\n    - name: Build RC release\n      run: |\n        ./script/build_release rc\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v6\n      with:\n        role-to-assume: ${{ secrets.AWS_ROLE_STAGING }}\n        aws-region: ${{ secrets.AWS_ACCESS_REGION }}\n\n    - name: Deploy RC to release-candidate bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_STAGING }}/${{ env.release_tag }}\n\n    - name: Deploy RC to rolling bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_STAGING }}/rc\n\n    - name: Deploy RC version file\n      run: |\n        aws s3 sync --no-progress --acl public-read s3outver s3://${{ secrets.AWS_S3_BUCKET_STAGING }}\n\n    - name: Invalidate Cloudfront\n      run: |\n        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_STAGING }} --paths \"/rc/*\" \"/rc/ipxe/*\" \"/rc/sigs/*\"\n\n    - name: Tag RC Release\n      run: |\n        ./script/tag ${{ env.release_tag }}\n\n    - name: Extract release notes\n      id: extract-release-notes\n      uses: ffurrer2/extract-release-notes@v3\n\n    - name: Create RC Release and Upload Assets\n      uses: svenstaro/upload-release-action@v2\n      with:\n        file: githubout/*\n        file_glob: true\n        overwrite: true\n        prerelease: true\n        release_name: ${{ env.release_tag }}\n        repo_token: ${{ secrets.GITHUB_TOKEN }}\n        tag: ${{ env.release_tag }}\n        body: ${{ steps.extract-release-notes.outputs.release_notes }}\n\n    - name: Notify Discord on failure\n      if: failure()\n      run: |\n        ./script/message failure\n\n    - name: Notify Discord on completion\n      if: success()\n      run: |\n        ./script/message rc-push\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: release\n\non:\n  push:\n    branches:\n      - master\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}\n  GITHUB_SHA: ${{ github.sha }}\n\njobs:\n  release:\n    name: Build Release\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: write\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        ref: master\n\n    - name: Retrieve Certs\n      run: |\n        ./script/retrieve_certs\n      env:\n        GIT_USER: ${{ secrets.GIT_USER }}\n        GIT_AUTH: ${{ secrets.GIT_AUTH }}\n        GIT_URL: ${{ secrets.GIT_URL }}\n        CERTS_KEY: ${{ secrets.CERTS_KEY }}\n\n    - name: Set Release Tag\n      run: echo \"release_tag=$(cat version.txt)\" >> $GITHUB_ENV\n\n    - name: Build release\n      run: |\n        ./script/build_release release\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v6\n      with:\n        role-to-assume: ${{ secrets.AWS_ROLE_PROD }}\n        aws-region: ${{ secrets.AWS_ACCESS_REGION }}\n\n    - name: Deploy master to release bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_PROD }}/${{ env.release_tag }}\n\n    - name: Deploy master to rolling bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_PROD }}\n\n    - name: Invalidate Cloudfront\n      run: |\n        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_PROD }} --paths \"/*\" \"/ipxe/*\" \"/sigs/*\"\n\n    - name: Tag Release\n      run: |\n        ./script/tag ${{ env.release_tag }}\n\n    - name: Extract release notes\n      id: extract-release-notes\n      uses: ffurrer2/extract-release-notes@v3\n\n    - name: Create Release and Upload Assets\n      uses: svenstaro/upload-release-action@v2\n      with:\n        file: githubout/*\n        file_glob: true\n        overwrite: true\n        prerelease: false\n        release_name: ${{ env.release_tag }}\n        repo_token: ${{ secrets.GITHUB_TOKEN }}\n        tag: ${{ env.release_tag }}\n        body: ${{ steps.extract-release-notes.outputs.release_notes }}\n\n    - name: Notify Discord on failure\n      if: failure()\n      run: |\n        ./script/message failure\n\n    - name: Notify Discord on completion\n      if: success()\n      run: |\n        ./script/message live-push\n"
  },
  {
    "path": ".github/workflows/rolling.yml",
    "content": "name: rolling\n\non:\n  workflow_dispatch:\n  # Disabled automatic rolling releases during version updates\n  # push:\n  #   paths:\n  #     - 'endpoints.yml'\n  #     - 'roles/netbootxyz/defaults/main.yml'\n  #   branches:\n  #     - development\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}\n  GITHUB_SHA: ${{ github.sha }}\n\njobs:\n  rolling:\n    name: Build Release\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: write\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        ref: 'master'\n\n    - name: Retrieve Certs\n      run: |\n        ./script/retrieve_certs\n      env:\n        GIT_USER: ${{ secrets.GIT_USER }}\n        GIT_AUTH: ${{ secrets.GIT_AUTH }}\n        GIT_URL: ${{ secrets.GIT_URL }}\n        CERTS_KEY: ${{ secrets.CERTS_KEY }}\n\n    - name: Set Release Tag\n      run: echo \"release_tag=$(cat version.txt)\" >> $GITHUB_ENV\n\n    - name: Download endpoints.yml and main.yml from Development\n      run: |\n        wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/development/endpoints.yml -O endpoints.yml\n        wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/development/roles/netbootxyz/defaults/main.yml -O roles/netbootxyz/defaults/main.yml\n        chmod +x script/build_release\n        \n    - name: Build release\n      run: |\n        ./script/build_release rolling\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v6\n      with:\n        role-to-assume: ${{ secrets.AWS_ROLE_ROLLING }}\n        aws-region: ${{ secrets.AWS_ACCESS_REGION }}\n\n    - name: Deploy master to rolling bucket\n      run: |\n        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_PROD }}\n\n    - name: Invalidate Cloudfront\n      run: |\n        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_PROD }} --paths \"/*\" \"/ipxe/*\" \"/sigs/*\"\n\n    - name: Notify Discord on failure\n      if: failure()\n      run: |\n        ./script/message failure\n\n    - name: Notify Discord on completion\n      if: success()\n      run: |\n        ./script/message rolling-push\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# AGENTS.md\n\nGuidelines for AI coding agents working in the netboot.xyz repository.\n\n## Project Summary\n\nnetboot.xyz generates iPXE bootloaders and menus for 190+ operating systems using Ansible and Jinja2 templates. There is no application code in a traditional sense — the project produces `.ipxe` scripts and bootloader binaries.\n\n## Build Commands\n\n```bash\n# Syntax check (fast, run first)\nansible-playbook site.yml --syntax-check\n\n# Lint Ansible tasks\nansible-lint -v roles/netbootxyz/tasks\n\n# Full local build (generates menus + bootloaders to /var/www/html)\nansible-playbook site.yml\n\n# Menu-only build (skip bootloader compilation)\nansible-playbook site.yml -e \"generate_disks=false generate_checksums=false generate_signatures=false\"\n\n# Docker build (outputs to buildout/)\ndocker build -t localbuild --platform=linux/amd64 -f Dockerfile .\ndocker run --rm -it --platform=linux/amd64 -v $(pwd):/buildout localbuild\n\n# Release builds\n./script/build_release dev      # Development\n./script/build_release pr       # Pull request test\n./script/build_release rc       # Release candidate\n./script/build_release release  # Production\n./script/build_release rolling  # Rolling\n```\n\n### CI Checks (what PRs must pass)\n\n1. `ansible-playbook site.yml --syntax-check`\n2. `ansible-lint -v roles/netbootxyz/tasks`\n3. Full Docker build via `./script/build_release pr`\n\n### Testing\n\nMolecule tests exist but require Docker:\n```bash\npip install molecule molecule-docker\nmolecule test\n```\n\nThere are no unit tests. Validation is done through syntax checks, linting, and full builds.\n\n## Code Style\n\n### YAML / Ansible\n\n- Start every YAML file with `---` on line 1.\n- Use 2-space indentation consistently.\n- Use **fully-qualified collection names** (FQCN) for all modules:\n  - `ansible.builtin.template`, `ansible.builtin.set_fact`, `ansible.builtin.shell`, etc.\n  - Never use short names like `template:` or `shell:`.\n- Use `snake_case` for all variable names: `boot_domain`, `generate_menus`, `netbootxyz_root`.\n- Guard booleans with the `| default(true) | bool` pattern:\n  ```yaml\n  when:\n    - generate_menus | default(true) | bool\n  ```\n- Use `when:` as a list even for single conditions.\n- Use descriptive `name:` for every task.\n- The `.ansible-lint` config skips these rules (do not add workarounds for them):\n  - `command-instead-of-module`, `command-instead-of-shell`\n  - `no-changed-when`, `risky-shell-pipe`\n  - `literal-compare`, `var-naming[no-role-prefix]`\n\n### iPXE Templates (`.ipxe.j2` files)\n\n- Start with `#!ipxe` shebang on line 1.\n- Add a comment header with OS name and URL on lines 2-4.\n- iPXE scripts are **flat** — do not indent iPXE commands.\n- Use `#` for comments inside templates.\n- Variable conventions:\n  - iPXE runtime variables: `${variable_name}` (evaluated at boot time)\n  - Jinja2 template variables: `{{ variable }}` (evaluated at build time)\n  - These are often mixed: `${live_endpoint}{{ endpoints.foo.path }}`\n- Labels use `:label_name` in `snake_case`.\n- Navigation pattern: `goto ${menu} ||` at template start.\n- User selection: `choose <var> || goto <exit_label>`.\n- Exit pattern: clear menu and `exit 0`:\n  ```ipxe\n  :distro_exit\n  clear menu\n  exit 0\n  ```\n- Error pattern: echo, prompt, return to menu:\n  ```ipxe\n  :error\n  echo Error occurred, press any key to return to menu\n  prompt\n  goto main_menu\n  ```\n- Fallback chains: `command || goto fallback` for graceful degradation.\n- Architecture mapping varies by OS family:\n  - Red Hat: `x86_64` → `x86_64`, `arm64` → `aarch64`\n  - Debian: `x86_64` → `amd64`, `arm64` → `arm64`\n- Guard optional values: `isset ${variable}` in iPXE, `{% if value.field is defined %}` in Jinja2.\n\n### Jinja2 Patterns\n\n- Loop over releases: `{% for item in releases.<distro>.versions %}`\n- Sort by name: `{% for key, value in releases.items() | sort(attribute='1.name') %}`\n- Filter enabled items: `{% if value.enabled is defined and value.enabled | bool %}`\n- Template iteration uses `with_community.general.filetree` in tasks.\n\n### OS Definition Schema (`defaults/main.yml`)\n\n```yaml\nreleases:\n  distro_key:          # lowercase, no hyphens (e.g., almalinux, rockylinux)\n    name: \"Display Name\"\n    mirror: \"http://mirror.url\"\n    base_dir: \"path/on/mirror\"\n    enabled: true\n    menu: linux         # one of: linux, bsd, dos, unix\n    versions:\n      - code_name: \"version_id\"\n        name: \"Display Version\"\n```\n\nOptional fields: `archive_mirror`, `paths`, `flavors`, `platforms`, `version`.\n\n### Utility Definition Schema (`defaults/main.yml`)\n\n```yaml\nutilitiesefi:          # or utilitiespcbios64, utilitiespcbios32, utilitiesarm\n  utility_key:\n    name: \"Display Name\"\n    enabled: true\n    type: direct        # one of: direct, ipxemenu, memdisk, memtest, sanboot\n    kernel: \"<url>\"\n    initrd: \"<url>\"     # optional\n```\n\n## File Organization\n\n| Path | Purpose |\n|------|---------|\n| `site.yml` | Main playbook entry point |\n| `defaults/main.yml` | All OS/utility definitions and default config |\n| `endpoints.yml` | Live image endpoint URLs |\n| `user_overrides.yml` | Local overrides (not committed) |\n| `templates/menu/*.ipxe.j2` | ~100 iPXE menu templates |\n| `templates/disks/*.j2` | Bootloader embedded scripts |\n| `templates/pipxe/*.j2` | Raspberry Pi Makefile templates |\n| `tasks/*.yml` | 14 Ansible task files |\n| `vars/{debian,redhat,ubuntu}.yml` | Per-distro package lists |\n| `script/` | Build and release shell scripts |\n\n## Menu Hierarchy\n\n```\nmenu.ipxe (main) → linux.ipxe → ubuntu.ipxe, fedora.ipxe, ...\n                  → bsd.ipxe   → freebsd.ipxe, openbsd.ipxe, ...\n                  → live.ipxe  → live-ubuntu.ipxe, ...\n                  → utils-*.ipxe\n                  → windows.ipxe\n```\n\nMenus chain via `chain ${menu}.ipxe || goto error`. Signature verification gates chaining when `sigs_enabled` is true.\n\n## Error Handling\n\n- **Ansible**: Relies on default fail-fast behavior. No `block/rescue/always`. Guard tasks with `when:` conditions. Use `| default()` to prevent undefined variable errors.\n- **iPXE**: Use `command || goto fallback` chains. Protocol degradation: HTTPS → HTTP → local boot. Always provide a `:error` label that prompts the user.\n- **Shell scripts**: Use `set -e` at the top of all scripts.\n\n## Adding a New Operating System\n\n1. Add entry to `releases:` in `roles/netbootxyz/defaults/main.yml`.\n2. Create `roles/netbootxyz/templates/menu/<distro>.ipxe.j2` following existing templates.\n3. The menu template is auto-discovered via `filetree` iteration — no registration needed.\n4. Add the distro to the appropriate category menu (e.g., `linux.ipxe.j2`) if it needs a menu entry.\n5. If using live images, add endpoint to `endpoints.yml`.\n6. Test: `ansible-playbook site.yml --syntax-check && ansible-lint -v roles/netbootxyz/tasks`\n\n## Key Variables\n\n- **`boot_domain`**: Target domain for generated menus.\n- **`boot_version`**: Version string for releases.\n- **`site_name`**: Custom branding (defaults to `netboot.xyz`).\n- **`generate_menus` / `generate_disks`**: Enable/disable build components.\n- **`sigs_enabled`**: Enable signature verification for menu chaining.\n- **`live_endpoint`**: Base URL for live/rescue images.\n- **Runtime variables**: `${distro}_mirror` and `${distro}_base_dir` are auto-generated from `releases:` entries in `boot.cfg.j2` and available to all menu templates at boot time.\n\n## Git Workflow\n\n- **`development`**: Main development branch, default PR target.\n- **`RC`**: Release candidate staging.\n- **`master`**: Production releases.\n- Commit style: imperative mood, descriptive. Automated commits use `Version bump for ...` format.\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "<!-- markdownlint-configure-file {\"MD024\": { \"siblings_only\": true } } -->\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n## [3.0.0] - 2026-01-24\n\n### Added\n\n- Proxmox Datacenter Manager support with text and debug installation modes\n- Memtest86+ v8.00 series support\n\n### Changed\n\n- **BREAKING**: Updated embedded certificates used for image signature verification in iPXE bootloaders\n- Users with 2.x bootloaders will be automatically upgraded to 3.x on first boot\n- Bumped major version to 3.x series due to code signing certificate updates requiring bootloader update\n- Various distribution version updates across all supported operating systems\n- Improved certificate retrieval script with commit SHA validation output\n\n### Fixed\n\n- Oracle Linux menu items now properly filter by architecture (x86_64 vs aarch64)\n- OpenSUSE Tumbleweed ARM64 build configuration corrected to use ports mirror\n- Flatcar Container Linux boot redirect issue resolved\n\n## [2.0.89] - 2025-11-08\n\n### Added\n\n- OpenSUSE 16.0 support with live ISO boot method\n- Dasharo Tools Suite updated to v2.7.0 and v2.7.1\n\n### Changed\n\n- Updated Ansible to v12 for improved build system\n- Updated ansible-lint to v24.12.2 with compatibility fixes\n- Various distribution version updates:\n  - Arch Linux updated to 2025.11.01\n  - SmartOS updated to 20251030T000436Z\n  - CoreOS updated to 42.20251012.3.0-stable, 43.20251024.2.0-testing, 43.20251027.1.0-next\n  - IPFire updated to 2.29-core198\n- Improved dependency tracking in GitHub workflows\n- Updated GitHub Actions:\n  - actions/checkout to v5\n  - actions/setup-python to v6\n  - aws-actions/configure-aws-credentials to v5\n\n### Fixed\n\n- OpenSUSE 16.0 boot configuration now uses live ISO method with proper root= parameter\n- Ansible-lint configuration updated to skip var-naming rule for internal variables\n- CI/CD compatibility issues resolved between Ansible and ansible-lint versions\n- Renovate configuration JSON syntax errors corrected\n\n## [2.0.88] - 2025-08-09\n\n### Added\n\n- CachyOS live distribution with archiso boot configuration\n- Ubuntu Spins distribution template for Ubuntu flavor variants  \n- Debian 13 (Trixie) net installer\n- Rocky Linux 10 and AlmaLinux 10 \n- Flatcar Container Linux ARM64 architecture support\n- Proxmox VE 9.0\n- Dasharo Tools Suite updated to v2.6.0\n- SystemRescue archiso_pxe_http initrd support\n\n### Changed\n\n- FreeDOS updated to v1.4 with corrected URLs\n- Various distribution version updates and endpoint refreshes\n- Improved MAC address handling in TFTP boot configuration\n\n### Fixed\n\n- Fedora CoreOS kernel filename format corrected\n\n### Removed\n\n- Deepin distribution completely removed from the system\n\n## [2.0.87] - 2025-05-08\n\n### Added\n\n- Fedora Onyx build\n- Kali arm64 Added\n\n### Changed\n\n- Various version updates\n- Cleanup of older distros from endpoints\n\n## [2.0.86] - 2025-03-13\n\n### Added\n\n- Support for Kairos\n- Enabled NFS support in iPXE\n\n## [2.0.85] - 2025-02-23\n\n### Changed\n\n- Various version updates\n- Checks for boot timeout from local-vars.ipxe\n\n## [2.0.84] - 2025-01-04\n\n### Added\n\n- UEFI Shell available under utilities for x86/ARM UEFI mode\n- Floppy boot images for UEFI\n- Dasharo Tools Suite\n- Latest GRML added with ARM support\n\n### Changed\n\n- Moves win_base_url and rhel_base_url out of boot.cfg to local-vars.ipxe as they are\n  user defined variables.\n- Adds a check in boot.cfg to see if live_endpoint is set from local-vars.ipxe. This\n  will allow the user to set their overrides locally on their network.\n\n## [2.0.83] - 2024-11-07\n\n### Changed\n\n- Various version updates\n\n## [2.0.82] - 2024-09-18\n\n### Changed\n\n- Various version updates\n\n## [2.0.81] - 2024-08-10\n\n### Added\n\n- Added ZFSBootMenu\n- Added VanillaOS\n- Added Super Grub2 Disk for EFI\n\n### Fixed\n\n- Slowness with Ubuntu 24.04 net install getting stuck on Cloud Init\n- Removed hard coded console on VyOS to fix on Equinix Metal\n\n## [2.0.80] - 2024-07-17\n\n### Added\n\n- Adds option for setting System Resuce password \n\n### Removed\n\n- Scientific Linux (EOL)\n\n## [2.0.79] - 2024-05-25\n\n### Added\n\n- Added Talos to arm64 menu\n- Ubuntu 24.04 LTS, Fedora 40, and many other version updates\n\n### Changed \n\n- Dropped newer Ubuntu Live Image versions as they don't properly work anymore\n\n## [2.0.78] - 2024-03-30\n\n### Fixed\n\n- Resolves an issue with the generated index having incorrect naming on the links due\n  to a previous variable name change on the index template\n- Proxmox iso names are corrected for backup and mailgateway\n\n## [2.0.77] - 2024-02-24\n\n### Fixed\n\n- Talos menu fixed\n\n### Changed\n\n- Use bootloader_filename instead of site_name for bootloader filenames\n\n## [2.0.76] - 2023-12-31\n\n### Added\n\n- Memtest86+ 6.20 for EFI and Legacy x86_64 modes, leaves 5.01 for Legacy purposes\n  as some issues were noticed loading 6.20 Legacy on KVM where it hangs on\n  loading but works fine using VMware.\n- ARM ISO and USB Images added\n- Tunable make_num_jobs for compiling in parallel\n\n## [2.0.75] - 2023-12-03\n\n### Fixed\n\n- Updated CentOS to be able to pull arm64 images\n- Updates to images that may have been missing curl in the\n  initrd for booting\n\n### Changed\n\n- Uses exit 1 on local boot now to allow for it to roll over\n  to next device in UEFI (Issue #1276)\n- Switches to using proxmox iso from asset releases so that it can\n  also be installed via local assets (Issue #1350)\n\n## [2.0.74] - 2023-11-14\n\n### Changed\n\n- Update rescue flag to include inst. prefix on RHEL based distros\n\n### Fixed\n\n- Minor bugs in Fedora menu\n- CAINE booting\n\n### Removed\n\n- Anarchy Linux\n\n## [2.0.73] - 2023-10-13\n\n### Added\n\n- Fedora 39 stubbed out for release later this month\n- Ubuntu 23.10\n- Text UI support for Proxmox Distros\n\n### Fixed\n\n- Fixed an issue with Fedora would error with \"Could not boot\"\n\n### Removed\n\n- Remove AVG as it's no longer maintained\n\n## [2.0.72] - 2023-09-15\n\n### Fixed\n\n- Fixed an issue where Proxmox/QEMU users using Legacy mode would hang or\n  reboot when loading an OS. Would have affected 2.0.70 and 2.0.71 releases.\n\n## [2.0.71] - 2023-09-09\n\n### Added\n\n- Added NixOS option for ARM\n\n### Changed\n\n- Adjusted bootloader logic for detecting v6 and v6 scenarios\n\n### Fixed\n\n- Kickstart URLs were broken on RHEL based distros if text install\n  was being used.\n\n## [2.0.70] - 2023-07-03\n\n### Added\n\n- Enabled CERT_CMD in iPXE\n- Added Debian 12\n- Disable pci scan option when loaded on ARM/EFI as command isn't supported\n- Building snp and snponly builds for Equinix Metal\n\n### Changed\n\n- Changed default Equinix Metal builds to use snp to ensure more stable start\n- Changed CentOS 9 Stream mirror due to it no longer working with iPXE\n\n## [2.0.69] - 2023-05-07\n\n### Added\n\n- Ubuntu 23.04 (Lunar)\n- Fedora 38\n- Added multiarch combined ISO and IMG file for x86_64 and arm64\n\n## [2.0.68] - 2023-04-02\n\n### Changed\n\n- Various versions updated, no major changes\n\n## [2.0.67] - 2023-02-18\n\n### Added\n\n- Enabled Link Layer Discovery Protocol (LLDP)\n- OpenSUSE ARM Support\n\n## [2.0.66] - 2022-12-28\n\n### Fixed\n\n- Adjusted Mint menu generation for minor releases to fix rolling\n\n## [2.0.65] - 2022-12-03\n\n### Fixed\n\n- Removed deprecated arg from Ansible playbook to fix dev and rolling\n\n## [2.0.64] - 2022-11-23\n\n### Removed\n\n- Removed RancherOS\n\n## [2.0.63] - 2022-10-23\n\n### Added\n\n- Fedora 37 (to be released)\n- Ubuntu 20.10 (Kinetic Kudu)\n\n## [2.0.62] - 2022-09-13\n\n### Changes\n\n- Uses inst.text instead of text on redhat based distros\n\n### Fixed\n\n- Menu was incorrect on AlmaLinux on aarch64\n\n## [2.0.61] - 2022-08-28\n\n### Added\n\n- Various version updates\n- Viewpoint attribute on boot.netboot.xyz index\n- Oracle Linux aarch64\n\n### Changes\n\n- Various Ansible Lint fixes\n\n### Fixed\n\n- Ubuntu 22.04 version issues related to minor increments\n\n## [2.0.60] - 2022-07-24\n\n### Added\n\n- Added Fedora Kionite\n\n### Changes\n\n- Collapsed Dockerfiles into one\n- Various version updates\n- Cleaned up some EOL versions\n\n## [2.0.59] - 2022-05-28\n\n### Added\n\n- VMware Photon 4.0\n\n## [2.0.58] - 2022-04-22\n\n### Added\n\n- Ubuntu 22.04 LTS Jammy Jellyfish\n- Fedora 26 Prep for release\n\n### Changes\n\n- Disabled RPI image as it was failing, will need to revisit in future\n- Lint fixes\n\n## [2.0.57] - 2022-03-21\n\n### Added\n\n- Proxmox Backup Server\n- Proxmox Mail Gateway\n\n### Changes\n\n- Proxmox pulls ISO from upstream site now, consolidated Proxmox items to one menu\n\n## [2.0.56] - 2022-02-26\n\n### Fixed\n\n- Added a ipxe_cloud_config for packet and metal for older clients\n\n## [2.0.55] - 2022-02-12\n\n### Added\n\n- Slackware 15.0\n\n### Fixed\n\n- Hardset Flatcar Linux initrd to fix booting (`https://github.com/netbootxyz/netboot.xyz/issues/1070`)\n- Archlinux now sets archtecture correctly with static ips\n\n### Changes\n\n- Changes Packet bootloaders to Equinix Metal\n- Switch archlinux default mirror to mirrors.edge.kernel.org to avoid redirect\n\n## [2.0.54] - 2021-12-25\n\n### Added\n\n- CentOS 9 Stream hardset url\n- Various version updates\n\n## [2.0.53] - 2021-11-22\n\n### Added\n- Fedora 35\n- Various version updates\n\n## [2.0.52] - 2021-10-31\n\n### Added\n\n- Support for ProxyDHCP environments\n\n## [2.0.51] - 2021-10-15\n\n### Added\n\n- Fedora CoreOS - aarch64 support\n- Garuda Linux Live builds\n- Ubuntu 21.10 live builds and installers\n- Added Padded Floppy builds for tooling sensitive to size of disk\n- Added logic for building iPXE linux binaries\n\n### Fixed\n\n- Manjaro builds working again\n\n## [2.0.50] - 2021-10-03\n\n### Added\n\n- Added Clonezilla 32-bit\n\n### Changed\n\n- Proper rolling for boot.netboot.xyz implemented, endpoints.yml and defaults\n  are now pushed to boot.netboot.xyz upon update in development branch to\n  ensure version updates can be consumed as identified. Allows for new versions\n  to be available before a release.\n\n## [2.0.49] - 2021-09-29\n\n### Added\n\n- Support for Ubuntu 20.04 Subiquity and up on arm64\n- Added Archlinux 32-bit\n- Added shredos for 32-bit\n- Added systemrescue for 32-bit\n- Added Fedora 35 Beta\n- Added Ubuntu 21.10 Impish Indri Beta\n\n### Fixed\n\n- Corrected architecture naming on k3os\n\n### Changed\n\n- Split pcbios utilities menu into 32-bit and 64-bit options\n- utilitiespcbios is now utilitiespcbios64 and utilitiespcbios32 for overrides\n- Renamed ubuntu netboot assets to align better with existing branches\n\n## [2.0.48] - 2021-09-17\n\n### Added\n\n- Support for Harvester\n- Support for Tails\n- Support for Kali 32-bit net installer\n- Support for hrmpf\n- Support for Gentoo 32-bit and arm64 installers\n- Added EFI support for OpenBSD using sanboot\n- Adds additional options for arm64 iPXE binary downloads\n\n## [2.0.47] - 2021-08-30\n\n### Fixed\n\n- Corrects an issue with loading 32-bit linux menu on 64-bit platforms (https://github.com/netbootxyz/netboot.xyz/issues/978)\n\n## [2.0.46] - 2021-08-29\n\n### Fixed\n\n- Fix incorrect arch introduced on Ubuntu\n\n## [2.0.45] - 2021-08-29\n\n### Added\n\n- Created a seperate menu for supported 32-bit Operating Systems\n- Enables utility menu for Packet non EFI\n- Updated arm menu\n\n### Fixed\n\n- Refactor of architecture checks, better support for i386 and arch distros\n- Arm64 and i386 options work now\n- Added kernel_params for console overrides to utility images\n\n### Changed\n\n- Dropped some older EOL distros\n\n## [2.0.44] - 2021-08-24\n\n### Added\n\n- Enables utility menu for Packet EFI\n- Added Debian 11 Live Builds\n- Adds Param command to iPXE builds\n- Adds next-server and version info when booted locally\n\n### Fixed\n\n- Fixes console issues for Ubuntu and Debian on Packet\n\n### Changes\n\n- Updates to Voyager menu to let it be more dynamic\n\n## [2.0.43] - 2021-08-19\n\n### Added\n\n- Adds Proxmox VE\n- Adds Zorin 16\n- Adds Elementary OS 6\n- Enables ability to add custom commands early in menu load with early_menu_*\n- Adds ability to change install priority on Ubuntu Legacy\n- Adds a toggle for enabling local-vars.ipxe\n\n### Fixed\n\n- Adjustments to index.html template, adds description\n- Readme tweaks for new site\n\n## [2.0.42] - 2021-08-01\n\n### Added\n\n- Debian 11 (Bullseye) ahead of release\n\n### Fixed\n\n- Gentoo more reliable, switches to initrd.magic to avoid modifying initrd\n- Fixes to Mint menu to populate options correctly\n- Cosmetic fixes to index.html.j2 tables\n\n## [2.0.41] - 2021-07-08\n\n### Added\n\n- Adds support for openEuler\n- Adds ping command to iPXE build\n\n### Fixed\n\n- NixOS working again, using images and iPXE configs that are generated upstream\n\n### Changes\n\n- Use non https repo for almalinux\n- Switch to using initrd.magic (`https://github.com/ipxe/ipxe/commit/e5f02551735922eb235388bff08249a6f31ded3d`)\n- Moves initrd= and cmdline values to single kernel parameter in Ansible\n\n## [2.0.40] - 2021-06-12\n\n### Added\n\n- Adds support for VMware ESXi with user supplied media\n\n## [2.0.39] - 2021-05-15\n\n### Added\n\n- Enabled gzip and zlib support on iPXE binaries\n\n### Fixed\n\n- Check for legacy undionly filename if running menu locally\n\n## [2.0.38] - 2021-05-02\n\n### Added\n\n- Fedora 34 and Live Versions\n- Redo Rescue\n- Rescuezilla\n- Rocky Linux\n\n### Changed\n\n- Switched to using upstream genfsimg for building hybrid images\n- Merged Legacy and EFI disks into single image for USB and ISOs\n- Can now use autoexec.ipxe on the root of a USB key to inject variables or modify the starting bootloader\n- Renamed USB disk from .usb to .img\n\n## [2.0.37] - 2021-04-25\n\n### Added\n\n- Ubuntu 21.04 Installer and Live Versions\n\n### Fixed\n\n- Version number variable tweaks\n\n## [2.0.36] - 2021-04-18\n\n### Added\n\n- Support for ShredOS\n\n## [2.0.35] - 2021-04-02\n\n### Added\n\n- Support for EndeavourOS\n\n## [2.0.34] - 2021-03-13\n\n### Added\n\n- Support for AlmaLinux\n\n### Fixed\n\n- Updated Debian Kernel for Live images, transitioned over to Actions from Travis\n\n## [2.0.33] - 2021-03-06\n\n### Removed\n\n- Parrot NetInstall images are no longer maintained\n- Removed Velt as it appears deprecated\n\n## [2.0.32] - 2021-02-09\n\n### Fixed\n\n- Update to latest Ubuntu maintenance release\n\n### Changed\n\n- Disabled Unix Menu on EFI as SmartOS not working in that mode and was the only option on EFI\n- Various version updates\n\n## [2.0.31] - 2021-01-18\n\n### Fixed\n\n- Fixes results too large bug introduced on Ubuntu menu\n\n### Changed\n\n- Change priority to low on Ubuntu Legacy installer\n\n## [2.0.30] - 2021-01-17\n\n### Added\n\n- Can now download hybrid bootloaders that contain x86_64 Legacy and EFI builds in one image.\n  Enables the user to use one ISO or USB key for multiple scenarios.\n- Ability to use custom URLs for menus instead of just relying on Github netboot.xyz-custom repo.\n\n### Changed\n\n- Added the legacy installer back for Ubuntu 20.04 (Focal).  20.04 will be the last\n  version to support legacy Debian Installer with autoinstall being the new Ubuntu\n  standard going foward.\n- Various version updates\n\n## [2.0.29] - 2020-12-28\n\n### Changed\n\n- Various version updates\n- Switched asset builders from Github to Travis\n- Introduced changelog\n\n## [2.0.28] - 2020-12-09\n\n### Added\n\n- VyOS Support\n\n### Changed\n\n- Switches to GitHub Actions from Travis CI for primary repo automation\n\n## [2.0.27] - 2020-11-20\n\n### Changed\n\n- Change builder image name\n- Remove older Kali images, fix menu for latest version\n- Switch to inst.repo for Red Hat based OS\n- Allow for static assigned networking to work on Ubuntu builds\n\n## [2.0.26] - 2020-11-18\n\n### Added\n\n- Adds a hook in the bootloader that checks for local-vars.ipxe from a local tftp server, useful for loading up variables before loading the menu. Can be used to ensure github user is set by default for custom menus.\n\n### Changed\n\n- Switches builder to netbootxyz docker image on Github Container Registry\n- Simplfied Fedora Live menu\n\n### Fixed\n\n- Bugfix on NixOS menu\n\n## [2.0.25] - 2020-11-07\n\n### Added\n\n- Initial support for Raspberry Pi iPXE bootloader which allows you to boot using SD Card or USB key. (Experimental)\n- Ubuntu 20.10 Grovvy Live Images\n- Added support for Ubuntu 20.04/20.10 Subiquity Server installers\n- Added Fedora 33 net installer and live images\n\n### Changed\n\n- Fedora Core build version is now updated automatically.\n\n## [2.0.24] - 2020-10-28\n\n### Fixed\n\n- Fixed github releases\n\n## [2.0.23] - 2020-10-27\n\n### Added\n\n- Ubuntu 20.10 Groovy Gorilla - Live CD install only\n- Fedora 33\n- OpenBSD 6.8\n\n## [2.0.22] - 2020-10-11\n\n### Fixed\n\n- Fixed Anarchy Linux\n\n### Changed\n\n- Pin builders to Ansible 2.10\n\n## [2.0.21] - 2020-09-13\n\n### Changed\n\n- Version updates\n\n## [2.0.20] - 2020-08-28\n\n### Fixed\n\n- Archlinux url fixes\n\n## [2.0.19] - 2020-08-12\n\n### Added\n\n- Adds ability to add custom kernel command line parameters\n\n### Fixed\n\n- Sets proper RELEASE Tag when creating a Github Release\n\n## [2.0.18] - 2020-07-24\n\n### Fixed\n\n- Fixed Fedora CoreOS build\n- Various unnamed bugs\n\n## [2.0.17] - 2020-06-30\n\n### Added\n\n- CentOS 8.2\n- Mint 20\n- OpenSUSE Leap 15.2\n\n### Changed\n\n- Changes to K3OS deployments\n- Tweaks to ARM64 menus,  added ARM placeholders for Utility menu\n\n## [2.0.16] - 2020-06-09\n\n### Added\n\n- Adds Devuan back in with latest Beowulf\n\n### Fixed\n\n- Corrects issue with Fedora and text mode\n\n## [2.0.15] - 2020-05-20\n\n### Added\n\n- Backbox 7\n\n### Fixed\n\n- CentOS path fixes\n\n## [2.0.14] - 2020-05-06\n\n### Added\n\n- Fedora 32 and Ubuntu 20.04 live assets\n- PopOS 20.04\n- Parrot 4.9\n\n### Changed\n\n- Bump to CentOS 7.8\n- Moved NixOS to hosted live assets\n\n## [2.0.13] - 2020-04-24\n\n### Changed\n\n- Ubuntu 20.04 url\n- NixOS 20.03\n\n## [2.0.12] - 2020-04-23\n\n### Added\n\n- Ubuntu 20.04 LTS added and 20.04 stock live builds updated\n\n### Changed\n\n- Fedora 32 added and 29 dropped\n\n### Removed\n\n- Removed test forked or branched code from github as it no longer works\n\n## [2.0.11] - 2020-04-01\n\n### Added\n\n- Clonezilla Testing/Stable\n- Gentoo instlaler LiveCD\n- Nitrux Stable\n- System Rescue CD\n- Zorin Linux\n- Manjaro Live CDs\n- KDE-neon\n- Sparky Linux Rolling and Stable\n- 4mLinux core and SSS\n- SmartOS version tags\n- BlueStart Linux\n- Parrot Linux installer\n- Bodhi 5 standard and app pack\n- Linux Mint Debian Edition\n\n### Fixed\n\n- Fixed CentOS kickstart url\n\n### Removed\n\n- Dropped tails support\n\n## [2.0.10] - 2020-03-07\n\n### Changed\n\n- Various version updates\n\n## [2.0.9] - 2020-02-16\n\n### Changed\n\n- Various version updates\n\n## [2.0.8] - 2020-02-06\n\n### Added\n\n- SmartOS\n- 4MLinux\n- BakAndImgCD\n- The Smallest Server Suite\n\n### Fixed\n\n- Various bug fixes\n\n## [2.0.7] - 2020-01-25\n\n### Added\n\n- CentOS 8.1\n- Gentoo (working now)\n- Fatdog\n- Kaspersky Rescue Disk\n- LXLE\n- Live Raise\n- Septor\n- Tiny Core Linux using kernels instead of memdisk\n\n## [2.0.6] - 2020-01-19\n\n### Added\n\n- Oracle Linux\n- Anarchy Installer\n- Bluestart Live\n- Zen Graphical Installer for Arch\n- Kodachi Linux\n- Bohdi Linux\n- Boot Repair CD\n- Devuan Live\n- gparted Live\n- grml Live\n- Parrot Live\n- Rescatux\n- System Rescue CD\n- CAINE\n- Nitrux\n- Velt Live\n- Fedora CoreOS back in\n\n### Removed\n\n- Security Menu and merges those options into Linux and Live menus\n- Unused external signature checking code\n\n## [2.0.5] - 2020-01-11\n\n### Added\n\n- SparkyLinux\n- K3OS\n- RHEL menu option back to Linux Menu\n- Support for text mode on RHEL/Fedora\n- netboot.xyz endpoints menu under Utilities for testing Dev/Staging/Prod endpoints\n- Enables auto login for Rancher\n\n## [2.0.4] - 2020-01-06\n\n### Added\n\n- PCI Device List\n- VLAN Tagging Support in Manual Configuration\n- DBAN\n- Clonezilla\n- Breakin\n- FerenOS\n- Q4OS 3.10\n\n### Fixed\n\n- FreeBSD working\n- Captures upstream iPXE version as ipxe_version\n- Fixes Packet and GCE Versioning\n\n## [2.0.3] - 2020-01-02\n\n### Fixed\n\n- Fixes for Live CD and Menus\n\n## [2.0.2] - 2019-12-31\n\n### Fixed\n\n- Windows fixes, timeout for version checking\n- Fixes for Deepin and Elementary\n\n## [2.0.1] - 2019-12-27\n\n### Fixed\n\n- Fixes some index.html issues so that iPXE clients exit properly\n- Change flags on genisoimage reflect el-torito options\n- Move generate_signatures to end of playbook\n- Moves retrieval of latest menu version from about to menu to ensure variable is always loaded\n- Generates the version file for netboot.xyz site\n- Enable epel for packages like figlet\n- Fixes some discord messaging\n\n## [2.0.0] - 2019-12-26\n\n### Changes\n- Switches primary boot.netboot.xyz to deploy deployed with Ansible and sets up 2.x rolling release series\n\n## [1.9.9] - 2019-12-13\n\n### Deprecated\n- Pre 2.x series before being deployed with Ansible\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to netboot.xyz\n\nFirst of all, thank you for supporting the netboot.xyz community and for \nconsidering contributing to the project!\n\n## How to Contribute\n\nBecause netboot.xyz supports many different operating systems and utilities, it\ntakes work and time to keep the many options updated.  Distributions may add a\nnew version of the operating system, locations of files can change, and versions\nmight go end of life and drop off the mirrors.\n\nThe end goal is to support as many operating systems as possible so that it's\nreally easy to go explore new operating systems and tools from one location.\n\n## What can I do to help?\n\n### Help keep netboot.xyz updated\n\nIf you noticed one of your favorite operating system or tool has been updated,\nfeel free to open a [Pull Request] to get the operating system updated.  It \nwill be reviewed and merged once validated.\n\n### Add support for new OS and Utilities\n\nDo you have a favorite utility that you use often but isn't on netboot.xyz?\nFeel free to request it being added or submit a [Pull Request].\n\n### Ask your distribution to become netboot friendly\n\nIf you don't see support for your favorite distribution in netboot.xyz, please\nopen up an [issue] with netboot.xyz and if possible, open up an issue with the\ndistribution.\n\nAsk for the distribution to provide a way to load installer kernels from\ntheir mirror directly or provide key files from their release ISO somewhere that\nis accessible over HTTP. This usually might be a `vmlinuz`, an `initrd`, and\npotentially a `rootfs` and could be extracted and hosted on the mirror when the\nrelease is generated. Providing these allows not only netboot.xyz to load the\ninstaller from a supported and trusted location but also users to do the same\nfrom their own PXE servers. In this day and age as physical media is less\nnecessary, having the option to pull files as needed is much more efficient\nespecially when you may have limited bandwidth.\n\n### Improve the documentation and knowledgebase\n\nWe are trying to make netboot.xyz a place to come to learn about infrastructure\nautomation so creating good docs on not only the project but how other distributions\nautomation works is important. A lot of the logic on booting is currently in code but\ngetting those into site documentation as well helps them to be better searchable by\nsearch engines. If you are a technical writer, feel free to contribute docs that\nwould enable others to learn and grow.\n\n### Submit ideas\n\nWe are always looking for new ideas to make the tool more useful, if you have an\nidea, feel free to open up a Github [issue] or open up a [Pull Request].\n\n### Communication Channels\n\n* [Discord](https://discord.gg/An6PA2a) Chat Server for netboot.xyz discussions, questions, and development\n* Follow us on [Twitter](https://twitter.com/netbootxyz) at [@netbootxyz](https://twitter.com/netbootxyz)\n  for the latest updates\n* Start a [discussion](https://github.com/netbootxyz/netboot.xyz/discussions) or share something cool you have done with the project.\n\n### Donate\n\nWe have set up an [Open Collective](https://opencollective.com/netbootxyz) and [Github Sponsors](https://github.com/sponsors/netbootxyz) to open the project up to those who wish to donate to help out the project. This may cover hosting and domain fees, hardware for validation testing, or anything else that comes up in maintaining a project like this. Every little bit will help! If you enjoy the work we do, please support us!\n\n## Enjoy and have fun!\n\n[issue]: https://github.com/netbootxyz/netboot.xyz/issues/new\n[Pull Request]: https://github.com/netbootxyz/netboot.xyz/pulls\n"
  },
  {
    "path": "Dockerfile",
    "content": "ARG NBXYZ_OVERRIDES=default\n\nFROM ghcr.io/netbootxyz/builder:latest AS builder\n\n# repo for build\nCOPY . /ansible\n\nFROM builder AS netbootxyz-default\nENV EXTRA_VARS=\"\"\n\nFROM builder AS netbootxyz-production\nENV EXTRA_VARS=\"--extra-vars @script/netbootxyz-overrides.yml\"\n\nFROM netbootxyz-${NBXYZ_OVERRIDES} AS final\nRUN \\\n  echo \"**** running ansible ****\" && \\\n  cd /ansible && \\\n  ansible-playbook site.yml ${EXTRA_VARS}\n\n# runtime stage\nFROM alpine:latest\n\nCOPY --from=final /var/www/html/ /mnt/\nCOPY docker-build-root/ /\n\nENTRYPOINT [ \"/dumper.sh\" ]\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n"
  },
  {
    "path": "README.md",
    "content": "## netboot.xyz [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Your%20favorite%20operating%20systems%20in%20one%20place!&url=https://netboot.xyz&hashtags=netbootxyz,ipxe,pxe,linux,tech,code)\n\nYour favorite operating systems in one place!\n\n[![Build Status](https://github.com/netbootxyz/netboot.xyz/workflows/release/badge.svg)](https://github.com/netbootxyz/netboot.xyz/actions?query=workflow%3Arelease)\n[![Discord](https://img.shields.io/discord/425186187368595466)](https://discord.gg/An6PA2a)\n[![Release](https://img.shields.io/github/v/release/netbootxyz/netboot.xyz?color=hunter%20green)](https://github.com/netbootxyz/netboot.xyz/releases/latest)\n![GitHub all releases](https://img.shields.io/github/downloads/netbootxyz/netboot.xyz/total)\n\n![netboot.xyz menu](https://netboot.xyz/images/netboot.xyz.gif)\n\n### Bootloader Downloads\n\n#### Combined Legacy and UEFI iPXE Bootloaders\n\n| Type | Bootloader | Description |\n|------|------------|-------------|\n|ISO| [netboot.xyz.iso](https://boot.netboot.xyz/ipxe/netboot.xyz.iso)| Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box |\n|USB| [netboot.xyz.img](https://boot.netboot.xyz/ipxe/netboot.xyz.img)| Used for creation of USB Keys|\n\n#### Legacy (PCBIOS) iPXE Bootloaders\n\n| Type | Bootloader | Description |\n|------|------------|-------------|\n|Kernel| [netboot.xyz.lkrn](https://boot.netboot.xyz/ipxe/netboot.xyz.lkrn)|Used for booting from GRUB/EXTLINUX|\n|Floppy| [netboot.xyz.dsk](https://boot.netboot.xyz/ipxe/netboot.xyz.dsk)| Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc|\n|Padded Floppy| [netboot.xyz.pdsk](https://boot.netboot.xyz/ipxe/netboot.xyz.pdsk)| Padded Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc|\n|DHCP| [netboot.xyz.kpxe](https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe)| DHCP boot image file, uses built-in iPXE NIC drivers|\n|DHCP-undionly| [netboot.xyz-undionly.kpxe](https://boot.netboot.xyz/ipxe/netboot.xyz-undionly.kpxe)| DHCP boot image file, use if you have NIC issues|\n\n#### UEFI iPXE Bootloaders\n\n| Type | Bootloader | Description |\n|------|------------|-------------|\n|DHCP| [netboot.xyz.efi](https://boot.netboot.xyz/ipxe/netboot.xyz.efi)| DHCP boot image file, uses built-in iPXE NIC drivers|\n|DHCP-snp| [netboot.xyz-snp.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-snp.efi)| EFI w/ Simple Network Protocol, attempts to boot all net devices|\n|DHCP-snponly| [netboot.xyz-snponly.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-snponly.efi)| EFI w/ Simple Network Protocol, only boots from device chained from|\n\n#### ARM64 iPXE Bootloaders\n\n| Type | Bootloader | Description |\n|------|------------|-------------|\n|DHCP| [netboot.xyz-arm64.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi)| DHCP boot image file, uses built-in iPXE NIC drivers|\n|DHCP-snp| [netboot.xyz-arm64-snp.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-arm64-snp.efi)| EFI w/ Simple Network Protocol, attempts to boot all net devices|\n|DHCP-snponly| [netboot.xyz-arm64-snponly.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-arm64-snponly.efi)| EFI w/ Simple Network Protocol, only boots from device chained from|\n\n#### Raspberry Pi iPXE Bootloaders\n\n| Type | Bootloader | Description |\n|------|------------|-------------|\n|USB/SD Card| [netboot.xyz-rpi4-sdcard.img](https://boot.netboot.xyz/ipxe/netboot.xyz-rpi4-sdcard.img)| Raspberry Pi 4 - USB/SD Card Image|\n|DHCP-snp| [netboot.xyz-rpi4-snp.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-rpi4-snp.efi)| Raspberry Pi 4 - EFI Image|\n\nSHA256 checksums are generated during each build of iPXE and are located [here](https://boot.netboot.xyz/ipxe/netboot.xyz-sha256-checksums.txt).  You can also view the scripts that are embedded into the images [here](https://github.com/netbootxyz/netboot.xyz/tree/master/ipxe/disks).\n\n### What is netboot.xyz?\n\n[netboot.xyz](http://www.netboot.xyz) is a convenient place to boot into any type of operating system or utility disk without the need of having to go spend time retrieving the ISO just to run it.  [iPXE](http://ipxe.org/) is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags.\n\nIf you already have iPXE up and running on the network, you can hit netboot.xyz at anytime by typing for Legacy (PCBIOS) mode:\n\n    chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn\n\nor when in UEFI mode:\n\n    chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.efi\n\nYou can also load using HTTPS, but by default builds of iPXE do not have HTTPS support compiled in. This will load the appropriate netboot.xyz kernel with all of the proper options enabled.\n\n### Documentation\n\nSee [netboot.xyz](https://netboot.xyz) for all documentation.  Some links to get started with are:\n\n* [Downloads](https://netboot.xyz/downloads/)\n* [Self Hosting](https://netboot.xyz/docs/selfhosting/)\n* [Booting Methods](https://netboot.xyz/docs/booting/ipxe)\n* [FAQ](https://netboot.xyz/docs/faq)\n* [Blog](https://netboot.xyz/blog)\n\nIf you'd like to contribute to the documentation, the netboot.xyz documentation is located at [netboot.xyz-docs](https://github.com/netbootxyz/netboot.xyz-docs).\n\n### Self Hosting netboot.xyz\n\nFor those users who want to deploy their own netboot.xyz environment,  you can leverage the same scripts that are used to deploy the hosted environment. The source scripts are all Ansible templates and can be generated and customized to your preference.\n\nPlease see the [self-hosting docs](https://netboot.xyz/docs/selfhosting/) for more information but in short:\n\n#### Deploying using Ansible\n\nTo generate, run:\n\n```\nansible-playbook site.yml\n```\n\nThe build output will be located in /var/www/html by default.\n\n#### Deploying with Docker\n\n```\ndocker build -t localbuild --platform=linux/amd64 -f Dockerfile .\ndocker run --rm -it --platform=linux/amd64 -v $(pwd):/buildout localbuild\n```\n\nThe build output will be in the generated folder `buildout`\n\n#### Local Overrides\n\nAnsible will handle source generation as well as iPXE disk generation with your settings.  It will generate Legacy (PCBIOS) and UEFI iPXE disks that can be used to load into your netboot.xyz environment. If you want to override the defaults, you can put overrides in user_overrides.yml.  See `user_overrides.yml` for examples. \n\nUsing the overrides file, you can override all of the settings from the defaults/main.yml so that you can easily change the boot mirror URLs when the menus are rendered.  If you prefer to do this after the fact, you can also edit the boot.cfg to make changes, but keep in mind those changes will not be saved when you redeploy the menu.\n\n#### Self Hosted Custom Options\n\nIn addition to being able to host netboot.xyz locally, you can also create your own custom templates for custom menus within netboot.xyz.  Please see [Custom User Menus](etc/netbootxyz/custom/README.md) for more information.\n\n### What Operating Systems are currently available on netboot.xyz?\n\n#### Operating Systems\n\n| Name       | URL             | Installer Kernel | Live OS       |\n|------------|-----------------|------------------|---------------|\n| AlmaLinux | https://almalinux.org/ | Yes | No |\n| Alpine Linux | https://alpinelinux.org | Yes | No |\n| Arch Linux | https://www.archlinux.org | Yes | No |\n| Backbox | https://www.backbox.org | No | Yes |\n| BlackArch Linux | https://blackarch.org | Yes | Yes |\n| Bluestar Linux | https://sourceforge.net/projects/bluestarlinux | No | Yes |\n| Bodhi Linux | https://www.bodhilinux.com | No | Yes |\n| CachyOS | https://cachyos.org | No | Yes |\n| CentOS | https://centos.org | Yes | No |\n| Debian | https://debian.org | Yes | Yes|\n| Devuan | https://devuan.org | Yes | No |\n| Elementary OS | https://elementary.io | No | Yes |\n| EndeavourOS | https://endeavouros.com | No | Yes |\n| Fatdog64 | https://distro.ibiblio.org/fatdog/web/ | No | Yes |\n| Fedora | https://fedoraproject.org | Yes | Yes |\n| Fedora CoreOS | https://getfedora.org/en/coreos?stream=stable | Yes | No |\n| Feren OS | https://ferenos.weebly.com/ | Yes | No |\n| Flatcar Container Linux | https://www.flatcar.org | Yes | No |\n| FreeBSD | https://freebsd.org | Yes, disk image | No |\n| FreeDOS | https://www.freedos.org | ISO - Memdisk| No |\n| Garuda Linux | https://garudalinux.org/ | No | Yes |\n| Gentoo | https://gentoo.org | Yes | Yes |\n| Harvester | https://harvesterhci.io | Yes | No |\n| hrmpf | https://github.com/leahneukirchen/hrmpf/ | No | Yes |\n| IPFire | https://www.ipfire.org | Yes | No |\n| K3OS | https://k3os.io/ | Yes | Yes |\n| Kairos | https://kairos.io/ | Yes | No |\n| Kali Linux | https://www.kali.org | Yes | Yes |\n| KDE Neon | https://neon.kde.org | No | Yes |\n| Kodachi | https://www.digi77.com/linux-kodachi/ | No | Yes |\n| Linux Lite | https://www.linuxliteos.com | No | Yes |\n| LXLE | https://lxle.net/ | No | Yes |\n| Mageia | https://www.mageia.org | Yes | No |\n| Manjaro | https://manjaro.org | No | Yes |\n| Mint | https://linuxmint.com | No | Yes |\n| Microsoft Windows | https://www.microsoft.com | User supplied media | No |\n| MirOS | http://www.mirbsd.org | Yes | No |\n| Nitrux | https://nxos.org/ | No | Yes |\n| NixOS | https://nixos.org | Yes | No |\n| OpenBSD | https://openbsd.org | Yes | No |\n| openEuler | https://openeuler.org | Yes | No |\n| openSUSE | https://opensuse.org | Yes | No |\n| Oracle Linux | https://www.oracle.com/linux/ | Yes | Installer |\n| Parrot Security | https://www.parrotsec.org | No | Yes |\n| Peppermint | https://peppermintos.com | No | Yes |\n| Pop OS |https://system76.com/pop| No | Yes |\n| Proxmox Open Source Products | https://www.proxmox.com/ | Yes | No |\n| Q4OS | https://q4os.org | No | Yes |\n| Raizo | https://sourceforge.net/projects/live-raizo/ | No | Yes |\n| Red Hat Enterprise Linux | https://www.redhat.com | User supplied media | No |\n| Regolith | https://regolith-linux.org | No | Yes |\n| Rocky Linux | https://rockylinux.org/ | Yes | No |\n| Septor | https://septor.sourceforge.io | No | Yes |\n| Slackware | https://www.slackware.com | Yes | No |\n| SmartOS | https://www.smartos.org/ | Yes | No |\n| SparkyLinux | https://sparkylinux.org/ | No | Yes |\n| Tails | https://tails.net | No | Yes |\n| Talos | https://www.talos.dev/ | Yes | No |\n| Tiny Core Linux | https://tinycorelinux.net | Yes | Yes |\n| Ubuntu | https://www.ubuntu.com | Yes | Yes |\n| VMware | https://www.vmware.com | User supplied media | No |\n| VMware Photon | https://vmware.github.io/photon/ | Yes | No |\n| Vanilla OS | https://vanillaos.org | No | Yes |\n| Voyager | https://voyagerlive.org | No | Yes |\n| VyOS | https://vyos.io | Yes | No |\n| Zen Installer | https://sourceforge.net/projects/revenge-installer | Yes | No |\n| Zorin OS | https://zorin.com | No | Yes |\n\n### Utilities\n\n| Name       | URL                     | Type |\n|------------|-------------------------|------|\n| 4MLinux | https://4mlinux.com/ | Kernel/Initrd |\n| Boot Repair CD | https://sourceforge.net/projects/boot-repair-cd/ | LiveCD |\n| Breakin | https://www.advancedclustering.com/products/software/breakin/ | Kernel/Initrd |\n| CAINE | https://www.caine-live.net/ | LiveCD |\n| Clonezilla | https://www.clonezilla.org/ | LiveCD |\n| DBAN | https://www.dban.org/ | Kernel |\n| GParted | https://gparted.org | LiveCD |\n| Grml | https://grml.org | LiveCD |\n| Kaspersky Rescue Disk | https://support.kaspersky.com/krd18 | LiveCD |\n| Memtest | https://www.memtest.org/ | Kernel |\n| MemTest86 Free | https://www.memtest86.com | USB Img |\n| Redo Rescue | http://redorescue.com/ | LiveCD |\n| Rescatux | https://www.supergrubdisk.org/rescatux/ | LiveCD |\n| Rescuezilla | https://rescuezilla.com/ | LiveCD |\n| ShredOS | https://github.com/PartialVolume/shredos.x86_64 | Kernel | \n| Super Grub2 Disk | https://www.supergrubdisk.org | ISO - Memdisk |\n| System Rescue | https://system-rescue.org/ | LiveCD |\n| Ultimate Boot CD | https://www.ultimatebootcd.com | ISO - Memdisk |\n| ZFSBootMenu | https://docs.zfsbootmenu.org/ | Kernel |\n\n### Stargazers over time\n\n[![Stargazers over time](https://starchart.cc/netbootxyz/netboot.xyz.svg)](https://starchart.cc/netbootxyz/netboot.xyz)\n\n### Feedback\n\nFeel free to open up an [issue](https://github.com/netbootxyz/netboot.xyz/issues) on Github or ping us on [Discord](https://discord.gg/An6PA2a).  Follow us on [Twitter](https://twitter.com/netbootxyz) and like us on [Facebook](https://www.facebook.com/netboot.xyz)!\n"
  },
  {
    "path": "docker-build-root/dumper.sh",
    "content": "#! /bin/sh\n\n# check for dump dir\nif [ -d /buildout ]; then\n  # if there are no files in that directory use 777 perms as root\n  if [ `find /buildout -prune -empty 2>/dev/null` ]; then\n    /bin/mkdir -p /buildout/buildout\n    /bin/cp -r /mnt/* /buildout/buildout/\n    /bin/chmod 777 -R /buildout/buildout\n  # match the ownership of the first file we see\n  else\n    PERMS=`/usr/bin/find /buildout/* -print -quit |xargs stat -c \"%u:%g\"`\n    /bin/mkdir -p /buildout/buildout\n    /bin/cp -r /mnt/* /buildout/buildout/\n    /bin/chown $PERMS -R /buildout/buildout\n  fi\nelse\n  /bin/echo \"/buildout not found exiting\"  \n  exit 1\nfi  \n"
  },
  {
    "path": "endpoints.yml",
    "content": "endpoints:\n  kali-xfce-squash:\n    path: /debian-squash/releases/download/2025.4-f03c4b56/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: kali\n    version: '2025.4'\n    flavor: xfce\n    kernel: kali-xfce-squash\n  kde-neon-user:\n    path: /ubuntu-squash/releases/download/20260312-0746-88395a11/\n    files:\n    - vmlinuz\n    - filesystem.squashfs\n    - initrd.lz\n    os: neon\n    version: 20260312-0746\n    flavor: user\n    kernel: kde-neon-user\n  regolith-current:\n    path: /ubuntu-squash/releases/download/1.2-e7db33e3/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: regolith\n    version: current\n    flavor: ubuntu\n    kernel: regolith-current\n  breakin:\n    path: /asset-mirror/releases/download/4.26.1-f22abf78/\n    files:\n    - vmlinuz\n    - initrd\n    os: breakin\n    version: 4.26.1\n  dban:\n    path: /asset-mirror/releases/download/2.3.0-dca9acb4/\n    files:\n    - DBAN.BZI\n    os: dban\n    version: 2.3.0\n  sparky-stable-mingui:\n    path: /debian-squash/releases/download/8.2-d8df60d4/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: stable\n    flavor: xfce-min\n    kernel: sparky-stable-mingui\n  sparky-stable-gui:\n    path: /debian-squash/releases/download/8.2-28fbf253/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: stable\n    flavor: xfce\n    kernel: sparky-stable-gui\n  sparky-stable-lxqt:\n    path: /debian-squash/releases/download/8.2-16df4761/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: stable\n    flavor: lxqt\n    kernel: sparky-stable-lxqt\n  sparky-rolling-mingui:\n    path: /debian-squash/releases/download/2026.03-8a7a4cf8/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: rolling\n    flavor: xfce-min\n    kernel: sparky-rolling-mingui\n  sparky-rolling-gui:\n    path: /debian-squash/releases/download/2026.03-314f0a50/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: rolling\n    flavor: xfce\n    kernel: sparky-rolling-gui\n  sparky-rolling-lxqt:\n    path: /debian-squash/releases/download/2026.03-1a7f6c6a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: sparky\n    version: rolling\n    flavor: lxqt\n    kernel: sparky-rolling-lxqt\n  oracle-8:\n    path: /asset-mirror/releases/download/6-c7882e2d/\n    files:\n    - vmlinuz\n    - initrd\n    - squashfs.img\n    os: oracle\n    version: '8'\n    arch: x86_64\n  kodachi-6:\n    path: /ubuntu-squash/releases/download/6.2-2a23039c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: kodachi\n    version: '6'\n  devuan-ascii:\n    path: /debian-squash/releases/download/2.1-c1f637a9/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: devuan\n    version: '2'\n    flavor: ascii\n  gparted-stable:\n    path: /debian-squash/releases/download/1.8.0-2-5616e296/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: gparted\n    version: stable\n  rescatux:\n    path: /debian-squash/releases/download/0.72-beta8-55ca0efd/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: rescatux\n    version: current\n  caine:\n    path: /ubuntu-squash/releases/download/13.0-4216585a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: caine\n    version: '13.0'\n  dts:\n    path: /dts/v2.7.1\n    files:\n    - initrd\n    - vmlinuz\n    os: dts\n    version: 2.7.1\n  bootrepair:\n    path: /ubuntu-squash/releases/download/current-e035b00c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: bootrepair\n    version: current\n  blackarch-installer:\n    path: /asset-mirror/releases/download/2023.04.01-cfc58a6d/\n    files:\n    - initrd\n    - vmlinuz\n    - airootfs.sfs\n    os: blackarch\n    version: current\n  bluestar:\n    path: /asset-mirror/releases/download/6.7.8-2024.03.04-d4e083fc/\n    files:\n    - initrd\n    - vmlinuz\n    - airootfs.sfs\n    os: bluestar\n    version: current\n  zeninstall:\n    path: /asset-mirror/releases/download/2020.05.27-b25da634/\n    files:\n    - initrd\n    - vmlinuz\n    - airootfs.sfs\n    os: zeninstall\n    version: current\n  lxle:\n    path: /ubuntu-squash/releases/download/18.04.3-83291c4b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: lxle\n    version: current\n  kaspersky-rescue:\n    path: /asset-mirror/releases/download/18-7f6056db/\n    files:\n    - initrd.xz\n    - initrd\n    - vmlinuz\n    - kernel.dat\n    - 000-core.srm\n    - 001-xorg.srm\n    - 002-xfce.srm\n    - 003-kl.srm\n    - 004-krt.srm\n    - 005-bases.srm\n    - 008-firefox.srm\n    os: kaspersky\n    version: '18'\n  septor:\n    path: /debian-squash/releases/download/2022-32f07395/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: septor\n    version: current\n  manjaro-xfce-current:\n    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-93c4b57e/\n    files:\n    - livefs.sfs\n    - rootfs.sfs\n    - mhwdfs.sfs\n    - desktopfs.sfs\n    - initrd\n    - vmlinuz\n    os: manjaro\n    version: current\n    flavor: xfce\n    kernel: manjaro-xfce-current\n  manjaro-gnome-current:\n    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-917f9a0a/\n    files:\n    - livefs.sfs\n    - rootfs.sfs\n    - mhwdfs.sfs\n    - desktopfs.sfs\n    - initrd\n    - vmlinuz\n    os: manjaro\n    version: current\n    flavor: gnome\n    kernel: manjaro-gnome-current\n  manjaro-kde-current:\n    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-df3b24fa/\n    files:\n    - livefs.sfs\n    - rootfs.sfs\n    - mhwdfs.sfs\n    - desktopfs.sfs\n    - initrd\n    - vmlinuz\n    os: manjaro\n    version: current\n    flavor: kde\n    kernel: manjaro-kde-current\n  fatdog:\n    path: /asset-mirror/releases/download/903-eefda31d/\n    files:\n    - vmlinuz\n    - initrd\n    os: fatdog\n    version: current\n  raizo:\n    path: /debian-squash/releases/download/v17.26.01.25i-5c171de0/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: raizo\n    version: current\n  4mlinux:\n    path: /asset-mirror/releases/download/50.1-fcaac630/\n    files:\n    - initrd\n    - vmlinuz\n    os: 4mlinux\n    version: current\n    flavor: full\n  4mlinux-thesss:\n    path: /asset-mirror/releases/download/51.0-bb45ecde/\n    files:\n    - initrd\n    - vmlinuz\n    os: 4mlinux\n    version: current\n    flavor: TheSSS\n  4mlinux-bakandimg:\n    path: /asset-mirror/releases/download/51.0-978b0518/\n    files:\n    - initrd\n    - vmlinuz\n    os: 4mlinux\n    version: current\n    flavor: BakAndImg\n  4mlinux-antivirus:\n    path: /asset-mirror/releases/download/51.0-1.5.1-6a1b14f1/\n    files:\n    - initrd\n    - vmlinuz\n    os: 4mlinux\n    version: current\n    flavor: AntivirusLiveCD\n  ubuntu-20.04-default-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-edcc76af/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: GNOME\n    kernel: ubuntu-20.04-default-squash\n  ubuntu-20.04-KDE-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-de797e6a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: KDE\n    kernel: ubuntu-20.04-KDE-squash\n  ubuntu-20.04-XFCE-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-ecac5789/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: XFCE\n    kernel: ubuntu-20.04-XFCE-squash\n  ubuntu-20.04-Budgie-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-4901a824/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: Budgie\n    kernel: ubuntu-20.04-Budgie-squash\n  ubuntu-20.04-MATE-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-b988c78f/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: MATE\n    kernel: ubuntu-20.04-MATE-squash\n  ubuntu-20.04-kylin-squash:\n    path: /ubuntu-squash/releases/download/20.04.6-fe97e81a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: kylin\n    kernel: ubuntu-20.04-kylin-squash\n  voyager-focal-squash:\n    path: /ubuntu-squash/releases/download/focal-594b12a7/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: Voyager\n    version: focal\n    flavor: focal\n    kernel: voyager-focal-squash\n  pop-20.04-default-squash:\n    path: /ubuntu-squash/releases/download/5-66b7e861/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: pop\n    version: '20.04'\n    flavor: intel-amd\n    kernel: pop-20.04-default-squash\n  pop-20.04-nvidia-squash:\n    path: /ubuntu-squash/releases/download/5-6efd1d75/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: pop\n    version: '20.04'\n    flavor: nvidia\n    kernel: pop-20.04-nvidia-squash\n  nixos-20.03:\n    path: /asset-mirror/releases/download/124244129-bd20f138/\n    files:\n    - bzImage\n    - initrd\n    - netboot.ipxe\n    os: nixos\n    version: '20.03'\n  kodachi-7:\n    path: /ubuntu-squash/releases/download/7.6-5b1ead62/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: kodachi\n    version: '7'\n  linux-lite-5-squash:\n    path: /ubuntu-squash/releases/download/5.8-75cb937c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: lite\n    version: 5.8\n    kernel: linux-lite-5-squash\n  vyos-rolling:\n    path: /debian-squash/releases/download/2026.03.19-0028-rolling-bf6bd56c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: vyos\n    version: rolling\n    flavor: rolling\n    kernel: vyos-rolling\n  pureos-gnome:\n    path: /ubuntu-squash/releases/download/2020-08-06-83257efc/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: pureos\n    version: current\n    flavor: gnome\n    kernel: pureos-gnome\n  rescuezilla:\n    path: /asset-mirror/releases/download/2.6.1-123ed276/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: rescuezilla\n    version: 2.6.1\n  nitrux-release:\n    path: /ubuntu-squash/releases/download/2022.02.28-e364d0a5/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: nitrux\n    version: 2022.02.28\n  endeavouros:\n    path: /asset-mirror/releases/download/Neo-2026.01.12-a0604436/\n    files:\n    - airootfs.sfs\n    - initrd\n    - vmlinuz\n    os: endeavouros\n    version: Neo-2026.01.12\n  kodachi-8:\n    path: /ubuntu-squash/releases/download/8.2-625e11fa/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: kodachi\n    version: '8'\n  redorescue:\n    path: /asset-mirror/releases/download/4.0.0-000d2575/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: redorescue\n    version: 4.0.0\n  elementaryos-6-default-squash:\n    path: /ubuntu-squash/releases/download/6-3e90a5ea/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: elementary-os\n    version: '6'\n    kernel: elementaryos-6-default-squash\n  voyager-bullseye-squash:\n    path: /debian-squash/releases/download/bullseye-a59d37d9/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: Voyager\n    version: bullseye\n    flavor: bullseye\n    kernel: voyager-bullseye-squash\n  memtest86:\n    path: /asset-mirror/releases/download/11.6-e4a137e7/\n    files:\n    - memtest86-usb.img\n    os: memtest86-free\n    version: '11.6'\n  gentoo-x86:\n    path: /asset-mirror/releases/download/20241209T170323Z-4e10abc5/\n    files:\n    - image.squashfs\n    - initrd\n    - vmlinuz\n    os: gentoo\n    version: 20241209T170323Z\n    arch: x86\n  gentoo-arm64:\n    path: /asset-mirror/releases/download/20260113T194558Z-3c528165/\n    files:\n    - image.squashfs\n    - initrd\n    - vmlinuz\n    os: gentoo\n    version: 20260113T194558Z\n    arch: arm64\n  gentoo-amd64:\n    path: /asset-mirror/releases/download/20260125T170113Z-9aa997ef/\n    files:\n    - image.squashfs\n    - initrd\n    - vmlinuz\n    os: gentoo\n    version: 20260125T170113Z\n    arch: amd64\n  tails:\n    path: /asset-mirror/releases/download/7.5-17629562/\n    files:\n    - vmlinuz\n    - initrd.img\n    - 9990-misc-helpers.sh\n    - tails-amd64.iso\n    os: tails\n    version: '7.5'\n    arch: amd64\n  hrmpf:\n    path: /asset-mirror/releases/download/20231124-1008bb6d/\n    files:\n    - vmlinuz\n    - initrd\n    - squashfs.img\n    os: hrmpf\n    version: '20231124'\n  ubuntu-netboot-20.04-arm64:\n    path: /ubuntu-squash/releases/download/20.04.5-bb142c3d/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 20.04.5\n    codename: focal\n    flavor: netboot\n    kernel: ubuntu-netboot-20.04-arm64\n    arch: arm64\n  ubuntu-netboot-20.04-amd64:\n    path: /ubuntu-squash/releases/download/20.04.6-b13ed0a8/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 20.04.6\n    codename: focal\n    flavor: netboot\n    kernel: ubuntu-netboot-20.04-amd64\n    arch: amd64\n  systemrescue-i686:\n    path: /asset-mirror/releases/download/9.03-0f19cc5c/\n    files:\n    - airootfs.sfs\n    - initrd\n    - vmlinuz\n    os: systemrescue\n    version: 9.03\n    arch: i686\n  systemrescue-amd64:\n    path: /asset-mirror/releases/download/12.03-d20a63ac/\n    files:\n    - airootfs.sfs\n    - initrd\n    - vmlinuz\n    - archiso_pxe_http\n    os: systemrescue\n    version: 12.03\n    arch: amd64\n  shredos-i686:\n    path: /asset-mirror/releases/download/0.34_32-bit_20221231-c4450e3a/\n    files:\n    - shredos\n    os: shredos\n    version: 0.34_32-bit_20221231\n    arch: i686\n  shredos-x86_64:\n    path: /asset-mirror/releases/download/2025.11_28_x86-64_0.40-bf7a6bdf/\n    files:\n    - shredos\n    os: shredos\n    version: 2025.11_28_x86-64_0.40\n    arch: x86_64\n  archlinux-32:\n    path: /asset-mirror/releases/download/2024.07.10-2797a944/\n    files:\n    - airootfs.sfs\n    - initramfs-linux.img\n    - vmlinuz-linux\n    os: archlinux\n    version: 2024.07.10\n    arch: i686\n  clonezilla-debian-stable-amd64:\n    path: /debian-squash/releases/download/3.3.1-35-1a41a72c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: clonezilla\n    version: 3.3.1-35\n    flavor: stable\n    kernel: clonezilla-debian-stable-amd64\n    arch: amd64\n  clonezilla-ubuntu-stable-amd64:\n    path: /ubuntu-squash/releases/download/20260220-questing-b835723b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: clonezilla\n    version: 20260220-questing\n    flavor: stable\n    kernel: clonezilla-ubuntu-stable-amd64\n    arch: amd64\n  clonezilla-debian-testing-amd64:\n    path: /debian-squash/releases/download/3.3.2-8-8db01622/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: clonezilla\n    version: 3.3.2-8\n    flavor: testing\n    kernel: clonezilla-debian-testing-amd64\n    arch: amd64\n  clonezilla-ubuntu-testing-amd64:\n    path: /ubuntu-squash/releases/download/20260318-resolute-bea81d96/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: clonezilla\n    version: 20260318-resolute\n    flavor: testing\n    kernel: clonezilla-ubuntu-testing-amd64\n    arch: amd64\n  garuda-dr460nized-gaming:\n    path: /asset-mirror/releases/download/250801-a96201bb/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: dr460nized-gaming\n    version: 250801\n  garuda-dr460nized:\n    path: /asset-mirror/releases/download/250801-f610be58/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: dr460nized\n    version: 250801\n  garuda-xfce:\n    path: /asset-mirror/releases/download/250801-c866e6bf/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: xfce\n    version: 250801\n  garuda-gnome:\n    path: /asset-mirror/releases/download/250801-c80a21be/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: gnome\n    version: 250801\n  garuda-lxqt-kwin:\n    path: /asset-mirror/releases/download/230501-f13b4b24/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: lxqt-kwin\n    version: 230501\n  garuda-wayfire:\n    path: /asset-mirror/releases/download/230501-61b681d1/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: wayfire\n    version: 230501\n  garuda-qtile:\n    path: /asset-mirror/releases/download/231029-9dfb930b/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: qtile\n    version: 231029\n  garuda-i3wm:\n    path: /asset-mirror/releases/download/250801-d48b8f05/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: i3wm\n    version: 250801\n  garuda-sway:\n    path: /asset-mirror/releases/download/250801-8d451890/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: sway\n    version: 250801\n  garuda-mate:\n    path: /asset-mirror/releases/download/230501-3af08aa6/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: mate\n    version: 230501\n  garuda-kde-barebones:\n    path: /asset-mirror/releases/download/220329-198784ed/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: kde-barebones\n    version: 220329\n  proxmox-backup-server:\n    path: /asset-mirror/releases/download/4.1-1-6f50261b/\n    files:\n    - initrd\n    - vmlinuz\n    - proxmox.iso\n    os: proxmox-backup-server\n    version: 4.1-1\n  proxmox-ve:\n    path: /asset-mirror/releases/download/9.1-1-1d6923a5/\n    files:\n    - initrd\n    - proxmox.iso\n    - vmlinuz\n    os: proxmox-ve\n    version: 9.1-1\n  proxmox-mailgateway:\n    path: /asset-mirror/releases/download/9.0-1-ded4eba1/\n    files:\n    - initrd\n    - vmlinuz\n    - proxmox.iso\n    os: proxmox-mailgateway\n    version: 9.0-1\n  ubuntu-netboot-22.04-amd64:\n    path: /ubuntu-squash/releases/download/22.04.5-be230164/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 22.04.5\n    codename: jammy\n    flavor: netboot\n    kernel: ubuntu-netboot-22.04-amd64\n    arch: amd64\n  ubuntu-netboot-22.04-arm64:\n    path: /ubuntu-squash/releases/download/22.04.5-9d9df014/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 22.04.5\n    codename: jammy\n    flavor: netboot\n    kernel: ubuntu-netboot-22.04-arm64\n    arch: arm64\n  ubuntu-22.04-default-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-9d09e9e2/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: GNOME\n    kernel: ubuntu-22.04-default-squash\n  ubuntu-22.04-XFCE-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-f1d182b7/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: XFCE\n    kernel: ubuntu-22.04-XFCE-squash\n  ubuntu-22.04-MATE-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-96688be7/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: MATE\n    kernel: ubuntu-22.04-MATE-squash\n  ubuntu-22.04-Budgie-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-a893fa5a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: Budgie\n    kernel: ubuntu-22.04-Budgie-squash\n  ubuntu-22.04-KDE-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-45d5c769/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: KDE\n    kernel: ubuntu-22.04-KDE-squash\n  ubuntu-22.04-kylin-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-943f61f5/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: kylin\n    kernel: ubuntu-22.04-kylin-squash\n  voyager-jammy-squash:\n    path: /ubuntu-squash/releases/download/jammy-e9ee9abe/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: Voyager\n    version: jammy\n    flavor: jammy\n    kernel: voyager-jammy-squash\n  pop-22.04-default-squash:\n    path: /ubuntu-squash/releases/download/21-31dbd35b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: pop\n    version: '22.04'\n    flavor: intel-amd\n    kernel: pop-22.04-default-squash\n  vmware-photon-x86_64:\n    path: /asset-mirror/releases/download/4.0-febcf67e/\n    files:\n    - initrd.img\n    - vmlinuz\n    os: vmware-photon\n    version: '4.0'\n    arch: x86_64\n  vmware-photon-aarch64:\n    path: /asset-mirror/releases/download/4.0-ed208546/\n    files:\n    - initrd.img\n    - vmlinuz\n    os: vmware-photon\n    version: '4.0'\n    arch: aarch64\n  harvester:\n    path: /asset-mirror/releases/download/v1.7.1-fcf0fd7f/\n    files:\n    - harvester-vmlinuz-amd64\n    - harvester-initrd-amd64\n    - harvester-rootfs-amd64.squashfs\n    - harvester-amd64.sha512\n    - version.yaml\n    os: harvester\n    version: v1.7.1\n  linux-lite-6-squash:\n    path: /ubuntu-squash/releases/download/6.4-2550834c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: lite\n    version: 6.4\n    kernel: linux-lite-6-squash\n  mint-21-cinnamon-squash:\n    path: /ubuntu-squash/releases/download/21-32bd7a0e/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '21'\n    flavor: Cinnamon\n    kernel: mint-21-cinnamon-squash\n  mint-21-mate-squash:\n    path: /ubuntu-squash/releases/download/21-f0dbd590/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '21'\n    flavor: mate\n    kernel: mint-21-mate-squash\n  mint-21-xfce-squash:\n    path: /ubuntu-squash/releases/download/21-48716442/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '21'\n    flavor: xfce\n    kernel: mint-21-xfce-squash\n  oracle-9-x86_64:\n    path: /asset-mirror/releases/download/U1-23c7d963/\n    files:\n    - vmlinuz\n    - initrd\n    - squashfs.img\n    os: oracle\n    version: '9'\n    arch: x86_64\n  oracle-9-aarch64:\n    path: /asset-mirror/releases/download/U1-f576e989/\n    files:\n    - vmlinuz\n    - initrd\n    - squashfs.img\n    os: oracle\n    version: '9'\n    arch: aarch64\n  parrot-home:\n    path: /debian-squash/releases/download/6.3.2-27d6d20b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: parrot\n    version: 6.3.2\n    flavor: home\n  parrot-security:\n    path: /debian-squash/releases/download/6.3.2-b763048a/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: parrot\n    version: 6.3.2\n    flavor: security\n  xcp-ng:\n    path: /asset-mirror/releases/download/8.3-55521b28/\n    files:\n    - xen.gz\n    - vmlinuz\n    - install.img\n    os: xcp-ng\n    version: '8.2'\n  garuda-cinnamon:\n    path: /asset-mirror/releases/download/250801-0b360492/\n    files:\n    - amd_ucode.img\n    - desktopfs.sfs\n    - intel_ucode.img\n    - livefs.sfs\n    - initramfs.img\n    - mhwdfs.sfs\n    - rootfs.sfs\n    - vmlinuz\n    os: garuda\n    flavor: cinnamon\n    version: 250801\n  elementaryos-7-default-squash:\n    path: /ubuntu-squash/releases/download/7-82f69428/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: elementary-os\n    version: '7'\n    kernel: elementaryos-7-default-squash\n  ubuntu-20.04-LXQT-squash:\n    path: /ubuntu-squash/releases/download/20.04.5-07228691/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '20.04'\n    flavor: LXQT\n    kernel: ubuntu-20.04-LXQT-squash\n  ubuntu-22.04-LXQT-squash:\n    path: /ubuntu-squash/releases/download/22.04.5-81dbf90b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '22.04'\n    flavor: LXQT\n    kernel: ubuntu-22.04-LXQT-squash\n  backbox-default-squash:\n    path: /ubuntu-squash/releases/download/8.1-c2287989/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: BackBox\n    version: '8.1'\n    flavor: desktop\n    kernel: backbox-default-squash\n  bodhi-standard:\n    path: /ubuntu-squash/releases/download/7.0.0-f22738f2/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: bodhi\n    version: 7.0.0\n    flavor: standard\n  bodhi-apppack:\n    path: /ubuntu-squash/releases/download/7.0.0-b588d8e1/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: bodhi\n    version: 7.0.0\n    flavor: apppack\n  mfsbsd-14:\n    path: /asset-mirror/releases/download/14.2-f360f980/\n    files:\n    - default.img\n    - special-edition.img\n    os: freebsd\n    version: '14'\n  zorin-core-squash:\n    path: /ubuntu-squash/releases/download/17.3-a87e018b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: zorin\n    version: '17.3'\n    flavor: Core\n    kernel: zorin-core-squash\n  q4os-plasma-squash:\n    path: /debian-squash/releases/download/6.6-65fa9dd9/\n    files:\n    - filesystem.squashfs\n    os: Q4OS\n    version: '6.6'\n    flavor: plasma\n    kernel: q4os-default-squash\n  q4os-default-squash:\n    path: /debian-squash/releases/download/6.6-5d30850e/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: Q4OS\n    version: '6.6'\n    flavor: trinity\n    kernel: q4os-default-squash\n  memtest86plus:\n    path: /asset-mirror/releases/download/8.00-32a14678/\n    files:\n    - memtest32.bin\n    - memtest32.efi\n    - memtest64.bin\n    - memtest64.efi\n    - mt86p_i586\n    - mt86p_la64\n    - mt86p_x86_64\n    os: memtest86-plus\n    version: '8.00'\n  ubuntu-netboot-24.04-arm64:\n    path: /ubuntu-squash/releases/download/24.04.4-b13d6c2e/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 24.04.4\n    codename: noble\n    flavor: netboot\n    kernel: ubuntu-netboot-24.04-arm64\n    arch: arm64\n  ubuntu-netboot-24.04-amd64:\n    path: /ubuntu-squash/releases/download/24.04.4-717d3a1a/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 24.04.4\n    codename: noble\n    flavor: netboot\n    kernel: ubuntu-netboot-24.04-amd64\n    arch: amd64\n  fedora-40-gnome:\n    path: /fedora-assets/releases/download/1.14-aefc8f89/\n    files:\n    - vmlinuz\n    - initrd\n    - squashfs.img\n    os: fedora\n    version: 40\n    flavor: GNOME\n  ubuntu-24.04-default-squash:\n    path: /ubuntu-squash/releases/download/24.04.4-315cc059/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    - minimal.standard.live.squashfs\n    - minimal.standard.squashfs\n    - minimal.squashfs\n    os: ubuntu\n    version: '24.04'\n    flavor: GNOME\n    kernel: ubuntu-24.04-default-squash\n  vanilla-os:\n    path: /asset-mirror/releases/download/20240728-32e3ebb7/\n    files:\n    - initrd\n    - filesystem.squashfs\n    - vmlinuz\n    os: vanilla-os\n    version: 2-20240728\n  zfsbootmenu:\n    path: /asset-mirror/releases/download/3.1.0-1620b6a3/\n    files:\n    - zfsbootmenu-recovery-x86_64.efi\n    os: zfsbootmenu\n    version: 3.1.0\n  supergrubdisk:\n    path: /asset-mirror/releases/download/2.06s4-30515aca/\n    files:\n    - supergrub2-classic-x86_64.efi\n    os: supergrubdisk\n    version: 2.06s4\n  mint-22-xfce-squash:\n    path: /ubuntu-squash/releases/download/22-e45bc094/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '22'\n    flavor: xfce\n    kernel: mint-22-xfce-squash\n  mint-22-cinnamon-squash:\n    path: /ubuntu-squash/releases/download/22-14b93ac4/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '22'\n    flavor: Cinnamon\n    kernel: mint-22-cinnamon-squash\n  mint-22-mate-squash:\n    path: /ubuntu-squash/releases/download/22-482b71dc/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '22'\n    flavor: mate\n    kernel: mint-22-mate-squash\n  ubuntu-netboot-24.10-amd64:\n    path: /ubuntu-squash/releases/download/24.10-01d20dde/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '24.10'\n    codename: oracular\n    flavor: netboot\n    kernel: ubuntu-netboot-24.10-amd64\n    arch: amd64\n  ubuntu-netboot-24.10-arm64:\n    path: /ubuntu-squash/releases/download/24.10-f22a7742/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '24.10'\n    codename: oracular\n    flavor: netboot\n    kernel: ubuntu-netboot-24.10-arm64\n    arch: arm64\n  grml-small-amd64:\n    path: /debian-squash/releases/download/2025.12-ca5dc013/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: grml\n    version: '2025.12'\n    flavor: small\n    arch: amd64\n  grml-full-amd64:\n    path: /debian-squash/releases/download/2025.12-ee78df85/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: grml\n    version: '2025.12'\n    flavor: full\n    arch: amd64\n  grml-full-arm64:\n    path: /debian-squash/releases/download/2025.12-f76c469c/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: grml\n    version: '2025.12'\n    flavor: full\n    arch: arm64\n  grml-small-arm64:\n    path: /debian-squash/releases/download/2025.12-d7d97ac4/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: grml\n    version: '2025.12'\n    flavor: small\n    arch: arm64\n  uefishell:\n    path: /asset-mirror/releases/download/edk2-stable202002-a6917535/\n    files:\n    - uefi-shell-x64.efi\n    - uefi-shell-aarch64.efi\n    - uefi-shell-arm.efi\n    os: uefi-shell\n    version: edk2-stable202002\n  uefi-shell-x64:\n    path: /asset-mirror/releases/download/edk2-stable202002-a9ce7096/\n    files:\n    - uefi-shell-x64.efi\n    os: uefi-shell-x64\n    version: edk2-stable202002\n  ubuntu-netboot-25.04-amd64:\n    path: /ubuntu-squash/releases/download/25.04-fa10ffe9/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '25.04'\n    codename: plucky\n    flavor: netboot\n    kernel: ubuntu-netboot-25.04-amd64\n    arch: amd64\n  ubuntu-netboot-25.04-arm64:\n    path: /ubuntu-squash/releases/download/25.04-63097bc7/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '25.04'\n    codename: plucky\n    flavor: netboot\n    kernel: ubuntu-netboot-25.04-arm64\n    arch: arm64\n  mint-20-xfce-squash:\n    path: /ubuntu-squash/releases/download/20.3-af4b8d97/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '20.3'\n    flavor: xfce\n    kernel: mint-20-xfce-squash\n  mint-20-cinnamon-squash:\n    path: /ubuntu-squash/releases/download/20.3-33df4cad/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '20.3'\n    flavor: Cinnamon\n    kernel: mint-20-cinnamon-squash\n  mint-20-mate-squash:\n    path: /ubuntu-squash/releases/download/20.3-7b17290c/\n    files:\n    - initrd\n    - vmlinuz\n    - filesystem.squashfs\n    os: mint\n    version: '20.3'\n    flavor: mate\n    kernel: mint-20-mate-squash\n  mint-lmde-cinnamon-squash:\n    path: /debian-squash/releases/download/6-1834227b/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: mint\n    version: '6'\n    flavor: Cinnamon\n    kernel: mint-lmde-cinnamon-squash\n  ubuntu-spins:\n    path: /asset-mirror/releases/download/0.0.3-d0cf8373/\n    files:\n    - vmlinuz\n    - initrd\n    os: ubuntu-spins\n    version: 0.0.3\n  cachyos:\n    path: /asset-mirror/releases/download/260308-b5de98b7/\n    files:\n    - airootfs.sfs\n    - initrd\n    - vmlinuz\n    - archiso_pxe_http\n    os: cachyos\n    version: '260308'\n  deepin-20-squash:\n    path: /debian-squash/releases/download/20.9-a4ce5fe4/\n    files:\n    - filesystem.squashfs\n    - initrd\n    - vmlinuz\n    os: Deepin\n    version: '20.9'\n    kernel: deepin-20-squash\n  debian-13-live-kernel:\n    path: /debian-core-13/releases/download/13.3.0-0a426450/\n    files:\n    - initrd\n    - vmlinuz\n    os: debian\n    version: '13'\n  debian-13-default-squash:\n    path: /debian-squash/releases/download/13.4.0-9d9b777e/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: core\n    kernel: debian-13-live-kernel\n  debian-13-lxde-squash:\n    path: /debian-squash/releases/download/13.4.0-98209c44/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: lxde\n    kernel: debian-13-live-kernel\n  debian-13-kde-squash:\n    path: /debian-squash/releases/download/13.4.0-c5f83616/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: kde\n    kernel: debian-13-live-kernel\n  debian-13-gnome-squash:\n    path: /debian-squash/releases/download/13.4.0-0aea8fe2/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: gnome\n    kernel: debian-13-live-kernel\n  debian-13-lxqt-squash:\n    path: /debian-squash/releases/download/13.4.0-6936b7a0/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: lxqt\n    kernel: debian-13-live-kernel\n  debian-13-mate-squash:\n    path: /debian-squash/releases/download/13.4.0-f3c0e3ad/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: mate\n    kernel: debian-13-live-kernel\n  ubuntu-netboot-25.10-amd64:\n    path: /ubuntu-squash/releases/download/25.10-64f54a86/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '25.10'\n    codename: questing\n    flavor: netboot\n    kernel: ubuntu-netboot-25.10-amd64\n    arch: amd64\n  ubuntu-netboot-25.10-arm64:\n    path: /ubuntu-squash/releases/download/25.10-9fc235de/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: '25.10'\n    codename: questing\n    flavor: netboot\n    kernel: ubuntu-netboot-25.10-arm64\n    arch: arm64\n  debian-13-cinnamon-squash:\n    path: /debian-squash/releases/download/13.4.0-bcf1dab7/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: cinnamon\n    kernel: debian-13-live-kernel\n  debian-13-xfce-squash:\n    path: /debian-squash/releases/download/13.4.0-5048a26b/\n    files:\n    - filesystem.squashfs\n    os: debian\n    version: 13.4.0\n    flavor: xfce\n    kernel: debian-13-live-kernel\n  proxmox-datacenter-manager:\n    path: /asset-mirror/releases/download/1.0-2-6fa12487/\n    files:\n    - initrd\n    - proxmox.iso\n    - vmlinuz\n    os: proxmox-datacenter-manager\n    version: 1.0-2\n  ubuntu-netboot-hwe-24.04-amd64:\n    path: /ubuntu-squash/releases/download/24.04.4-5d65e4e9/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 24.04.4\n    codename: noble\n    flavor: netboot-hwe\n    kernel: ubuntu-netboot-hwe-24.04-amd64\n    arch: amd64\n  ubuntu-netboot-hwe-24.04-arm64:\n    path: /ubuntu-squash/releases/download/24.04.4-940f2f1c/\n    files:\n    - initrd\n    - vmlinuz\n    os: ubuntu\n    version: 24.04.4\n    codename: noble\n    flavor: netboot-hwe\n    kernel: ubuntu-netboot-hwe-24.04-arm64\n    arch: arm64\n"
  },
  {
    "path": "etc/netbootxyz/custom/README.md",
    "content": "# Custom Menus for Self Hosted netboot.xyz\n\nThis directory contains custom iPXE files that are rendered\nduring menu generation and available from the main menu via\nthe custom menu option.\n\nWhen these options are set:\n\n```\ncustom_generate_menus: true\ncustom_templates_dir: \"{{ netbootxyz_conf_dir }}/custom\"\n```\n\nthe menu will add an option for custom menus and attempt to load into\ncustom/custom.ipxe.  From there custom options can be built and\nmaintained seperately from the netboot.xyz source tree so that both\nmenus can be updated independently.\n\nA sample menu is provided to demonstrate how to configure and set up\na menu.  You can copy the custom directory from the repo:\n\n```\ncp -r etc/netbootxyz/custom /etc/netbootxyz/custom\n```\n\nIf you are building via Docker, you can create a `custom` folder in\nthe root source directory and then set the variable like so:\n\n```\ncustom_generate_menus: true\ncustom_templates_dir: \"/ansible/custom\"\n```\n"
  },
  {
    "path": "etc/netbootxyz/custom/custom.ipxe.j2",
    "content": "#!ipxe\n###\n### {{ site_name }} custom menu example\n###\n\n:custom\nclear custom_choice\nmenu This is a Test Menu\nitem --gap This is the first sub menu\nitem option_one ${space} Loading a kernel and initrd\nitem option_two ${space} Loading an ISO\nitem --gap This is a second sub menu\nitem option_three ${space} Loads another custom sub menu\nitem option_four ${space} This is option four\nchoose custom_choice || goto custom_exit\necho ${cls}\ngoto ${custom_choice}\ngoto custom_exit\n\n:option_one\nkernel http://path.to/vmlinuz\ninitrd http://path.to/initrd\nimgargs vmlinuz put_kernel_img_args_here\nboot || goto custom_exit\n\n:option_two\nkernel {{ memdisk_location }} raw iso\ninitrd http://path.to/iso\nboot || goto custom_exit\n\n:option_three\necho Chains into another menu...\nchain custom1.ipxe || goto custom\n\n:custom_exit\nexit\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"extends\": [\n    \"config:recommended\"\n  ],\n  \"regexManagers\": [\n    {\n      \"fileMatch\": [\"^\\\\.github\\\\/workflows\\\\/.*\\\\.ya?ml$\"],\n      \"matchStrings\": [\n        \"pip(?:3)?\\\\s+install(?:\\\\s+(?:-U|--upgrade))?\\\\s+(?<depName>[A-Za-z0-9_.+-]+(?:\\\\[[^\\\\]]+\\\\])?)==(?<currentValue>\\\\d+(?:\\\\.\\\\d+)*)\"\n      ],\n      \"datasourceTemplate\": \"pypi\"\n    }\n  ]\n}\n"
  },
  {
    "path": "roles/netbootxyz/README.md",
    "content": "Ansible role: netbootxyz\n========================\n\nUses Ansible to generate a self hosted environment of netboot.xyz for use anywhere\n\nRequirements\n------------\n\nAny pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required.\n\nRole Variables\n--------------\n\nA description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well.\n\nDependencies\n------------\n\nA list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles.\n\nExample Playbook\n----------------\n\nIncluding an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:\n\n    - hosts: servers\n      roles:\n         - { role: username.rolename, x: 42 }\n\nLicense\n-------\n\nApache\n\nAuthor Information\n------------------\n\nWebsite: https://netboot.xyz\nAuthor: Antony Messerli"
  },
  {
    "path": "roles/netbootxyz/defaults/main.yml",
    "content": "boot_domain: boot.netboot.xyz\nboot_timeout: 300000\nboot_version: 3.x\nbootloader_disks:\n- netboot.xyz\nbootloader_http_enabled: true\nbootloader_https_enabled: true\nbootloaders:\n  arm:\n  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box\n    ipxe_bin: ipxe.iso\n    output_bin: -arm64.iso\n    type: ISO\n  - desc: Used for creation of USB Keys\n    ipxe_bin: ipxe.img\n    output_bin: -arm64.img\n    type: IMG\n  - desc: DHCP EFI boot image file, uses built-in iPXE NIC drivers\n    ipxe_bin: ipxe.efi\n    output_bin: -arm64.efi\n    type: DHCP\n  - desc: EFI w/ Simple Network Protocol, attempts to boot all net devices\n    ipxe_bin: snp.efi\n    output_bin: -arm64-snp.efi\n    type: DHCP-snp\n  - desc: EFI w/ Simple Network Protocol, only boots from device chained from\n    ipxe_bin: snponly.efi\n    output_bin: -arm64-snponly.efi\n    type: DHCP-snponly\n  hybrid:\n  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box\n    ipxe_bin: ipxe.iso\n    output_bin: .iso\n    type: ISO\n  - desc: Used for creation of USB Keys\n    ipxe_bin: ipxe.img\n    output_bin: .img\n    type: IMG\n  legacy:\n  - desc: Used for booting from GRUB/EXTLINUX\n    ipxe_bin: ipxe.lkrn\n    output_bin: .lkrn\n    type: Kernel\n  - desc: Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc\n    ipxe_bin: ipxe.dsk\n    output_bin: .dsk\n    type: Floppy\n  - desc: Padded Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc\n    ipxe_bin: ipxe.pdsk\n    output_bin: .pdsk\n    type: Floppy\n  - desc: DHCP boot image file, uses built-in iPXE NIC drivers\n    ipxe_bin: ipxe.kpxe\n    output_bin: .kpxe\n    type: DHCP\n  - desc: DHCP boot image file, use if you have NIC issues\n    ipxe_bin: undionly.kpxe\n    output_bin: -undionly.kpxe\n    type: DHCP-undionly\n  multiarch:\n  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box\n    ipxe_bin: ipxe.iso\n    output_bin: -multiarch.iso\n    type: ISO\n  - desc: Used for creation of USB Keys\n    ipxe_bin: ipxe.img\n    output_bin: -multiarch.img\n    type: IMG\n  rpi:\n  - desc: Raspberry Pi 4 - USB/SD Card Image\n    ipxe_bin: rpi4-sdcard.img\n    output_bin: -rpi4-sdcard.img\n    type: USB/SD Card\n  - desc: Raspberry Pi 4 - EFI Image\n    ipxe_bin: snp.efi\n    output_bin: -rpi4-snp.efi\n    type: DHCP-snp\n  secureboot_arm64:\n  - desc: Secure Boot ARM64 ISO for CD/DVD/Virtual Media\n    output_bin: -sb-arm64.iso\n    type: ISO\n  - desc: Secure Boot ARM64 USB image\n    output_bin: -sb-arm64.img\n    type: IMG\n  secureboot_x86_64:\n  - desc: Secure Boot x86_64 ISO for CD/DVD/Virtual Media\n    output_bin: -sb.iso\n    type: ISO\n  - desc: Secure Boot x86_64 USB image\n    output_bin: -sb.img\n    type: IMG\n  uefi:\n  - desc: DHCP EFI boot image file, uses built-in iPXE NIC drivers\n    ipxe_bin: ipxe.efi\n    output_bin: .efi\n    type: DHCP\n  - desc: EFI w/ Simple Network Protocol, attempts to boot all net devices\n    ipxe_bin: snp.efi\n    output_bin: -snp.efi\n    type: DHCP-snp\n  - desc: EFI w/ Simple Network Protocol, only boots from device chained from\n    ipxe_bin: snponly.efi\n    output_bin: -snponly.efi\n    type: DHCP-snponly\n  - desc: DHCP EFI Floppy boot image file, uses built-in iPXE NIC drivers\n    ipxe_bin: ipxe.efi.dsk\n    output_bin: .efi.dsk\n    type: Floppy\n  - desc: EFI Floppy image w/ Simple Network Protocol, attempts to boot all net devices\n    ipxe_bin: snp.efi.dsk\n    output_bin: -snp.efi.dsk\n    type: Floppy-snp\ncert_dir: /etc/netbootxyz/certs\ncert_file_filename: ca-netboot-xyz.crt\nchecksums_filename: '{{ site_name }}-sha256-checksums.txt'\ncodesign_cert_filename: codesign.crt\ncodesign_key_filename: codesign.key\ncustom_generate_menus: false\ncustom_github_menus: true\ncustom_templates_dir: '{{ netbootxyz_conf_dir }}/custom'\ncustom_url_menus: true\nearly_menu_contents: '### put early ipxe settings here'\nearly_menu_enabled: false\ngenerate_checksums: true\ngenerate_disks: true\ngenerate_disks_arm: false\ngenerate_disks_efi: true\ngenerate_disks_hybrid: false\ngenerate_disks_legacy: true\ngenerate_disks_linux: false\ngenerate_disks_rpi: false\ngenerate_disks_secureboot: false\ngenerate_local_vars: true\ngenerate_menus: true\ngenerate_signatures: false\ngenerate_version_file: true\nipxe_branch: master\nipxe_ca_filename: ca-ipxe-org.crt\nipxe_ca_url: http://ca.ipxe.org/ca.crt\nipxe_debug_enabled: false\nipxe_debug_options: httpcore,tls\nipxe_repo: https://github.com/ipxe/ipxe\nipxe_secureboot_archive_url: https://github.com/ipxe/ipxe/releases/download/{{ ipxe_secureboot_version\n  }}/ipxeboot.tar.gz\nipxe_secureboot_version: v2.0.0\nipxe_source_dir: /usr/src/ipxe\nkernel_params: initrd=initrd.magic ${cmdline}\nlive_endpoint: https://github.com/netbootxyz\nmake_num_jobs: 1\nmemdisk_location: http://${boot_domain}/memdisk\nnetbootxyz_conf_dir: /etc/netbootxyz\nnetbootxyz_root: /var/www/html\npciids_url: https://raw.githubusercontent.com/netbootxyz/pciids/master/pciids.ipxe\npipxe_branch: master\npipxe_repo: https://github.com/netbootxyz/pipxe\npipxe_source_dir: /usr/src/pipxe\nreleases:\n  almalinux:\n    base_dir: almalinux\n    enabled: true\n    menu: linux\n    mirror: http://repo.almalinux.org\n    name: AlmaLinux\n    versions:\n    - code_name: 10\n      name: 10 (Latest)\n    - code_name: 9\n      name: 9 (Latest)\n    - code_name: 8\n      name: 8 (Latest)\n  alpinelinux:\n    base_dir: alpine\n    enabled: true\n    menu: linux\n    mirror: http://dl-cdn.alpinelinux.org\n    name: Alpine Linux\n    versions:\n    - code_name: v3.23\n      name: '3.23'\n    - code_name: edge\n      name: Edge (development)\n  archlinux:\n    base_dir: archlinux\n    enabled: true\n    menu: linux\n    mirror: mirrors.kernel.org\n    name: Arch Linux\n    versions:\n    - code_name: 2026.03.01\n      name: 2026.03.01\n  blackarch:\n    enabled: true\n    menu: linux\n    name: BlackArch\n    versions:\n    - code_name: current\n      name: current\n  centos:\n    base_dir: null\n    enabled: true\n    menu: linux\n    mirror: https://mirror.stream.centos.org\n    name: CentOS Stream\n    versions:\n    - code_name: 10-stream\n      name: 10.0 Stream\n    - code_name: 9-stream\n      name: 9.0 Stream\n  coreos:\n    base_dir: prod/streams\n    enabled: true\n    menu: linux\n    mirror: https://builds.coreos.fedoraproject.org\n    name: Fedora CoreOS\n    versions:\n    - code_name: 43.20260301.3.1\n      name: stable\n    - code_name: 43.20260316.2.1\n      name: testing\n    - code_name: 44.20260316.1.1\n      name: next\n  debian:\n    archive_mirror: http://archive.debian.org\n    base_dir: debian\n    enabled: true\n    menu: linux\n    mirror: http://deb.debian.org\n    name: Debian\n    versions:\n      stable:\n      - code_name: trixie\n        name: 13.0 (trixie)\n      - code_name: bookworm\n        name: 12.0 (bookworm)\n      testing:\n      - code_name: forky\n        name: forky (testing)\n      - code_name: sid\n        name: sid (unstable)\n  devuan:\n    base_dir: devuan\n    enabled: true\n    menu: linux\n    mirror: http://deb.devuan.org\n    name: Devuan\n    versions:\n      stable:\n      - code_name: daedalus\n        name: 5.0 Daedalus (stable)\n      - code_name: chimaera\n        name: 4.0 Chimaera (oldstable)\n      - code_name: beowulf\n        name: 3.1 Beowulf (oldoldstable)\n      testing:\n      - code_name: excalibur\n        name: Excalibur (testing)\n  fedora:\n    base_dir: fedora\n    enabled: true\n    menu: linux\n    mirror: http://mirrors.kernel.org\n    name: Fedora\n    versions:\n    - code_name: 43\n      name: 43\n    - code_name: 42\n      name: 42\n  flatcar:\n    enabled: true\n    menu: linux\n    mirror: ''\n    name: Flatcar Container Linux\n    versions:\n    - code_name: stable\n      name: Stable Channel\n    - code_name: beta\n      name: Beta Channel\n    - code_name: alpha\n      name: Alpha Channel\n    - code_name: edge\n      name: Edge Channel\n  freebsd:\n    enabled: true\n    menu: bsd\n    name: FreeBSD\n  freedos:\n    base_dir: pub/micro/pc-stuff/freedos/files/distributions/1.4\n    enabled: true\n    menu: dos\n    mirror: http://www.ibiblio.org\n    name: FreeDOS\n    versions:\n    - code_name: FD14-FullUSB\n      name: 1.4 Full Installer\n    - code_name: FD14-LiteUSB\n      name: 1.4 Lite Installer\n  gentoo:\n    enabled: true\n    menu: linux\n    name: Gentoo\n  harvester:\n    enabled: true\n    menu: linux\n    name: Harvester\n  ipfire:\n    base_dir: releases/ipfire-2.x\n    enabled: true\n    menu: linux\n    mirror: https://downloads.ipfire.org\n    name: IPFire\n    versions:\n    - code_name: 2.29-core200\n      name: 2.29 Core200\n  k3os:\n    enabled: true\n    menu: linux\n    mirror: https://github.com/rancher/k3os/releases\n    name: k3OS\n  kairos:\n    enabled: true\n    flavors:\n    - key: core\n      name: Core\n    - key: k3sv1.30.11-k3s1\n      name: k3s v1.30.11-k3s1 (Standard)\n    - key: k3sv1.31.7-k3s1\n      name: k3s v1.31.7-k3s1 (Standard)\n    - key: k3sv1.32.3-k3s1\n      name: k3s v1.32.3-k3s1 (Standard)\n    menu: linux\n    mirror: https://github.com/kairos-io/kairos/releases\n    name: Kairos\n    platforms:\n    - key: alpine-3.21\n      name: Alpine Linux 3.21\n    - key: debian-12\n      name: Debian 12\n    - key: fedora-40\n      name: Fedora 40\n    - key: opensuse-leap-15.6\n      name: openSUSE Leap 15.6\n    - key: opensuse-tumbleweed\n      name: openSUSE Tumbleweed\n    - key: rockylinux-9\n      name: Rocky Linux 9\n    - key: ubuntu-22.04\n      name: Ubuntu 22.04\n    - key: ubuntu-24.04\n      name: Ubuntu 24.04\n    - key: ubuntu-24.10\n      name: Ubuntu 24.10\n    version: v3.5.3\n  kali:\n    base_dir: kali\n    enabled: true\n    menu: linux\n    mirror: http://http.kali.org\n    name: Kali Linux\n    versions:\n    - code_name: rolling\n      name: Rolling Edition\n  mageia:\n    base_dir: mageia\n    enabled: true\n    menu: linux\n    mirror: http://mirrors.kernel.org\n    name: Mageia\n    versions:\n    - code_name: '8'\n      name: '8'\n    - code_name: cauldron\n      name: cauldron\n  nixos:\n    base_dir: nixos\n    enabled: true\n    menu: linux\n    name: NixOS\n    versions:\n    - code_name: nixos-25.11\n      name: nixos-25.11\n    - code_name: nixos-25.05\n      name: nixos-25.05\n    - code_name: nixos-24.11\n      name: nixos-24.11\n    - code_name: nixos-24.05\n      name: nixos-24.05\n    - code_name: nixos-23.11\n      name: nixos-23.11\n    - code_name: nixos-23.05\n      name: nixos-23.05\n    - code_name: nixos-22.11\n      name: nixos-22.11\n    - code_name: nixos-22.05\n      name: nixos-22.05\n    - code_name: nixos-21.11\n      name: nixos-21.11\n    - code_name: nixos-21.05\n      name: nixos-21.05\n    - code_name: nixos-20.09\n      name: nixos-20.09\n  openEuler:\n    base_dir: null\n    enabled: true\n    menu: linux\n    mirror: http://repo.openeuler.org\n    name: openEuler\n    versions:\n    - code_name: openEuler-24.09\n      name: openEuler-24.09\n    - code_name: openEuler-24.03-LTS-SP1\n      name: openEuler-24.03-LTS-SP1\n    - code_name: openEuler-20.03-LTS-SP3\n      name: openEuler-20.03-LTS-SP3\n    - code_name: openEuler-22.03-LTS\n      name: openEuler-22.03-LTS\n    - code_name: openEuler-22.03-LTS-SP1\n      name: openEuler-22.03-LTS-SP1\n    - code_name: openEuler-22.03-LTS-SP2\n      name: openEuler-22.03-LTS-SP2\n  openbsd:\n    base_dir: pub/OpenBSD\n    enabled: true\n    menu: bsd\n    mirror: http://cdn.openbsd.org\n    name: OpenBSD\n    versions:\n    - code_name: snapshots\n      image_ver: '78'\n      name: 7.8 Latest Snapshot\n    - code_name: '7.8'\n      image_ver: '78'\n      name: '7.8'\n    - code_name: '7.7'\n      image_ver: '77'\n      name: '7.7'\n  opensuse:\n    base_dir: distribution/leap\n    enabled: true\n    menu: linux\n    mirror: http://download.opensuse.org\n    name: openSUSE\n    versions:\n    - code_name: '16.0'\n      name: openSUSE Leap 16.0\n    - code_name: '15.6'\n      name: openSUSE Leap 15.6\n    - code_name: tumbleweed\n      name: openSUSE tumbleweed\n  oracle:\n    enabled: true\n    menu: linux\n    mirror: https://yum.oracle.com\n    name: Oracle Linux\n    paths:\n      8: /repo/OracleLinux/OL8/baseos/latest\n      9: /repo/OracleLinux/OL9/baseos/latest\n  photon:\n    enabled: true\n    menu: linux\n    name: VMware Photon\n  proxmox:\n    enabled: true\n    menu: linux\n    name: Proxmox\n  rhel:\n    enabled: true\n    menu: linux\n    name: Red Hat Enterprise Linux\n  rockylinux:\n    base_dir: pub/rocky\n    enabled: true\n    menu: linux\n    mirror: http://download.rockylinux.org\n    name: Rocky Linux\n    versions:\n    - code_name: 10\n      name: 10 (Latest)\n    - code_name: 9\n      name: 9 (Latest)\n    - code_name: 8\n      name: 8 (Latest)\n  slackware:\n    base_dir: slackware\n    enabled: true\n    menu: linux\n    mirror: http://mirrors.kernel.org\n    name: Slackware\n    versions:\n    - code_name: current\n      name: Current\n    - code_name: '14.2'\n      name: '14.2'\n    - code_name: '14.1'\n      name: '14.1'\n    - code_name: '15.0'\n      name: '15.0'\n  smartos:\n    base_dir: /platform/i86pc/\n    enabled: true\n    menu: unix\n    mirror: https://netboot.smartos.org/os/\n    name: SmartOS\n    versions:\n    - code_name: 20260319T000507Z\n      name: 20260319T000507Z\n    - code_name: 20260306T044811Z\n      name: 20260306T044811Z\n    - code_name: 20260305T000543Z\n      name: 20260305T000543Z\n    - code_name: 20260219T015737Z\n      name: 20260219T015737Z\n  talos:\n    enabled: true\n    menu: linux\n    mirror: https://github.com/siderolabs/talos/releases\n    name: Talos\n    platforms:\n    - key: metal\n      name: Bare Metal\n    - key: aws\n      name: AWS\n    - key: azure\n      name: Azure\n    - key: digitalocean\n      name: Digital Ocean\n    - key: equinixMetal\n      name: Equinix Metal\n    - key: gcp\n      name: GCP\n    - key: hcloud\n      name: Hetzner Cloud\n    - key: nocloud\n      name: Nocloud\n    - key: openstack\n      name: Openstack\n    - key: oracle\n      name: oracle\n    - key: scaleway\n      name: Scaleway\n    - key: upcloud\n      name: Upcloud\n    - key: vmware\n      name: VMware\n    - key: vultr\n      name: Vultr\n  tinycore:\n    enabled: true\n    menu: linux\n    mirror: http://distro.ibiblio.org/tinycorelinux\n    name: Tiny Core Linux\n    versions:\n    - arch: x86\n      code_name: core\n      initrd: /17.x/x86/release/distribution_files/core.gz\n      kernel: /17.x/x86/release/distribution_files/vmlinuz\n      name: Core\n    - arch: x86_64\n      code_name: corepure\n      initrd: /17.x/x86_64/release/distribution_files/corepure64.gz\n      kernel: /17.x/x86_64/release/distribution_files/vmlinuz64\n      name: CorePure\n    - arch: x86\n      code_name: dcorebionic\n      initrd: /dCore/x86/release/dCore-bionic/dCore-bionic.gz\n      kernel: /dCore/x86/release/dCore-bionic/vmlinuz-bionic\n      name: dCore Bionic\n    - arch: x86\n      code_name: dcorebionicplus\n      initrd: /dCore/x86/release/dCore-bionic/dCorePlus-bionic.gz\n      kernel: /dCore/x86/release/dCore-bionic/vmlinuz-bionic\n      name: dCore Bionic Plus\n    - arch: x86\n      code_name: dcorejessie\n      initrd: /dCore/x86/release/dCore-jessie/dCore-jessie.gz\n      kernel: /dCore/x86/release/dCore-jessie/vmlinuz-jessie\n      name: dCore Jessie\n    - arch: x86\n      code_name: dcorejessieplus\n      initrd: /dCore/x86/release/dCore-jessie/dCorePlus-jessie.gz\n      kernel: /dCore/x86/release/dCore-jessie/vmlinuz-jessie\n      name: dCore Jessie Plus\n    - arch: x86\n      code_name: dcorestretch\n      initrd: /dCore/x86/release/dCore-stretch/dCore-stretch.gz\n      kernel: /dCore/x86/release/dCore-stretch/vmlinuz-stretch\n      name: dCore Stretch\n    - arch: x86\n      code_name: dcorestretchplus\n      initrd: /dCore/x86/release/dCore-stretch/dCorePlus-stretch.gz\n      kernel: /dCore/x86/release/dCore-stretch/vmlinuz-stretch\n      name: dCore Stretch Plus\n    - arch: x86\n      code_name: dcoretrusty\n      initrd: /dCore/x86/release/dCore-trusty/dCore-trusty.gz\n      kernel: /dCore/x86/release/dCore-trusty/vmlinuz-trusty\n      name: dCore Trusty\n    - arch: x86\n      code_name: dcoretrustyplus\n      initrd: /dCore/x86/release/dCore-trusty/dCorePlus-trusty.gz\n      kernel: /dCore/x86/release/dCore-trusty/vmlinuz-trusty\n      name: dCore Trusty Plus\n    - arch: x86\n      code_name: dcorewheezy\n      initrd: /dCore/x86/release/dCore-wheezy/dCore-wheezy.gz\n      kernel: /dCore/x86/release/dCore-wheezy/vmlinuz-wheezy\n      name: dCore Wheezy\n    - arch: x86\n      code_name: dcorewheezyplus\n      initrd: /dCore/x86/release/dCore-wheezy/dCorePlus-wheezy.gz\n      kernel: /dCore/x86/release/dCore-wheezy/vmlinuz-wheezy\n      name: dCore Wheezy Plus\n    - arch: x86\n      code_name: dcorexenial\n      initrd: /dCore/x86/release/dCore-xenial/dCore-xenial.gz\n      kernel: /dCore/x86/release/dCore-xenial/vmlinuz-xenial\n      name: dCore Xenial\n    - arch: x86\n      code_name: dcorexenialplus\n      initrd: /dCore/x86/release/dCore-xenial/dCorePlus-xenial.gz\n      kernel: /dCore/x86/release/dCore-xenial/vmlinuz-xenial\n      name: dCore Xenial Plus\n    - arch: x86_64\n      code_name: dcore64bionic\n      initrd: /dCore/x86_64/release/dCore-bionic64/dCore-bionic64.gz\n      kernel: /dCore/x86_64/release/dCore-bionic64/vmlinuz-bionic64\n      name: dCore64 Bionic\n    - arch: x86_64\n      code_name: dcore64bionicplus\n      initrd: /dCore/x86_64/release/dCore-bionic64/dCorePlus-bionic64.gz\n      kernel: /dCore/x86_64/release/dCore-bionic64/vmlinuz-bionic64\n      name: dCore64 Bionic Plus\n    - arch: x86_64\n      code_name: dcore64buster\n      initrd: /dCore/x86_64/release/dCore-buster64/dCore-buster64.gz\n      kernel: /dCore/x86_64/release/dCore-buster64/vmlinuz-buster64\n      name: dCore64 Buster\n    - arch: x86_64\n      code_name: dcore64busterplus\n      initrd: /dCore/x86_64/release/dCore-buster64/dCorePlus-buster64.gz\n      kernel: /dCore/x86_64/release/dCore-buster64/vmlinuz-buster64\n      name: dCore64 Buster Plus\n    - arch: x86_64\n      code_name: dcore64stretch\n      initrd: /dCore/x86_64/release/dCore-stretch64/dCore-stretch64.gz\n      kernel: /dCore/x86_64/release/dCore-stretch64/vmlinuz-stretch64\n      name: dCore64 Stretch\n    - arch: x86_64\n      code_name: dcore64stretchplus\n      initrd: /dCore/x86_64/release/dCore-stretch64/dCorePlus-stretch64.gz\n      kernel: /dCore/x86_64/release/dCore-stretch64/vmlinuz-stretch64\n      name: dCore Stretch Plus\n  ubuntu:\n    archive_mirror: http://old-releases.ubuntu.com\n    base_dir: ubuntu\n    enabled: true\n    menu: linux\n    mirror: http://archive.ubuntu.com\n    name: Ubuntu\n    versions:\n    - code_name: questing\n      name: 25.10 Questing Quokka\n    - code_name: plucky\n      name: 25.04 Plucky Puffin\n    - code_name: oracular\n      name: 24.10 Oracular Oriole\n    - code_name: noble\n      name: 24.04 LTS Noble Numbat\n    - code_name: jammy\n      name: 22.04 LTS Jammy Jellyfish\n    - code_name: focal\n      name: 20.04 LTS Focal Fossa (Subiquity)\n    - code_name: focal-legacy\n      name: 20.04 LTS Focal Fossa (Legacy)\n    - code_name: bionic\n      name: 18.04 LTS Bionic Beaver\n    - code_name: xenial\n      name: 16.04 LTS Xenial Xerus\n  vmware:\n    enabled: true\n    menu: linux\n    name: VMware ESXi\n  vyos:\n    enabled: true\n    menu: linux\n    name: VyOS\n    versions:\n    - code_name: rolling\n      name: 1.5 rolling\n  zeninstall:\n    enabled: true\n    menu: linux\n    name: Zen Installer Arch\n    versions:\n    - code_name: current\n      name: current\nsigs_dir: '{{ netbootxyz_root }}/sigs'\nsigs_enabled: false\nsigs_location: http://${boot_domain}/sigs/\nsigs_menu: false\nsite_name: netboot.xyz\ntime_server: 0.pool.ntp.org\nutilitiesarm:\n  memtest86:\n    enabled: false\n    kernel: ${live_endpoint}{{ endpoints.memtest86.path }}memtest86-usb.img\n    name: Memtest86 Free - {{ endpoints.memtest86.version }}\n    type: sanboot\n  uefishell:\n    enabled: true\n    kernel: ${live_endpoint}{{ endpoints.uefishell.path }}uefi-shell-aarch64.efi\n    name: UEFI Shell\n    type: direct\nutilitiesefi:\n  4mlinux:\n    enabled: true\n    name: 4MLinux\n    type: ipxemenu\n  bootrepair:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.bootrepair.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.bootrepair.path }}vmlinuz ip=dhcp boot=casper\n      netboot=http fetch=${live_endpoint}{{ endpoints.bootrepair.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: Boot Repair CD\n    type: direct\n  caine:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.caine.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.caine.path }}vmlinuz ip=dhcp boot=casper\n      netboot=url url=${live_endpoint}{{ endpoints.caine.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: CAINE\n    type: direct\n  clonezilla:\n    enabled: true\n    name: Clonezilla\n    type: ipxemenu\n  dts:\n    enabled: true\n    initrd: https://boot.dasharo.com{{ endpoints.dts.path }}/dts-base-image-v{{ endpoints.dts.version\n      }}.cpio.gz\n    kernel: https://boot.dasharo.com{{ endpoints.dts.path }}/bzImage-v{{ endpoints.dts.version\n      }}\n    name: Dasharo Tools Suite\n    type: direct\n  gparted:\n    enabled: true\n    name: GParted\n    type: ipxemenu\n  kaspersky:\n    enabled: true\n    name: Kaspersky Rescue Disk\n    type: ipxemenu\n  memtest86plus:\n    enabled: true\n    name: Memtest86+ {{ endpoints.memtest86plus.version }}\n    type: memtest\n    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_x86_64\n    version: '{{ endpoints.memtest86plus.version }}'\n  redorescue:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.redorescue.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.redorescue.path }}vmlinuz boot=live noprompt\n      nocomponents setkmap=us fetch=${live_endpoint}{{ endpoints.redorescue.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: RedoRescue\n    type: direct\n  rescatux:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.rescatux.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.rescatux.path }}vmlinuz boot=live fetch=${live_endpoint}{{\n      endpoints.rescatux.path }}filesystem.squashfs selinux=1 security=selinux enforcing=0\n      {{ kernel_params }}\n    name: Rescatux\n    type: direct\n  rescuezilla:\n    enabled: true\n    name: Rescuezilla\n    type: ipxemenu\n  shredos:\n    enabled: true\n    name: ShredOS\n    type: ipxemenu\n  supergrubdisk:\n    enabled: true\n    kernel: ${live_endpoint}{{ endpoints.supergrubdisk.path }}supergrub2-classic-x86_64.efi\n    name: Super Grub2 Disk\n    type: direct\n  systemrescue:\n    enabled: true\n    name: System Rescue CD\n    type: ipxemenu\n  uefishell:\n    enabled: true\n    kernel: ${live_endpoint}{{ endpoints.uefishell.path }}uefi-shell-x64.efi\n    name: UEFI Shell\n    type: direct\n  zfsbootmenu:\n    enabled: true\n    kernel: ${live_endpoint}{{ endpoints.zfsbootmenu.path }}zfsbootmenu-recovery-x86_64.efi\n    name: ZFSBootMenu\n    type: direct\nutilitiespcbios32:\n  clonezilla:\n    enabled: true\n    name: Clonezilla\n    type: ipxemenu\n  memtest86legacy:\n    enabled: true\n    name: Memtest86+ 5.01.0\n    type: memtest\n    util_path: https://boot.netboot.xyz/utils/memtest86-5.01.0\n    version: 5.01.0\n  memtest86plus:\n    enabled: true\n    name: Memtest86+ {{ endpoints.memtest86plus.version }}\n    type: memtest\n    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_i586\n    version: '{{ endpoints.memtest86plus.version }}'\n  shredos:\n    enabled: true\n    name: ShredOS\n    type: ipxemenu\n  systemrescue:\n    enabled: true\n    name: System Rescue CD\n    type: ipxemenu\nutilitiespcbios64:\n  4mlinux:\n    enabled: true\n    name: 4MLinux\n    type: ipxemenu\n  bootrepair:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.bootrepair.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.bootrepair.path }}vmlinuz ip=dhcp boot=casper\n      netboot=http fetch=${live_endpoint}{{ endpoints.bootrepair.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: Boot Repair CD\n    type: direct\n  breakin:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.breakin.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.breakin.path }}vmlinuz sshpasswd=breakin\n      startup=breakin {{ kernel_params }}\n    name: Breakin\n    type: direct\n  caine:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.caine.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.caine.path }}vmlinuz ip=dhcp boot=casper\n      netboot=http fetch=${live_endpoint}{{ endpoints.caine.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: CAINE\n    type: direct\n  clonezilla:\n    enabled: true\n    name: Clonezilla\n    type: ipxemenu\n  dban:\n    enabled: true\n    name: DBAN\n    type: ipxemenu\n  dts:\n    enabled: true\n    initrd: https://boot.dasharo.com{{ endpoints.dts.path }}/dts-base-image-v{{ endpoints.dts.version\n      }}.cpio.gz\n    kernel: https://boot.dasharo.com{{ endpoints.dts.path }}/bzImage-v{{ endpoints.dts.version\n      }}\n    name: Dasharo Tools Suite\n    type: direct\n  gparted:\n    enabled: true\n    name: GParted\n    type: ipxemenu\n  kaspersky:\n    enabled: true\n    name: Kaspersky Rescue Disk\n    type: ipxemenu\n  memtest86legacy:\n    enabled: true\n    name: Memtest86+ 5.01.0\n    type: memtest\n    util_path: https://boot.netboot.xyz/utils/memtest86-5.01.0\n    version: 5.01.0\n  memtest86plus:\n    enabled: true\n    name: Memtest86+ {{ endpoints.memtest86plus.version }}\n    type: memtest\n    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_x86_64\n    version: '{{ endpoints.memtest86plus.version }}'\n  redorescue:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.redorescue.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.redorescue.path }}vmlinuz boot=live noprompt\n      nocomponents setkmap=us fetch=${live_endpoint}{{ endpoints.redorescue.path }}filesystem.squashfs\n      {{ kernel_params }}\n    name: RedoRescue\n    type: direct\n  rescatux:\n    enabled: true\n    initrd: ${live_endpoint}{{ endpoints.rescatux.path }}initrd\n    kernel: ${live_endpoint}{{ endpoints.rescatux.path }}vmlinuz boot=live fetch=${live_endpoint}{{\n      endpoints.rescatux.path }}filesystem.squashfs selinux=1 security=selinux enforcing=0\n      {{ kernel_params }}\n    name: Rescatux\n    type: direct\n  rescuezilla:\n    enabled: true\n    name: Rescuezilla\n    type: ipxemenu\n  shredos:\n    enabled: true\n    name: ShredOS\n    type: ipxemenu\n  supergrub:\n    enabled: true\n    name: Super GRUB2 Disk\n    type: memdisk\n    util_path: http://master.dl.sourceforge.net/project/supergrub2/2.04s1/super_grub2_disk_2.04s1/super_grub2_disk_hybrid_2.04s1.iso\n    version: 2.04s1\n  systemrescue:\n    enabled: true\n    name: System Rescue CD\n    type: ipxemenu\n  ubcd:\n    enabled: true\n    name: Ultimate Boot CD (UBCD)\n    type: memdisk\n    util_path: https://mirror.sysadminguide.net/ubcd/ubcd539.iso\n    version: '539'\nwimboot_location: http://${boot_domain}/wimboot\nwimboot_upstream_url: https://github.com/ipxe/wimboot/releases/latest/download/wimboot\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/colour.h",
    "content": "#undef COLOR_NORMAL_FG\n#undef COLOR_NORMAL_BG\n#undef COLOR_SELECT_FG\n#undef COLOR_SELECT_BG\n#undef COLOR_SEPARATOR_FG\n#undef COLOR_SEPARATOR_BG\n#undef COLOR_EDIT_FG\n#undef COLOR_EDIT_BG\n#undef COLOR_ALERT_FG\n#undef COLOR_ALERT_BG\n#undef COLOR_URL_FG\n#undef COLOR_URL_BG\n#undef COLOR_PXE_FG\n#undef COLOR_PXE_BG\n#define COLOR_NORMAL_FG\t\tCOLOR_CYAN\n#define COLOR_NORMAL_BG\t\tCOLOR_BLACK\n#define COLOR_SELECT_FG\t\tCOLOR_WHITE\n#define COLOR_SELECT_BG\t\tCOLOR_BLUE\n#define COLOR_SEPARATOR_FG\tCOLOR_WHITE\n#define COLOR_SEPARATOR_BG\tCOLOR_BLACK\n#define COLOR_EDIT_FG\t\tCOLOR_BLACK\n#define COLOR_EDIT_BG\t\tCOLOR_CYAN\n#define COLOR_ALERT_FG\t\tCOLOR_WHITE\n#define COLOR_ALERT_BG\t\tCOLOR_RED\n#define COLOR_URL_FG\t\tCOLOR_CYAN\n#define COLOR_URL_BG\t\tCOLOR_BLUE\n#define COLOR_PXE_FG\t\tCOLOR_BLACK\n#define COLOR_PXE_BG\t\tCOLOR_WHITE\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/console.h",
    "content": "#define\tCONSOLE_FRAMEBUFFER\t/* Graphical framebuffer console */"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/crypto.h",
    "content": "#undef OCSP_CHECK\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/general.h",
    "content": "#define CERT_CMD              /* Certificate management commands */\n#define CONSOLE_CMD           /* Console command */\n#define DIGEST_CMD            /* Image crypto digest commands */\n#define DOWNLOAD_PROTO_HTTPS  /* Secure Hypertext Transfer Protocol */\n#define DOWNLOAD_PROTO_NFS    /* NFS */\n#define IMAGE_COMBOOT         /* COMBOOT */\n#define IMAGE_TRUST_CMD       /* Image trust management commands */\n#define IMAGE_GZIP            /* GZIP image support */\n#define IMAGE_PNG             /* PNG image support */\n#define IMAGE_ZLIB            /* ZLIB image support */\n#define NET_PROTO_IPV6        /* IPv6 protocol */\n#define NET_PROTO_LLDP        /* Link Layer Discovery protocol */\n#define NSLOOKUP_CMD          /* DNS resolving command */\n#define NTP_CMD               /* NTP commands */\n#define PARAM_CMD             /* Form parameter commands */\n#define PCI_CMD               /* PCI commands */\n#define PING_CMD              /* Ping command */\n#define POWEROFF_CMD          /* Power off commands */\n#define REBOOT_CMD            /* Reboot command */\n#define TIME_CMD              /* Time commands */\n#define VLAN_CMD              /* VLAN commands */\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/general.h.efi",
    "content": "#define CERT_CMD              /* Certificate management commands */\n#define CONSOLE_CMD           /* Console command */\n#define DIGEST_CMD            /* Image crypto digest commands */\n#define DOWNLOAD_PROTO_HTTPS  /* Secure Hypertext Transfer Protocol */\n#define DOWNLOAD_PROTO_NFS    /* NFS */\n#define IMAGE_TRUST_CMD       /* Image trust management commands */\n#define IMAGE_GZIP            /* GZIP image support */\n#define IMAGE_PNG             /* PNG image support */\n#define IMAGE_ZLIB            /* ZLIB image support */\n#define NET_PROTO_IPV6        /* IPv6 protocol */\n#define NET_PROTO_LLDP        /* Link Layer Discovery protocol */\n#define NSLOOKUP_CMD          /* DNS resolving command */\n#define NTP_CMD               /* NTP commands */\n#define PARAM_CMD             /* Form parameter commands */\n#define PCI_CMD               /* PCI commands */\n#define PING_CMD              /* Ping command */\n#define POWEROFF_CMD          /* Power off commands */\n#define REBOOT_CMD            /* Reboot command */\n#define TIME_CMD              /* Time commands */\n#define VLAN_CMD              /* VLAN commands */\n"
  },
  {
    "path": "roles/netbootxyz/meta/main.yml",
    "content": "galaxy_info:\n  author: Antony Messerli\n  description: Installs a self hosted version of netboot.xyz\n  license: Apache-2.0\n  min_ansible_version: 2.7\n  platforms:\n    - name: Ubuntu\n      versions:\n        - all\n    - name: Centos\n      versions:\n        - all\n  galaxy_tags:\n    - system\ndependencies: []\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_checksums.yml",
    "content": "---\n- name: Register a listing of all created iPXE bootloaders\n  ansible.builtin.shell: ls -p -I {{ checksums_filename }} {{ netbootxyz_root }}/ipxe/ | grep -v /\n  register: netboot_disks\n\n- name: Generate date\n  ansible.builtin.command: date\n  register: current_date\n\n- name: Gather stat listing of directory\n  ansible.builtin.command: sha256sum -b {{ item }}\n  with_items:\n    - \"{{ netboot_disks.stdout_lines }}\"\n  args:\n    chdir: \"{{ netbootxyz_root }}/ipxe/\"\n  register: netboot_disks_stat\n\n- name: Generate ipxe disk checksums\n  ansible.builtin.template:\n    src: checksums.txt.j2\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ checksums_filename }}\"\n\n- name: Generate site name banner for index\n  ansible.builtin.shell: toilet -f standard {{ site_name | quote }} --html | grep span\n  register: index_title\n  when: ansible_facts['os_family'] == \"Debian\"\n\n- name: Reset bootloader filename to first in list\n  ansible.builtin.set_fact:\n    bootloader_filename: \"{{ bootloader_disks | first }}\"\n\n- name: Generate netboot.xyz index template\n  ansible.builtin.template:\n    src: index.html.j2\n    dest: \"{{ netbootxyz_root }}/index.html\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks.yml",
    "content": "---\n\n- name: Set up iPXE build environment\n  ansible.builtin.include_tasks: generate_disks_base.yml\n\n- name: Generate legacy iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_legacy.yml\n  when:\n    - generate_disks_legacy | default(true) | bool\n\n- name: Generate linux iPXE bootloader\n  ansible.builtin.include_tasks: generate_disks_linux.yml\n  when:\n    - generate_disks_linux | default(false) | bool\n\n- name: Generate EFI iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_efi.yml\n  when:\n    - generate_disks_efi | default(true) | bool\n\n- name: Generate ARM iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_arm.yml\n  when:\n    - generate_disks_arm | default(false) | bool\n\n- name: Generate RPI iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_rpi.yml\n  when:\n    - generate_disks_rpi | default(false) | bool\n    - bootloader_filename == \"netboot.xyz\"\n\n- name: Generate hybrid iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_hybrid.yml\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - bootloader_filename == \"netboot.xyz\"\n\n- name: Generate Secure Boot iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks_secureboot.yml\n  when:\n    - generate_disks_secureboot | default(false) | bool\n    - bootloader_filename == \"netboot.xyz\"\n\n- name: Remove stale autoexec.ipxe when Secure Boot is disabled\n  ansible.builtin.file:\n    path: \"{{ netbootxyz_root }}/ipxe/autoexec.ipxe\"\n    state: absent\n  when:\n    - not (generate_disks_secureboot | default(false) | bool)\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_arm.yml",
    "content": "---\n\n- name: Copy netboot.xyz local EFI iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/{{ item }}\"\n  with_items:\n    - colour.h\n    - console.h\n    - crypto.h\n\n- name: Copy netboot.xyz general.h.efi iPXE config\n  ansible.builtin.copy:\n    src: \"ipxe/local/general.h.efi\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/general.h\"\n\n- name: Set trust file to ipxe ca\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n  when: not generate_signatures\n\n- name: Combine trust files if set\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}\"\n  when: generate_signatures | bool\n\n# iPXE workaround\n# http://lists.ipxe.org/pipermail/ipxe-devel/2018-August/006254.html\n# apply patch to fix arm64 builds on amd64 builds\n- name: Workaround in iPXE for arm\n  ansible.builtin.shell: sed -i '/WORKAROUND_CFLAGS/d' arch/arm64/Makefile\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n\n- name: Compile iPXE bootloaders for EFI arm64\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         CROSS_COMPILE=aarch64-linux-gnu- \\\n         ARCH=arm64 \\\n         EMBED={{ bootloader_filename }} \\\n         TRUST={{ trust_files }} \\\n         bin-arm64-efi/ipxe.efi \\\n         bin-arm64-efi/snp.efi \\\n         bin-arm64-efi/snponly.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool == false\n\n- name: Compile iPXE bootloader for EFI arm64 with debug flags\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         CROSS_COMPILE=aarch64-linux-gnu- \\\n         ARCH=arm64 \\\n         DEBUG={{ ipxe_debug_options }} \\\n         EMBED={{ bootloader_filename }} \\\n         TRUST={{ trust_files }} \\\n         bin-arm64-efi/snp.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool\n\n- name: Copy iPXE arm64 EFI builds to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/{{ item.src }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ item.dest }}\"\n    remote_src: true\n  with_items:\n    - {src: \"bin-arm64-efi/ipxe.efi\", dest: \"{{ bootloader_filename }}-arm64.efi\"}\n    - {src: \"bin-arm64-efi/snp.efi\", dest: \"{{ bootloader_filename }}-arm64-snp.efi\"}\n    - {src: \"bin-arm64-efi/snponly.efi\", dest: \"{{ bootloader_filename }}-arm64-snponly.efi\"}\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_base.yml",
    "content": "---\n\n- name: Gathering facts\n  ansible.builtin.setup:\n\n- name: Gather variables for each operating system\n  ansible.builtin.include_vars: \"{{ item }}\"\n  with_first_found:\n    - \"{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_version'] | lower }}.yml\"\n    - \"{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml\"\n    - \"{{ ansible_facts['os_family'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml\"\n    - \"{{ ansible_facts['distribution'] | lower }}.yml\"\n    - \"{{ ansible_facts['os_family'] | lower }}.yml\"\n\n- name: Ensure EPEL is enabled\n  ansible.builtin.dnf:\n    name: epel-release\n    state: present\n  when:\n    - ansible_facts['distribution'] == \"CentOS\"\n\n- name: Set var to bootloader of loop\n  ansible.builtin.set_fact:\n    bootloader_filename: \"{{ bootloader_file }}\"\n\n- name: Create iPXE file directories\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n  with_items:\n    - \"{{ netbootxyz_root }}/ipxe\"\n    - \"{{ cert_dir }}\"\n\n- name: Retrieve latest wimboot\n  ansible.builtin.get_url:\n    url: \"{{ wimboot_upstream_url }}\"\n    dest: \"{{ netbootxyz_root }}/wimboot\"\n\n- name: Copy helper apps\n  ansible.builtin.copy:\n    src: \"{{ item }}\"\n    dest: \"{{ netbootxyz_root }}\"\n  with_items:\n    - memdisk\n\n- name: Install required packages\n  ansible.builtin.package:\n    name: \"{{ item }}\"\n    state: present\n  with_items: \"{{ netbootxyz_packages }}\"\n\n- name: Check out latest iPXE sources\n  ansible.builtin.git:\n    repo: \"{{ ipxe_repo }}\"\n    dest: \"{{ ipxe_source_dir }}\"\n    version: \"{{ ipxe_branch }}\"\n    force: true\n  register: ipxe_git_checkout\n\n- name: Copy iPXE Bootloader template to iPXE source directory\n  ansible.builtin.template:\n    src: \"disks/{{ bootloader_filename }}.j2\"\n    dest: \"{{ ipxe_source_dir }}/src/{{ bootloader_filename }}\"\n\n- name: Touch iPXE config local files\n  ansible.builtin.file:\n    path: \"{{ ipxe_source_dir }}/{{ item }}\"\n    state: touch\n  with_items:\n    - src/config/local/umalloc.h\n    - src/config/local/nap.h\n    - src/config/local/timer.h\n    - src/config/local/branding.h\n    - src/config/local/serial.h\n    - src/config/local/reboot.h\n    - src/config/local/sanboot.h\n    - src/config/local/fault.h\n    - src/config/local/dhcp.h\n    - src/config/local/sideband.h\n    - src/config/local/entropy.h\n    - src/config/local/crypto.h\n    - src/config/local/usb.h\n    - src/config/local/settings.h\n    - src/config/local/isa.h\n\n- name: Retrieve iPXE CA\n  ansible.builtin.get_url:\n    url: \"{{ ipxe_ca_url }}\"\n    dest: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_efi.yml",
    "content": "---\n\n- name: Copy netboot.xyz local EFI iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/{{ item }}\"\n  with_items:\n    - colour.h\n    - console.h\n    - crypto.h\n\n- name: Copy netboot.xyz general.h.efi iPXE config\n  ansible.builtin.copy:\n    src: \"ipxe/local/general.h.efi\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/general.h\"\n\n- name: Set trust file to ipxe ca\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n  when: not generate_signatures\n\n- name: Combine trust files if set\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}\"\n  when: generate_signatures | bool\n\n- name: Compile iPXE bootloader for EFI\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         TRUST={{ trust_files }} \\\n         bin-x86_64-efi/ipxe.efi \\\n         bin-x86_64-efi/snp.efi \\\n         bin-x86_64-efi/snponly.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool == false\n\n- name: Compile iPXE bootloader for EFI with debug flags\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         DEBUG={{ ipxe_debug_options }} \\\n         TRUST={{ trust_files }} \\\n         bin-x86_64-efi/ipxe.efi \\\n         bin-x86_64-efi/snp.efi \\\n         bin-x86_64-efi/snponly.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool\n\n- name: Generate iPXE floppy images for EFI\n  ansible.builtin.shell: |\n    truncate -s 1440k bin-x86_64-efi/ipxe.efi.dsk\n    mformat -i bin-x86_64-efi/ipxe.efi.dsk -f 1440 ::\n    mmd -i bin-x86_64-efi/ipxe.efi.dsk ::EFI\n    mmd -i bin-x86_64-efi/ipxe.efi.dsk ::EFI/BOOT\n    cp bin-x86_64-efi/ipxe.efi.dsk bin-x86_64-efi/snp.efi.dsk\n    mcopy -i bin-x86_64-efi/ipxe.efi.dsk  bin-x86_64-efi/ipxe.efi ::EFI/BOOT/BOOTX64.EFI\n    mcopy -i bin-x86_64-efi/snp.efi.dsk  bin-x86_64-efi/snp.efi ::EFI/BOOT/BOOTX64.EFI\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n\n- name: Copy iPXE EFI builds to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/{{ item.src }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ item.dest }}\"\n    remote_src: true\n  with_items:\n    - {src: \"bin-x86_64-efi/ipxe.efi\", dest: \"{{ bootloader_filename }}.efi\"}\n    - {src: \"bin-x86_64-efi/snp.efi\", dest: \"{{ bootloader_filename }}-snp.efi\"}\n    - {src: \"bin-x86_64-efi/snponly.efi\", dest: \"{{ bootloader_filename }}-snponly.efi\"}\n    - {src: \"bin-x86_64-efi/ipxe.efi.dsk\", dest: \"{{ bootloader_filename }}.efi.dsk\"}\n    - {src: \"bin-x86_64-efi/snp.efi.dsk\", dest: \"{{ bootloader_filename }}-snp.efi.dsk\"}\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_hybrid.yml",
    "content": "---\n\n- name: Generate hybrid ISO x86_64 image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.iso \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_legacy | default(true) | bool\n    - generate_disks_efi | default(true) | bool\n\n\n- name: Generate hybrid ISO multiarch image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-multiarch.iso \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_legacy | default(true) | bool\n    - generate_disks_arm | default(false) | bool\n    - generate_disks_efi | default(true) | bool\n\n- name: Generate hybrid ISO arm64 image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.iso \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_arm | default(false) | bool\n\n- name: Generate hybrid USB x86_64 image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.img \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_legacy | default(true) | bool\n    - generate_disks_efi | default(true) | bool\n\n- name: Generate hybrid USB multiarch image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-multiarch.img \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_legacy | default(true) | bool\n    - generate_disks_arm | default(false) | bool\n    - generate_disks_efi | default(true) | bool\n\n- name: Generate hybrid USB arm64 image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.img \\\n      -s {{ bootloader_filename }} \\\n      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when:\n    - generate_disks_hybrid | default(false) | bool\n    - generate_disks_arm | default(false) | bool\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_legacy.yml",
    "content": "---\n\n- name: Copy netboot.xyz local legacy iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/{{ item }}\"\n  with_items:\n    - colour.h\n    - console.h\n    - crypto.h\n    - general.h\n\n- name: Set trust file to ipxe ca\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n  when: not generate_signatures\n\n- name: Combine trust args if set\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}\"\n  when: generate_signatures | bool\n\n- name: Compile iPXE bootloader for Legacy BIOS\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         TRUST={{ trust_files }} \\\n         bin/ipxe.dsk \\\n         bin/ipxe.pdsk \\\n         bin/ipxe.lkrn \\\n         bin/ipxe.kpxe \\\n         bin/undionly.kpxe\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool == false\n\n- name: Compile iPXE bootloader for Legacy BIOS with debug flags\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         DEBUG={{ ipxe_debug_options }} \\\n         TRUST={{ trust_files }} \\\n         bin/ipxe.dsk \\\n         bin/ipxe.pdsk \\\n         bin/ipxe.lkrn \\\n         bin/ipxe.kpxe \\\n         bin/undionly.kpxe\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool\n\n- name: Copy iPXE files for Legacy BIOS to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/bin/ipxe{{ item }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}{{ item }}\"\n    remote_src: true\n  with_items:\n    - \".pdsk\"\n    - \".dsk\"\n    - \".lkrn\"\n    - \".kpxe\"\n  when: bootloader_filename != \"netboot.xyz-metal\"\n\n- name: Copy iPXE files for Legacy BIOS to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/bin/ipxe{{ item }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}{{ item }}\"\n    remote_src: true\n  with_items:\n    - \".kpxe\"\n  when: bootloader_filename == \"netboot.xyz-metal\"\n\n- name: Copy undionly.kpxe for Legacy BIOS to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/bin/undionly.kpxe\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-undionly.kpxe\"\n    remote_src: true\n  when: bootloader_filename != \"netboot.xyz-metal\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_linux.yml",
    "content": "---\n\n- name: Copy netboot.xyz local legacy iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/{{ item }}\"\n  with_items:\n    - colour.h\n    - console.h\n    - crypto.h\n\n- name: Copy netboot.xyz general.h.efi iPXE config\n  ansible.builtin.copy:\n    src: \"ipxe/local/general.h.efi\"\n    dest: \"{{ ipxe_source_dir }}/src/config/local/general.h\"\n\n- name: Set trust file to ipxe ca\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n  when: not generate_signatures\n\n- name: Combine trust args if set\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}\"\n  when: generate_signatures | bool\n\n- name: Compile iPXE Linux bootloader for Legacy BIOS\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         TRUST={{ trust_files }} \\\n         bin-x86_64-linux/slirp.linux\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool == false\n\n- name: Compile iPXE Linux bootloader for Legacy BIOS with debug flags\n  ansible.builtin.shell: |\n    make clean\n    make -j{{ make_num_jobs }} \\\n         EMBED={{ bootloader_filename }} \\\n         DEBUG={{ ipxe_debug_options }} \\\n         TRUST={{ trust_files }} \\\n         bin-x86_64-linux/slirp.linux\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: ipxe_debug_enabled | bool\n\n- name: Copy iPXE linux binary for Legacy BIOS to http directory\n  ansible.builtin.copy:\n    src: \"{{ ipxe_source_dir }}/src/bin-x86_64-linux/slirp.linux\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-linux.bin\"\n    remote_src: true\n  when: bootloader_filename != \"netboot.xyz-metal\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_rpi.yml",
    "content": "---\n- name: Install required packages\n  ansible.builtin.package:\n    name: \"{{ item }}\"\n    state: present\n  with_items: \"{{ pipxe_packages }}\"\n\n- name: Check out latest pipxe sources\n  ansible.builtin.git:\n    repo: \"{{ pipxe_repo }}\"\n    dest: \"{{ pipxe_source_dir }}\"\n    version: \"{{ pipxe_branch }}\"\n    force: true\n    recursive: true\n  register: pipxe_git_checkout\n\n- name: Copy iPXE Bootloader template to iPXE source directory\n  ansible.builtin.template:\n    src: \"disks/{{ bootloader_filename }}.j2\"\n    dest: \"{{ pipxe_source_dir }}/ipxe/src/{{ bootloader_filename }}\"\n\n- name: Copy netboot.xyz local EFI iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: \"{{ pipxe_source_dir }}/ipxe/src/config/local/{{ item }}\"\n  with_items:\n    - colour.h\n    - console.h\n    - crypto.h\n\n- name: Copy netboot.xyz general.h.efi iPXE config\n  ansible.builtin.copy:\n    src: \"ipxe/local/general.h.efi\"\n    dest: \"{{ pipxe_source_dir }}/ipxe/src/config/local/general.h\"\n\n- name: Set trust file to ipxe ca\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }}\"\n  when: not generate_signatures\n\n- name: Combine trust files if set\n  ansible.builtin.set_fact:\n    trust_files: \"{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}\"\n  when: generate_signatures | bool\n\n- name: Copy Makefile template into pipxe\n  ansible.builtin.template:\n    src: pipxe/Makefile-rpi4.j2\n    dest: \"{{ pipxe_source_dir }}/Makefile\"\n\n- name: Compile iPXE bootloader for RPI build\n  ansible.builtin.shell: |\n    make -j{{ make_num_jobs }}\n  args:\n    chdir: \"{{ pipxe_source_dir }}\"\n\n- name: Copy iPXE RPI builds to http directory\n  ansible.builtin.copy:\n    src: \"{{ pipxe_source_dir }}/{{ item.src }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/{{ item.dest }}\"\n    remote_src: true\n  with_items:\n    - {src: \"sdcard.img\", dest: \"{{ bootloader_filename }}-rpi4-sdcard.img\"}\n    - {src: \"ipxe/src/bin-arm64-efi/snp.efi\", dest: \"{{ bootloader_filename }}-rpi4-snp.efi\"}\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_secureboot.yml",
    "content": "---\n\n- name: Create Secure Boot output directories\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n  with_items:\n    - \"{{ netbootxyz_root }}/ipxe/secureboot-x86_64\"\n    - \"{{ netbootxyz_root }}/ipxe/secureboot-arm64\"\n\n- name: Download iPXE Secure Boot archive\n  ansible.builtin.get_url:\n    url: \"{{ ipxe_secureboot_archive_url }}\"\n    dest: \"/tmp/ipxeboot.tar.gz\"\n\n- name: Extract iPXE Secure Boot archive\n  ansible.builtin.unarchive:\n    src: \"/tmp/ipxeboot.tar.gz\"\n    dest: \"/tmp\"\n    remote_src: true\n\n- name: Copy x86_64 Secure Boot binaries to output directory\n  ansible.builtin.copy:\n    src: \"/tmp/ipxeboot/x86_64-sb/{{ item }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/secureboot-x86_64/{{ item }}\"\n    remote_src: true\n  with_items:\n    - ipxe.efi\n    - ipxe-shim.efi\n    - shimx64.efi\n    - snponly.efi\n    - snponly-shim.efi\n\n- name: Copy ARM64 Secure Boot binaries to output directory\n  ansible.builtin.copy:\n    src: \"/tmp/ipxeboot/arm64-sb/{{ item }}\"\n    dest: \"{{ netbootxyz_root }}/ipxe/secureboot-arm64/{{ item }}\"\n    remote_src: true\n  with_items:\n    - ipxe.efi\n    - ipxe-shim.efi\n    - shimaa64.efi\n    - snponly.efi\n    - snponly-shim.efi\n  when: generate_disks_arm | default(false) | bool\n\n- name: Template autoexec.ipxe for x86_64 Secure Boot\n  ansible.builtin.template:\n    src: \"disks/autoexec.ipxe.j2\"\n    dest: \"{{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe\"\n\n- name: Template autoexec.ipxe for ARM64 Secure Boot\n  ansible.builtin.template:\n    src: \"disks/autoexec.ipxe.j2\"\n    dest: \"{{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe\"\n  when: generate_disks_arm | default(false) | bool\n\n- name: Generate Secure Boot x86_64 ISO image\n  ansible.builtin.shell: |\n    ./util/genfsimg \\\n      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb.iso \\\n      -s {{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe \\\n      -e /tmp/ipxeboot/x86_64-sb/shimx64.efi \\\n      /tmp/ipxeboot/x86_64-sb/ipxe.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n\n- name: Generate Secure Boot x86_64 USB image\n  ansible.builtin.shell: |\n    ./util/genfsimg \\\n      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb.img \\\n      -s {{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe \\\n      -e /tmp/ipxeboot/x86_64-sb/shimx64.efi \\\n      /tmp/ipxeboot/x86_64-sb/ipxe.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n\n- name: Generate Secure Boot ARM64 ISO image\n  ansible.builtin.shell: |\n    ./util/genfsimg \\\n      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb-arm64.iso \\\n      -s {{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe \\\n      -e /tmp/ipxeboot/arm64-sb/shimaa64.efi \\\n      /tmp/ipxeboot/arm64-sb/ipxe.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: generate_disks_arm | default(false) | bool\n\n- name: Generate Secure Boot ARM64 USB image\n  ansible.builtin.shell: |\n    ./util/genfsimg \\\n      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb-arm64.img \\\n      -s {{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe \\\n      -e /tmp/ipxeboot/arm64-sb/shimaa64.efi \\\n      /tmp/ipxeboot/arm64-sb/ipxe.efi\n  args:\n    chdir: \"{{ ipxe_source_dir }}/src\"\n  when: generate_disks_arm | default(false) | bool\n\n- name: Copy autoexec.ipxe to ipxe root as standalone release asset\n  ansible.builtin.copy:\n    src: \"{{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe\"\n    dest: \"{{ netbootxyz_root }}/ipxe/autoexec.ipxe\"\n    remote_src: true\n\n- name: Remove Secure Boot directories after ISO/USB generation\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: absent\n  with_items:\n    - \"{{ netbootxyz_root }}/ipxe/secureboot-x86_64\"\n    - \"{{ netbootxyz_root }}/ipxe/secureboot-arm64\"\n\n- name: Clean up Secure Boot archive\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: absent\n  with_items:\n    - \"/tmp/ipxeboot.tar.gz\"\n    - \"/tmp/ipxeboot\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_menus.yml",
    "content": "---\n- name: Combine overrides with release defaults\n  ansible.builtin.set_fact:\n    _releases: \"{{ releases | combine(release_overrides, recursive=True) }}\"\n  when: release_overrides is defined\n\n- name: Set releases with user overrides\n  ansible.builtin.set_fact:\n    releases: \"{{ _releases }}\"\n  when: release_overrides is defined\n\n# PC BIOS utilities\n- name: Combine overrides with utilitiespcbios64 defaults\n  ansible.builtin.set_fact:\n    _utilitiespcbios64: \"{{ utilitiespcbios64 | combine(utilitiespcbios64_overrides, recursive=True) }}\"\n  when: utilitiespcbios64_overrides is defined\n\n- name: Set utilitypcbios64 with user overrides\n  ansible.builtin.set_fact:\n    utilitiespcbios64: \"{{ _utilitiespcbios64 }}\"\n  when: utilitiespcbios64_overrides is defined\n\n- name: Combine overrides with utilitiespcbios32 defaults\n  ansible.builtin.set_fact:\n    _utilitiespcbios32: \"{{ utilitiespcbios32 | combine(utilitiespcbios32_overrides, recursive=True) }}\"\n  when: utilitiespcbios32_overrides is defined\n\n- name: Set utilitypcbios32 with user overrides\n  ansible.builtin.set_fact:\n    utilitiespcbios32: \"{{ _utilitiespcbios32 }}\"\n  when: utilitiespcbios32_overrides is defined\n\n# EFI utilities\n- name: Combine overrides with utilitiesefi defaults\n  ansible.builtin.set_fact:\n    _utilitiesefi: \"{{ utilitiesefi | combine(utilitiesefi_overrides, recursive=True) }}\"\n  when: utilitiesefi_overrides is defined\n\n- name: Set utilityefi with user overrides\n  ansible.builtin.set_fact:\n    utilitiesefi: \"{{ _utilitiesefi }}\"\n  when: utilitiesefi_overrides is defined\n\n- name: Generate directories\n  ansible.builtin.file:\n    path: \"{{ netbootxyz_root }}\"\n    state: directory\n\n- name: Set menu version\n  ansible.builtin.set_fact:\n    upstream_version: \"{{ boot_version }}\"\n  when:\n    - generate_version_file | bool\n\n- name: Generate version.ipxe for upstream\n  ansible.builtin.template:\n    src: \"version.ipxe.j2\"\n    dest: \"{{ netbootxyz_root }}/version.ipxe\"\n  when:\n    - generate_version_file | bool\n\n- name: Generate netboot.xyz source files templates\n  ansible.builtin.template:\n    src: \"{{ item.src }}\"\n    dest: \"{{ netbootxyz_root }}/{{ item.path | regex_replace('.j2', '') }}\"\n  with_community.general.filetree: \"{{ 'templates/menu/' }}\"\n  when: item.state == \"file\"\n\n- name: Generate local-vars.ipxe if enabled\n  ansible.builtin.template:\n    src: \"local-vars.ipxe.j2\"\n    dest: \"{{ netbootxyz_root }}/local-vars.ipxe\"\n  when:\n    - generate_local_vars | bool\n\n- name: Retrieve pciids.ipxe\n  ansible.builtin.get_url:\n    url: \"{{ pciids_url }}\"\n    dest: \"{{ netbootxyz_root }}/pciids.ipxe\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_menus_custom.yml",
    "content": "---\n\n- name: Generate directories\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n  with_items:\n    - \"{{ custom_templates_dir }}\"\n    - \"{{ netbootxyz_root }}/custom\"\n\n- name: Generate custom user menu templates\n  ansible.builtin.template:\n    src: \"{{ item.src }}\"\n    dest: \"{{ netbootxyz_root }}/custom/{{ item.path | regex_replace('.j2', '') }}\"\n  with_community.general.filetree: \"{{ custom_templates_dir }}\"\n  when: item.state == \"file\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_signatures.yml",
    "content": "---\n- name: Gather list of source files\n  ansible.builtin.command: ls {{ netbootxyz_root }}\n  register: source_files\n\n- name: Create directories for signatures\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n  with_items:\n    - \"{{ sigs_dir }}\"\n\n- name: Generate signatures for source files\n  ansible.builtin.shell: |\n    openssl cms -sign -binary -noattr -in {{ netbootxyz_root }}/{{ item }} \\\n    -signer {{ codesign_cert_filename }} -inkey {{ codesign_key_filename }} -certfile {{ cert_file_filename }} -outform DER \\\n    -out {{ sigs_dir }}/{{ item }}.sig\n  args:\n    chdir: \"{{ cert_dir }}\"\n  with_items:\n    - \"{{ source_files.stdout_lines }}\"\n"
  },
  {
    "path": "roles/netbootxyz/tasks/main.yml",
    "content": "---\n\n- name: Print Bootloader Disks to Build\n  ansible.builtin.debug:\n    var: bootloader_disks\n\n- name: Generate menus\n  ansible.builtin.include_tasks: generate_menus.yml\n  when:\n    - generate_menus | default(true) | bool\n\n- name: Generate custom menus\n  ansible.builtin.include_tasks: generate_menus_custom.yml\n  when:\n    - custom_generate_menus | default(false) | bool\n\n- name: Generate iPXE bootloaders\n  ansible.builtin.include_tasks: generate_disks.yml\n  with_items:\n    - \"{{ bootloader_disks }}\"\n  loop_control:\n    loop_var: bootloader_file\n  when:\n    - generate_disks | default(true) | bool\n\n- name: Generate checksums\n  ansible.builtin.include_tasks: generate_checksums.yml\n  when:\n    - generate_checksums | default(true) | bool\n\n- name: Generate signatures\n  ansible.builtin.include_tasks: generate_signatures.yml\n  when:\n    - generate_signatures | default(false) | bool\n"
  },
  {
    "path": "roles/netbootxyz/templates/checksums.txt.j2",
    "content": "# {{ site_name }} bootloaders generated at {{ current_date.stdout }}\n# iPXE Commit: {{ ipxe_repo }}/commit/{{ ipxe_git_checkout.after }}\n\n{% for item in netboot_disks_stat.results %}\n{{ item.stdout }}\n{% endfor %}"
  },
  {
    "path": "roles/netbootxyz/templates/disks/autoexec.ipxe.j2",
    "content": "#!ipxe\n#\n# {{ site_name }} - Secure Boot autoexec.ipxe\n#\n# This script is loaded automatically by iPXE v2.0.0+ Secure Boot\n# binaries from the same directory. It replaces the embedded script\n# used in self-compiled netboot.xyz bootloaders.\n#\n\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_cya ${esc:string}[36m\nset fg_whi ${esc:string}[37m\nset HTTPS_ERR HTTPS appears to have failed... attempting HTTP\nset HTTP_ERR HTTP has failed, localbooting...\nset site_name {{ site_name }}\nset boot_domain {{ boot_domain }}\nset ipxe_version ${version}\nset version {{ boot_version }}\nset conn_type https\n\n:start\necho ${bold}${fg_gre}${site_name} - ${fg_whi}v${version} (Secure Boot)${boldoff}\niseq ${site_name} netboot.xyz || echo ${bold}${fg_whi}Powered by ${fg_gre}netboot.xyz${fg_whi}${boldoff}\nprompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp\n\n:dhcp\necho\ndhcp || goto netconfig\ngoto menu\n\n:failsafe\nmenu ${boot_domain} Failsafe Menu\nitem localboot Boot to local drive\nitem netconfig Manual network configuration\nitem retry Retry boot\nitem debug iPXE Debug Shell\nitem reboot Reboot System\nchoose failsafe_choice || exit\ngoto ${failsafe_choice}\n\n:netconfig\necho Network Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n IP: && read net${net}/ip\necho -n Subnet mask: && read net${net}/netmask\necho -n Gateway: && read net${net}/gateway\necho -n DNS: && read dns\nifopen net${net}\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:menu\n{% if bootloader_https_enabled | bool %}\n:menu_https\nset conn_type https\ngoto menu_start\n{% endif %}\n\n{% if bootloader_http_enabled | bool %}\n:menu_http\nset conn_type http\ngoto menu_start\n{% endif %}\n\n:menu_start\nisset ${netX/dns6} && goto menu_v6 || goto menu_v4\n:menu_v6\nisset ${netX/dns6_bak} && set netX/dns6 ${netX/dns6_bak} ||\nset netX/dns6_bak ${netX/dns6}\necho Attempting ${conn_type} boot over IPv6...\nchain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv6 failed... attempting IPv4...\nclear netX/dns6\n:menu_v4\necho Attempting ${conn_type} boot over IPv4...\nchain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv4 failed...\niseq ${conn_type} https && goto menu_http || goto localboot\n\n:localboot\nexit\n\n:retry\ngoto start\n\n:reboot\nreboot\ngoto start\n\n:debug\necho Type \"exit\" to return to menu\nshell\ngoto failsafe\n"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz-gce.j2",
    "content": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_cya ${esc:string}[36m\nset fg_whi ${esc:string}[37m\nset HTTPS_ERR HTTPS appears to have failed... attempting HTTP\nset HTTP_ERR HTTP has failed, localbooting...\nset ipxe_version ${version}\nset version {{ boot_version }}\nset ipxe_cloud_config gce\n\n:start\necho ${bold}${fg_gre}netboot.xyz ${fg_whi}v${version} for ${fg_cya}Google Compute Engine${boldoff}\nprompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp\n\n:dhcp\necho\ndhcp || goto netconfig\ngoto menu\n\n:failsafe\nmenu netboot.xyz Failsafe Menu\nitem localboot Boot to local drive\nitem netconfig Manual network configuration\nitem vlan Manual VLAN configuration\nitem retry Retry boot\nitem debug iPXE Debug Shell\nitem reboot Reboot System\nchoose failsafe_choice || exit\ngoto ${failsafe_choice}\n\n:netconfig\necho Network Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n IP: && read net${net}/ip\necho -n Subnet mask: && read net${net}/netmask\necho -n Gateway: && read net${net}/gateway\necho -n DNS: && read dns\nifopen net${net}\necho Attempting chainload of netboot.xyz...\ngoto menu || goto failsafe\n\n:vlan\necho VLAN Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan\nvcreate --tag ${vlan} net${net}\nifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:netvlan\necho -n IP: && read net${net}-${vlan}/ip\necho -n Subnet mask: && read net${net}-${vlan}/netmask\necho -n Gateway: && read net${net}-${vlan}/gateway\necho -n DNS: && read dns\nifopen net${net}-${vlan}\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:menu\nset conn_type https\nchain --autofree https://boot.netboot.xyz/menu.ipxe || echo ${HTTPS_ERR}\nsleep 5\nset conn_type http\nchain --autofree http://boot.netboot.xyz/menu.ipxe || echo ${HTTP_ERR}\ngoto localboot\n\n:localboot\nexit\n\n:retry\ngoto start\n\n:reboot\nreboot\ngoto start\n\n:debug\necho Type \"exit\" to return to menu\nshell\ngoto failsafe\n"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz-metal.j2",
    "content": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_red ${esc:string}[31m\nset fg_cya ${esc:string}[36m\nset fg_whi ${esc:string}[37m\nset HTTPS_ERR HTTPS appears to have failed... attempting HTTP\nset HTTP_ERR HTTP has failed, localbooting...\nset ipxe_version ${version}\nset version {{ boot_version }}\nset ipxe_cloud_config metal\n\n:start\necho ${bold}${fg_gre}netboot.xyz ${fg_whi}v${version} for ${fg_red}metal.equinix.com${fg_whi}${boldoff}\nprompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp\n\n:dhcp\necho\ndhcp || goto netconfig\ngoto menu\n\n:failsafe\nmenu netboot.xyz Failsafe Menu\nitem localboot Boot to local drive\nitem netconfig Manual network configuration\nitem vlan Manual VLAN configuration\nitem retry Retry boot\nitem debug iPXE Debug Shell\nitem reboot Reboot System\nchoose failsafe_choice || exit\ngoto ${failsafe_choice}\n\n:netconfig\necho Network Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n IP: && read net${net}/ip\necho -n Subnet mask: && read net${net}/netmask\necho -n Gateway: && read net${net}/gateway\necho -n DNS: && read dns\nifopen net${net}\necho Attempting chainload of netboot.xyz...\ngoto menu || goto failsafe\n\n:vlan\necho VLAN Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan\nvcreate --tag ${vlan} net${net}\nifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:netvlan\necho -n IP: && read net${net}-${vlan}/ip\necho -n Subnet mask: && read net${net}-${vlan}/netmask\necho -n Gateway: && read net${net}-${vlan}/gateway\necho -n DNS: && read dns\nifopen net${net}-${vlan}\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:menu\nset conn_type https\nchain --autofree https://boot.netboot.xyz/menu.ipxe || echo ${HTTPS_ERR}\nsleep 5\nset conn_type http\nchain --autofree http://boot.netboot.xyz/menu.ipxe || echo ${HTTP_ERR}\ngoto localboot\n\n:localboot\nexit\n\n:retry\ngoto start\n\n:reboot\nreboot\ngoto start\n\n:debug\necho Type \"exit\" to return to menu\nshell\ngoto failsafe\n"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz.j2",
    "content": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_cya ${esc:string}[36m\nset fg_whi ${esc:string}[37m\nset VARS_ERR Local vars file not found... attempting TFTP boot...\nset TFTP_ERR Local TFTP failed... attempting remote HTTPS\nset V6_ERR IPv6 appears to have failed... attempting IPv4...\nset HTTPS_ERR HTTPS appears to have failed... attempting HTTP\nset HTTP_ERR HTTP has failed, localbooting...\nset site_name {{ site_name }}\nset boot_domain {{ boot_domain }}\nset ipxe_version ${version}\nset version {{ boot_version }}\nset conn_type https\nset tftp-root-path /\n\n:start\necho ${bold}${fg_gre}${site_name} - ${fg_whi}v${version}${boldoff}\niseq ${site_name} netboot.xyz || echo ${bold}${fg_whi}Powered by ${fg_gre}netboot.xyz${fg_whi}${boldoff}\nprompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp\n\n:dhcp\necho\ndhcp || goto netconfig\nisset ${next-server} && isset ${proxydhcp/next-server} && goto choose-tftp || set tftp-server ${next-server} && goto load-custom-ipxe\n\n:choose-tftp\n# Load \"proxy settings\" from root server\nchain tftp://${next-server}/local-vars.ipxe || echo ${VARS_ERR}\n# Check if the proxy-dhcp-vars script has made any usable command about how to progress with a next-server and a proxy-next-server being set\nisset ${use_proxydhcp_settings} && iseq ${use_proxydhcp_settings} true && goto set-next-server ||\nprompt --key p --timeout 4000 DHCP proxy detected, press ${bold}p${boldoff} to boot from ${proxydhcp/next-server}... && set use_proxydhcp_settings true || set use_proxydhcp_settings false\ngoto set-next-server\n\n:set-next-server\niseq ${use_proxydhcp_settings} true && set tftp-server ${proxydhcp/next-server} || set tftp-server ${next-server}\ngoto load-custom-ipxe\n\n:load-custom-ipxe\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}.kpxe && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-undionly.kpxe && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-snp.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-snponly.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-arm64.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}.kpxe && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-undionly.kpxe && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-snp.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-snponly.efi && goto tftpmenu ||\nisset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-arm64.efi && goto tftpmenu ||\ngoto menu\n\n:failsafe\nmenu ${boot_domain} Failsafe Menu\nitem localboot Boot to local drive\nitem netconfig Manual network configuration\nitem vlan Manual VLAN configuration\nitem retry Retry boot\nitem debug iPXE Debug Shell\nitem reboot Reboot System\nchoose failsafe_choice || exit\ngoto ${failsafe_choice}\n\n:netconfig\necho Network Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n IP: && read net${net}/ip\necho -n Subnet mask: && read net${net}/netmask\necho -n Gateway: && read net${net}/gateway\necho -n DNS: && read dns\nifopen net${net}\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:vlan\necho VLAN Configuration:\necho Available interfaces...\nifstat\nimgfree\necho -n Set network interface number [0 for net0, defaults to 0]: ${} && read net\nisset ${net} || set net 0\necho -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan\nvcreate --tag ${vlan} net${net}\nifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:netvlan\necho -n IP: && read net${net}-${vlan}/ip\necho -n Subnet mask: && read net${net}-${vlan}/netmask\necho -n Gateway: && read net${net}-${vlan}/gateway\necho -n DNS: && read dns\nifopen net${net}-${vlan}\necho Attempting chainload of ${boot_domain}...\ngoto menu || goto failsafe\n\n:tftpmenu\nchain tftp://${tftp-server}/local-vars.ipxe || echo ${VARS_ERR}\nisset ${hostname} && chain --autofree tftp://${tftp-server}/HOSTNAME-${hostname}.ipxe || echo Custom boot by Hostname not found trying MAC...\nchain --autofree tftp://${tftp-server}/MAC-${mac:hexraw}.ipxe || echo Custom boot by MAC (hexraw) not found, attempting by MAC (hexhyp)...\nchain --autofree tftp://${tftp-server}/MAC-${mac:hexhyp}.ipxe || echo Custom boot by MAC (hexhyp) not found, booting default...\nchain --autofree tftp://${tftp-server}/menu.ipxe || echo ${TFTP_ERR} && goto menu\n\n:menu\n{% if bootloader_https_enabled | bool %}\n:menu_https\nset conn_type https\ngoto menu_start\n{% endif %}\n\n{% if bootloader_http_enabled | bool %}\n:menu_http\nset conn_type http\ngoto menu_start\n{% endif %}\n\n:menu_start\nisset ${netX/dns6} && goto menu_v6 || goto menu_v4\n:menu_v6\nisset ${netX/dns6_bak} && set netX/dns6 ${netX/dns6_bak} ||\nset netX/dns6_bak ${netX/dns6}\necho Attempting ${conn_type} boot over IPv6...\nchain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv6 failed... attempting IPv4...\nclear netX/dns6\n:menu_v4\necho Attempting ${conn_type} boot over IPv4...\nchain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv4 failed...\niseq ${conn_type} https && goto menu_http || goto localboot\n\n:localboot\nexit\n\n:retry\ngoto start\n\n:reboot\nreboot\ngoto start\n\n:debug\necho Type \"exit\" to return to menu\nshell\ngoto failsafe\n"
  },
  {
    "path": "roles/netbootxyz/templates/index.html.j2",
    "content": "#!ipxe\n####       {{ boot_domain }} initial loader        ####\n#### see https://netboot.xyz for more information ####\n{% if bootloader_https_enabled | bool %}\nset conn_type https\nchain --autofree https://{{ boot_domain }}/menu.ipxe || echo HTTPS failed... attempting HTTP...\n{% endif %}\n{% if bootloader_http_enabled | bool %}\nset conn_type http\nchain --autofree http://{{ boot_domain }}/menu.ipxe || echo HTTP failed, localbooting...\n{% endif %}\nexit\n\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>{{ site_name }} BootLoaders - Powered by netboot.xyz</title>\n    <meta name='description' content='Download links for available {{ site_name }} bootloaders.'>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style>\n      table, th, td {\n      padding: 5px;\n      border: 1px solid black; \n      }\n    </style>\n  </head>\n  <body>\n  <div style=\"font-family: monospace, fixed; font-weight: bold;\">\n  {% if index_title.stdout is defined %}\n  {{ index_title.stdout }}\n  {% else %}\n  <h1>{{ site_name }}</h1>\n  {% endif %}\n  <p>\n  Version: {{ boot_version }}<br>\n  Powered by <a href=https://netboot.xyz>netboot.xyz</a>\n  </p>\n\n{% if generate_disks_hybrid == true %}\n  <p>x86_64 Legacy and EFI Combined iPXE Bootloaders</p>\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.hybrid %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n  <p>Multi-arch (x86_64 and arm64) Legacy and EFI Combined iPXE Bootloaders</p>\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.multiarch %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n\n{% if generate_disks_legacy == true %}\n  <p>x86_64 Legacy (PCBIOS) iPXE Bootloaders</p>\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.legacy %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n\n{% if generate_disks_efi == true %}\n  <p>x86_64 UEFI iPXE Bootloaders</p>\n\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.uefi %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n\n{% if generate_disks_arm == true %}\n  <p>ARM64 UEFI iPXE Bootloaders</p>\n\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.arm %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n\n{% if generate_disks_secureboot == true %}\n  <p>x86_64 UEFI Secure Boot iPXE Bootloaders</p>\n\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.secureboot_x86_64 %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n\n{% if generate_disks_arm == true %}\n  <p>ARM64 UEFI Secure Boot iPXE Bootloaders</p>\n\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.secureboot_arm64 %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n{% endif %}\n\n{% if generate_disks_rpi == true %}\n  <p>Raspberry Pi iPXE Bootloaders</p>\n\n  <table style=\"width:100%\">\n    <!-- table header -->\n    <tr>\n       <th style=\"width:10%;\"> Type </th>\n       <th style=\"width:20%;\"> Bootloader </th>\n       <th style=\"width:70%;\"> Description </th>\n    </tr>\n    <!-- table rows -->\n    {% for item in bootloaders.rpi %}\n    <tr>\n       <td> {{ item.type }} </td>\n       <td> <a href=\"ipxe/{{ bootloader_filename }}{{ item.output_bin }}\">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>\n       <td> {{ item.desc }} </td>\n    </tr>\n    {% endfor %}\n  </table>\n{% endif %}\n\n  <p>Checksums<p>\n\n  <a href=\"ipxe/{{ site_name }}-sha256-checksums.txt\">SHA256 checksums</a>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "roles/netbootxyz/templates/local-vars.ipxe.j2",
    "content": "#!ipxe\n### used for adding local variables before loading the menu\n\n### set to enable enable github custom menu\n#set github_user my_github_username\n\n# If a DHCP proxy server is found and this variable is set to true, the tftp server provided by the DHCP proxy will be used instead of the tftp server provided by the root DHCP\n# Please note that this variable is always read from the local-vars.ipxe onb the tftp server the root DHCP provided\n# If the variable isn't present at runtime, the user will be queried to press a key to boot from the proxy DHCP prtovided ftfp server\n#set use_proxydhcp_settings true\n\n### Media Locations for Licensed Distros\n#set rhel_base_url http://my_rhel_mirror/rhel/\n#set win_base_url http://my_windows_mirror/windows/\n\n### Sets the local live endpoint for the users local installation\n#set live_endpoint http://my_ip_address:8080\n\n### Sets the default boot timeout\n#set boot_timeout 300000\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/4mlinux.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os 4MLinux\nmenu ${os} - Current Arch [ ${arch} ]\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"4mlinux\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}\n{% endif %}\n{% endfor %}\nchoose version || goto exit\ngoto ${version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"4mlinux\" %}\n:{{ value.version }}-{{ value.flavor }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz root=/dev/ram0 vga=normal {{ kernel_params }} \ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/about.ipxe.j2",
    "content": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset ital ${esc:string}[3m\nset under ${esc:string}[4m\nset boldoff ${esc:string}[22m\nset italoff ${esc:string}[23m\nset underoff ${esc:string}[24m\nset fs_bla ${esc:string}[30m\nset fg_red ${esc:string}[31m\nset fg_gre ${esc:string}[32m\nset fg_yel ${esc:string}[33m\nset fg_blu ${esc:string}[34m\nset fg_mag ${esc:string}[35m\nset fg_cya ${esc:string}[36m\nset fg_whi ${esc:string}[37m\n\n:netabout\nmenu ${fg_cya}${bold}About netboot.xyz ${fg_whi}(v${version})\nitem about  \nitem about    ${fg_gre}${bold}Thanks for using netboot.xyz! We'd love to hear your feedback.\nitem about  \nitem --gap -- ${fg_whi}${bold}--- Community --------------------------------------------------------------\nitem about    ${fg_cya}${bold}X (Twitter):       ${fg_whi}${boldoff}@netbootxyz\nitem about    ${fg_mag}${bold}Discord:           ${fg_whi}${boldoff}https://discord.gg/An6PA2a\nitem about    ${fg_cya}${bold}GitHub Repo:       ${fg_whi}${boldoff}https://github.com/netbootxyz/netboot.xyz\nitem about  \nitem --gap -- ${fg_whi}${bold}--- Support the Project ----------------------------------------------------\nitem about    ${fg_gre}${bold}Open Collective:   ${fg_whi}${boldoff}https://opencollective.com/netbootxyz\nitem about    ${fg_gre}${bold}Github Sponsors:   ${fg_whi}${boldoff}https://github.com/sponsors/netbootxyz\nitem about    ${fg_yel}${bold}Official Store:    ${fg_whi}${boldoff}https://store.netboot.xyz\nisset ${upstream_version} && goto display_version || goto skip_version\n:display_version\nitem about  \niseq ${version} ${upstream_version} || item about    ${fg_yel}${bold}>>> Update available: ${fg_whi}${boldoff}${upstream_version}\n:skip_version\nitem --gap -- ${fg_whi}${bold}-------------------------------------------------------------------------------\nitem exit     ${fg_cya}${bold}<-- Back to main menu\nchoose selected || goto exit\ngoto ${selected}\n\n:about\nclear menu\ngoto netabout\n\n:exit\nclear menu\nexit\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/almalinux.ipxe.j2",
    "content": "#!ipxe\n\n# AlmaLinux Operating System\n# https://almalinux.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:almalinux\nclear osversion\nset os {{ releases.almalinux.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu ${os} - ${os_arch}\n{% for item in releases.almalinux.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nisset ${osversion} || choose osversion || goto linux_menu\necho ${cls}\nset dir ${almalinux_base_dir}/${osversion}/BaseOS/${os_arch}/os\nset repo ${almalinux_mirror}/${dir}\ngoto boottype\n\n:boottype\nset ova ${os} ${osversion}\nmenu ${os} ${os_arch} boot type\nitem graphical ${ova} graphical installer\nitem text ${ova} text based installer\nitem rescue ${ova} rescue\nitem kickstart ${ova} set kickstart url [ ${ks_url} ]\nisset ${bt} || choose bt || goto almalinux\necho ${cls}\niseq ${bt} text && goto text ||\niseq ${bt} rescue && goto rescue ||\niseq ${bt} kickstart && goto kickstart ||\niseq ${bt} kickstart_device && goto kickstart_device ||\ngoto bootos_images\n\n:graphical\nset install_mode inst.graphical ||\ngoto bootos_images\n\n:text\nset install_mode inst.text ||\ngoto bootos_images\n\n:rescue\nset params inst.rescue ||\ngoto bootos_images\n\n:kickstart\necho -n Specify kickstart URL for ${os} ${osversion}: && read ks_url\nset params inst.ks=${ks_url} ||\nclear bt\ngoto boottype\n\n:bootos_images\nimgfree\nkernel ${almalinux_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${repo} ${install_mode} ${params} ${ipparam} {{ kernel_params }}\ninitrd ${almalinux_mirror}/${dir}/images/pxeboot/initrd.img\necho\necho MD5sums:\nmd5sum vmlinuz initrd.img\nboot\ngoto linux_menu\n\n:linux_menu\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/alpinelinux.ipxe.j2",
    "content": "#!ipxe\n\n# Alpine Linux\n# https://alpinelinux.org\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}::::${dns}\n\ngoto ${menu}\n\n:alpinelinux\nclear alpine_version\nset os {{ releases.alpinelinux.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} i386 && set os_arch x86 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu ${os} - ${os_arch}\nitem --gap Releases\n{% for item in releases.alpinelinux.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose alpine_version || goto alpine_exit\ngoto boot\n\n:boot\nset base-url ${alpinelinux_mirror}\nset dir ${alpinelinux_base_dir}/${alpine_version}/releases/${os_arch}/netboot\nset repo-url ${alpinelinux_mirror}/${alpinelinux_base_dir}/${alpine_version}/main\nimgfree\nkernel ${base-url}/${dir}/vmlinuz-lts ${ipparam} alpine_repo=${repo-url} modules=loop,squashfs modloop=${base-url}/${dir}/modloop-lts quiet nomodeset {{ kernel_params }}\ninitrd ${base-url}/${dir}/initramfs-lts\necho\necho MD5sums:\nmd5sum vmlinuz-lts initramfs-lts\nboot\n\n:alpine_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/archlinux.ipxe.j2",
    "content": "#!ipxe\n\n# Arch Linux Operating System\n# http://www.archlinux.org\n\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} i386 && set os_arch i686 ||\nisset ${dhcp-server} || goto static_ip\nset ipparam BOOTIF=${netX/mac} ip=dhcp\nset real_archlinux_mirror ${archlinux_mirror}\ngoto goto_menu\n\n:static_ip\n# Arch Linux cannot use DNS if booted with a static IP\n# See https://bugs.archlinux.org/task/63174\n# Remove this hack when the above bug is properly resolved\nnslookup real_archlinux_mirror ${archlinux_mirror}\nset ipparam BOOTIF=${netX/mac} ip=${ip}::${gateway}:${netmask}\n\n:goto_menu\ngoto ${menu} ||\n\n:archlinux\nset os {{ releases.archlinux.name }}\nclear arch_version\nmenu ${os} - ${arch}\nitem --gap Latest Releases\n{% for item in releases.archlinux.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose arch_version || goto archlinux_exit\niseq ${os_arch} amd64 && goto boot ||\niseq ${os_arch} i686 && goto boot32 ||\n\n:boot\nimgfree\nset dir ${archlinux_base_dir}/iso/${arch_version}/arch/boot\nset params archiso_http_srv=http://${real_archlinux_mirror}/${archlinux_base_dir}/iso/${arch_version}/ archisobasedir=arch cms_verify=y ${ipparam} net.ifnames=0 {{ kernel_params }}\nkernel http://${archlinux_mirror}/${dir}/${os_arch}/vmlinuz-linux ${params}\ninitrd http://${archlinux_mirror}/${dir}/${os_arch}/initramfs-linux.img\necho\necho MD5sums:\nmd5sum vmlinuz-linux initramfs-linux.img\nboot\ngoto archlinux_exit\n\n:boot32\n{% for key, value in endpoints.items() | sort %}\n{% if key == \"archlinux-32\" %}\nset arch32_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\nimgfree\nset params archiso_http_srv=${arch32_url} archisobasedir=arch checksum=y ${ipparam} net.ifnames=0 {{ kernel_params }}\nkernel ${arch32_url}vmlinuz-linux ${ipparam} ${params}\ninitrd ${arch32_url}initramfs-linux.img\necho\necho MD5sums:\nmd5sum vmlinuz-linux initramfs-linux.img\nboot\ngoto archlinux_exit\n\n:archlinux_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/blackarch.ipxe.j2",
    "content": "#!ipxe\n\n# BlackArch Linux Operating System\n# https://blackarch.org/\n\ngoto ${menu}\n\n:blackarch\nset os {{ releases.blackarch.name }}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nmenu ${os} Installers\nitem --gap The Default login is root/blackarch\nitem --gap Run blackarch-install once logged in\n{% for item in releases.blackarch.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose blackarch_version || goto blackarch_exit\ngoto blackarch_boot\n\n:blackarch_boot\nimgfree\nset url ${live_endpoint}{{ endpoints['blackarch-installer'].path }}\nkernel ${url}vmlinuz archisobasedir=blackarch ${ipparam} archiso_http_srv=${url} {{ kernel_params }}\ninitrd ${url}initrd\nboot\ngoto blackarch_exit\n\n:blackarch_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/boot.cfg.j2",
    "content": "#!ipxe\n\n:global_vars\n# set site name\nset site_name {{ site_name }}\n\n# set boot domain\nset boot_domain {{ boot_domain }}\n\n# set location of memdisk\nset memdisk {{ memdisk_location }}\n\n# set location of custom netboot.xyz live assets, override in local-vars.ipxe\nisset ${live_endpoint} || set live_endpoint {{ live_endpoint }}\n\n# signature check enabled?\nset sigs_enabled {{ sigs_enabled | default(false) | bool | lower }}\n\n# set location of signatures for sources\nset sigs {{ sigs_location }}\n\n# set location of latest iPXE\niseq ${platform} efi && set ipxe_disk netboot.xyz-snponly.efi || set ipxe_disk netboot.xyz-undionly.kpxe\n\n# set default boot timeout\nisset ${boot_timeout} || set boot_timeout {{ boot_timeout }}\n\n##################\n# official mirrors\n##################\n:mirrors\n{% for key, value in releases.items() | sort(attribute='1.name') %}\n{% if value.mirror is defined and value.base_dir is defined %}\n### {{ value.name }}\nset {{ key }}_mirror {{ value.mirror }}\nset {{ key }}_base_dir {{ value.base_dir }}\n\n{% endif %}\n{% endfor %}\n#################################################\n# determine architectures and enable menu options\n#################################################\n:architectures\nset menu_linux 1\nset menu_bsd 1\nset menu_unix 1\nset menu_freedos 1\nset menu_live 1\nset menu_pci 1\nset menu_windows 1\nset menu_utils 1\niseq ${arch} i386 && goto i386 ||\niseq ${arch} x86_64 && goto x86_64 ||\niseq ${arch} arm64 && goto arm64 ||\ngoto architectures_end\n:x86_64\nset menu_linux_i386 0\niseq ${platform} efi && goto efi ||\ngoto architectures_end\n:i386\nset menu_linux 0\nset menu_linux_i386 1\nset menu_bsd 1\nset menu_unix 0\nset menu_freedos 1\nset menu_live 0\nset menu_windows 0\nset menu_utils 1\niseq ${platform} efi && goto efi ||\ngoto architectures_end\n:arm64\nset menu_linux 0\nset menu_linux_arm 1\nset menu_unix 0\nset menu_freedos 0\nset menu_live 0\nset menu_live_arm 1\nset menu_windows 0\nset menu_utils 0\nset menu_utils_arm 1\nset menu_pci 0\niseq ${platform} efi && goto efi ||\ngoto architectures_end\n:efi\nset menu_bsd 1\nset menu_freedos 0\nset menu_unix 0\nset menu_pci 0\ngoto architectures_end\n:architectures_end\ngoto clouds\n\n###################################\n# set iPXE cloud provider specifics\n###################################\n:clouds\niseq ${ipxe_cloud_config} gce && goto gce ||\niseq ${ipxe_cloud_config} metal && goto metal ||\niseq ${ipxe_cloud_config} packet && goto metal ||\ngoto clouds_end\n\n:gce\nset cmdline console=ttyS0,115200n8\ngoto clouds_end\n\n:metal\niseq ${arch} i386 && goto metal_x86_64 ||\niseq ${arch} x86_64 && goto metal_x86_64 ||\niseq ${arch} arm64 && goto metal_arm64 ||\ngoto clouds_end\n\n:metal_x86_64\nset cmdline console=ttyS1,115200n8\niseq ${platform} efi && set ipxe_disk netboot.xyz-metal-snp.efi || set ipxe_disk netboot.xyz-metal.kpxe\nset menu_linux_i386 0\nset menu_freedos 0\nset menu_windows 0\niseq ${platform} efi && set menu_pci 0 ||\ngoto clouds_end\n\n:metal_arm64\nset cmdline console=ttyAMA0,115200\nset ipxe_disk netboot.xyz-metal-arm64-snp.efi\nset menu_bsd 1\nset menu_freedos 0\nset menu_live 0\nset menu_windows 0\nset menu_utils 0\nset menu_pci 0\ngoto clouds_end\n\n:clouds_end\ngoto end\n\n:end\nexit\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/bsd.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:bsd_menu\n\nmenu BSD Installers - Current Arch [ ${arch} ]\n\n# BSD based systems\nitem --gap BSD Based Operating Systems\n{% for key, value in releases.items() | sort(attribute='1.name') %}\n{% if value.enabled is defined and value.menu == \"bsd\" and value.enabled | bool %}\n{% if key == \"freebsd\" %}\niseq ${platform} efi || item {{ key }} ${space} {{ value.name }}\n{% else %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endif %}\n{% endfor %}\nchoose menu || goto bsd_exit\n\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto bsd_menu\n\n:bsd_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/centos.ipxe.j2",
    "content": "#!ipxe\n\n# CentOS Stream\n# http://www.centos.org\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:centos\nclear osversion\nset os {{ releases.centos.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu ${os} - ${os_arch}\n{% for item in releases.centos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nisset ${osversion} || choose osversion || goto linux_menu\necho ${cls}\nset dir ${centos_base_dir}/${osversion}/BaseOS/${os_arch}/os ||\nset repo ${centos_mirror}/${dir}\ngoto boottype\n\n:boottype\nset ova ${os} ${osversion}\nmenu ${os} ${os_arch} boot type\nitem graphical ${ova} graphical installer\nitem text ${ova} text based installer\nitem rescue ${ova} rescue\nitem kickstart ${ova} set kickstart url [ ${ks_url} ]\nisset ${bt} || choose bt || goto centos\necho ${cls}\niseq ${bt} text && goto text ||\niseq ${bt} rescue && goto rescue ||\niseq ${bt} kickstart && goto kickstart ||\niseq ${bt} kickstart_device && goto kickstart_device ||\ngoto bootos_images\n\n:graphical\nset install_mode inst.graphical ||\ngoto bootos_images\n\n:text\nset install_mode inst.text ||\ngoto bootos_images\n\n:rescue\nset params inst.rescue ||\ngoto bootos_images\n\n:kickstart\necho -n Specify kickstart URL for ${os} ${osversion}: && read ks_url\nset params inst.ks=${ks_url} ||\nclear bt\ngoto boottype\n\n:bootos_images\nimgfree\nkernel ${centos_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${repo} ${install_mode} ${params} ${ipparam} {{ kernel_params }}\ninitrd ${centos_mirror}/${dir}/images/pxeboot/initrd.img\necho\necho MD5sums:\nmd5sum vmlinuz initrd.img\nboot\ngoto linux_menu\n\n:linux_menu\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/clonezilla.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch i686 ||\nset os Clonezilla\nmenu ${os}\nitem --gap ${os} Versions\nitem debian ${space} ${os} Debian Based\niseq ${os_arch} amd64 && item ubuntu ${space} ${os} Ubuntu Based ||\nchoose live_version || goto live_exit\nmenu ${os} ${live_version} - ${os_arch}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:debian\n{% for key, value in endpoints.items() %}\n{% if value.os == \"clonezilla\" and \"debian\" in key %}\niseq ${os_arch} {{ value.arch }} && item {{ value.path }} ${space} {{ value.os | title }} {{ value.version | title }} {{ value.flavor | title }} ||\n{% endif %}\n{% endfor %}\nchoose path || goto live_menu\ngoto clonezilla-boot\n\n:ubuntu\n{% for key, value in endpoints.items() %}\n{% if value.os == \"clonezilla\" and \"ubuntu\" in key %}\niseq ${os_arch} {{ value.arch }} && item {{ value.path }} ${space} {{ value.os | title }} {{ value.version | title }} {{ value.flavor | title }} ||\n{% endif %}\n{% endfor %}\nchoose path || goto live_menu\ngoto clonezilla-boot\n\n:clonezilla-boot\nimgfree\nset url ${live_endpoint}${path}\nkernel ${url}vmlinuz boot=live username=user union=overlay config components noswap edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=${url}filesystem.squashfs {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/coreos.ipxe.j2",
    "content": "#!ipxe\n\n# Fedora CoreOS\n# https://getfedora.org/coreos/\n# https://github.com/coreos/coreos-installer/blob/master/README.md#installing-from-pxe\n\ngoto ${menu}\n\n:coreos\nset os {{ releases.coreos.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nisset ${install_device} || set install_device unset\nisset ${ignition_url} || set ignition_url skip\nmenu ${os} - ${os_arch}\nitem --gap ${os}:\n{% for item in releases.coreos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem install_dev ${space} Set install device (e.g. /dev/sda): ${install_device}\nitem ignition_config ${space} Set ignition config url: ${ignition_url}\nchoose --default ${core_version} core_version || goto coreos_exit\necho ${cls}\niseq ${core_version} ignition_config && goto ignition_config ||\niseq ${core_version} install_dev && goto install_dev ||\ngoto core_boot ||\ngoto coreos_exit\n\n:core_boot\n{% for item in releases.coreos.versions %}\niseq ${core_version} {{ item.code_name }} && set coreos_channel {{ item.name }} ||\n{% endfor %}\nset base_url ${coreos_mirror}/${coreos_base_dir}/${coreos_channel}/builds\nset build_version ${core_version}\nimgfree\nkernel ${base_url}/${build_version}/${os_arch}/fedora-coreos-${build_version}-live-kernel.${os_arch} ip=dhcp rd.neednet=1 coreos.inst.install_dev=${install_device} coreos.inst.ignition_url=${ignition_url} coreos.live.rootfs_url=${base_url}/${build_version}/${os_arch}/fedora-coreos-${build_version}-live-rootfs.${os_arch}.img {{ kernel_params }}\ninitrd ${base_url}/${build_version}/${os_arch}/fedora-coreos-${build_version}-live-initramfs.${os_arch}.img\nboot\ngoto coreos_exit\n\n:install_dev\necho -n Selected install device will be overwritten,\necho -n please ensure you know what are you doing...\necho -n Please set desired install device:  && read install_device\nclear menu\ngoto coreos\n\n:ignition_config\necho -n Please set Ignition Configuration URL:  && read ignition_url\nclear menu\ngoto coreos\n\n:coreos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/dban.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:dban_menu\nmenu DBAN {{ endpoints.dban.version }} (Darik's Boot and Nuke)\nset kernel_url ${live_endpoint}{{ endpoints.dban.path }}DBAN.BZI\nitem --gap THIS SOFTWARE DESTROYS DATA\nitem --gap EVERY BOOT OPTION IS DESTRUCTIVE\nitem --gap DO NOT PROCEED IF YOU DO NOT KNOW WHAT THIS IS\nitem dban_exit ${space} Go Back\nitem dban_options ${space} Proceed I know what I am doing\nchoose menu || goto dban_exit\ngoto ${menu}\n\n:dban_options\nclear menu\nmenu DBAN {{ endpoints.dban.version }} (Darik's Boot and Nuke)\nitem --gap Choose a wipe method:\nitem dodshort ${space} Wipe all disks with the short DoD 5220.22-M method\nitem dod522022m ${space} Wipe all disks with the DoD 5220.22-M method\nitem dod3pass ${space} Wipe all disks with the DoD 5220.22-M method (3 pass)\nitem ops2 ${space} Wipe all disks with the RCMP TSSIT OPS-II method\nitem gutmann ${space} Wipe all disks with the Gutmann method\nitem prng ${space} Wipe all disks with the PRNG Stream method\nitem quick ${space} Wipe all disks with the Quick Erase method\nchoose nuke_method || goto dban_exit\ngoto dban_boot\n\n\n:dban_boot\nimgfree\nkernel ${kernel_url} nuke=\"dwipe --autonuke --method ${nuke_method}\" silent vga=785 ${cmdline}\nboot\n\n:dban_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/debian.ipxe.j2",
    "content": "#!ipxe\n\n# Debian Operating System\n# http://www.debian.org\n\ngoto ${menu}\n\n:debian\nset os Debian\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch i386 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nclear debian_version\nclear older_release\nmenu ${os} - ${os_arch}\nitem --gap Latest Releases\n{% for item in releases.debian.versions.stable %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --gap Testing Releases\n{% for item in releases.debian.versions.testing %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --gap Older Releases\nitem older_release ${space} Set release codename...\nchoose debian_version || goto debian_exit\niseq ${debian_version} older_release && goto older_release ||\ngoto mirrorcfg\n\n:older_release\nset older_release true\nset debian_mirror {{ releases.debian.archive_mirror }}\necho Setting mirror to ${debian_mirror}\nclear debian_version\necho -n Please set enter code name of release: ${} && read debian_version\nset dir ${debian_base_dir}/dists/${debian_version}/main/installer-${os_arch}/current/images/netboot/\ngoto deb_boot_type\n\n:mirrorcfg\nset debian_mirror ${debian_mirror}\nset mirrorcfg mirror/suite=${debian_version}\nset dir ${debian_base_dir}/dists/${debian_version}/main/installer-${os_arch}/current/images/netboot/\ngoto deb_boot_type\n\n:deb_boot_type\nmenu ${os} [${debian_version}] Installer\nitem --gap Install types\nitem text ${space} Text Based Install\nitem graphical ${space} Graphical Based Install\nitem rescue ${space} Rescue Mode\nitem expert ${space} Expert Install\nitem preseed ${space} Specify preseed url...\nchoose --default ${type} type || goto debian\n\necho ${cls}\ngoto deb_${type}\n\n:deb_rescue\nset install_params rescue/enable=true\ngoto deb_text\n\n:deb_expert\nset install_params priority=low\ngoto deb_text\n\n:deb_preseed\necho -n Specify preseed URL for ${os} ${debian_version}: && read preseedurl\nset install_params auto=true priority=critical preseed/url=${preseedurl}\ngoto deb_text\n\n:deb_text\nset dir ${dir}${menu}-installer/${os_arch}\ngoto deb_boot\n\n:deb_graphical\nset dir ${dir}gtk/${menu}-installer/${os_arch}\nset install_params vga=788\ngoto deb_boot\n\n:deb_boot\nimgfree\nkernel ${debian_mirror}/${dir}/linux ${install_params} ${netcfg} ${mirrorcfg} {{ kernel_params }}\ninitrd ${debian_mirror}/${dir}/initrd.gz\necho\necho MD5sums:\nmd5sum linux initrd.gz\niseq ${os_arch} amd64 && shim ${debian_mirror}/${dir}/bootnetx64.efi ||\niseq ${os_arch} arm64 && shim ${debian_mirror}/${dir}/bootnetaa64.efi ||\nboot\n\n:debian_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/devuan.ipxe.j2",
    "content": "#!ipxe\n\n# Devuan Operating System\n# http://www.devuan.org\n\ngoto ${menu}\n\n:devuan\nset os Devuan\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nclear devuan_version\nclear older_release\nmenu ${os} - ${os_arch}\nitem --gap Latest Releases\n{% for item in releases.devuan.versions.stable %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --gap Testing Releases\n{% for item in releases.devuan.versions.testing %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose devuan_version || goto devuan_exit\ngoto mirrorcfg\n\n:mirrorcfg\nset mirrorcfg mirror/suite=${devuan_version}\nset dir ${devuan_base_dir}/dists/${devuan_version}/main/installer-${os_arch}/current/images/netboot/\ngoto devuan_boot_type\n\n:devuan_boot_type\nmenu ${os} [${devuan_version}] Installer\nitem --gap Install types\nitem text ${space} Text Based Install\nitem graphical ${space} Graphical Based Install\nitem rescue ${space} Rescue Mode\nitem expert ${space} Expert Install\nitem preseed ${space} Specify preseed url...\nchoose --default ${type} type || goto devuan\n\necho ${cls}\ngoto devuan_${type}\n\n:devuan_rescue\nset install_params rescue/enable=true\ngoto devuan_text\n\n:devuan_expert\nset install_params priority=low\ngoto devuan_text\n\n:devuan_preseed\necho -n Specify preseed URL for ${os} ${devuan_version}: && read preseedurl\nset install_params auto=true priority=critical preseed/url=${preseedurl}\ngoto devuan_text\n\n:devuan_text\nset dir ${dir}debian-installer/${os_arch}\ngoto devuan_boot\n\n:devuan_graphical\nset dir ${dir}gtk/debian-installer/${os_arch}\nset install_params vga=788\ngoto devuan_boot\n\n:devuan_boot\nimgfree\necho Boot parameters: ${install_params} -- quiet ${params}\nkernel ${devuan_mirror}/${dir}/linux ${install_params} ${mirrorcfg} -- quiet ${params} {{ kernel_params }}\ninitrd ${devuan_mirror}/${dir}/initrd.gz\necho\necho MD5sums:\nmd5sum linux initrd.gz\nboot\n\n:devuan_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/endeavouros.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os EndeavourOS\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"endeavouros\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"endeavouros\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz archisobasedir=arch ${ipparam} archiso_http_srv=${url} {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/fedora.ipxe.j2",
    "content": "#!ipxe\n\n# Fedora Operating System\n# https://getfedora.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:fedora\nclear osversion\nclear sku_type\nclear ova\nclear bt\nset os {{ releases.fedora.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\n\nmenu ${os} - ${os_arch}\nitem --gap Latest Releases\n{% for item in releases.fedora.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\niseq ${os_arch} x86_64 && item rawhide ${space} ${os} rawhide ||\nisset ${osversion} || choose osversion || goto linux_menu\nset ova ${os} ${osversion}\ngoto product_sku\n\n:product_sku\nmenu ${os} ${os_arch} sku type\nitem Everything ${ova} Everything\nitem Server ${ova} Server\nitem Kinoite ${ova} Kinoite\nitem Onyx ${ova} Onyx\nitem Silverblue ${ova} Silverblue \nitem Sericea ${ova} Sericea\nisset ${sku_type} || choose sku_type || goto fedora\nset dir ${fedora_base_dir}/releases/${osversion}/${sku_type}/${os_arch}/os\niseq ${osversion} rawhide && set dir ${fedora_base_dir}/development/${osversion}/${sku_type}/${os_arch}/os ||\nset ova ${ova} ${sku_type}\necho ${cls}\ngoto boottype\n\n:boottype\nmenu ${os} ${os_arch} boot type\nitem graphical ${ova} graphical install\nitem text ${ova} text install\nitem rescue ${ova} rescue\nitem kickstart ${ova} set kickstart url [ ${ks_url} ]\nisset ${bt} || choose bt || goto fedora\necho ${cls}\niseq ${bt} normal && goto boot ||\ngoto ${bt}\n\n:graphical\nset install_mode inst.graphical ||\ngoto bootos_images\n\n:text\nset install_mode inst.text ||\ngoto bootos_images\n\n:rescue\nset params inst.rescue ||\ngoto bootos_images\n\n:kickstart\necho -n Specify kickstart URL for ${os} ${osversion}: && read ks_url\nset params inst.ks=${ks_url} ||\nclear bt\ngoto boottype\n\n:bootos_images\nimgfree\nkernel ${fedora_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${fedora_mirror}/${dir} ${install_mode} ${params} ${ipparam} {{ kernel_params }}\ninitrd ${fedora_mirror}/${dir}/images/pxeboot/initrd.img\necho\necho MD5sums:\nmd5sum vmlinuz initrd.img\nboot\ngoto linux_menu\n\n:linux_menu\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/flatcar.ipxe.j2",
    "content": "#!ipxe\n\n# Flatcar Container Linux\n# https://flatcar-linux.org/\n# For further info on:\n# iPXE and flatcar Container Linux: https://www.flatcar.org/docs/latest/installing/bare-metal/booting-with-ipxe/\n# Setting up Ignition: https://www.flatcar.org/docs/latest/installing/bare-metal/installing-to-disk/\n# 64-bit only\n\ngoto ${menu}\n\n:flatcar\nset os {{ releases.flatcar.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nmenu ${os} - Current Arch [ ${os_arch} ]\nitem --gap ${os}\n{% for item in releases.flatcar.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem ignition_config ${space} Set ignition.config.url: ${ignition.config.url}\nchoose --default ${menu} menu || goto flatcar_exit\necho ${cls}\ngoto ${menu} ||\ngoto flatcar_exit\n\n:stable\n:beta\n:alpha\n:edge\nset release ${menu}\nset base-url https://flatcar.cdn.cncf.io/${release}/${os_arch}-usr/current\nkernel ${base-url}/flatcar_production_pxe.vmlinuz ${flatcar_firstboot} ${flatcar_params} flatcar.autologin=tty1 flatcar.autologin=ttyS0 initrd=flatcar_production_pxe_image.cpio.gz ${cmdline}\ninitrd ${base-url}/flatcar_production_pxe_image.cpio.gz\nboot\ngoto flatcar_exit\n\n:ignition_config\necho -n Please set Ignition URL: && read ignition.config.url\nset flatcar_params ignition.config.url=${ignition.config.url}\nset flatcar_firstboot flatcar.first_boot=1\nclear menu\ngoto flatcar\n\n:flatcar_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/freebsd.ipxe.j2",
    "content": "#!ipxe\n\n# FreeBSD Operating System\n# http://www.freebsd.org\n\n:freebsd_menu\nset os {{ releases.freebsd.name }}\nmenu ${os}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"freebsd\" %}\nitem {{ value.path }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose ver || goto freebsd_exit\ngoto type_select\n\n:type_select\nmenu ${os}\nitem default.img ${space} Default\nitem special-edition.img ${space} Special Edition\nchoose type || goto freebsd_exit\ngoto boot_freebsd\n\n:boot_freebsd\nimgfree\necho This loads an mfsbsd installer (http://mfsbsd.vx.sk/).\necho Root password for all images: mfsroot\necho You'll need to configure networking manually for the installer disk as\necho it uses dhcp by default:\necho ifconfig xn0 inet <public ip> netmask 255.255.255.0\necho route delete default; route add default <public ip x.x.x.1>\necho echo \"nameserver x.x.x.x\" > /etc/resolv.conf\necho Once network is configured, you can launch the usual installer:\necho bsdinstall\ninitrd ${live_endpoint}${ver}${type}\nchain ${memdisk} harddisk raw\nexit\n\n:freebsd_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/freedos.ipxe.j2",
    "content": "#!ipxe\n\n# FreeDOS Operating System\n# http://www.freedos.org\n\n:freedos_menu\nset os {{ releases.freedos.name }}\nmenu ${os}\nitem --gap ${os}\n{% for item in releases.freedos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose freedos_version || goto freedos_exit\necho ${cls}\ngoto freedos_install || goto freedos_exit\n\n:freedos_install\nimgfree\nkernel ${memdisk}\ninitrd ${freedos_mirror}/${freedos_base_dir}/${freedos_version}.zip\nboot\n\n:freedos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/gentoo.ipxe.j2",
    "content": "#!ipxe\n\n# Gentoo Operating System\n# http://www.gentoo.org\n\n:gentoo\nclear gentoo_version\nset os {{ releases.gentoo.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch x86 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nmenu ${os} - Current Arch [ ${os_arch} ]\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"gentoo\" %}\niseq ${os_arch} {{ value.arch }} && item {{ value.version }}_{{ value.arch }} ${space} ${os} {{ value.version }} - {{ value.arch }} ||\n{% endif %}\n{% endfor %}\nchoose gentoo_version || goto gentoo_exit\ngoto ${gentoo_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"gentoo\" %}\n:{{ value.version }}_{{ value.arch }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz ip=dhcp root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 {{ kernel_params }}\ninitrd ${url}initrd\ninitrd ${url}image.squashfs /image.squashfs\nboot\n\n:gentoo_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/gparted.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os GParted Live\nmenu ${os} - Current Arch [ ${arch} ]\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"gparted\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"gparted\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} union=overlay username=user vga=788 {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/harvester.ipxe.j2",
    "content": "#!ipxe\n\n# Harvester\n# https://harvesterhci.io/\n# https://docs.harvesterhci.io/v1.0/install/pxe-boot-install/\n\ngoto ${menu} ||\n\n:harvester\nset os {{ releases.harvester.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nmenu ${os} - ${os_arch}\nitem --gap Harvester:\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"harvester\" %}\nitem harvester_url ${space} Begin install of Harvester ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nitem --gap Parameters:\nitem harvester_config_url ${space} Set config-create or config-join.yaml URL: ${harvester_config_url}\nchoose --default ${menu} menu || goto harvester_exit\necho ${cls}\ngoto ${menu} ||\ngoto harvester_exit\n\n:harvester_config_url\necho -n Set config.yaml URL:  && read harvester_config_url\nclear menu\ngoto harvester\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"harvester\" %}\n:harvester_url\nset harvester_url ${live_endpoint}{{ value.path }}\ngoto harvester_boot\n{% endif %}\n{% endfor %}\n\n:harvester_boot\nset install_params harvester.install.automatic=true harvester.install.config_url=${harvester_config_url}\nset boot_params ip=dhcp net.ifnames=1 console=ttyS0 console=tty1 rd.cos.disable root=live:${harvester_url}/harvester-rootfs-${os_arch}.squashfs rd.noverifyssl\nimgfree\nkernel ${harvester_url}/harvester-vmlinuz-${os_arch} ${install_params} ${boot_params} {{ kernel_params }}\ninitrd ${harvester_url}/harvester-initrd-${os_arch}\necho\necho MD5sums:\nmd5sum harvester-vmlinuz-${os_arch} harvester-initrd-${os_arch}\nboot\n\n:harvester_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ipfire.ipxe.j2",
    "content": "#!ipxe\n\n# IPFire\n# https://www.ipfire.org/\n\ngoto ${menu} ||\n\n:ipfire\nclear osversion\nset os {{ releases.ipfire.name }}\nmenu ${os}\n{% for item in releases.ipfire.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nisset ${osversion} || choose osversion || goto linux_menu\necho ${cls}\nset dir ${ipfire_base_dir}/${osversion}/images/x86_64\ngoto ipfire_images\n\n:ipfire_images\nimgfree\nkernel ${ipfire_mirror}/${dir}/vmlinuz vga=791 {{ kernel_params }}\ninitrd ${ipfire_mirror}/${dir}/instroot\necho\necho MD5sums:\nmd5sum vmlinuz instroot\nboot\n\n:ipfire_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/k3os.ipxe.j2",
    "content": "#!ipxe\n\n# k3OS by Rancher\n# https://k3os.io/\n# https://github.com/rancher/k3os#configuration-reference\n\ngoto ${menu} ||\n\n:k3os\nset os {{ releases.k3os.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nset k3os_mirror {{ releases.k3os.mirror }}\nisset ${k3os_version} || set k3os_version latest\nisset ${k3os_install_device} || set k3os_install_device /dev/sda\nmenu ${os} by Rancher\nmenu ${os} install\nitem --gap k3OS:\nitem k3os_boot ${space} Begin install ${os} ${k3os_version}\nitem --gap Parameters:\nitem k3os_version ${space} ${os} version: ${k3os_version}\nitem k3os_install_device ${space} Set install device: ${k3os_install_device}\nitem k3os_config_url ${space} Set config.yaml URL: ${k3os_config_url}\nitem k3os_mirror ${space} Set mirror URL: ${k3os_mirror}\nchoose --default ${menu} menu || goto k3os_exit\necho ${cls}\ngoto ${menu} ||\ngoto k3os_exit\n\n:k3os_version \nmenu ${os} version\nitem latest ${space} latest \nitem custom ${space} Set custom version\nchoose --default ${version} version || goto k3os_exit\necho ${cls}\ngoto k3os_version_${version} ||\ngoto k3os_exit\n\n:k3os_version_latest\nset k3os_version latest\nset k3os_base_url ${k3os_mirror}/latest/download\ngoto k3os\n\n:k3os_version_custom\nclear k3os_version\necho -n Please set k3OS version manually (in format vX.Y.Z):  && read k3os_version\nset k3os_base_url ${k3os_mirror}/download/${k3os_version}\nclear menu\ngoto k3os\n\n:k3os_install_device\necho -n Please set desired install device:  && read k3os_install_device\nclear menu\ngoto k3os\n\n:k3os_mirror\necho -n Set mirror URL:  && read k3os_mirror\nclear menu\ngoto k3os_version || \ngoto k3os_exit\n\n:k3os_config_url\necho -n Set config.yaml URL:  && read k3os_config_url\nclear menu\ngoto k3os\n\n:k3os_boot\nisset ${k3os_base_url} || set k3os_base_url ${k3os_mirror}/latest/download\nset install_params k3os.install.silent=true k3os.mode=install k3os.install.config_url=${k3os_config_url} k3os.install.device=${k3os_install_device}\nset boot_params printk.devkmsg=on k3os.install.iso_url=${k3os_base_url}/k3os-${os_arch}.iso console=ttyS0 console=tty1\nimgfree\nkernel ${k3os_base_url}/k3os-vmlinuz-${os_arch} ${install_params} ${boot_params} {{ kernel_params }}\ninitrd ${k3os_base_url}/k3os-initrd-${os_arch}\necho\necho MD5sums:\nmd5sum k3os-vmlinuz-${os_arch} k3os-initrd-${os_arch}\nboot\n\n:k3os_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kairos.ipxe.j2",
    "content": "#!ipxe\n\n# Kairos\n# https://github.com/kairos-io/kairos/releases\n\ngoto ${menu} ||\n\n:kairos\n#set os {{ releases.kairos.name }}\nset os Kairos\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nisset ${kairos_version} || set kairos_version {{ releases.kairos.version }}\nisset ${kairos_mirror} || set kairos_mirror {{ releases.kairos.mirror }}\nisset ${kairos_platform} || set kairos_platform {{ releases.kairos.platforms[0].key }}\nisset ${kairos_mode} || set kairos_mode install-mode-interactive\nisset ${kairos_flavor} || set kairos_flavor core\n\nmenu ${os}\nitem --gap Kairos:\nitem kairos_boot ${space} Begin install ${os} ${kairos_version}\nitem --gap Parameters:\nitem kairos_version ${space} ${os} version: ${kairos_version}\nitem kairos_mode ${space} Set install mode: ${kairos_mode}\nitem kairos_config_url ${space} Set config file URL: ${kairos_config_url}\nitem kairos_mirror ${space} Set mirror URL: ${kairos_mirror}\nitem kairos_platform ${space} Set platform: ${kairos_platform}\nitem kairos_flavor ${space} Set flavor: ${kairos_flavor}\nchoose --default ${menu} menu || goto kairos_exit\necho ${cls}\ngoto ${menu} ||\ngoto kairos_exit\n\n:kairos_version\nmenu ${os} version\nitem ${kairos_version} ${space} ${kairos_version}\nitem custom ${space} Set custom version\nchoose --default ${version} version || goto kairos_exit\necho ${cls}\ngoto kairos_version_${version} ||\ngoto kairos_exit\n\n:kairos_mode\nmenu ${os} Modes\nitem --gap Set Boot Mode:\nitem install-mode-interactive ${space} Interactive Install Mode\nitem install-mode ${space} Regular Install Mode\nitem kairos.remote_recovery_mode ${space} Remote Recovery Mode\nchoose --default ${kairos_mode} kairos_mode  || clear menu\ngoto kairos\n\n:kairos_platform\nmenu ${os} Platforms\nitem --gap Set Platform:\n{% for item in releases.kairos.platforms %}\nitem {{ item.key }} ${space} {{ item.name }}\n{% endfor %}\nchoose --default ${kairos_platform} kairos_platform || clear menu\ngoto kairos\n\n:kairos_flavor\nmenu ${os} Flavor\nitem --gap Set Flavor:\n{% for item in releases.kairos.flavors %}\nitem {{ item.key }} ${space} {{ item.name }}\n{% endfor %}\nchoose --default ${kairos_flavor} kairos_flavor || clear menu\ngoto kairos\n\n:kairos_version_custom\nclear kairos_version\necho -n Please set Kairos version manually (in format vX.Y.Z):  && read kairos_version\nset kairos_base_url ${kairos_mirror}/download/${kairos_version}\nclear menu\ngoto kairos\n\n:kairos_mirror\necho -n Set mirror URL:  && read kairos_mirror\nclear menu\ngoto kairos\n\n:kairos_config_url\necho -n Set config file URL:  && read kairos_config_url\nclear menu\ngoto kairos\n\n:kairos_boot\nimgfree\niseq ${kairos_flavor} core && set kairos_flavor_family core || set kairos_flavor_family standard\niseq ${kairos_flavor} core && set release_prefix ${kairos_mirror}/download/${kairos_version}/kairos-${kairos_platform}-${kairos_flavor_family}-${os_arch}-generic-${kairos_version} ||\niseq ${kairos_flavor} core || set release_prefix ${kairos_mirror}/download/${kairos_version}/kairos-${kairos_platform}-${kairos_flavor_family}-${os_arch}-generic-${kairos_version}-${kairos_flavor}\nset kairos_kernel_args root=live:${release_prefix}.squashfs rd.neednet=1 ip=dhcp rd.cos.disable netboot ${kairos_mode} config_url=${kairos_config_url} selinux=0 console=tty1 console=ttyS0 ${cmdline} initrd=initrd.magic\nkernel ${release_prefix}-kernel root=live:${release_prefix}.squashfs ${kairos_kernel_args}\ninitrd ${release_prefix}-initrd\n\necho\necho MD5sums:\nmd5sum kairos-${kairos_platform}-${kairos_flavor_family}-${os_arch}-generic-${kairos_version}-${kairos_flavor}-kernel kairos-${kairos_platform}-${kairos_flavor_family}-${os_arch}-generic-${kairos_version}-${kairos_flavor}-initrd\nboot\n\n:kairos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kali.ipxe.j2",
    "content": "#!ipxe\n\n# Kali Linux\n# http://www.kali.org\n\ngoto ${menu} ||\n\n:kali\nset os {{ releases.kali.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch i386 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nmenu ${os} - ${os_arch}\n{% for item in releases.kali.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose version || goto kali_exit\n\n:deb_boot_type\nset dir ${kali_base_dir}/dists/kali-${version}/main/installer-${os_arch}/current/images/netboot\nmenu ${os} boot parameters\nitem text ${os} text based install\nchoose --default ${type} type || goto kali\n\necho ${cls}\ngoto deb_${type}\n\n:deb_text\nset dir ${dir}/debian-installer/${os_arch}\ngoto deb_boot\n\n:deb_boot\nimgfree\nkernel ${kali_mirror}/${dir}/linux vga=788 -- quiet {{ kernel_params }}\ninitrd ${kali_mirror}/${dir}/initrd.gz\necho\necho MD5sums:\nmd5sum linux initrd.gz\nboot\n\n:kali_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kaspersky.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kaspersky Rescue Disk\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kaspersky\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kaspersky\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz netboot=${url} loadsrm=000-core.srm,001-xorg.srm,002-xfce.srm,003-kl.srm,004-krt.srm,005-bases.srm,008-firefox.srm net.ifnames=0 dodhcp dostartx {{ kernel_params }}\ninitrd ${url}initrd.xz\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux-arm.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Popular Linux Operating Systems:\nitem almalinux ${space} AlmaLinux\nitem alpinelinux ${space} Alpine Linux\nitem centos ${space} CentOS\nitem debian ${space} Debian\nitem fedora ${space} Fedora\nitem coreos ${space} Fedora CoreOS\nitem flatcar ${space} Flatcar Container Linux\nitem gentoo ${space} Gentoo\nitem kali ${space} Kali\nitem nixos ${space} NixOS\nitem opensuse ${space} openSUSE\nitem oracle ${space} Oracle Linux\nitem rhel ${space} Red Hat Enterprise Linux\nitem rockylinux ${space} Rocky Linux\nitem talos ${space} Talos\nitem ubuntu ${space} Ubuntu\nitem photon ${space} VMware Photon\nchoose menu || goto linux_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto linux_menu\n\n:linux_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux-i386.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Popular Linux Operating Systems:\nitem archlinux ${space} Arch Linux\nitem alpinelinux ${space} Alpine Linux\nitem debian ${space} Debian\nitem gentoo ${space} Gentoo\nitem kali ${space} Kali Linux\nitem opensuse ${space} openSUSE\nchoose menu || goto linux_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto linux_menu\n\n:linux_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Linux Distros:\n{% for key, value in releases.items() | sort(attribute='1.name') %}\n{% if value.enabled is defined and value.menu == \"linux\" and value.enabled | bool %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nchoose menu || goto linux_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto linux_menu\n\n:linux_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-arm.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nmenu Live Boot Distributions - Current Arch [ ${arch} ]\nitem --gap Live Boot Distributions\nitem live-fedora ${space} Fedora\nitem live-grml ${space} Grml\nchoose menu || goto live_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto live_menu\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-backbox.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os BackBox\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"BackBox\" and 'squash' in key %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"BackBox\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto boot-os\n{% endif %}\n{% endfor %}\n\n:boot-os\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-bluestar.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Bluestar\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"bluestar\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"bluestar\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz archisobasedir=arch ${ipparam} archiso_http_srv=${url} cow_spacesize=30% cow_label=BSLX_PERSIST ipv6.disable=1 disablehooks=v86d,915resolution,gma3600 modprobe.blacklist=uvesafb console=tty1 {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-bodhi.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Bodhi\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"bodhi\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"bodhi\" %}\n:{{ value.version }}-{{ value.flavor }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot-os\n\n{% endif %}\n{% endfor %}\n\n:boot-os\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-cachyos.ipxe.j2",
    "content": "#!ipxe\n\n# CachyOS Operating System\n# https://cachyos.org\n\ngoto ${menu} ||\n\n:live_menu\nset os CachyOS\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"cachyos\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"cachyos\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz ${ipparam} archiso_http_srv=${url} cow_spacesize=10G copytoram=auto module_blacklist=nvidia,nvidia_modeset,nvidia_uvm,nvidia_drm,pcspkr nouveau.modeset=1 i915.modeset=1 radeon.modeset=1 nvme_load=yes initrd=initrd.magic console=tty1 {{ kernel_params }}\ninitrd ${url}initrd\ninitrd ${url}archiso_pxe_http /hooks/archiso_pxe_http mode=755\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-debian.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Debian Live\nmenu ${os}\nitem --gap ${os} Versions\nitem trixie ${space} ${os} 13 (trixie)\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:trixie\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"debian\" and 'squash' in key and value.version == \"13\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"debian\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-devuan.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Devuan\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"devuan\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"devuan\" %}\n:{{ value.version }}-{{ value.flavor }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live username=devuan fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-elementary.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os elementary OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"elementary-os\" %}\nitem {{ key }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"elementary-os\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper maybe-ubiquity netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-endeavouros.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os EndeavourOS\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"endeavouros\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"endeavouros\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz ${ipparam} archiso_http_srv=${url} archisobasedir=arch cow_spacesize=10G earlymodules=loop modules-load=loop rd.modules-load=loop nvidia nouveau.modeset=0 nouveau.blacklist=yes modprobe.blacklist=nouveau i915.modeset=1 radeon.modeset=1 {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-fatdog.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Fatdog64\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"fatdog\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"fatdog\" %}\n:{{ value.version }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz rootfstype=ramfs {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-fedora.ipxe.j2",
    "content": "#!ipxe\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:live_menu\nset os Fedora Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for item in releases.fedora.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n{% for item in releases.fedora.versions %}\n{% set version_number = item.code_name %}\n:{{ version_number }}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"fedora\" and value.version == version_number %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title }}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n{% endfor %}\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"fedora\" %}\n:{{ key }}\nset live_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${live_url}vmlinuz ${ipparam} root=live:${live_url}squashfs.img ro rd.live.image rd.lvm=0 rd.luks=0 rd.md=0 rd.dm=0 {{ kernel_params }}\ninitrd ${live_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-feren.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Feren OS Live\nmenu ${os}\nitem --gap ${os} Versions\nitem current ${space} ${os} Current\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:current\n{% for key, value in endpoints.items() %}\n{% if value.os == \"feren\" %}\nitem {{ value.path }} ${space} {{ value.os | title }} {{ value.version | title }}\n{% endif %}\n{% endfor %}\nchoose path || goto live_menu\ngoto feren-boot\n\n:feren-boot\nimgfree\nset squash_url ${live_endpoint}${path}filesystem.squashfs\nset kernel_url ${live_endpoint}${path}\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-garuda.ipxe.j2",
    "content": "#!ipxe\n\n# Garuda Linux\n# https://garudalinux.org/\n\ngoto ${menu} ||\n\n:live-garuda\nset os Garuda\nmenu ${os} Live\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Live versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"garuda\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.flavor | title }} ({{ value.version }})\n{% endif %}\n{% endfor %}\nchoose menu || goto live_exit\ngoto ${menu}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"garuda\" %}\n:{{ value.version }}-{{ value.flavor }}\nset fetch_url ${live_endpoint}{{ value.path }}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz misobasedir=garuda ${ipparam} miso_http_srv=${fetch_url} nouveau.modeset=1 i915.modeset=1 radeon.modeset=1 driver=free {{ kernel_params }}\ninitrd ${kernel_url}initramfs.img\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-grml.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Grml\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nmenu ${os} - Current Arch [ ${arch} ]\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"grml\" %}\niseq ${os_arch} {{ value.arch }} && item {{ value.version }}-{{ value.flavor }}-{{ value.arch }} ${space} ${os} {{ value.version }} {{ value.flavor }} - {{ value.arch }} ||\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"grml\" %}\n:{{ value.version }}-{{ value.flavor }}-{{ value.arch }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-hrmpf.ipxe.j2",
    "content": "#!ipxe\n\n# hrmpf\n# https://github.com/leahneukirchen/hrmpf/\n\ngoto ${menu} ||\n\n:live-hrmpf\nclear hrmpf_version\nset os hrmpf\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"hrmpf\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose hrmpf_version || goto hrmpf_exit\ngoto ${hrmpf_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"hrmpf\" %}\n:{{ value.version }}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz root=live:${kernel_url}squashfs.img ro init=/sbin/init rd.luks=0 rd.md=0 rd.dm=0 gpt add_efi_memmap vconsole.unicode=1 vconsole.keymap=us locale.LANG=en_US.UTF-8 loglevel=6 printk.time=1 consoleblank=0 net.ifnames=0 {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:hrmpf_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-k3os.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os {{ releases.k3os.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nset k3os_mirror {{ releases.k3os.mirror }}\nmenu ${os} by Rancher\nisset ${k3os_version} || set k3os_version latest\nmenu ${os} live\nitem --gap k3OS live version:\nitem boot ${space} ${os} ${k3os_version} - live\nitem --gap Parameters:\nitem k3os_version ${space} ${os} version: ${k3os_version}\nitem k3os_mirror ${space} Set mirror URL: ${k3os_mirror}\nchoose --default ${menu} menu || goto live_exit\necho ${cls}\ngoto ${menu} ||\ngoto live_exit\n\n:k3os_version \nmenu ${os} version\nitem latest ${space} latest \nitem custom ${space} Set custom version\nchoose --default ${version} version || goto live_exit\necho ${cls}\ngoto k3os_version_${version} ||\ngoto live_exit\n\n:k3os_version_latest\nset k3os_version latest\nset k3os_base_url ${k3os_mirror}/latest/download\ngoto live_menu\n\n:k3os_version_custom\nclear k3os_version\necho -n Please set k3OS version manually (in format vX.Y.Z):  && read k3os_version\nset k3os_base_url ${k3os_mirror}/download/${k3os_version}\nclear menu\ngoto live_menu\n\n:k3os_mirror\necho -n Set mirror URL:  && read k3os_mirror\nclear menu\ngoto k3os_version || \ngoto live_exit\n\n:boot\nisset ${k3os_base_url} || set k3os_base_url ${k3os_mirror}/latest/download\nset install_params k3os.mode=live\nset boot_params printk.devkmsg=on console=ttyS0 console=tty1\nimgfree\nkernel ${k3os_base_url}/k3os-vmlinuz-${os_arch} ${install_params} ${boot_params} {{ kernel_params }}\ninitrd ${k3os_base_url}/k3os-initrd-${os_arch}\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-kali.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kali Linux\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kali\"  %}\nitem {{ key }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kali\" and 'squash' in key %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\nset params components\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live ${params} fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-kodachi.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kodachi\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kodachi\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"kodachi\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-lite.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Linux Lite\nmenu ${os}\nitem --gap Use the username linuxlite with a blank password\nitem --gap ${os} Versions\nitem 5 ${space} ${os} 6\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n:6\nset squash_url ${live_endpoint}{{ endpoints[\"linux-lite-5-squash\"].path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ endpoints[\"linux-lite-5-squash\"].path }}\ngoto boot-6\n\n:boot-6\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} username=linuxlite userfullname=linuxlite {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-lxle.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os LXLE\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"lxle\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"lxle\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-manjaro.ipxe.j2",
    "content": "#!ipxe\n\n:live_menu\nset os Manjaro\nmenu ${os} Live\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Live versions\nitem current ${space} ${os} Current Stable (21.x)\nchoose menu || goto live_exit\ngoto ${menu}\n\n:current\nmenu ${os} Live Current\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"manjaro\" and value.version == \"current\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}\n{% endif %}\n{% endfor %}\nchoose version || goto live_menu\ngoto ${version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"manjaro\" and value.version == \"current\" %}\n:{{ value.version }}-{{ value.flavor }}\nset fetch_url ${live_endpoint}{{ value.path }}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz misobasedir=manjaro ${ipparam} miso_http_srv=${fetch_url} nouveau.modeset=1 i915.modeset=1 radeon.modeset=1 driver=free tz=UTC lang=en_US keytable=us {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-mint.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Mint Live\nmenu ${os}\nitem --gap ${os} Versions\nitem 21 ${space} ${os} 21\nitem 20 ${space} ${os} 20\nitem lmde ${space} ${os} LMDE\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:22\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"mint\" and 'squash' in key and '22' in value.version %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:21\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"mint\" and 'squash' in key and '21' in value.version %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:20\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"mint\" and 'squash' in key and '20' in value.version %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:lmde\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"mint\" and 'squash' in key and value.version == \"lmde\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"mint\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\n{% if value.version == \"lmde\" %}\ngoto lmde-boot\n{% else %}\ngoto {{ value.version | int }}-boot\n{% endif %}\n{% endif %}\n{% endfor %}\n\n:22-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:21-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:20-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:lmde-boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-neon.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os KDE Neon\nmenu ${os}\nitem --gap ${os} Versions\nitem user ${space} ${os} User\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n:user\nset squash_url ${live_endpoint}{{ endpoints[\"kde-neon-user\"].path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ endpoints[\"kde-neon-user\"].path }}\ngoto user-boot\n\n:user-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd.lz\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-nitrux.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Nitrux\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"nitrux\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"nitrux\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-parrot.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Parrot OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"parrot\" %}\nitem {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"parrot\" %}\n:{{ value.version }}-{{ value.flavor }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-peppermint.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Peppermint\nmenu ${os}\nitem --gap ${os} Versions\nitem 10 ${space} ${os} 10\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"peppermint\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto {{ value.version }}-boot\n{% endif %}\n{% endfor %}\n\n:10-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-popos.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Pop os Live\nmenu ${os}\nitem --gap ${os} Versions\nitem jammy ${space} ${os} 22.04\nitem focal ${space} ${os} 20.04\nitem bionic ${space} ${os} 18.04\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:jammy\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"pop\" and 'squash' in key and value.version == \"22.04\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:focal\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"pop\" and 'squash' in key and value.version == \"20.04\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:bionic\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"pop\" and 'squash' in key and value.version == \"18.04\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"pop\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto {{ value.version }}-boot\n{% endif %}\n{% endfor %}\n\n:18.04-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:20.04-boot\n:22.04-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-q4os.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Q4OS Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"Q4OS\" and 'squash' in key %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"Q4OS\" and 'squash' in key %}\n:{{ value.version }}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"Q4OS\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto q4os-boot\n{% endif %}\n{% endfor %}\n\n:q4os-boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-raizo.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Live Raizo\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"raizo\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"raizo\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-regolith.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Regolith\nmenu ${os}\nitem --gap ${os} Versions\nitem current ${space} ${os} Current\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n:current\nset squash_url ${live_endpoint}{{ endpoints[\"regolith-current\"].path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ endpoints[\"regolith-current\"].path }}\ngoto current-boot\n\n:current-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=http fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-septor.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Septor\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"septor\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"septor\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-sparky.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os SparkyLinux Live\nmenu ${os}\nitem --gap ${os} Versions\nitem stable ${space} ${os} Stable\nitem rolling ${space} ${os} Rolling\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:stable\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"sparky\" and value.version == \"stable\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:rolling\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"sparky\" and value.version == \"rolling\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"sparky\" %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-tails.ipxe.j2",
    "content": "#!ipxe\n\n# Tails Operating System\n# https://tails.boum.org/\n\ngoto ${menu} ||\n\n:live-tails\nclear tails_version\nset os Tails\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"tails\" %}\nitem tails_{{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose tails_version || goto tails_exit\ngoto ${tails_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"tails\" %}\n:tails_{{ value.version }}\nset kernel_url ${live_endpoint}{{ value.path }}\nset iso_version {{ value.version }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fromiso=/tails.iso config nopersistence noprompt timezone=Etc/UTC splash noautologin module=Tails slab_nomerge slub_debug=FZP mce=0 vsyscall=none page_poison=1 init_on_free=1 mds=full,nosmt {{ kernel_params }}\ninitrd ${kernel_url}initrd.img\ninitrd ${kernel_url}9990-misc-helpers.sh /usr/lib/live/boot/9990-misc-helpers.sh\ninitrd ${kernel_url}tails-${os_arch}.iso /tails.iso\nboot\n\n:tails_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-ubuntu.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Ubuntu Live\nmenu ${os}\nitem --gap ${os} Versions\nitem jammy ${space} ${os} 22.04\nitem focal ${space} ${os} 20.04\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n:jammy\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and 'squash' in key and value.version == \"22.04\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title }}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:focal\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and 'squash' in key and value.version == \"20.04\" %}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title }}\n{% endif %}\n{% endfor %}\ngoto flavor_select\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto {{ value.version }}-boot\n{% endif %}\n{% endfor %}\n\n:20.04-boot\n:22.04-boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-vanillaos.ipxe",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Vanilla OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"vanilla-os\" %}\nitem vanilla_{{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"vanilla-os\" %}\n:vanilla_{{ value.version }}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz boot=live fetch=${kernel_url}/filesystem.squashfs config username=vanilla user-fullname=Vanilla quiet splash bgrt_disable modprobe.blacklist=nouveau initrd=initrd.magic ${cmdline}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-voyager.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Voyager Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"Voyager\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"Voyager\" %}\n:{{ value.version }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\nset kernel_url ${live_endpoint}{{ value.path }}\nimgfree\n{% if 'ubuntu-squash' in value.path %}\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\n{% endif %}\n{% if 'debian-squash' in value.path %}\nkernel ${kernel_url}vmlinuz boot=live fetch=${squash_url} {{ kernel_params }}\n{% endif %}\ninitrd ${kernel_url}initrd\nboot\n\n{% endif %}\n{% endfor %}\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-zorin.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Zorin Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"zorin\" %}\nitem {{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose live_version || goto live_exit\nmenu ${os} ${live_version}\nitem --gap ${os} Flavors\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"zorin\" and 'squash' in key %}\n:{{ value.version }}\nitem {{ key }} ${space} {{ value.os | title }} {{ value.version }} {{ value.flavor | title}}\ngoto flavor_select\n{% endif %}\n{% endfor %}\n\n:flavor_select\nchoose flavor || goto live_menu\necho ${cls}\ngoto ${flavor} ||\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"zorin\" and 'squash' in key %}\n{% set kernel_name = value.kernel %}\n:{{ key }}\nset squash_url ${live_endpoint}{{ value.path }}filesystem.squashfs\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\n{% endif %}\n{% endfor %}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${squash_url} {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nmenu Live Boot Distributions - Current Arch [ ${arch} ]\nitem --gap Live Boot Distributions\nitem live-backbox ${space} BackBox\nitem live-bluestar ${space} Bluestar Linux\nitem live-bodhi ${space} Bodhi\nitem live-cachyos ${space} CachyOS\nitem live-debian ${space} Debian\nitem live-devuan ${space} Devuan\nitem live-elementary ${space} elementary OS\nitem live-endeavouros ${space} EndeavourOS\nitem live-fatdog ${space} Fatdog64\nitem live-fedora ${space} Fedora\nitem live-feren ${space} Feren OS\nitem live-garuda ${space} Garuda Linux\nitem live-grml ${space} Grml\nitem live-hrmpf ${space} hrmpf\nitem live-k3os ${space} K3OS\nitem live-kali ${space} Kali\nitem live-kodachi ${space} Kodachi\nitem live-neon ${space} KDE Neon\nitem live-lite ${space} Linux Lite\nitem live-lxle ${space} LXLE\nitem live-manjaro ${space} Manjaro\nitem live-mint ${space} Mint\nitem live-nitrux ${space} Nitrux\nitem live-parrot ${space} Parrot OS\nitem live-peppermint ${space} Peppermint\nitem live-popos ${space} Pop OS\nitem live-q4os ${space} Q4OS\nitem live-raizo ${space} Live Raizo\nitem live-regolith ${space} Regolith\nitem live-septor ${space} Septor\nitem live-sparky ${space} SparkyLinux\nitem live-tails ${space} Tails\nitem tinycore ${space} Tiny Core Linux\nitem live-ubuntu ${space} Ubuntu\nitem ubuntu-spins ${space} Ubuntu Spins\nitem live-vanillaos ${space} Vanilla OS\nitem live-voyager ${space} Voyager\nitem live-zorin ${space} Zorin OS\nchoose menu || goto live_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto live_menu\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/lspci.ipxe.j2",
    "content": "#!ipxe\n\n# gather pci devices and list them\nclear addr\npciscan addr && goto pciscan_found ||\necho No PCI devices found...\nsleep 5\nexit\n:pciscan_found\n\nset spaces2:hex 20:20\nset spaces4:hex 20:20:20:20\n\nimgfetch pciids.ipxe\niseq ${sigs_enabled} true && goto verify_sigs || goto skip_verify\n:verify_sigs\nimgverify pciids.ipxe ${sigs}pciids.ipxe.sig ||\n:skip_verify\n\nclear addr\nmenu PCI device list\n:scan pciscan addr || goto scan_done\n  clear ven\n  clear dev\n  set vendor ${pci/${addr}.0.2}\n  set device ${pci/${addr}.2.2}\n  chain pciids.ipxe\n  item --gap ${addr:busdevfn} ${spaces4:string} ${ven}\n  item b${addr:busdevfn} ${spaces2:string} ${vendor}:${device} ${dev}\n  goto scan\n:scan_done\nchoose press_enter ||\n\nimgfree pciids.ipxe\nexit\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/mageia.ipxe.j2",
    "content": "#!ipxe\n\n# Mageia Operating System\n# http://www.mageia.org/\n\n# No way to set the network interface by MAC address, let the installer ask the question\nisset ${dhcp-server} && set network dhcp || set network static,ip:${ip},netmask:${netmask},gateway:${gateway},dns:${dns}\n\ngoto ${menu} ||\n\n:mageia\nset os {{ releases.mageia.name }}\nmenu ${os} - ${arch}\n{% for item in releases.mageia.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose version || goto mageia_exit\ngoto mageia_boot\n\n:mageia_boot\nset dir ${mageia_base_dir}/distrib/${version}/x86_64 && set dir2 isolinux/x86_64 ||\niseq ${arch} i386 && set dir ${mageia_base_dir}/distrib/${version}/i586 && set dir2 isolinux/i386 ||\nset automatic method:http,network:${network},server:${mageia_mirror},directory:/${dir}\nimgfree\nkernel ${mageia_mirror}/${dir}/${dir2}/vmlinuz automatic=${automatic} vga=788 splash=silent {{ kernel_params }}\ninitrd ${mageia_mirror}/${dir}/${dir2}/all.rdz\necho\necho MD5sums:\nmd5sum vmlinuz all.rdz\nboot || goto mageia\n\n:mageia_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/menu.ipxe.j2",
    "content": "#!ipxe\n{% if early_menu_enabled -%}\n{{ early_menu_contents }}\n{%- endif %}\n\n:start\nisset ${arch} && goto skip_arch_detect ||\ncpuid --ext 29 && set arch x86_64 || set arch i386\niseq ${buildarch} arm64 && set arch arm64 ||\n:skip_arch_detect\nchain --autofree boot.cfg ||\necho Attempting to retrieve latest upstream version number...\nchain --timeout 5000 https://boot.netboot.xyz/version.ipxe ||\nntp {{ time_server }} ||\niseq ${cls} serial && goto ignore_cls ||\nset cls:hex 1b:5b:4a  # ANSI clear screen sequence - \"^[[J\"\nset cls ${cls:string}\n:ignore_cls\n\n{% if 'x' in boot_version %}\n:version_check\nset latest_version {{ boot_version }}\necho ${cls}\niseq ${version} ${latest_version} && goto version_up2date ||\necho\necho Updated version of {{ site_name }} is available:\necho\necho Running version.....${version}\necho Updated version.....${latest_version}\necho\necho Please download the latest version from {{ site_name }}.\necho\necho Attempting to chain to latest version...\nchain --autofree http://${boot_domain}/ipxe/${ipxe_disk} ||\n:version_up2date\n{% endif %}\n\nisset ${menu} && goto ${menu} ||\nisset ${ip} || dhcp\n\n:main_menu\nclear menu\nset space:hex 20:20\nset space ${space:string}\nisset ${next-server} && menu ${site_name} v${version} - next-server: ${next-server} || menu ${site_name}\nitem --gap Default:\nitem local ${space} Boot from local hdd\nitem --gap Distributions:\niseq ${menu_linux} 1 && item linux ${space} Linux Network Installs (64-bit) ||\niseq ${menu_linux_i386} 1 && item linux-i386 ${space} Linux Network Installs (32-bit) ||\niseq ${menu_linux_arm} 1 && item linux-arm ${space} Linux Network Installs (arm64) ||\niseq ${menu_live} 1 && item live ${space} Live CDs ||\niseq ${menu_live_arm} 1 && item live-arm ${space} Live CDs ||\niseq ${menu_bsd} 1 && item bsd ${space} BSD Installs ||\niseq ${menu_unix} 1 && item unix ${space} Unix Network Installs ||\niseq ${menu_freedos} 1 && item freedos ${space} FreeDOS ||\niseq ${menu_windows} 1 && item windows ${space} Windows ||\nitem --gap Tools:\niseq ${menu_utils} 1 && iseq ${platform} efi && item utils-efi ${space} Utilities (UEFI) ||\niseq ${menu_utils} 1 && iseq ${platform} pcbios && iseq ${arch} x86_64 && item utils-pcbios-64 ${space} Utilities (64-bit) ||\niseq ${menu_utils} 1 && iseq ${platform} pcbios && iseq ${arch} i386 && item utils-pcbios-32 ${space} Utilities (32-bit) ||\niseq ${menu_utils_arm} 1 && item utils-arm ${space} Utilities (arm64) ||\nitem change_arch ${space} Architecture: ${arch}\nitem shell ${space} iPXE shell\nitem netinfo ${space} Network card info\niseq ${menu_pci} 1 && item lspci ${space} PCI Device List ||\nitem about ${space} About netboot.xyz\n{% if sigs_menu | bool %}\nitem --gap Signature Checks:\n{% if sigs_enabled | bool %}\nitem sig_check ${space} {{ site_name }} [ enabled: ${sigs_enabled} ]\n{% endif %}\n{% endif %}\n{% if custom_github_menus | bool %}\nisset ${github_user} && item --gap Custom Github Menu: ||\nisset ${github_user} && item custom-github ${space} ${github_user}'s Custom Menu ||\n{% endif %}\n{% if custom_url_menus | bool %}\nisset ${custom_url} && item --gap Custom URL Menu: ||\nisset ${custom_url} && item custom-url ${space} Custom URL Menu ||\n{% endif %}\n{% if custom_generate_menus | bool %}\nitem --gap Custom User Menus: ||\nitem custom-user ${space} Custom User Menus\n{% endif %}\nisset ${menu} && set timeout 0 || set timeout ${boot_timeout}\nchoose --timeout ${timeout} --default ${menu} menu || goto local\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto main_menu\n\n:error\necho Error occurred, press any key to return to menu ...\nprompt\ngoto main_menu\n\n:local\necho Booting from local disks ...\nexit 1\n\n:shell\necho Type \"exit\" to return to menu.\nset menu main_menu\nshell\ngoto main_menu\n\n:change_arch\niseq ${arch} x86_64 && set arch i386 && set menu_linux_i386 1 && set menu_linux 0 && goto main_menu ||\niseq ${arch} i386 && set arch x86_64 && set menu_linux_i386 0 && set menu_linux 1 && goto main_menu ||\ngoto main_menu\n\n:sig_check\niseq ${sigs_enabled} true && set sigs_enabled false || set sigs_enabled true\ngoto main_menu\n\n:about\nchain https://boot.netboot.xyz/about.ipxe || chain about.ipxe\ngoto main_menu\n\n:custom-github\nchain https://raw.githubusercontent.com/${github_user}/netboot.xyz-custom/master/custom.ipxe || goto error\ngoto main_menu\n\n:custom-url\nchain ${custom_url}/custom.ipxe || goto error\ngoto main_menu\n\n:custom-user\nchain custom/custom.ipxe\ngoto main_menu\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/nbxyz.ipxe.j2",
    "content": "#!ipxe\n\n# netboot.xyz endpoints\n# used for accessing the latest internet build menus\ngoto ${menu} ||\n\n:nbxyz\nset os netboot.xyz\nclear nbxyz_version\nmenu ${os}\nitem --gap Endpoints\nitem nbxyz-rolling ${space} Production Rolling (boot.netboot.xyz)\nitem nbxyz-prod ${space} Production Release (boot.netboot.xyz)\nitem nbxyz-staging ${space} Staging (staging.boot.netboot.xyz)\nitem nbxyz-dev ${space} Development (dev.boot.netboot.xyz)\nchoose nbxyz_version || goto nbxyz_exit\nimgfree\ngoto ${nbxyz_version}\n\n:nbxyz-rolling\nchain --autofree https://boot.netboot.xyz/menu.ipxe ||\ngoto nbxyz\n\n:nbxyz-prod\nchain https://boot.netboot.xyz/version.ipxe ||\nchain --autofree https://boot.netboot.xyz/${upstream_version}/menu.ipxe ||\ngoto nbxyz\n\n:nbxyz-staging\nchain https://staging.boot.netboot.xyz/version.ipxe ||\nchain --autofree https://staging.boot.netboot.xyz/${upstream_version}/menu.ipxe ||\ngoto nbxyz\n\n:nbxyz-dev\nchain https://s3.amazonaws.com/dev.boot.netboot.xyz/version.ipxe ||\nchain --autofree https://s3.amazonaws.com/dev.boot.netboot.xyz/${upstream_version}/menu.ipxe ||\ngoto nbxyz\n\n:nbxyz_exit\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/netinfo.ipxe.j2",
    "content": "#!ipxe\n\nmenu Network info\nitem --gap MAC:\nitem mac ${space} ${netX/mac}\nitem --gap IP/mask:\nitem ip ${space} ${netX/ip}/${netX/netmask}\nitem --gap Gateway:\nitem gw ${space} ${netX/gateway}\nitem --gap Domain:\nitem domain ${space} ${netX/domain}\nitem --gap DNS:\nitem dns ${space} ${netX/dns}\nitem --gap DHCP server:\nitem dhcpserver ${space} ${netX/dhcp-server}\nitem --gap Next-server:\nitem nextserver ${space} ${next-server}\nisset ${proxydhcp/next-server} && item --gap DHCP proxy next-server: ||\nisset ${proxydhcp/next-server} && item proxy-nextserver ${space} ${proxydhcp/next-server} ||\nisset ${proxydhcp/next-server} && item --gap Booted from DHCP proxy next-server: ||\nisset ${proxydhcp/next-server} && iseq ${proxydhcp/next-server} ${tftp-server} && item bootproxy ${space} Yes ||\nitem --gap Filename:\nisset ${proxydhcp/next-server} && item filename ${space} ${proxydhcp/filename} || item filename ${space} ${netX/filename}\nchoose empty ||\nexit\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/nixos.ipxe.j2",
    "content": "#!ipxe\n\n# NixOS\n# https://nixos.org/\n\nset os {{ releases.nixos.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu ${os} - ${os_arch}\nitem --gap Official Releases\n{% for item in releases.nixos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose version || goto nixos_exit\n\nimgfree\nchain https://github.com/nix-community/nixos-images/releases/download/${version}/netboot-${os_arch}-linux.ipxe\ngoto nixos_exit\n\n:nixos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/openEuler.ipxe.j2",
    "content": "#!ipxe\n\n# openEuler\n# https://openeuler.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:openEuler\nclear osversion\nset os {{ releases.openEuler.name }}\nmenu ${os} - ${arch}\n{% for item in releases.openEuler.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nisset ${osversion} || choose osversion || goto linux_menu\necho ${cls}\nset dir ${osversion}/OS/${arch}\nset repo ${openEuler_mirror}/${dir}\ngoto boottype\n\n:boottype\nset ova ${os} ${osversion}\nmenu ${os} ${arch} boot type\nitem graphical ${ova} graphical installer\nitem text ${ova} text based installer\nitem rescue ${ova} rescue\nitem kickstart ${ova} set kickstart url [ ${ks_url} ]\nisset ${bt} || choose bt || goto openEuler\necho ${cls}\niseq ${bt} text && goto text ||\niseq ${bt} rescue && goto rescue ||\niseq ${bt} kickstart && goto kickstart ||\niseq ${bt} kickstart_device && goto kickstart_device ||\ngoto bootos_images\n\n:graphical\nset install_mode inst.graphical ||\ngoto bootos_images\n\n:text\nset install_mode inst.text ||\ngoto bootos_images\n\n:rescue\nset params inst.rescue ||\ngoto bootos_images\n\n:kickstart\necho -n Specify kickstart URL for ${os} ${osversion}: && read ks_url\nset params inst.ks=${ks_url} ||\nclear bt\ngoto boottype\n\n:bootos_images\nimgfree\nkernel ${openEuler_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${repo} ${install_mode} ${params} ${ipparam} {{ kernel_params }}\ninitrd ${openEuler_mirror}/${dir}/images/pxeboot/initrd.img\necho\necho MD5sums:\nmd5sum vmlinuz initrd.img\nboot\ngoto linux_menu\n\n:linux_menu\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/openbsd.ipxe.j2",
    "content": "#!ipxe\n\n# OpenBSD Operating System\n# http://www.openbsd.org\n\n:openbsd_menu\nset os {{ releases.openbsd.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch i386 ||\nmenu ${os}\n{% for item in releases.openbsd.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose ver || goto openbsd_exit\n{% for item in releases.openbsd.versions %}\niseq ${ver} {{ item.code_name }} && set image_ver {{ item.image_ver }} ||\n{% endfor %}\ngoto boot_openbsd\n\n:boot_openbsd\niseq ${platform} pcbios && goto pcbios_boot ||\niseq ${platform} efi && goto efi_boot ||\n\n:pcbios_boot\nset src ${openbsd_mirror}/${openbsd_base_dir}/${ver}/${os_arch}/cd${image_ver}.iso\nimgfree\ninitrd ${src}\nchain ${memdisk} iso raw\ngoto openbsd_menu\n\n:efi_boot\nset src ${openbsd_mirror}/${openbsd_base_dir}/${ver}/${os_arch}/miniroot${image_ver}.img\nimgfree\nsanboot ${src}\ngoto openbsd_menu\n\n:openbsd_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/opensuse.ipxe.j2",
    "content": "#!ipxe\n\n# openSUSE Operating System\n# http://opensuse.org\n\nisset ${dhcp-server} || goto static_ip\nset netsetup netsetup=dhcp\ngoto goto_menu\n\n:static_ip\n# Need to convert netmask into prefix, because otherwise the installer\n# accepts it but configures the network with /32 prefix, which installs\n# fine but breaks connectivity to devices in the same network.\nset prefix 32\n\niseq ${netmask} 0.0.0.0 && set prefix 0 ||\n\niseq ${netmask} 128.0.0.0 && set prefix 1 ||\niseq ${netmask} 192.0.0.0 && set prefix 2 ||\niseq ${netmask} 224.0.0.0 && set prefix 3 ||\niseq ${netmask} 240.0.0.0 && set prefix 4 ||\niseq ${netmask} 248.0.0.0 && set prefix 5 ||\niseq ${netmask} 252.0.0.0 && set prefix 6 ||\niseq ${netmask} 254.0.0.0 && set prefix 7 ||\niseq ${netmask} 255.0.0.0 && set prefix 8 ||\n\niseq ${netmask} 255.128.0.0 && set prefix 9 ||\niseq ${netmask} 255.192.0.0 && set prefix 10 ||\niseq ${netmask} 255.224.0.0 && set prefix 11 ||\niseq ${netmask} 255.240.0.0 && set prefix 12 ||\niseq ${netmask} 255.248.0.0 && set prefix 13 ||\niseq ${netmask} 255.252.0.0 && set prefix 14 ||\niseq ${netmask} 255.254.0.0 && set prefix 15 ||\niseq ${netmask} 255.255.0.0 && set prefix 16 ||\n\niseq ${netmask} 255.255.128.0 && set prefix 17 ||\niseq ${netmask} 255.255.192.0 && set prefix 18 ||\niseq ${netmask} 255.255.224.0 && set prefix 19 ||\niseq ${netmask} 255.255.240.0 && set prefix 20 ||\niseq ${netmask} 255.255.248.0 && set prefix 21 ||\niseq ${netmask} 255.255.252.0 && set prefix 22 ||\niseq ${netmask} 255.255.254.0 && set prefix 23 ||\niseq ${netmask} 255.255.255.0 && set prefix 24 ||\n\niseq ${netmask} 255.255.255.128 && set prefix 25 ||\niseq ${netmask} 255.255.255.192 && set prefix 26 ||\niseq ${netmask} 255.255.255.224 && set prefix 27 ||\niseq ${netmask} 255.255.255.240 && set prefix 28 ||\niseq ${netmask} 255.255.255.248 && set prefix 29 ||\niseq ${netmask} 255.255.255.252 && set prefix 30 ||\niseq ${netmask} 255.255.255.254 && set prefix 31 ||\niseq ${netmask} 255.255.255.255 && set prefix 32 ||\n\nset netsetup netsetup=hostip,gateway,nameserver hostip=${ip}/${prefix} gateway=${gateway} nameserver=${dns}\n\n:goto_menu\nset netsetup ${netsetup} BOOTIF=${netX/mac}\n\nset distro opensuse\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} i386 && set os_arch i586 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu openSUSE - ${os_arch}\n{% for item in releases.opensuse.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose version || goto opensuse_exit\nset dir ${opensuse_base_dir}/${version}/repo/oss\niseq ${version} tumbleweed && set dir ${version}/repo/oss ||\n\n# Tumbleweed ARM64 uses ports mirror\niseq ${version} tumbleweed && iseq ${os_arch} aarch64 && set dir ports/aarch64/${version}/repo/oss ||\n\n# Check if version needs live ISO boot method (16.0 and later)\niseq ${version} 16.0 && set dir distribution/leap/${version}/repo/oss && set iso_dir distribution/leap/${version}/offline && set use_live_iso true ||\n\nimgfree\nset kernel_url boot/${os_arch}/loader \niseq ${os_arch} aarch64 && set kernel_url boot/${os_arch} ||\n\n# Choose boot method based on version\nisset ${use_live_iso} && goto opensuse_live_boot || goto opensuse_standard_boot\n\n:opensuse_live_boot\nkernel ${opensuse_mirror}/${dir}/${kernel_url}/linux root=live:${opensuse_mirror}/${iso_dir}/Leap-${version}-online-installer-${os_arch}.install.iso ${netsetup} ${params} {{ kernel_params }}\ninitrd ${opensuse_mirror}/${dir}/${kernel_url}/initrd\ngoto boot_os\n\n:opensuse_standard_boot\nkernel ${opensuse_mirror}/${dir}/${kernel_url}/linux ${netsetup} install=${opensuse_mirror}/${dir} ${params} {{ kernel_params }}\ninitrd ${opensuse_mirror}/${dir}/${kernel_url}/initrd\ngoto boot_os\n\n:boot_os\necho MD5sums:\nmd5sum linux initrd\nboot\n\n:opensuse_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/oracle.ipxe.j2",
    "content": "#!ipxe\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:oracle_menu\nset os Oracle Linux\nmenu ${os}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nitem --gap ${os} Versions\n{% set defined_versions = {} %}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"oracle\" %}\n{% if value.version not in defined_versions %}\n{% set _ = defined_versions.update({value.version: []}) %}\n{% endif %}\n{% set _ = defined_versions[value.version].append(value.arch) %}\n{% endif %}\n{% endfor %}\n{% for version, archs in defined_versions.items() | sort %}\n{% if archs | length > 1 %}\nitem {{ version }} ${space} ${os} {{ version }}\n{% else %}\niseq ${os_arch} {{ archs[0] }} && item {{ version }} ${space} ${os} {{ version }} ||\n{% endif %}\n{% endfor %}\nchoose version || goto oracle_exit\ngoto ${version}\n\n{% for version, archs in defined_versions.items() | sort %}\n:{{ version }}\n{% for arch in archs %}\niseq ${os_arch} {{ arch }} && goto {{ version }}_{{ arch }} ||\n{% endfor %}\ngoto oracle_exit\n\n{% endfor %}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"oracle\" %}\n:{{ value.version }}_{{ value.arch }}\nset url ${live_endpoint}{{ value.path }}\nset repo {{ releases.oracle.mirror }}{{ releases.oracle.paths[value.version|int] }}/${os_arch}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${url}vmlinuz ${ipparam} inst.repo=${repo} root=live:${url}squashfs.img ro rd.live.image rd.lvm=0 rd.luks=0 rd.md=0 rd.dm=0 {{ kernel_params }}\ninitrd ${url}initrd\nboot\n\n:oracle_exit\nclear menu\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/photon.ipxe.j2",
    "content": "#!ipxe\n\n# VMware Photon\n# https://vmware.github.io/photon/\n\ngoto ${menu} ||\n\n:photon\nset os {{ releases.photon.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nclear photon_choice\nmenu ${os}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"vmware-photon\" and value.arch == \"x86_64\" %}\nitem --gap ${os} Installers\nitem photon_install ${space} ${os} {{ value.version }} Installer\n{% endif %}\n{% endfor %}\nchoose photon_choice || goto photon_exit\ngoto ${photon_choice}\n\n:photon_install\niseq ${os_arch} x86_64 && goto x86_64 ||\niseq ${os_arch} aarch64 && goto aarch64 ||\n:x86_64\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"vmware-photon\" and value.arch == \"x86_64\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset photon_version {{ value.version }}\n{% endif %}\n{% endfor %}\ngoto photon_boot\n:aarch64\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"vmware-photon\" and value.arch == \"aarch64\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset photon_version {{ value.version }}\n{% endif %}\n{% endfor %}\ngoto photon_boot\n\n:photon_boot\nimgfree\nkernel ${kernel_url}vmlinuz root=/dev/ram0 loglevel=3 repo=https://packages.vmware.com/photon/${photon_version}/photon_release_${photon_version}_${os_arch} {{ kernel_params }}\ninitrd ${kernel_url}initrd.img\nboot\ngoto photon\n\n:photon_exit\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/proxmox.ipxe.j2",
    "content": "#!ipxe\n\n# Proxmox Open Source Products\n# https://www.proxmox.com\n\ngoto ${menu} ||\n\n:proxmox\nclear proxmox_choice\nclear proxmox_version\nset os Proxmox\nmenu ${os}\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"proxmox-backup-server\" %}\nitem --gap ${os} Backup Server\nitem pbs-normal ${space} ${os} Backup Server {{ value.version }}\nitem pbs-text ${space} ${os} Backup Server {{ value.version }} (Text)\nitem pbs-debug ${space} ${os} Backup Server {{ value.version }} (Debug)\n{% endif %}\n{% if value.os == \"proxmox-mailgateway\" %}\nitem --gap ${os} Mail Gateway\nitem pmg-normal ${space} ${os} Mail Gateway {{ value.version }}\nitem pmg-text ${space} ${os} Mail Gateway {{ value.version }} (Text)\nitem pmg-debug ${space} ${os} Mail Gateway {{ value.version }} (Debug)\n{% endif %}\n{% if value.os == \"proxmox-datacenter-manager\" %}\nitem --gap ${os} Datacenter Manager\nitem pdm-normal ${space} ${os} Datacenter Manager {{ value.version }}\nitem pdm-text ${space} ${os} Datacenter Manager {{ value.version }} (Text)\nitem pdm-debug ${space} ${os} Datacenter Manager {{ value.version }} (Debug)\n{% endif %}\n{% if value.os == \"proxmox-ve\" %}\nitem --gap ${os} VE\nitem pve-normal ${space} ${os} VE {{ value.version }}\nitem pve-text ${space} ${os} VE {{ value.version }} (Text)\nitem pve-debug ${space} ${os} VE {{ value.version }} (Debug)\n{% endif %}\n{% endfor %}\nchoose proxmox_choice || goto proxmox_exit\ngoto ${proxmox_choice}\n\n:pdm-normal\nset params splash=silent\ngoto boot-pdm\n\n:pdm-text\nset params splash=silent proxtui\ngoto boot-pdm\n\n:pdm-debug\nset params splash=verbose proxdebug\ngoto boot-pdm\n\n:pve-normal\nset params splash=silent\ngoto boot-pve\n\n:pve-text\nset params splash=silent proxtui\ngoto boot-pve\n\n:pve-debug\nset params splash=verbose proxdebug\ngoto boot-pve\n\n:pmg-normal\nset params splash=silent\ngoto boot-pmg\n\n:pmg-text\nset params splash=silent proxtui\ngoto boot-pmg\n\n:pmg-debug\nset params splash=verbose proxdebug\ngoto boot-pmg\n\n:pbs-normal\nset params splash=silent\ngoto boot-pbs\n\n:pbs-text\nset params splash=silent proxtui\ngoto boot-pbs\n\n:pbs-debug\nset params splash=verbose proxdebug\ngoto boot-pbs\n\n:boot-pbs\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"proxmox-backup-server\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset proxmox_version {{ value.version }}\n{% endif %}\n{% endfor %}\nimgfree\nkernel ${kernel_url}vmlinuz vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw quiet ${params} {{ kernel_params }}\ninitrd ${kernel_url}initrd\ninitrd ${kernel_url}proxmox.iso /proxmox.iso\nboot\n\n:boot-pmg\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"proxmox-mailgateway\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset proxmox_version {{ value.version }}\n{% endif %}\n{% endfor %}\nimgfree\nkernel ${kernel_url}vmlinuz vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw quiet ${params} {{ kernel_params }}\ninitrd ${kernel_url}initrd\ninitrd ${kernel_url}proxmox.iso /proxmox.iso\nboot\n\n:boot-pdm\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"proxmox-datacenter-manager\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset proxmox_version {{ value.version }}\n{% endif %}\n{% endfor %}\nimgfree\nkernel ${kernel_url}vmlinuz vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw quiet ${params} {{ kernel_params }}\ninitrd ${kernel_url}initrd\ninitrd ${kernel_url}proxmox.iso /proxmox.iso\nboot\n\n:boot-pve\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"proxmox-ve\" %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset proxmox_version {{ value.version }}\n{% endif %}\n{% endfor %}\nimgfree\nkernel ${kernel_url}vmlinuz vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw quiet ${params} {{ kernel_params }}\ninitrd ${kernel_url}initrd\ninitrd ${kernel_url}proxmox.iso /proxmox.iso\nboot\n\n:proxmox_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rescuezilla.ipxe.j2",
    "content": "#!ipxe\n\n# Rescuezilla Disk imaging\n# https://rescuezilla.com/\n\n:rescuezilla\nset os {{ utilitiesefi.rescuezilla.name }}\nmenu ${os} Live CD\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"rescuezilla\" %}\nitem {{ value.os }}_{{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose rescuezilla_version || goto rescuezilla_exit\ngoto ${rescuezilla_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"rescuezilla\" %}\n:{{ value.os }}_{{ value.version }}\nset kernel_url ${live_endpoint}{{ value.path }}\nimgfree\nkernel ${kernel_url}vmlinuz ip=dhcp boot=casper netboot=url url=${kernel_url}filesystem.squashfs {{ kernel_params }}\ninitrd ${kernel_url}initrd\nboot\n{% endif %}\n{% endfor %}\n\n:rescuezilla_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rhel.ipxe.j2",
    "content": "#!ipxe\n\n# Redhat Enterprise Linux (RHEL)\n# https://www.redhat.com\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\ngoto ${menu} ||\n\n:rhel\nset os Red Hat Enterprise Linux - ${os_arch}\nclear rhel_version\nmenu ${os}\nitem --gap Installers\nitem rhel_install ${space} ${os} Graphical Install\nitem rhel_install_text ${space} ${os} Text Install\nitem --gap Options:\nitem url_set ${space} Base URL [ ${rhel_base_url} ]\nchoose rhel_version || goto rhel_exit\ngoto ${rhel_version}\n\n:url_set\necho Set the HTTP URL of an extracted RHEL ISO without the trailing slash:\necho e.g. http://www.mydomain.com/rhel/7\necho\necho -n URL: ${} && read rhel_base_url\necho\necho netboot.xyz will attempt to load the following files:\necho ${rhel_base_url}/os/${os_arch}/images/pxeboot/vmlinuz\necho ${rhel_base_url}/os/${os_arch}/images/pxeboot/initrd.img\necho\nprompt Press any key to return to RHEL Menu...\ngoto rhel\n\n:rhel_install_text\nset params inst.text\ngoto rhel_install\n\n:rhel_install\nisset ${rhel_base_url} && goto boot || echo URL not set... && goto url_set\ngoto boot\n\n:boot\nimgfree\nkernel ${rhel_base_url}/os/${os_arch}/images/pxeboot/vmlinuz inst.repo=${rhel_base_url}/os/${os_arch} ${ipparam} ${params} {{ kernel_params }}\ninitrd ${rhel_base_url}/os/${os_arch}/images/pxeboot/initrd.img\nmd5sum vmlinuz initrd.img\nboot\ngoto rhel\n\n:rhel_exit\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rockylinux.ipxe.j2",
    "content": "#!ipxe\n\n# Rocky Linux\n# https://rockylinux.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}\nset ipparam BOOTIF=${netX/mac} ${ipparam}\n\ngoto ${menu} ||\n\n:rockylinux\nclear osversion\nset os {{ releases.rockylinux.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} arm64 && set os_arch aarch64 ||\nmenu ${os} - ${os_arch}\n{% for item in releases.rockylinux.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nisset ${osversion} || choose osversion || goto linux_menu\necho ${cls}\nset dir ${rockylinux_base_dir}/${osversion}/BaseOS/${os_arch}/os\nset repo ${rockylinux_mirror}/${dir}\ngoto boottype\n\n:boottype\nset ova ${os} ${osversion}\nmenu ${os} ${os_arch} boot type\nitem graphical ${ova} graphical installer\nitem text ${ova} text based installer\nitem rescue ${ova} rescue\nitem kickstart ${ova} set kickstart url [ ${ks_url} ]\nisset ${bt} || choose bt || goto rockylinux\necho ${cls}\niseq ${bt} text && goto text ||\niseq ${bt} rescue && goto rescue ||\niseq ${bt} kickstart && goto kickstart ||\ngoto bootos_images\n\n:graphical\nset install_mode inst.graphical ||\ngoto bootos_images\n\n:text\nset install_mode inst.text ||\ngoto bootos_images\n\n:rescue\nset params inst.rescue ||\ngoto bootos_images\n\n:kickstart\necho -n Specify kickstart URL for ${os} ${osversion}: && read ks_url\nset params inst.ks=${ks_url} ||\nclear bt\ngoto boottype\n\n:bootos_images\nimgfree\nkernel ${rockylinux_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${repo} ${install_mode} ${params} ${ipparam} {{ kernel_params }}\ninitrd ${rockylinux_mirror}/${dir}/images/pxeboot/initrd.img\necho\necho MD5sums:\nmd5sum vmlinuz initrd.img\nboot\ngoto linux_menu\n\n:linux_menu\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/shredos.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:shredos\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} i386 && set os_arch i686 ||\nmenu ShredOS\nitem --gap THIS SOFTWARE DESTROYS DATA\nitem --gap EVERY BOOT OPTION IS DESTRUCTIVE\nitem --gap DO NOT PROCEED IF YOU DO NOT KNOW WHAT THIS IS\nitem shredos_exit ${space} Go Back\nitem shredos_options ${space} Proceed I know what I am doing\nchoose menu || goto shredos_exit\ngoto ${menu}\n\n:shredos_options\nclear menu\nclear shredos_version\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"shredos\" %}\niseq ${os_arch} {{ value.arch }} && set kernel_url ${live_endpoint}{{ value.path }}shredos ||\nset shredos_version {{ value.version }}\n{% endif %}\n{% endfor %}\nmenu ShredOS ${shredos_version}\nitem --gap Choose a wipe method:\nitem dodshort ${space} Wipe all disks with the short DoD 5220.22-M method\nitem dod522022m ${space} Wipe all disks with the DoD 5220.22-M method\nitem dod3pass ${space} Wipe all disks with the DoD 5220.22-M method (3 pass)\nitem ops2 ${space} Wipe all disks with the RCMP TSSIT OPS-II method\nitem gutmann ${space} Wipe all disks with the Gutmann method\nitem prng ${space} Wipe all disks with the PRNG Stream method\nchoose nuke_method || goto shredos_exit\ngoto shredos_boot\n\n:shredos_boot\nimgfree\nkernel ${kernel_url} console=tty3 loglevel=3 nwipe_options=\"--method=${nuke_method}\" ${cmdline}\nboot\n\n:shredos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/slackware.ipxe.j2",
    "content": "#!ipxe\n\n# Slackware Operating System\n# http://www.slackware.com\n\ngoto ${menu}\n\n:slackware\nset os slackware\niseq ${arch} x86_64 && set sbits 64 || clear sbits\n\nmenu ${os}\n{% for item in releases.slackware.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --key o other Choose other version [o]\nchoose version || exit 0\niseq ${version} other || goto skip_read_version\necho ${cls}\necho -n Enter version: ${} && read version\n:skip_read_version\nset dir ${slackware_base_dir}/slackware${sbits}-${version}\ngoto boot\n\n:boot\nimgfree\nkernel ${slackware_mirror}/${dir}/kernels/huge.s/bzImage\ninitrd ${slackware_mirror}/${dir}/isolinux/initrd.img\nimgargs bzImage load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 tz=localtime initrd=initrd.magic ${cmdline}\nisset ${debug} && prompt ||\nboot\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/smartos.ipxe.j2",
    "content": "#!ipxe\n######################################\n# SmartOS                            #\n# https://www.smartos.org/           #\n# Credit: https://github.com/bahamat #\n######################################\n\n\n:custom\nclear smartos_build\nclear kflags\nset noimport false\nset kmdb_e false\nset kmdb_b false\ngoto smartos_menu\n\n:smartos_menu\nset os {{ releases.smartos.name }}\nmenu ${os}\nitem --gap Platform Images:\n{% for item in releases.smartos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --gap Options:\nitem toggle_pool ${space} Rescue mode: ${noimport}\nitem toggle_kmdb_e ${space} Load Kernel Debugger: ${kmdb_e}\nitem toggle_kmdb_b ${space} Boot Kernel Debugger First: ${kmdb_b}\n\niseq ${noimport} true && item --gap ${space} ||\niseq ${noimport} true && item --gap ${space} Zpool will not be imported. Rescue mode root password can be found at ||\niseq ${noimport} true && item --gap ${space} https://us-central.manta.mnx.io/Joyent_Dev/public/SmartOS/smartos.html ||\n\nchoose smartos_build || goto smartos_exit\niseq ${smartos_build} toggle_pool && goto toggle_pool ||\niseq ${smartos_build} toggle_kmdb_e && goto toggle_kmdb_e ||\niseq ${smartos_build} toggle_kmdb_b && goto toggle_kmdb_b ||\ngoto smartos_boot\n\n:smartos_boot\niseq ${kmdb_e} true && set kflags:hex 2d:6b ||\niseq ${kmdb_b} true && set kflags:hex 2d:6b:64 ||\nkernel ${smartos_mirror}${smartos_build}${smartos_base_dir}kernel/amd64/unix ${kflags:string} -B console=text,text-mode=\"115200,8,n,1,-\",smartos=true,noimport=${noimport}${root_shadow:string} ${cmdline}\nmodule ${smartos_mirror}${smartos_build}${smartos_base_dir}amd64/boot_archive type=rootfs name=ramdisk || goto fail\nmodule ${smartos_mirror}${smartos_build}${smartos_base_dir}amd64/boot_archive.hash type=hash name=ramdisk || goto fail\nboot\n\n:toggle_pool\niseq ${noimport} true && set noimport false || set noimport true\niseq ${noimport} false && clear root_shadow || set root_shadow:hex 2c:72:6f:6f:74:5f:73:68:61:64:6f:77:3d:27:24:35:24:32:48:4f:48:52:6e:4b:33:24:4e:76:4c:6c:6d:2e:31:4b:51:42:62:42:30:57:6a:6f:50:37:78:63:49:77:47:6e:6c:6c:68:7a:70:32:48:6e:54:2e:6d:44:4f:37:44:70:78:59:41:27:0a\ngoto smartos_menu\n\n:toggle_kmdb_e\niseq ${kmdb_e} true && set kmdb_e false || set kmdb_e true\niseq ${kmdb_e} false && set kmdb_b false ||\ngoto smartos_menu\n\n:toggle_kmdb_b\niseq ${kmdb_b} true && set kmdb_b false || set kmdb_b true\niseq ${kmdb_b} true && set kmdb_e true ||\ngoto smartos_menu\n\n:smartos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/systemrescue.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os System Rescue\nset os_arch ${arch}\nisset ${rootpass_enabled} || set rootpass_enabled false\nset rootpass ${mac:hexraw}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i386 && set os_arch i686 ||\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"systemrescue\" %}\niseq ${os_arch} {{ value.arch }} && item {{ value.version }}_${os_arch} ${space} ${os} {{ value.version }} ||\n{% endif %}\n{% endfor %}\nitem rootpass_mac Enable rootpass=${rootpass} [IP:${ip}] [ enabled: ${rootpass_enabled} ]\nchoose live_version || goto live_exit\ngoto ${live_version}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"systemrescue\" %}\n:{{ value.version }}_{{ value.arch }}\nset url ${live_endpoint}{{ value.path }}\ngoto boot\n\n{% endif %}\n{% endfor %}\n\n:rootpass_mac\nclear params\niseq ${rootpass_enabled} true && set rootpass_enabled false || set rootpass_enabled true && set params rootpass=${rootpass} nofirewall\ngoto live_menu\n\n:boot\nimgfree\nkernel ${url}vmlinuz archisobasedir=sysresccd ${ipparam} archiso_http_srv=${url} ${params} {{ kernel_params }}\ninitrd ${url}initrd\ninitrd ${url}archiso_pxe_http /hooks/archiso_pxe_http mode=755\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/talos.ipxe.j2",
    "content": "#!ipxe\n\n# Talos\n# https://github.com/siderolabs/talos/releases\n# https://www.talos.dev/v1.6/talos-guides/install/bare-metal-platforms/pxe\n\ngoto ${menu} ||\n\n:talos\nset os {{ releases.talos.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nisset ${talos_version} || set talos_version latest\nisset ${talos_mirror} || set talos_mirror {{ releases.talos.mirror }}\nisset ${talos_platform} || set talos_platform metal\nmenu ${os} by Talos Systems\nmenu ${os} install\nitem --gap Talos:\nitem talos_boot ${space} Begin install ${os} ${talos_version}\nitem --gap Parameters:\nitem talos_version ${space} ${os} version: ${talos_version}\nitem talos_config_url ${space} Set userdata.yaml URL: ${talos_config_url}\nitem talos_mirror ${space} Set mirror URL: ${talos_mirror}\nitem talos_platform ${space} Set platform: ${talos_platform}\nchoose --default ${menu} menu || goto talos_exit\necho ${cls}\ngoto ${menu} ||\ngoto talos_exit\n\n:talos_version\nmenu ${os} version\nitem latest ${space} latest\nitem custom ${space} Set custom version\nchoose --default ${version} version || goto talos_exit\necho ${cls}\ngoto talos_version_${version} ||\ngoto talos_exit\n\n:talos_version_latest\nset talos_version latest\nset talos_base_url ${talos_mirror}/latest/download\ngoto talos\n\n:talos_version_custom\nclear talos_version\necho -n Please set Talos version manually (in format vX.Y.Z):  && read talos_version\nset talos_base_url ${talos_mirror}/download/${talos_version}\nclear menu\ngoto talos\n\n:talos_mirror\necho -n Set mirror URL:  && read talos_mirror\nclear menu\ngoto talos\n\n:talos_config_url\necho -n Set userdata.yaml URL:  && read talos_config_url\nclear menu\ngoto talos\n\n# https://www.talos.dev/latest/reference/kernel/#talosplatform\n:talos_platform\nmenu ${os} platforms\n{% for item in releases.talos.platforms %}\nitem {{ item.key }} ${space} {{ item.name }}\n{% endfor %}\nchoose --default ${talos_platform} talos_platform\ngoto talos\n\n# https://www.talos.dev/latest/reference/kernel/\n:talos_boot\nisset ${talos_base_url} || set talos_base_url ${talos_mirror}/latest/download\nisset ${talos_config_url} && set talos_config talos.config=${talos_config_url} ||\n{# Edit releases.talos.custom_kernel_params in main.yml for custom kernel params #}\n{% if releases.talos.custom_kernel_params is defined and releases.talos.custom_kernel_params %}\nset boot_params {{ releases.talos.custom_kernel_params }}\n{% else %}\nset boot_params printk.devkmsg=on slab_nomerge pti=on console=ttyS0 console=tty0 init_on_alloc=1 init_on_free=1 consoleblank=0 nvme_core.io_timeout=4294967295 ima_template=ima-ng ima_appraise=fix ima_hash=sha512 talos.platform=${talos_platform} ${talos_config} initrd=initrd.magic ${cmdline}\n{% endif %}\nimgfree\nkernel ${talos_base_url}/vmlinuz-${os_arch} ${boot_params}\ninitrd ${talos_base_url}/initramfs-${os_arch}.xz\necho\necho Booting with the following kernel args:\necho ${boot_params}\necho\necho MD5sums:\nmd5sum vmlinuz-${os_arch} initramfs-${os_arch}.xz\nboot\n\n:talos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/tinycore.ipxe.j2",
    "content": "#!ipxe\n\n# Tiny Core Linux\n# http://tinycorelinux.net/downloads.html\n\nset tinycore_mirror {{ releases.tinycore.mirror }}\n\n:arch_menu\nset os Tiny Core Linux\nmenu ${os}\nitem --gap  Please choose a version below:\nitem x86 ${space} ${os} x86 (default)\nitem x86_64 ${space} ${os} x86_64\nchoose arch || goto tinycore_exit\ngoto ${arch} \n\n:x86\nmenu ${os}\nitem --gap  Please choose a version below:\n{% for item in releases.tinycore.versions %}\n{% if item.arch == \"x86\" %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endif %}\n{% endfor %}\nchoose version || goto tinycore_exit\ngoto ${version}\n\n:x86_64\nmenu ${os}\nitem --gap  Please choose a version below:\n{% for item in releases.tinycore.versions %}\n{% if item.arch == \"x86_64\" %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endif %}\n{% endfor %}\nchoose version || goto tinycore_exit\ngoto ${version}\n\n{% for item in releases.tinycore.versions %}\n:{{ item.code_name }}\nset kernel_url ${tinycore_mirror}{{ item.kernel }}\nset initrd_url ${tinycore_mirror}{{ item.initrd }}\ngoto boot\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url} loglevel=3 {{ kernel_params }}\ninitrd ${initrd_url}\nboot\n\n:tinycore_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ubuntu-spins.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Ubuntu Spins\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu-spins\" %}\nitem spins_{{ value.version }} ${space} ${os} {{ value.version }}\n{% endif %}\n{% endfor %}\nchoose ubuntu_spins || goto live_exit\nmenu ${os}\nitem --gap ${os} Flavors\ngoto ${ubuntu_spins}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu-spins\" %}\n:spins_{{ value.version }}\nset kernel_url ${live_endpoint}{{ value.path }}\ngoto boot\n{% endif %}\n{% endfor %}\n\n:boot\nimgfree\nkernel ${kernel_url}vmlinuz iso-chooser-menu boot=casper ip=dhcp initrd=initrd.magic ${cmdline}\ninitrd ${kernel_url}initrd\nboot\n\n:live_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ubuntu.ipxe.j2",
    "content": "#!ipxe\n\n# Ubuntu Operating System\n# https://www.ubuntu.com\n\ngoto ${menu}\n\n:ubuntu\nset os Ubuntu\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} arm64 && set os_arch arm64 ||\nclear ubuntu_version\nclear install_type\nclear older_release\nclear install_url\nclear kernel_flavor\nset install_type sub\nset install_priority critical\nmenu ${os} - ${os_arch}\nitem --gap Latest Releases\n{% for item in releases.ubuntu.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nitem --gap Older Releases\nitem older_release ${space} Set release codename...\nchoose ubuntu_version || goto ubuntu_exit\niseq ${ubuntu_version} older_release && goto older_release ||\niseq ${ubuntu_version} focal-legacy && set install_type deb ||\niseq ${ubuntu_version} focal-legacy && set ubuntu_version focal ||\niseq ${install_type} sub && goto kernel_type ||\niseq ${os_arch} arm64 && echo \"arm64 not supported on legacy network installs, please use 20.04 Subiquity and up\" && sleep 5 && goto ubuntu ||\ngoto mirrorcfg\n\n:kernel_type\nset kernel_flavor generic\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and value.flavor is defined and value.flavor == \"netboot-hwe\" and value.codename is defined and value.arch is defined %}\niseq ${ubuntu_version} {{ value.codename }} && iseq ${os_arch} {{ value.arch }} && goto kernel_type_menu ||\n{% endif %}\n{% endfor %}\ngoto boot_type\n\n:kernel_type_menu\nmenu ${os} [${ubuntu_version}] ${os_arch} - Kernel Type\nitem --gap Select kernel type\nitem generic ${space} Generic Kernel (default)\nitem hwe ${space} HWE Kernel (Hardware Enablement)\nchoose --default ${kernel_flavor} kernel_flavor || goto ubuntu\ngoto boot_type\n\n:older_release\nset older_release true\nset ubuntu_mirror {{ releases.ubuntu.archive_mirror }}\necho Setting mirror to ${ubuntu_mirror}\nclear ubuntu_version\necho -n Please set enter code name of release: ${} && read ubuntu_version\nset dir ${ubuntu_base_dir}/dists/${ubuntu_version}-updates/main/installer-${os_arch}/current/images/netboot/\ngoto boot_type\n\n:mirrorcfg\nset mirrorcfg mirror/suite=${ubuntu_version}\nset dir ${ubuntu_base_dir}/dists/${ubuntu_version}-updates/main/installer-${os_arch}/current/images/netboot/\niseq ${ubuntu_version} focal && set dir ${ubuntu_base_dir}/dists/${ubuntu_version}-updates/main/installer-${os_arch}/current/legacy-images/netboot/ ||\ngoto boot_type\n\n:boot_type\nmenu ${os} [${ubuntu_version}] Installer\nitem --gap Install types\nitem install ${space} Install\nitem rescue ${space} Rescue Mode\nitem automated ${space} Specify preseed/autoinstall url...\niseq ${install_type} deb && item priority ${space} Change install priority [ ${install_priority} ] ||\nchoose --default ${type} type || goto ubuntu\necho ${cls}\ngoto deb_${type}\n\n:deb_rescue\niseq ${install_type} deb && set install_params rescue/enable=true ||\niseq ${install_type} sub && set install_params systemd.unit=rescue.target ||\ngoto deb_install\n\n:deb_priority\niseq ${install_priority} critical && set install_priority low || set install_priority critical\ngoto boot_type\n\n:deb_automated\niseq ${install_type} deb && set install_name preseed ||\niseq ${install_type} sub && set install_name autoinstall ||\necho -n Specify ${install_name} URL for ${os} ${ubuntu_version}: && read install_url\niseq ${install_type} deb && set install_params auto=true priority=${install_priority} preseed/url=${install_url} ||\niseq ${install_type} sub && set install_params autoinstall ds=nocloud-net;s=${install_url} ||\ngoto deb_install\n\n:deb_install\niseq ${install_type} deb && goto deb_boot ||\niseq ${kernel_flavor} hwe && goto ${ubuntu_version}_${os_arch}_hwe ||\niseq ${install_type} sub && goto ${ubuntu_version}_${os_arch} ||\n\n:deb_boot\necho Loading Ubuntu PXE netboot installer\nset dir ${dir}ubuntu-installer/${os_arch}\nimgfree\nkernel ${ubuntu_mirror}/${dir}/linux ${install_params} ${mirrorcfg} {{ kernel_params }}\ninitrd ${ubuntu_mirror}/${dir}/initrd.gz\necho\necho MD5sums:\nmd5sum linux initrd.gz\nboot\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and value.flavor is defined and value.flavor == \"netboot\" %}\n{% set kernel_name = value.kernel %}\n:{{ value.codename }}_{{ value.arch }}\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset codename {{ value.codename }}\nset version_number {{ value.version }}\n{% endif %}\n{% endfor %}\ngoto sub_boot\n{% endif %}\n{% endfor %}\n\n{% for key, value in endpoints.items() | sort %}\n{% if value.os == \"ubuntu\" and value.flavor is defined and value.flavor == \"netboot-hwe\" %}\n{% set kernel_name = value.kernel %}\n:{{ value.codename }}_{{ value.arch }}_hwe\n{% for key, value in endpoints.items() | sort %}\n{% if key == kernel_name %}\nset kernel_url ${live_endpoint}{{ value.path }}\nset codename {{ value.codename }}\nset version_number {{ value.version }}\n{% endif %}\n{% endfor %}\ngoto sub_boot\n{% endif %}\n{% endfor %}\n\n:sub_boot\nimgfree\niseq ${os_arch} amd64 && set ubuntu_iso_url http://releases.ubuntu.com/${codename}/ubuntu-${version_number}-live-server-${os_arch}.iso ||\niseq ${os_arch} arm64 && set ubuntu_iso_url http://cdimage.ubuntu.com/releases/${version_number}/release/ubuntu-${version_number}-live-server-${os_arch}.iso ||\nisset ${dhcp-server} && set netboot_params ip=dhcp url=${ubuntu_iso_url} || set netboot_params\necho Loading Ubuntu Subiquity Network Installer...\nkernel ${kernel_url}vmlinuz root=/dev/ram0 ramdisk_size=3500000 cloud-config-url=/dev/null ${netboot_params} ${install_params} {{ kernel_params }}\ninitrd ${kernel_url}initrd\necho\necho MD5sums:\nmd5sum vmlinuz initrd\nboot\n\n:ubuntu_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/unix.ipxe.j2",
    "content": "#!ipxe\n\ngoto ${menu} ||\n\n:unix_menu\nmenu Unix Installers\nitem --gap Unix Distros:\n{% for key, value in releases.items() | sort(attribute='1.name') %}\n{% if value.enabled is defined and value.menu == \"unix\" and value.enabled | bool %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nchoose menu || goto unix_exit\necho ${cls}\ngoto ${menu} ||\niseq ${sigs_enabled} true && goto verify_sigs || goto change_menu\n\n:verify_sigs\nimgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error\ngoto change_menu\n\n:change_menu\nchain ${menu}.ipxe || goto error\ngoto unix_menu\n\n:unix_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-arm.ipxe.j2",
    "content": "#!ipxe\n\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiesarm.items() | sort(attribute='1.name') %}\n{% if value.enabled %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nitem --gap netboot.xyz tools:\nitem nbxyz ${space} netboot.xyz endpoints\nchoose --default ${menu} menu || goto utils_exit\necho ${cls}\ngoto ${menu} ||\nchain ${menu}.ipxe || goto utils_exit\ngoto utils_exit\n\n{% for key, value in utilitiesarm.items() | sort %}\n{% if value.enabled | bool and value.type == \"direct\" %}\n:{{ key }}\nimgfree\nkernel {{ value.kernel }}\n{% if value.initrd is defined and value.initrd %}\ninitrd {{ value.initrd }}\n{% endif %}\nboot\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n{% for key, value in utilitiesefi.items() | sort %}\n{% if value.enabled | bool and value.type == \"sanboot\" %}\n:{{ key }}\nimgfree\nsanboot {{ value.kernel }}\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n:utils_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-efi.ipxe.j2",
    "content": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiesefi.items() | sort(attribute='1.name') %}\n{% if value.enabled %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nitem --gap netboot.xyz tools:\nitem cmdline ${space} Kernel cmdline params: [${cmdline}]\nitem nbxyz_custom_url ${space} Set custom menu [url: ${custom_url}]\nitem nbxyz_custom_github ${space} Set Github username [user: ${github_user}]\nitem nbxyz ${space} netboot.xyz endpoints\nchoose --default ${menu} menu || goto utils_exit\necho ${cls}\ngoto ${menu} ||\nchain ${menu}.ipxe || goto utils_exit\ngoto utils_exit\n\n{% for key, value in utilitiesefi.items() | sort %}\n{% if value.enabled | bool and value.type == \"direct\" %}\n:{{ key }}\nimgfree\nkernel {{ value.kernel }}\n{% if value.initrd is defined and value.initrd %}\ninitrd {{ value.initrd }}\n{% endif %}\nboot\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n{% for key, value in utilitiesefi.items() | sort %}\n{% if value.enabled | bool and value.type == \"sanboot\" %}\n:{{ key }}\nimgfree\nsanboot {{ value.kernel }}\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n:cmdline\necho If you want to change the default kernel command line parameters\necho you can override the defaults here.\necho\necho Currently set to: ${cmdline}\necho\necho -n Enter cmdline parameters: ${} && read cmdline\ngoto utils_menu\n\n:memtest86plus\nimgfree\nkernel {{ utilitiesefi.memtest86plus.util_path }}\nboot\ngoto utils_menu\n\n:nbxyz_custom_url\necho If you have a customized menu you would like to load into netboot.xyz\necho set the base path url to your custom ipxe files here. \necho It will look for custom.ipxe in that path as the entry point.\necho\necho -n Please enter your custom http url here: ${} && read custom_url\ngoto utils_menu\n\n:nbxyz_custom_github\necho Make sure you have a fork of https://github.com/netbootxyz/netboot.xyz-custom.\necho You can then customize your fork as needed and set up your own custom options.\necho Once your username is set, a custom option will appear on the main menu.\necho\necho -n Please enter your Github username: ${} && read github_user\ngoto utils_menu\n\n:utils_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-pcbios-32.ipxe.j2",
    "content": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiespcbios32.items() | sort(attribute='1.name') %}\n{% if value.enabled %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nitem --gap netboot.xyz tools:\nitem cmdline ${space} Kernel cmdline params: [${cmdline}]\nitem nbxyz_custom_url ${space} Set custom menu [url: ${custom_url}]\nitem nbxyz_custom_github ${space} Set Github username [user: ${github_user}]\nitem testdistro ${space} Test Distribution ISO\nitem nbxyz ${space} netboot.xyz endpoints\nchoose --default ${menu} menu || goto utils_exit\necho ${cls}\ngoto ${menu} ||\nchain ${menu}.ipxe || goto utils_exit\ngoto utils_exit\n\n{% for key, value in utilitiespcbios32.items() | sort %}\n{% if value.enabled | bool and value.type == \"memdisk\" %}\n:{{ key }}\nset util_path {{ value.util_path }}\nset util_file {{ value.util_path | basename }}\nset util_version {{ value.version }}\ngoto boot_{{ value.type }}\n{% endif %}\n{% endfor %}\n\n{% for key, value in utilitiespcbios32.items() | sort %}\n{% if value.enabled | bool and value.type == \"direct\" %}\n:{{ key }}\nimgfree\nkernel {{ value.kernel }}\ninitrd {{ value.initrd }}\nboot\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n:boot_memdisk\nimgfree\nkernel ${memdisk} iso raw\ninitrd --name ${util_file} ${util_path}\necho\necho MD5sums:\nmd5sum memdisk ${util_file}\nboot\ngoto utils_exit\n\n:cmdline\necho If you want to change the default kernel command line parameters\necho you can override the defaults here.\necho\necho Currently set to: ${cmdline}\necho\necho -n Enter cmdline parameters: ${} && read cmdline\ngoto utils_menu\n\n:memtest86legacy\nimgfree\nkernel {{ utilitiespcbios32.memtest86legacy.util_path }}\nboot\ngoto utils_menu\n\n:memtest86plus\nimgfree\nkernel {{ utilitiespcbios32.memtest86plus.util_path }}\nboot\ngoto utils_menu\n\n:nbxyz_custom_url\necho If you have a customized menu you would like to load into netboot.xyz\necho set the base path url to your custom ipxe files here. \necho It will look for custom.ipxe in that path as the entry point.\necho\necho -n Please enter your custom http url here: ${} && read custom_url\ngoto utils_menu\n\n:nbxyz_custom_github\necho Make sure you have a fork of https://github.com/netbootxyz/netboot.xyz-custom.\necho You can then customize your fork as needed and set up your own custom options.\necho Once your username is set, a custom option will appear on the main menu.\necho\necho -n Please enter your Github username: ${} && read github_user\ngoto utils_menu\n\n:testdistro\necho This option will allow you to test booting an ISO using memdisk. Please\necho specify the URL of the ISO you want to test and it will automatically\necho attempt to load the ISO using memdisk.\necho -n URL: ${} && read distro_iso\nkernel ${memdisk} iso raw\ninitrd ${distro_iso}\nboot\ngoto utils_menu\n\n:utils_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-pcbios-64.ipxe.j2",
    "content": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiespcbios64.items() | sort(attribute='1.name') %}\n{% if value.enabled %}\nitem {{ key }} ${space} {{ value.name }}\n{% endif %}\n{% endfor %}\nitem --gap netboot.xyz tools:\nitem cmdline ${space} Kernel cmdline params: [${cmdline}]\nitem nbxyz_custom_url ${space} Set custom menu [url: ${custom_url}]\nitem nbxyz_custom_github ${space} Set Github username [user: ${github_user}]\nitem testdistro ${space} Test Distribution ISO\nitem nbxyz ${space} netboot.xyz endpoints\nchoose --default ${menu} menu || goto utils_exit\necho ${cls}\ngoto ${menu} ||\nchain ${menu}.ipxe || goto utils_exit\ngoto utils_exit\n\n{% for key, value in utilitiespcbios64.items() | sort %}\n{% if value.enabled | bool and value.type == \"memdisk\" %}\n:{{ key }}\nset util_path {{ value.util_path }}\nset util_file {{ value.util_path | basename }}\nset util_version {{ value.version }}\ngoto boot_{{ value.type }}\n{% endif %}\n{% endfor %}\n\n{% for key, value in utilitiespcbios64.items() | sort %}\n{% if value.enabled | bool and value.type == \"direct\" %}\n:{{ key }}\nimgfree\nkernel {{ value.kernel }}\ninitrd {{ value.initrd }}\nboot\ngoto utils_exit\n{% endif %}\n{% endfor %}\n\n:boot_memdisk\nimgfree\nkernel ${memdisk} iso raw\ninitrd --name ${util_file} ${util_path}\necho\necho MD5sums:\nmd5sum memdisk ${util_file}\nboot\ngoto utils_exit\n\n:cmdline\necho If you want to change the default kernel command line parameters\necho you can override the defaults here.\necho\necho Currently set to: ${cmdline}\necho\necho -n Enter cmdline parameters: ${} && read cmdline\ngoto utils_menu\n\n:memtest86legacy\nimgfree\nkernel {{ utilitiespcbios64.memtest86legacy.util_path }}\nboot\ngoto utils_menu\n\n:memtest86plus\nimgfree\nkernel {{ utilitiespcbios64.memtest86plus.util_path }}\nboot\ngoto utils_menu\n\n:nbxyz_custom_url\necho If you have a customized menu you would like to load into netboot.xyz\necho set the base path url to your custom ipxe files here. \necho It will look for custom.ipxe in that path as the entry point.\necho\necho -n Please enter your custom http url here: ${} && read custom_url\ngoto utils_menu\n\n:nbxyz_custom_github\necho Make sure you have a fork of https://github.com/netbootxyz/netboot.xyz-custom.\necho You can then customize your fork as needed and set up your own custom options.\necho Once your username is set, a custom option will appear on the main menu.\necho\necho -n Please enter your Github username: ${} && read github_user\ngoto utils_menu\n\n:testdistro\necho This option will allow you to test booting an ISO using memdisk. Please\necho specify the URL of the ISO you want to test and it will automatically\necho attempt to load the ISO using memdisk.\necho -n URL: ${} && read distro_iso\nkernel ${memdisk} iso raw\ninitrd ${distro_iso}\nboot\ngoto utils_menu\n\n:utils_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/vmware.ipxe.j2",
    "content": "#!ipxe\n\n# VMware ESXi\n# https://www.vmware.com\n\ngoto ${menu} ||\n\n:vmware\nset os VMware ESXi\nclear vmware_choice\nmenu ${os}\nitem --gap Installers\nitem vmware_install ${space} ${os} Install\nitem --gap Options:\nitem url_set ${space} Base URL [ ${vmware_base_url} ]\nchoose vmware_choice || goto vmware_exit\ngoto ${vmware_choice}\n\n:url_set\necho Set the HTTP URL of an extracted VMware ISO without the trailing slash:\necho e.g. http://www.mydomain.com/vmware/esxi7\necho\necho -n URL: ${} && read vmware_base_url\necho\necho The following files will be loaded the following files:\necho\necho For Legacy: ${vmware_base_url}/mboot.c32 \necho For EFI: ${vmware_base_url}/efi/boot/bootx64.efi\necho \necho The ESXi modules will be loaded from the following file:\necho ${vmware_base_url}/boot.cfg\necho\necho Ensure you have edited boot.cfg to reflect the prefix of:\necho\necho prefix=${vmware_base_url}\necho kernelopt=runweasel ks=${vmware_base_url}/ks.cfg\necho \necho If you aren't doing kickstart automation, you can leave off the ks option.\necho\necho If the filenames in the kernel= and modules= lines begin with a forward\necho slash (/) character, delete those characters.\necho\nprompt Press any key to return to VMware Menu...\ngoto vmware\n\n:vmware_install\nisset ${vmware_base_url} && goto boot_check || echo URL not set... && goto url_set\n:boot_check\niseq ${platform} efi && goto efi_boot || goto legacy_boot\n\n:efi_boot\nimgfree\nkernel ${vmware_base_url}/efi/boot/bootx64.efi -c ${vmware_base_url}/boot.cfg\ngoto boot\n\n:legacy_boot\nimgfree\nkernel ${vmware_base_url}/mboot.c32 -c ${vmware_base_url}/boot.cfg\ngoto boot\n\n:boot\nmd5sum bootx64.efi\nboot\ngoto vmware\n\n:vmware_exit\nexit 0\n\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/vyos.ipxe.j2",
    "content": "#!ipxe\n\n# VyOS\n# https://vyos.io\n\ngoto ${menu}\n\n:vyos\nset os {{ releases.vyos.name }}\nmenu ${os} Installers\nitem --gap Official Releases\n{% for item in releases.vyos.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose vyos_version || goto vyos_exit\ngoto vyos_boot\n\n:vyos_boot\nimgfree\nset url ${live_endpoint}{{ endpoints['vyos-rolling'].path }}\nkernel ${url}vmlinuz boot=live components hostname=vyos username=live nopersistence noautologin union=overlay console=tty0 net.ifnames=0 biosdevname=0 fetch=${url}filesystem.squashfs {{ kernel_params }}\ninitrd ${url}initrd\n\nboot\ngoto vyos_exit\n\n:vyos_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/windows.ipxe.j2",
    "content": "#!ipxe\n\n# Microsoft Windows\n# https://www.microsoft.com\n\nset win_arch x64\ngoto ${menu} ||\n\n:windows\nset os Microsoft Windows\nclear win_version\nmenu ${os} \nitem --gap Installers\nitem win_install ${space} Load ${os} Installer...\nitem --gap Options:\nitem arch_set ${space} Architecture [ ${win_arch} ]\nitem url_set ${space} Base URL [ ${win_base_url} ]\nchoose win_version || goto windows_exit\ngoto ${win_version}\n\n:arch_set\niseq ${win_arch} x64 && set win_arch x86 || set win_arch x64\ngoto windows\n\n:url_set\necho Set the HTTP URL of an extracted Windows ISO without the trailing slash:\necho e.g. http://www.mydomain.com/windows\necho\necho -n URL: ${} && read win_base_url\necho\necho netboot.xyz will attempt to load the following files:\necho ${win_base_url}/${win_arch}/bootmgr\necho ${win_base_url}/${win_arch}/bootmgr.efi\necho ${win_base_url}/${win_arch}/boot/bcd\necho ${win_base_url}/${win_arch}/boot/boot.sdi\necho ${win_base_url}/${win_arch}/sources/boot.wim\necho\nprompt Press any key to return to Windows Menu...\ngoto windows\n\n:win_install\nisset ${win_base_url} && goto boot || echo URL not set... && goto url_set\n\n:boot\nimgfree\nkernel {{ wimboot_location }}\ninitrd -n bootmgr     ${win_base_url}/${win_arch}/bootmgr       bootmgr ||\ninitrd -n bootmgr.efi ${win_base_url}/${win_arch}/bootmgr.efi   bootmgr.efi ||      \ninitrd -n bcd         ${win_base_url}/${win_arch}/boot/bcd      bcd ||\ninitrd -n bcd         ${win_base_url}/${win_arch}/Boot/BCD      bcd ||\ninitrd -n boot.sdi    ${win_base_url}/${win_arch}/boot/boot.sdi boot.sdi ||\ninitrd -n boot.sdi    ${win_base_url}/${win_arch}/Boot/boot.sdi boot.sdi ||\ninitrd -n boot.wim    ${win_base_url}/${win_arch}/sources/boot.wim boot.wim\nboot\n\n:windows_exit\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/zeninstall.ipxe.j2",
    "content": "#!ipxe\n\n# Zen Installer for Arch\n# https://sourceforge.net/projects/revenge-installer/\n\n:zen\nset os {{ releases.zeninstall.name }}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nmenu ${os} Installers\nitem --gap Currently during boot you need to press ctrl+d/ctrl+c\nitem --gap repeatedly when init hangs on starting a download\n{% for item in releases.zeninstall.versions %}\nitem {{ item.code_name }} ${space} ${os} {{ item.name }}\n{% endfor %}\nchoose zen_version || goto zen_exit\ngoto zen_boot\n\n:zen_boot\nimgfree\nset url ${live_endpoint}{{ endpoints.zeninstall.path }}\nkernel ${url}vmlinuz archisobasedir=arch ${ipparam} archiso_http_srv=${url} {{ kernel_params }}\ninitrd ${url}initrd\nboot\ngoto zen_exit\n\n:zen_exit\nclear menu\nexit 0\n"
  },
  {
    "path": "roles/netbootxyz/templates/pipxe/Makefile-rpi3.j2",
    "content": "FW_URL\t\t:= https://github.com/raspberrypi/firmware/branches/stable/boot\nSHELL\t\t:= /bin/bash\nEFI_BUILD\t:= RELEASE\nEFI_ARCH\t:= AARCH64\nEFI_TOOLCHAIN\t:= GCC5\nEFI_TIMEOUT\t:= 3\nEFI_FLAGS\t:= --pcd=PcdPlatformBootTimeOut=$(EFI_TIMEOUT)\nEFI_DSC\t\t:= edk2-platforms/Platform/RaspberryPi/RPi3/RPi3.dsc\nEFI_FD\t\t:= Build/RPi3/$(EFI_BUILD)_$(EFI_TOOLCHAIN)/FV/RPI_EFI.fd\n\nIPXE_CROSS\t:= aarch64-linux-gnu-\nIPXE_SRC\t:= ipxe/src\nIPXE_TGT\t:= bin-arm64-efi/rpi.efi\nIPXE_EFI\t:= $(IPXE_SRC)/$(IPXE_TGT)\n\nSDCARD_MB\t:= 32\nexport MTOOLSRC\t:= mtoolsrc\n\nall : sdcard sdcard.img sdcard.zip\n\nsubmodules :\n\tgit submodule update --init --recursive\n\nfirmware :\n\tif [ ! -e firmware ] ; then \\\n\t\t$(RM) -rf firmware-tmp ; \\\n\t\tsvn export $(FW_URL) firmware-tmp && \\\n\t\tmv firmware-tmp firmware ; \\\n\tfi\n\nefi : $(EFI_FD)\n\nefi-basetools : submodules\n\t$(MAKE) -C edk2/BaseTools\n\n$(EFI_FD) : submodules efi-basetools\n\t. ./edksetup.sh && \\\n\tbuild -b $(EFI_BUILD) -a $(EFI_ARCH) -t $(EFI_TOOLCHAIN) \\\n\t\t-p $(EFI_DSC) $(EFI_FLAGS)\n\nipxe : $(IPXE_EFI)\n\n$(IPXE_EFI) : submodules\n\t$(MAKE) -C $(IPXE_SRC) CROSS=$(IPXE_CROSS) CONFIG=rpi EMBED={{ bootloader_filename }} TRUST={{ trust_files }} $(IPXE_TGT)\n\nsdcard : firmware efi ipxe\n\t$(RM) -rf sdcard\n\tmkdir -p sdcard\n\tcp -r $(sort $(filter-out firmware/kernel%,$(wildcard firmware/*))) \\\n\t\tsdcard/\n\tcp config.txt $(EFI_FD) edk2/License.txt sdcard/\n\tmkdir -p sdcard/efi/boot\n\tcp $(IPXE_EFI) sdcard/efi/boot/bootaa64.efi\n\tcp ipxe/COPYING* sdcard/\n\nsdcard.img : sdcard\n\ttruncate -s $(SDCARD_MB)M $@\n\tmpartition -I -c -b 32 -s 32 -h 64 -t $(SDCARD_MB) -a \"z:\"\n\tmformat -v \"piPXE\" \"z:\"\n\tmcopy -s sdcard/* \"z:\"\n\nsdcard.zip : sdcard\n\t$(RM) -f $@\n\t( pushd $< ; zip -q -r ../$@ * ; popd )\n\nupdate:\n\tgit submodule foreach git pull origin master\n\ntag :\n\tgit tag v`git show -s --format='%ad' --date=short | tr -d -`\n\n.PHONY : submodules firmware efi efi-basetools $(EFI_FD) ipxe $(IPXE_EFI) \\\n\t sdcard sdcard.img\n\nclean :\n\t$(RM) -rf firmware Build sdcard sdcard.img sdcard.zip\n\tif [ -d $(IPXE_SRC) ] ; then $(MAKE) -C $(IPXE_SRC) clean ; fi\n"
  },
  {
    "path": "roles/netbootxyz/templates/pipxe/Makefile-rpi4.j2",
    "content": "FW_URL\t\t:= https://github.com/raspberrypi/firmware/branches/stable/boot\nSHELL\t\t:= /bin/bash\nEFI_BUILD\t:= RELEASE\nEFI_ARCH\t:= AARCH64\nEFI_TOOLCHAIN\t:= GCC5\nEFI_TIMEOUT\t:= 3\nEFI_FLAGS\t:= --pcd=PcdPlatformBootTimeOut=$(EFI_TIMEOUT)\nEFI_DSC\t\t:= edk2-platforms/Platform/RaspberryPi/RPi4/RPi4.dsc\nEFI_FD\t\t:= Build/RPi4/$(EFI_BUILD)_$(EFI_TOOLCHAIN)/FV/RPI_EFI.fd\n\nIPXE_CROSS\t:= aarch64-linux-gnu-\nIPXE_SRC\t:= ipxe/src\nIPXE_TGT\t:= bin-arm64-efi/snp.efi\nIPXE_EFI\t:= $(IPXE_SRC)/$(IPXE_TGT)\n\nSDCARD_MB\t:= 32\nexport MTOOLSRC\t:= mtoolsrc\n\nall : sdcard sdcard.img sdcard.zip\n\nsubmodules :\n\tgit submodule update --init --recursive\n\nfirmware :\n\tif [ ! -e firmware ] ; then \\\n\t\t$(RM) -rf firmware-tmp ; \\\n\t\tsvn export $(FW_URL) firmware-tmp && \\\n\t\tmv firmware-tmp firmware ; \\\n\tfi\n\nefi : $(EFI_FD)\n\nefi-basetools : submodules\n\t$(MAKE) -C edk2/BaseTools\n\n$(EFI_FD) : submodules efi-basetools\n\t. ./edksetup.sh && \\\n\tbuild -b $(EFI_BUILD) -a $(EFI_ARCH) -t $(EFI_TOOLCHAIN) \\\n\t\t-p $(EFI_DSC) $(EFI_FLAGS)\n\nipxe : $(IPXE_EFI)\n\n$(IPXE_EFI) : submodules\n\t$(MAKE) -C $(IPXE_SRC) CROSS=$(IPXE_CROSS) CONFIG=rpi EMBED={{ bootloader_filename }} TRUST={{ trust_files }} $(IPXE_TGT)\n\nsdcard : firmware efi ipxe\n\t$(RM) -rf sdcard\n\tmkdir -p sdcard\n\tcp -r $(sort $(filter-out firmware/kernel%,$(wildcard firmware/*))) \\\n\t\tsdcard/\n\tcp config.txt $(EFI_FD) edk2/License.txt sdcard/\n\tmkdir -p sdcard/efi/boot\n\tcp $(IPXE_EFI) sdcard/efi/boot/bootaa64.efi\n\tcp ipxe/COPYING* sdcard/\n\nsdcard.img : sdcard\n\ttruncate -s $(SDCARD_MB)M $@\n\tmpartition -I -c -b 32 -s 32 -h 64 -t $(SDCARD_MB) -a \"z:\"\n\tmformat -v \"piPXE\" \"z:\"\n\tmcopy -s sdcard/* \"z:\"\n\nsdcard.zip : sdcard\n\t$(RM) -f $@\n\t( pushd $< ; zip -q -r ../$@ * ; popd )\n\nupdate:\n\tgit submodule foreach git pull origin master\n\ntag :\n\tgit tag v`git show -s --format='%ad' --date=short | tr -d -`\n\n.PHONY : submodules firmware efi efi-basetools $(EFI_FD) ipxe $(IPXE_EFI) \\\n\t sdcard sdcard.img\n\nclean :\n\t$(RM) -rf firmware Build sdcard sdcard.img sdcard.zip\n\tif [ -d $(IPXE_SRC) ] ; then $(MAKE) -C $(IPXE_SRC) clean ; fi\n"
  },
  {
    "path": "roles/netbootxyz/templates/version.ipxe.j2",
    "content": "#!ipxe\n{% if upstream_version %}\nset upstream_version {{ upstream_version }}\n{% endif %}\nexit\n"
  },
  {
    "path": "roles/netbootxyz/tests/inventory",
    "content": "localhost\n"
  },
  {
    "path": "roles/netbootxyz/tests/test.yml",
    "content": "---\n- hosts: localhost\n  remote_user: root\n  roles:\n    - netbootxyz\n"
  },
  {
    "path": "roles/netbootxyz/vars/debian.yml",
    "content": "---\nnetbootxyz_packages:\n  - apache2\n  - binutils-dev\n  - binutils-aarch64-linux-gnu\n  - dosfstools\n  - figlet\n  - gcc-aarch64-linux-gnu\n  - build-essential\n  - genisoimage\n  - git\n  - isolinux\n  - liblzma-dev\n  - libslirp-dev\n  - syslinux\n  - syslinux-common\n  - toilet\n  - mtools\n"
  },
  {
    "path": "roles/netbootxyz/vars/main.yml",
    "content": "---\n"
  },
  {
    "path": "roles/netbootxyz/vars/redhat.yml",
    "content": "---\nnetbootxyz_packages:\n  - dosfstools\n  - figlet\n  - gcc\n  - genisoimage\n  - git\n  - httpd\n  - libslirp-devel\n  - minizip-devel\n  - syslinux\n  - xz-devel\n  - make\n"
  },
  {
    "path": "roles/netbootxyz/vars/ubuntu.yml",
    "content": "---\nnetbootxyz_packages:\n  - apache2\n  - binutils-dev\n  - binutils-aarch64-linux-gnu\n  - dosfstools\n  - figlet\n  - gcc-aarch64-linux-gnu\n  - build-essential\n  - genisoimage\n  - git\n  - isolinux\n  - liblzma-dev\n  - libslirp-dev\n  - syslinux\n  - syslinux-common\n  - toilet\n  - mtools\n\npipxe_packages:\n  - acpica-tools\n  - binutils\n  - binutils-dev\n  - gcc\n  - libuuid1\n  - make\n  - mtools\n  - perl\n  - python2\n  - subversion\n  - uuid\n  - uuid-dev\n  - virtualenv\n  - xz-utils\n"
  },
  {
    "path": "script/build_release",
    "content": "#!/bin/bash\nset -e\n\nTYPE=$1\nHARD_RELEASE=\"3.x\"\nHARD_RC=\"3.x-RC\"\nDEV_URL=\"dev.boot.netboot.xyz\"\nSTAGING_URL=\"staging.boot.netboot.xyz\"\nPROD_URL=\"boot.netboot.xyz\"\nNBXYZ_OVERRIDES=production\n\n# Set boot domain\nif [[ \"${TYPE}\" == \"dev\" ]]; then\n  BOOT_DOMAIN=\"s3.amazonaws.com/${DEV_URL}/${GITHUB_SHA}\"\n  BOOT_VERSION=\"${GITHUB_SHA}\"\nelif [[ \"${TYPE}\" == \"pr\" ]]; then\n  BOOT_DOMAIN=\"test.com\"\n  BOOT_VERSION=\"test\"\n  NBXYZ_OVERRIDES=default\nelif [[ \"${TYPE}\" == \"rc\" ]]; then\n  BOOT_VERSION=$(cat version.txt)-RC\n  BOOT_DOMAIN=\"${STAGING_URL}/${BOOT_VERSION}\"\nelif [[ \"${TYPE}\" == \"release\" ]]; then\n  BOOT_VERSION=$(cat version.txt)\n  BOOT_DOMAIN=\"${PROD_URL}/${BOOT_VERSION}\"\nelif [[ \"${TYPE}\" == \"rolling\" ]]; then\n  HARD_RELEASE=\"3.x\"\n  PROD_URL=\"boot.netboot.xyz\"\nfi\n\n# build release files \nif ! [[ \"${TYPE}\" == \"rolling\" ]]; then\n  sed -i \\\n    \"/^# boot_version/c\\boot_version: \\\"${BOOT_VERSION}\\\"\" \\\n    user_overrides.yml\n  sed -i \\\n    \"/^# boot_domain/c\\boot_domain: ${BOOT_DOMAIN}\" \\\n    user_overrides.yml\n\n  # Build release\n  docker build -t localbuild --build-arg NBXYZ_OVERRIDES=${NBXYZ_OVERRIDES} .\n  docker run --rm -i -v $(pwd):/buildout localbuild\n\n  # Generate folder outputs\n  mkdir -p s3out\n  mkdir -p s3outver\n  cp -r buildout/* s3out/\n  cp buildout/version.ipxe s3outver/\n  mkdir -p githubout\n  mv buildout/ipxe/* githubout/\n  cd buildout\n  rm -Rf ipxe\n  tar -czf menus.tar.gz *\n  mv menus.tar.gz ../githubout\n  cd ..\n  if [[ \"${TYPE}\" == \"dev\" ]]; then\n    cp githubout/menus.tar.gz s3out/\n  fi\nfi\n\n# Latest style endpoints for RC and Live\nif [[ \"${TYPE}\" == \"release\" ]] || [[ \"${TYPE}\" == \"rolling\" ]] || [[ \"${TYPE}\" == \"rc\" ]]; then\n  rm -Rf buildout/\n  if [[ \"${TYPE}\" == \"release\" ]] || [[ \"${TYPE}\" == \"rolling\" ]]; then\n    sed -i \\\n      -e \"/^boot_version/c\\boot_version: \\\"${HARD_RELEASE}\\\"\" \\\n      -e \"/^boot_domain/c\\boot_domain: ${PROD_URL}\" \\\n      user_overrides.yml\n    docker build -t localbuild --build-arg NBXYZ_OVERRIDES=${NBXYZ_OVERRIDES} .\n    docker run --rm -i -v $(pwd):/buildout localbuild\n  fi\n  if [[ \"${TYPE}\" == \"rc\" ]]; then\n    sed -i \\\n      -e \"/^boot_version/c\\boot_version: \\\"${HARD_RC}\\\"\" \\\n      -e \"/^boot_domain/c\\boot_domain: ${STAGING_URL}/rc\" \\\n      user_overrides.yml\n    docker build -t localbuild --build-arg NBXYZ_OVERRIDES=${NBXYZ_OVERRIDES} .\n    docker run --rm -i -v $(pwd):/buildout localbuild\n  fi\n  mkdir -p s3out-latest\n  cp -r buildout/* s3out-latest/\nfi\n"
  },
  {
    "path": "script/message",
    "content": "#!/bin/bash\nset -e\n\nTYPE=$1\n\nif [ \"${TYPE}\" == \"dev-push\" ]; then\n  BOOT_URL=\"https://s3.amazonaws.com/dev.boot.netboot.xyz/${GITHUB_SHA}/index.html\"\nelif [ \"${TYPE}\" == \"rc-push\" ]; then\n  BOOT_URL=\"https://staging.boot.netboot.xyz/$(cat version.txt)-RC/index.html\"\nelif [ \"${TYPE}\" == \"live-push\" ]; then\n  BOOT_URL=\"https://boot.netboot.xyz/$(cat version.txt)/index.html\"\nelif [ \"${TYPE}\" == \"rolling-push\" ]; then\n  BOOT_URL=\"https://boot.netboot.xyz/index.html\"\nfi\n\n# send status to discord\nif [ \"${TYPE}\" == \"failure\" ]; then\n  curl -X POST -H \"Content-Type: application/json\" --data \\\n  '{\n    \"avatar_url\": \"https://api.microlink.io/?url=https://twitter.com/github&embed=image.url\",\n    \"embeds\": [\n      {\n        \"color\": 16711680,\n        \"description\": \"__**Failed to Build**__ \\n**Build:**  'https://github.com/netbootxyz/netboot.xyz/actions/runs/${GITHUB_RUN_ID}'\\n**Status:**  Failure\\n**Change:** https://github.com/netbootxyz/netboot.xyz/commit/'${GITHUB_SHA}'\\n\"\n      }\n    ],\n    \"username\": \"Github\"\n  }' \\\n  ${DISCORD_HOOK_URL}\nelse\n  curl -X POST -H \"Content-Type: application/json\" --data \\\n  '{\n    \"avatar_url\": \"https://api.microlink.io/?url=https://twitter.com/github&embed=image.url\",\n    \"embeds\": [\n      {\n        \"color\": 1681177,\n        \"description\": \"__**Boot Menu Published**__ \\n**Files:** '${BOOT_URL}' \\n**Build:**  'https://github.com/netbootxyz/netboot.xyz/actions/runs/${GITHUB_RUN_ID}'\\n**Change:** https://github.com/netbootxyz/netboot.xyz/commit/'${GITHUB_SHA}'\\n\"\n      }\n    ],\n    \"username\": \"Github\"\n  }' \\\n  ${DISCORD_HOOK_URL}\nfi\n"
  },
  {
    "path": "script/netbootxyz-overrides.yml",
    "content": "---\nsigs_menu: true\nsigs_enabled: true\ngenerate_disks_arm: true\ngenerate_disks_hybrid: true\ngenerate_disks_linux: true\ngenerate_disks_rpi: false\ngenerate_disks_secureboot: true\ngenerate_version_file: true\ngenerate_local_vars: false\nmake_num_jobs: 4\nbootloader_multiple: true\nbootloader_disks:\n  - \"netboot.xyz\"\n  - \"netboot.xyz-metal\"\ngenerate_signatures: true\nsigs_dir: \"{{ netbootxyz_root }}/sigs\"\nsigs_location: \"http://${boot_domain}/sigs/\"\ncert_dir: \"/ansible/certs\"\nipxe_branch: master\nipxe_ca_url: http://ca.ipxe.org/ca.crt\nipxe_ca_filename: ca-ipxe-org.crt\ncodesign_cert_filename: codesign.crt\ncodesign_key_filename: codesign.key\ncert_file_filename: ca-netboot-xyz.crt\n"
  },
  {
    "path": "script/retrieve_certs",
    "content": "#!/bin/bash\nset -e\n\n# retrieve certs\ngit clone https://$GIT_USER:$GIT_AUTH@$GIT_URL certs\necho \"Retrieved certs from repository at commit:\"\ngit -C certs log -1 --format=\"SHA: %H%nAuthor: %an <%ae>%nDate: %ad\" --date=short\necho \"\"\ncp certs/certs.tar.enc .\nopenssl aes-256-cbc -pass pass:$CERTS_KEY -d -salt -pbkdf2 -a -in certs.tar.enc -out certs.tar\ntar xf certs.tar -C certs\n"
  },
  {
    "path": "script/tag",
    "content": "#! /bin/bash\n\n# if tag exists append random string to it\nCODE=$(curl -s -o /dev/null -I -w \"%{http_code}\" https://api.github.com/repos/netbootxyz/netboot.xyz/releases/tags/\"${RELEASE_TAG}\")\necho ${CODE}\nif [ \"${CODE}\" == \"404\" ]; then\n  git tag ${RELEASE_TAG}\nelif [ \"${CODE}\" == \"200\" ]; then\n  RAND=$(cat /dev/urandom | tr -dc 'A-Z0-9' | fold -w 3 | head -n 1)\n  git tag ${RELEASE_TAG}${RAND}\nfi\n"
  },
  {
    "path": "site.yml",
    "content": "---\n- hosts: localhost\n  user: root\n  roles:\n    - netbootxyz\n  vars_files:\n    - endpoints.yml\n    - user_overrides.yml\n"
  },
  {
    "path": "user_overrides.yml",
    "content": "---\n\n# overrides defaults in netbootxyz role\ngenerate_menus: true\ngenerate_disks: true\ngenerate_checksums: true\ngenerate_local_vars: true\nmake_num_jobs: 1\n\n# set desired site name\n# site_name: mysitename.com\n\n# set desired boot domain\n# boot_domain: boot.mysitename.com\n\n# set boot version\n# boot_version: \"3.x\"\n\n# bootloader_tftp_enabled: false\n# bootloader_https_enabled: true\n# bootloader_http_enabled: true\n\n# set release overrides from standard netboot.xyz defaults\n# release_overrides:\n#   alpinelinux:\n#     name: \"Alpine Linux\"\n#   fedora:\n#     mirror: \"mirrors.kernel.org\"\n\n# set utilitiesefi_overrides from standard netboot.xyz defaults for EFI utilities\n# utilitiesefi_overrides:\n#  supergrub:\n#    enabled: false\n\n# set utilities_overrides from standard netboot.xyz defaults for PC BIOS utilities\n# utilitiespcbios64_overrides:\n#  supergrub:\n#    enabled: false\n\nearly_menu_enabled: false\nearly_menu_contents: |\n   ### early menu overrides\n   ### used to set early ipxe options such as custom console & logo\n   # console --x 1024 --y 768\n   # console --picture https://boot.netboot.xyz/logo.png\n"
  },
  {
    "path": "version.txt",
    "content": "3.0.0\n"
  }
]