Full Code of netbootxyz/netboot.xyz for AI

development 971197e8aa03 cached
170 files
329.2 KB
104.9k tokens
1 requests
Download .txt
Showing preview only (369K chars total). Download the full file or copy to clipboard to get everything.
Repository: netbootxyz/netboot.xyz
Branch: development
Commit: 971197e8aa03
Files: 170
Total size: 329.2 KB

Directory structure:
gitextract_zt7mag3n/

├── .ansible-lint
├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   └── feature_request.md
│   └── workflows/
│       ├── claude.yml
│       ├── development.yml
│       ├── pull-requests.yml
│       ├── release-candidate.yml
│       ├── release.yml
│       └── rolling.yml
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── docker-build-root/
│   └── dumper.sh
├── endpoints.yml
├── etc/
│   └── netbootxyz/
│       └── custom/
│           ├── README.md
│           └── custom.ipxe.j2
├── renovate.json
├── roles/
│   └── netbootxyz/
│       ├── README.md
│       ├── defaults/
│       │   └── main.yml
│       ├── files/
│       │   ├── ipxe/
│       │   │   └── local/
│       │   │       ├── colour.h
│       │   │       ├── console.h
│       │   │       ├── crypto.h
│       │   │       ├── general.h
│       │   │       └── general.h.efi
│       │   └── memdisk
│       ├── meta/
│       │   └── main.yml
│       ├── tasks/
│       │   ├── generate_checksums.yml
│       │   ├── generate_disks.yml
│       │   ├── generate_disks_arm.yml
│       │   ├── generate_disks_base.yml
│       │   ├── generate_disks_efi.yml
│       │   ├── generate_disks_hybrid.yml
│       │   ├── generate_disks_legacy.yml
│       │   ├── generate_disks_linux.yml
│       │   ├── generate_disks_rpi.yml
│       │   ├── generate_disks_secureboot.yml
│       │   ├── generate_menus.yml
│       │   ├── generate_menus_custom.yml
│       │   ├── generate_signatures.yml
│       │   └── main.yml
│       ├── templates/
│       │   ├── checksums.txt.j2
│       │   ├── disks/
│       │   │   ├── autoexec.ipxe.j2
│       │   │   ├── netboot.xyz-gce.j2
│       │   │   ├── netboot.xyz-metal.j2
│       │   │   └── netboot.xyz.j2
│       │   ├── index.html.j2
│       │   ├── local-vars.ipxe.j2
│       │   ├── menu/
│       │   │   ├── 4mlinux.ipxe.j2
│       │   │   ├── about.ipxe.j2
│       │   │   ├── almalinux.ipxe.j2
│       │   │   ├── alpinelinux.ipxe.j2
│       │   │   ├── archlinux.ipxe.j2
│       │   │   ├── blackarch.ipxe.j2
│       │   │   ├── boot.cfg.j2
│       │   │   ├── bsd.ipxe.j2
│       │   │   ├── centos.ipxe.j2
│       │   │   ├── clonezilla.ipxe.j2
│       │   │   ├── coreos.ipxe.j2
│       │   │   ├── dban.ipxe.j2
│       │   │   ├── debian.ipxe.j2
│       │   │   ├── devuan.ipxe.j2
│       │   │   ├── endeavouros.ipxe.j2
│       │   │   ├── fedora.ipxe.j2
│       │   │   ├── flatcar.ipxe.j2
│       │   │   ├── freebsd.ipxe.j2
│       │   │   ├── freedos.ipxe.j2
│       │   │   ├── gentoo.ipxe.j2
│       │   │   ├── gparted.ipxe.j2
│       │   │   ├── harvester.ipxe.j2
│       │   │   ├── ipfire.ipxe.j2
│       │   │   ├── k3os.ipxe.j2
│       │   │   ├── kairos.ipxe.j2
│       │   │   ├── kali.ipxe.j2
│       │   │   ├── kaspersky.ipxe.j2
│       │   │   ├── linux-arm.ipxe.j2
│       │   │   ├── linux-i386.ipxe.j2
│       │   │   ├── linux.ipxe.j2
│       │   │   ├── live-arm.ipxe.j2
│       │   │   ├── live-backbox.ipxe.j2
│       │   │   ├── live-bluestar.ipxe.j2
│       │   │   ├── live-bodhi.ipxe.j2
│       │   │   ├── live-cachyos.ipxe.j2
│       │   │   ├── live-debian.ipxe.j2
│       │   │   ├── live-devuan.ipxe.j2
│       │   │   ├── live-elementary.ipxe.j2
│       │   │   ├── live-endeavouros.ipxe.j2
│       │   │   ├── live-fatdog.ipxe.j2
│       │   │   ├── live-fedora.ipxe.j2
│       │   │   ├── live-feren.ipxe.j2
│       │   │   ├── live-garuda.ipxe.j2
│       │   │   ├── live-grml.ipxe.j2
│       │   │   ├── live-hrmpf.ipxe.j2
│       │   │   ├── live-k3os.ipxe.j2
│       │   │   ├── live-kali.ipxe.j2
│       │   │   ├── live-kodachi.ipxe.j2
│       │   │   ├── live-lite.ipxe.j2
│       │   │   ├── live-lxle.ipxe.j2
│       │   │   ├── live-manjaro.ipxe.j2
│       │   │   ├── live-mint.ipxe.j2
│       │   │   ├── live-neon.ipxe.j2
│       │   │   ├── live-nitrux.ipxe.j2
│       │   │   ├── live-parrot.ipxe.j2
│       │   │   ├── live-peppermint.ipxe.j2
│       │   │   ├── live-popos.ipxe.j2
│       │   │   ├── live-q4os.ipxe.j2
│       │   │   ├── live-raizo.ipxe.j2
│       │   │   ├── live-regolith.ipxe.j2
│       │   │   ├── live-septor.ipxe.j2
│       │   │   ├── live-sparky.ipxe.j2
│       │   │   ├── live-tails.ipxe.j2
│       │   │   ├── live-ubuntu.ipxe.j2
│       │   │   ├── live-vanillaos.ipxe
│       │   │   ├── live-voyager.ipxe.j2
│       │   │   ├── live-zorin.ipxe.j2
│       │   │   ├── live.ipxe.j2
│       │   │   ├── lspci.ipxe.j2
│       │   │   ├── mageia.ipxe.j2
│       │   │   ├── menu.ipxe.j2
│       │   │   ├── nbxyz.ipxe.j2
│       │   │   ├── netinfo.ipxe.j2
│       │   │   ├── nixos.ipxe.j2
│       │   │   ├── openEuler.ipxe.j2
│       │   │   ├── openbsd.ipxe.j2
│       │   │   ├── opensuse.ipxe.j2
│       │   │   ├── oracle.ipxe.j2
│       │   │   ├── photon.ipxe.j2
│       │   │   ├── proxmox.ipxe.j2
│       │   │   ├── rescuezilla.ipxe.j2
│       │   │   ├── rhel.ipxe.j2
│       │   │   ├── rockylinux.ipxe.j2
│       │   │   ├── shredos.ipxe.j2
│       │   │   ├── slackware.ipxe.j2
│       │   │   ├── smartos.ipxe.j2
│       │   │   ├── systemrescue.ipxe.j2
│       │   │   ├── talos.ipxe.j2
│       │   │   ├── tinycore.ipxe.j2
│       │   │   ├── ubuntu-spins.ipxe.j2
│       │   │   ├── ubuntu.ipxe.j2
│       │   │   ├── unix.ipxe.j2
│       │   │   ├── utils-arm.ipxe.j2
│       │   │   ├── utils-efi.ipxe.j2
│       │   │   ├── utils-pcbios-32.ipxe.j2
│       │   │   ├── utils-pcbios-64.ipxe.j2
│       │   │   ├── vmware.ipxe.j2
│       │   │   ├── vyos.ipxe.j2
│       │   │   ├── windows.ipxe.j2
│       │   │   └── zeninstall.ipxe.j2
│       │   ├── pipxe/
│       │   │   ├── Makefile-rpi3.j2
│       │   │   └── Makefile-rpi4.j2
│       │   └── version.ipxe.j2
│       ├── tests/
│       │   ├── inventory
│       │   └── test.yml
│       └── vars/
│           ├── debian.yml
│           ├── main.yml
│           ├── redhat.yml
│           └── ubuntu.yml
├── script/
│   ├── build_release
│   ├── message
│   ├── netbootxyz-overrides.yml
│   ├── retrieve_certs
│   └── tag
├── site.yml
├── user_overrides.yml
└── version.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .ansible-lint
================================================
# .ansible-lint
skip_list:
  - '208'
  - command-instead-of-module  # Using command rather than module.
  - command-instead-of-shell  # Use shell only when shell functionality is required.
  - no-changed-when  # Commands should not change things if nothing needs doing.
  - risky-shell-pipe  # Shells that use pipes should set the pipefail option.
  - literal-compare  # Don't compare to literal True/False.
  - var-naming[no-role-prefix]  # Internal variables don't need role prefix.


================================================
FILE: .dockerignore
================================================
.git


================================================
FILE: .github/FUNDING.yml
================================================
github: netbootxyz
open_collective: netbootxyz


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: 'bug'
assignees: ''

---

[]: This bug persists when memory is increased beyond 8GB.
<!--
Please validate that the issue is not a symptom of insufficient memory.
Many installation media are based on live-cd images that require more than
a few MB/GB of memory to run.
-->

**Describe the bug**
<!-- A clear and concise description of what the bug is. -->

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'

**Expected behavior**
<!-- A clear and concise description of what the bug is. -->

**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->

**Additional context**
<!-- Add any other context about the problem here. -->


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask a question in the Discussions area
    url: https://github.com/netbootxyz/netboot.xyz/discussions
    about: Recommended place for questions, operating system discussion, and ideas.
  - name: Ask a question on the netboot.xyz Discord Server
    url: https://discord.gg/An6PA2a
    about: Join the official netboot.xyz Discord!


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: 'enhancement'
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->

**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->

**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->

**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->


================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude PR Assistant

on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  issues:
    types: [opened, assigned]
  pull_request_review:
    types: [submitted]

jobs:
  claude-code-action:
    if: |
      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: read
      issues: read
      id-token: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 1

      - name: Run Claude PR Action
        uses: anthropics/claude-code-action@beta
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          timeout_minutes: "60"


================================================
FILE: .github/workflows/development.yml
================================================
name: development

on:
  push:
    branches:
      - development
  workflow_dispatch:

env:
  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}
  GITHUB_SHA: ${{ github.sha }}

jobs:
  development-build:
    name: Build Development
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
    - uses: actions/checkout@v6
      with:
        ref: development

    - name: Retrieve Certs
      run: |
        ./script/retrieve_certs
      env:
        GIT_USER: ${{ secrets.GIT_USER }}
        GIT_AUTH: ${{ secrets.GIT_AUTH }}
        GIT_URL: ${{ secrets.GIT_URL }}
        CERTS_KEY: ${{ secrets.CERTS_KEY }}

    - name: Build Development Release
      run: |
        ./script/build_release dev

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v6
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_DEV }}
        aws-region: ${{ secrets.AWS_ACCESS_REGION }}

    - name: Deploy development release to bucket/SHA
      run: |
        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_DEV }}/$GITHUB_SHA

    - name: Deploy development version file to bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3outver s3://${{ secrets.AWS_S3_BUCKET_DEV }}

    - name: Notify Discord on failure
      if: failure()
      run: |
        ./script/message failure

    - name: Notify Discord on completion
      if: success()
      run: |
        ./script/message dev-push


================================================
FILE: .github/workflows/pull-requests.yml
================================================
name: pull-requests

on:
  pull_request:
    branches:
      - development
      - RC
      - master

jobs:
  test-pr:
    name: Test Pull Request
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6

    - uses: actions/setup-python@v6
      with:
        python-version: '3.14' # renovate: datasource=github-tags depName=python

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install ansible==13.4.0 # renovate: datasource=pypi depName=ansible
        pip install ansible-lint==26.3.0 # renovate: datasource=pypi depName=ansible-lint

    - name: Syntax Check
      run: |
        ansible-playbook site.yml --syntax-check

    - name: Ansible lint
      run: |
        ansible-lint -v roles/netbootxyz/tasks

  build-pr:
    name: Build Pull Request
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v6

    - uses: actions/setup-python@v6

    - name: Build PR release
      run: |
        ./script/build_release pr


================================================
FILE: .github/workflows/release-candidate.yml
================================================
name: release-candidate

on:
  push:
    branches:
      - RC
  workflow_dispatch:

env:
  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}
  GITHUB_SHA: ${{ github.sha }}

jobs:
  rc-build:
    name: Build Release Candidate
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: write
    steps:
    - uses: actions/checkout@v6
      with:
        ref: RC

    - name: Retrieve Certs
      run: |
        ./script/retrieve_certs
      env:
        GIT_USER: ${{ secrets.GIT_USER }}
        GIT_AUTH: ${{ secrets.GIT_AUTH }}
        GIT_URL: ${{ secrets.GIT_URL }}
        CERTS_KEY: ${{ secrets.CERTS_KEY }}

    - name: Set Release Tag
      run: echo "release_tag=$(cat version.txt)-RC" >> $GITHUB_ENV

    - name: Build RC release
      run: |
        ./script/build_release rc

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v6
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_STAGING }}
        aws-region: ${{ secrets.AWS_ACCESS_REGION }}

    - name: Deploy RC to release-candidate bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_STAGING }}/${{ env.release_tag }}

    - name: Deploy RC to rolling bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_STAGING }}/rc

    - name: Deploy RC version file
      run: |
        aws s3 sync --no-progress --acl public-read s3outver s3://${{ secrets.AWS_S3_BUCKET_STAGING }}

    - name: Invalidate Cloudfront
      run: |
        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_STAGING }} --paths "/rc/*" "/rc/ipxe/*" "/rc/sigs/*"

    - name: Tag RC Release
      run: |
        ./script/tag ${{ env.release_tag }}

    - name: Extract release notes
      id: extract-release-notes
      uses: ffurrer2/extract-release-notes@v3

    - name: Create RC Release and Upload Assets
      uses: svenstaro/upload-release-action@v2
      with:
        file: githubout/*
        file_glob: true
        overwrite: true
        prerelease: true
        release_name: ${{ env.release_tag }}
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        tag: ${{ env.release_tag }}
        body: ${{ steps.extract-release-notes.outputs.release_notes }}

    - name: Notify Discord on failure
      if: failure()
      run: |
        ./script/message failure

    - name: Notify Discord on completion
      if: success()
      run: |
        ./script/message rc-push


================================================
FILE: .github/workflows/release.yml
================================================
name: release

on:
  push:
    branches:
      - master

env:
  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}
  GITHUB_SHA: ${{ github.sha }}

jobs:
  release:
    name: Build Release
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: write
    steps:
    - uses: actions/checkout@v6
      with:
        ref: master

    - name: Retrieve Certs
      run: |
        ./script/retrieve_certs
      env:
        GIT_USER: ${{ secrets.GIT_USER }}
        GIT_AUTH: ${{ secrets.GIT_AUTH }}
        GIT_URL: ${{ secrets.GIT_URL }}
        CERTS_KEY: ${{ secrets.CERTS_KEY }}

    - name: Set Release Tag
      run: echo "release_tag=$(cat version.txt)" >> $GITHUB_ENV

    - name: Build release
      run: |
        ./script/build_release release

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v6
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_PROD }}
        aws-region: ${{ secrets.AWS_ACCESS_REGION }}

    - name: Deploy master to release bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3out s3://${{ secrets.AWS_S3_BUCKET_PROD }}/${{ env.release_tag }}

    - name: Deploy master to rolling bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_PROD }}

    - name: Invalidate Cloudfront
      run: |
        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_PROD }} --paths "/*" "/ipxe/*" "/sigs/*"

    - name: Tag Release
      run: |
        ./script/tag ${{ env.release_tag }}

    - name: Extract release notes
      id: extract-release-notes
      uses: ffurrer2/extract-release-notes@v3

    - name: Create Release and Upload Assets
      uses: svenstaro/upload-release-action@v2
      with:
        file: githubout/*
        file_glob: true
        overwrite: true
        prerelease: false
        release_name: ${{ env.release_tag }}
        repo_token: ${{ secrets.GITHUB_TOKEN }}
        tag: ${{ env.release_tag }}
        body: ${{ steps.extract-release-notes.outputs.release_notes }}

    - name: Notify Discord on failure
      if: failure()
      run: |
        ./script/message failure

    - name: Notify Discord on completion
      if: success()
      run: |
        ./script/message live-push


================================================
FILE: .github/workflows/rolling.yml
================================================
name: rolling

on:
  workflow_dispatch:
  # Disabled automatic rolling releases during version updates
  # push:
  #   paths:
  #     - 'endpoints.yml'
  #     - 'roles/netbootxyz/defaults/main.yml'
  #   branches:
  #     - development

env:
  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}
  GITHUB_SHA: ${{ github.sha }}

jobs:
  rolling:
    name: Build Release
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: write
    steps:
    - uses: actions/checkout@v6
      with:
        ref: 'master'

    - name: Retrieve Certs
      run: |
        ./script/retrieve_certs
      env:
        GIT_USER: ${{ secrets.GIT_USER }}
        GIT_AUTH: ${{ secrets.GIT_AUTH }}
        GIT_URL: ${{ secrets.GIT_URL }}
        CERTS_KEY: ${{ secrets.CERTS_KEY }}

    - name: Set Release Tag
      run: echo "release_tag=$(cat version.txt)" >> $GITHUB_ENV

    - name: Download endpoints.yml and main.yml from Development
      run: |
        wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/development/endpoints.yml -O endpoints.yml
        wget https://raw.githubusercontent.com/netbootxyz/netboot.xyz/development/roles/netbootxyz/defaults/main.yml -O roles/netbootxyz/defaults/main.yml
        chmod +x script/build_release
        
    - name: Build release
      run: |
        ./script/build_release rolling

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v6
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_ROLLING }}
        aws-region: ${{ secrets.AWS_ACCESS_REGION }}

    - name: Deploy master to rolling bucket
      run: |
        aws s3 sync --no-progress --acl public-read s3out-latest s3://${{ secrets.AWS_S3_BUCKET_PROD }}

    - name: Invalidate Cloudfront
      run: |
        aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID_PROD }} --paths "/*" "/ipxe/*" "/sigs/*"

    - name: Notify Discord on failure
      if: failure()
      run: |
        ./script/message failure

    - name: Notify Discord on completion
      if: success()
      run: |
        ./script/message rolling-push


================================================
FILE: AGENTS.md
================================================
# AGENTS.md

Guidelines for AI coding agents working in the netboot.xyz repository.

## Project Summary

netboot.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.

## Build Commands

```bash
# Syntax check (fast, run first)
ansible-playbook site.yml --syntax-check

# Lint Ansible tasks
ansible-lint -v roles/netbootxyz/tasks

# Full local build (generates menus + bootloaders to /var/www/html)
ansible-playbook site.yml

# Menu-only build (skip bootloader compilation)
ansible-playbook site.yml -e "generate_disks=false generate_checksums=false generate_signatures=false"

# Docker build (outputs to buildout/)
docker build -t localbuild --platform=linux/amd64 -f Dockerfile .
docker run --rm -it --platform=linux/amd64 -v $(pwd):/buildout localbuild

# Release builds
./script/build_release dev      # Development
./script/build_release pr       # Pull request test
./script/build_release rc       # Release candidate
./script/build_release release  # Production
./script/build_release rolling  # Rolling
```

### CI Checks (what PRs must pass)

1. `ansible-playbook site.yml --syntax-check`
2. `ansible-lint -v roles/netbootxyz/tasks`
3. Full Docker build via `./script/build_release pr`

### Testing

Molecule tests exist but require Docker:
```bash
pip install molecule molecule-docker
molecule test
```

There are no unit tests. Validation is done through syntax checks, linting, and full builds.

## Code Style

### YAML / Ansible

- Start every YAML file with `---` on line 1.
- Use 2-space indentation consistently.
- Use **fully-qualified collection names** (FQCN) for all modules:
  - `ansible.builtin.template`, `ansible.builtin.set_fact`, `ansible.builtin.shell`, etc.
  - Never use short names like `template:` or `shell:`.
- Use `snake_case` for all variable names: `boot_domain`, `generate_menus`, `netbootxyz_root`.
- Guard booleans with the `| default(true) | bool` pattern:
  ```yaml
  when:
    - generate_menus | default(true) | bool
  ```
- Use `when:` as a list even for single conditions.
- Use descriptive `name:` for every task.
- The `.ansible-lint` config skips these rules (do not add workarounds for them):
  - `command-instead-of-module`, `command-instead-of-shell`
  - `no-changed-when`, `risky-shell-pipe`
  - `literal-compare`, `var-naming[no-role-prefix]`

### iPXE Templates (`.ipxe.j2` files)

- Start with `#!ipxe` shebang on line 1.
- Add a comment header with OS name and URL on lines 2-4.
- iPXE scripts are **flat** — do not indent iPXE commands.
- Use `#` for comments inside templates.
- Variable conventions:
  - iPXE runtime variables: `${variable_name}` (evaluated at boot time)
  - Jinja2 template variables: `{{ variable }}` (evaluated at build time)
  - These are often mixed: `${live_endpoint}{{ endpoints.foo.path }}`
- Labels use `:label_name` in `snake_case`.
- Navigation pattern: `goto ${menu} ||` at template start.
- User selection: `choose <var> || goto <exit_label>`.
- Exit pattern: clear menu and `exit 0`:
  ```ipxe
  :distro_exit
  clear menu
  exit 0
  ```
- Error pattern: echo, prompt, return to menu:
  ```ipxe
  :error
  echo Error occurred, press any key to return to menu
  prompt
  goto main_menu
  ```
- Fallback chains: `command || goto fallback` for graceful degradation.
- Architecture mapping varies by OS family:
  - Red Hat: `x86_64` → `x86_64`, `arm64` → `aarch64`
  - Debian: `x86_64` → `amd64`, `arm64` → `arm64`
- Guard optional values: `isset ${variable}` in iPXE, `{% if value.field is defined %}` in Jinja2.

### Jinja2 Patterns

- Loop over releases: `{% for item in releases.<distro>.versions %}`
- Sort by name: `{% for key, value in releases.items() | sort(attribute='1.name') %}`
- Filter enabled items: `{% if value.enabled is defined and value.enabled | bool %}`
- Template iteration uses `with_community.general.filetree` in tasks.

### OS Definition Schema (`defaults/main.yml`)

```yaml
releases:
  distro_key:          # lowercase, no hyphens (e.g., almalinux, rockylinux)
    name: "Display Name"
    mirror: "http://mirror.url"
    base_dir: "path/on/mirror"
    enabled: true
    menu: linux         # one of: linux, bsd, dos, unix
    versions:
      - code_name: "version_id"
        name: "Display Version"
```

Optional fields: `archive_mirror`, `paths`, `flavors`, `platforms`, `version`.

### Utility Definition Schema (`defaults/main.yml`)

```yaml
utilitiesefi:          # or utilitiespcbios64, utilitiespcbios32, utilitiesarm
  utility_key:
    name: "Display Name"
    enabled: true
    type: direct        # one of: direct, ipxemenu, memdisk, memtest, sanboot
    kernel: "<url>"
    initrd: "<url>"     # optional
```

## File Organization

| Path | Purpose |
|------|---------|
| `site.yml` | Main playbook entry point |
| `defaults/main.yml` | All OS/utility definitions and default config |
| `endpoints.yml` | Live image endpoint URLs |
| `user_overrides.yml` | Local overrides (not committed) |
| `templates/menu/*.ipxe.j2` | ~100 iPXE menu templates |
| `templates/disks/*.j2` | Bootloader embedded scripts |
| `templates/pipxe/*.j2` | Raspberry Pi Makefile templates |
| `tasks/*.yml` | 14 Ansible task files |
| `vars/{debian,redhat,ubuntu}.yml` | Per-distro package lists |
| `script/` | Build and release shell scripts |

## Menu Hierarchy

```
menu.ipxe (main) → linux.ipxe → ubuntu.ipxe, fedora.ipxe, ...
                  → bsd.ipxe   → freebsd.ipxe, openbsd.ipxe, ...
                  → live.ipxe  → live-ubuntu.ipxe, ...
                  → utils-*.ipxe
                  → windows.ipxe
```

Menus chain via `chain ${menu}.ipxe || goto error`. Signature verification gates chaining when `sigs_enabled` is true.

## Error Handling

- **Ansible**: Relies on default fail-fast behavior. No `block/rescue/always`. Guard tasks with `when:` conditions. Use `| default()` to prevent undefined variable errors.
- **iPXE**: Use `command || goto fallback` chains. Protocol degradation: HTTPS → HTTP → local boot. Always provide a `:error` label that prompts the user.
- **Shell scripts**: Use `set -e` at the top of all scripts.

## Adding a New Operating System

1. Add entry to `releases:` in `roles/netbootxyz/defaults/main.yml`.
2. Create `roles/netbootxyz/templates/menu/<distro>.ipxe.j2` following existing templates.
3. The menu template is auto-discovered via `filetree` iteration — no registration needed.
4. Add the distro to the appropriate category menu (e.g., `linux.ipxe.j2`) if it needs a menu entry.
5. If using live images, add endpoint to `endpoints.yml`.
6. Test: `ansible-playbook site.yml --syntax-check && ansible-lint -v roles/netbootxyz/tasks`

## Key Variables

- **`boot_domain`**: Target domain for generated menus.
- **`boot_version`**: Version string for releases.
- **`site_name`**: Custom branding (defaults to `netboot.xyz`).
- **`generate_menus` / `generate_disks`**: Enable/disable build components.
- **`sigs_enabled`**: Enable signature verification for menu chaining.
- **`live_endpoint`**: Base URL for live/rescue images.
- **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.

## Git Workflow

- **`development`**: Main development branch, default PR target.
- **`RC`**: Release candidate staging.
- **`master`**: Production releases.
- Commit style: imperative mood, descriptive. Automated commits use `Version bump for ...` format.


================================================
FILE: CHANGELOG.md
================================================
<!-- markdownlint-configure-file {"MD024": { "siblings_only": true } } -->
# Changelog

All notable changes to this project will be documented in this file.

## [3.0.0] - 2026-01-24

### Added

- Proxmox Datacenter Manager support with text and debug installation modes
- Memtest86+ v8.00 series support

### Changed

- **BREAKING**: Updated embedded certificates used for image signature verification in iPXE bootloaders
- Users with 2.x bootloaders will be automatically upgraded to 3.x on first boot
- Bumped major version to 3.x series due to code signing certificate updates requiring bootloader update
- Various distribution version updates across all supported operating systems
- Improved certificate retrieval script with commit SHA validation output

### Fixed

- Oracle Linux menu items now properly filter by architecture (x86_64 vs aarch64)
- OpenSUSE Tumbleweed ARM64 build configuration corrected to use ports mirror
- Flatcar Container Linux boot redirect issue resolved

## [2.0.89] - 2025-11-08

### Added

- OpenSUSE 16.0 support with live ISO boot method
- Dasharo Tools Suite updated to v2.7.0 and v2.7.1

### Changed

- Updated Ansible to v12 for improved build system
- Updated ansible-lint to v24.12.2 with compatibility fixes
- Various distribution version updates:
  - Arch Linux updated to 2025.11.01
  - SmartOS updated to 20251030T000436Z
  - CoreOS updated to 42.20251012.3.0-stable, 43.20251024.2.0-testing, 43.20251027.1.0-next
  - IPFire updated to 2.29-core198
- Improved dependency tracking in GitHub workflows
- Updated GitHub Actions:
  - actions/checkout to v5
  - actions/setup-python to v6
  - aws-actions/configure-aws-credentials to v5

### Fixed

- OpenSUSE 16.0 boot configuration now uses live ISO method with proper root= parameter
- Ansible-lint configuration updated to skip var-naming rule for internal variables
- CI/CD compatibility issues resolved between Ansible and ansible-lint versions
- Renovate configuration JSON syntax errors corrected

## [2.0.88] - 2025-08-09

### Added

- CachyOS live distribution with archiso boot configuration
- Ubuntu Spins distribution template for Ubuntu flavor variants  
- Debian 13 (Trixie) net installer
- Rocky Linux 10 and AlmaLinux 10 
- Flatcar Container Linux ARM64 architecture support
- Proxmox VE 9.0
- Dasharo Tools Suite updated to v2.6.0
- SystemRescue archiso_pxe_http initrd support

### Changed

- FreeDOS updated to v1.4 with corrected URLs
- Various distribution version updates and endpoint refreshes
- Improved MAC address handling in TFTP boot configuration

### Fixed

- Fedora CoreOS kernel filename format corrected

### Removed

- Deepin distribution completely removed from the system

## [2.0.87] - 2025-05-08

### Added

- Fedora Onyx build
- Kali arm64 Added

### Changed

- Various version updates
- Cleanup of older distros from endpoints

## [2.0.86] - 2025-03-13

### Added

- Support for Kairos
- Enabled NFS support in iPXE

## [2.0.85] - 2025-02-23

### Changed

- Various version updates
- Checks for boot timeout from local-vars.ipxe

## [2.0.84] - 2025-01-04

### Added

- UEFI Shell available under utilities for x86/ARM UEFI mode
- Floppy boot images for UEFI
- Dasharo Tools Suite
- Latest GRML added with ARM support

### Changed

- Moves win_base_url and rhel_base_url out of boot.cfg to local-vars.ipxe as they are
  user defined variables.
- Adds a check in boot.cfg to see if live_endpoint is set from local-vars.ipxe. This
  will allow the user to set their overrides locally on their network.

## [2.0.83] - 2024-11-07

### Changed

- Various version updates

## [2.0.82] - 2024-09-18

### Changed

- Various version updates

## [2.0.81] - 2024-08-10

### Added

- Added ZFSBootMenu
- Added VanillaOS
- Added Super Grub2 Disk for EFI

### Fixed

- Slowness with Ubuntu 24.04 net install getting stuck on Cloud Init
- Removed hard coded console on VyOS to fix on Equinix Metal

## [2.0.80] - 2024-07-17

### Added

- Adds option for setting System Resuce password 

### Removed

- Scientific Linux (EOL)

## [2.0.79] - 2024-05-25

### Added

- Added Talos to arm64 menu
- Ubuntu 24.04 LTS, Fedora 40, and many other version updates

### Changed 

- Dropped newer Ubuntu Live Image versions as they don't properly work anymore

## [2.0.78] - 2024-03-30

### Fixed

- Resolves an issue with the generated index having incorrect naming on the links due
  to a previous variable name change on the index template
- Proxmox iso names are corrected for backup and mailgateway

## [2.0.77] - 2024-02-24

### Fixed

- Talos menu fixed

### Changed

- Use bootloader_filename instead of site_name for bootloader filenames

## [2.0.76] - 2023-12-31

### Added

- Memtest86+ 6.20 for EFI and Legacy x86_64 modes, leaves 5.01 for Legacy purposes
  as some issues were noticed loading 6.20 Legacy on KVM where it hangs on
  loading but works fine using VMware.
- ARM ISO and USB Images added
- Tunable make_num_jobs for compiling in parallel

## [2.0.75] - 2023-12-03

### Fixed

- Updated CentOS to be able to pull arm64 images
- Updates to images that may have been missing curl in the
  initrd for booting

### Changed

- Uses exit 1 on local boot now to allow for it to roll over
  to next device in UEFI (Issue #1276)
- Switches to using proxmox iso from asset releases so that it can
  also be installed via local assets (Issue #1350)

## [2.0.74] - 2023-11-14

### Changed

- Update rescue flag to include inst. prefix on RHEL based distros

### Fixed

- Minor bugs in Fedora menu
- CAINE booting

### Removed

- Anarchy Linux

## [2.0.73] - 2023-10-13

### Added

- Fedora 39 stubbed out for release later this month
- Ubuntu 23.10
- Text UI support for Proxmox Distros

### Fixed

- Fixed an issue with Fedora would error with "Could not boot"

### Removed

- Remove AVG as it's no longer maintained

## [2.0.72] - 2023-09-15

### Fixed

- Fixed an issue where Proxmox/QEMU users using Legacy mode would hang or
  reboot when loading an OS. Would have affected 2.0.70 and 2.0.71 releases.

## [2.0.71] - 2023-09-09

### Added

- Added NixOS option for ARM

### Changed

- Adjusted bootloader logic for detecting v6 and v6 scenarios

### Fixed

- Kickstart URLs were broken on RHEL based distros if text install
  was being used.

## [2.0.70] - 2023-07-03

### Added

- Enabled CERT_CMD in iPXE
- Added Debian 12
- Disable pci scan option when loaded on ARM/EFI as command isn't supported
- Building snp and snponly builds for Equinix Metal

### Changed

- Changed default Equinix Metal builds to use snp to ensure more stable start
- Changed CentOS 9 Stream mirror due to it no longer working with iPXE

## [2.0.69] - 2023-05-07

### Added

- Ubuntu 23.04 (Lunar)
- Fedora 38
- Added multiarch combined ISO and IMG file for x86_64 and arm64

## [2.0.68] - 2023-04-02

### Changed

- Various versions updated, no major changes

## [2.0.67] - 2023-02-18

### Added

- Enabled Link Layer Discovery Protocol (LLDP)
- OpenSUSE ARM Support

## [2.0.66] - 2022-12-28

### Fixed

- Adjusted Mint menu generation for minor releases to fix rolling

## [2.0.65] - 2022-12-03

### Fixed

- Removed deprecated arg from Ansible playbook to fix dev and rolling

## [2.0.64] - 2022-11-23

### Removed

- Removed RancherOS

## [2.0.63] - 2022-10-23

### Added

- Fedora 37 (to be released)
- Ubuntu 20.10 (Kinetic Kudu)

## [2.0.62] - 2022-09-13

### Changes

- Uses inst.text instead of text on redhat based distros

### Fixed

- Menu was incorrect on AlmaLinux on aarch64

## [2.0.61] - 2022-08-28

### Added

- Various version updates
- Viewpoint attribute on boot.netboot.xyz index
- Oracle Linux aarch64

### Changes

- Various Ansible Lint fixes

### Fixed

- Ubuntu 22.04 version issues related to minor increments

## [2.0.60] - 2022-07-24

### Added

- Added Fedora Kionite

### Changes

- Collapsed Dockerfiles into one
- Various version updates
- Cleaned up some EOL versions

## [2.0.59] - 2022-05-28

### Added

- VMware Photon 4.0

## [2.0.58] - 2022-04-22

### Added

- Ubuntu 22.04 LTS Jammy Jellyfish
- Fedora 26 Prep for release

### Changes

- Disabled RPI image as it was failing, will need to revisit in future
- Lint fixes

## [2.0.57] - 2022-03-21

### Added

- Proxmox Backup Server
- Proxmox Mail Gateway

### Changes

- Proxmox pulls ISO from upstream site now, consolidated Proxmox items to one menu

## [2.0.56] - 2022-02-26

### Fixed

- Added a ipxe_cloud_config for packet and metal for older clients

## [2.0.55] - 2022-02-12

### Added

- Slackware 15.0

### Fixed

- Hardset Flatcar Linux initrd to fix booting (`https://github.com/netbootxyz/netboot.xyz/issues/1070`)
- Archlinux now sets archtecture correctly with static ips

### Changes

- Changes Packet bootloaders to Equinix Metal
- Switch archlinux default mirror to mirrors.edge.kernel.org to avoid redirect

## [2.0.54] - 2021-12-25

### Added

- CentOS 9 Stream hardset url
- Various version updates

## [2.0.53] - 2021-11-22

### Added
- Fedora 35
- Various version updates

## [2.0.52] - 2021-10-31

### Added

- Support for ProxyDHCP environments

## [2.0.51] - 2021-10-15

### Added

- Fedora CoreOS - aarch64 support
- Garuda Linux Live builds
- Ubuntu 21.10 live builds and installers
- Added Padded Floppy builds for tooling sensitive to size of disk
- Added logic for building iPXE linux binaries

### Fixed

- Manjaro builds working again

## [2.0.50] - 2021-10-03

### Added

- Added Clonezilla 32-bit

### Changed

- Proper rolling for boot.netboot.xyz implemented, endpoints.yml and defaults
  are now pushed to boot.netboot.xyz upon update in development branch to
  ensure version updates can be consumed as identified. Allows for new versions
  to be available before a release.

## [2.0.49] - 2021-09-29

### Added

- Support for Ubuntu 20.04 Subiquity and up on arm64
- Added Archlinux 32-bit
- Added shredos for 32-bit
- Added systemrescue for 32-bit
- Added Fedora 35 Beta
- Added Ubuntu 21.10 Impish Indri Beta

### Fixed

- Corrected architecture naming on k3os

### Changed

- Split pcbios utilities menu into 32-bit and 64-bit options
- utilitiespcbios is now utilitiespcbios64 and utilitiespcbios32 for overrides
- Renamed ubuntu netboot assets to align better with existing branches

## [2.0.48] - 2021-09-17

### Added

- Support for Harvester
- Support for Tails
- Support for Kali 32-bit net installer
- Support for hrmpf
- Support for Gentoo 32-bit and arm64 installers
- Added EFI support for OpenBSD using sanboot
- Adds additional options for arm64 iPXE binary downloads

## [2.0.47] - 2021-08-30

### Fixed

- Corrects an issue with loading 32-bit linux menu on 64-bit platforms (https://github.com/netbootxyz/netboot.xyz/issues/978)

## [2.0.46] - 2021-08-29

### Fixed

- Fix incorrect arch introduced on Ubuntu

## [2.0.45] - 2021-08-29

### Added

- Created a seperate menu for supported 32-bit Operating Systems
- Enables utility menu for Packet non EFI
- Updated arm menu

### Fixed

- Refactor of architecture checks, better support for i386 and arch distros
- Arm64 and i386 options work now
- Added kernel_params for console overrides to utility images

### Changed

- Dropped some older EOL distros

## [2.0.44] - 2021-08-24

### Added

- Enables utility menu for Packet EFI
- Added Debian 11 Live Builds
- Adds Param command to iPXE builds
- Adds next-server and version info when booted locally

### Fixed

- Fixes console issues for Ubuntu and Debian on Packet

### Changes

- Updates to Voyager menu to let it be more dynamic

## [2.0.43] - 2021-08-19

### Added

- Adds Proxmox VE
- Adds Zorin 16
- Adds Elementary OS 6
- Enables ability to add custom commands early in menu load with early_menu_*
- Adds ability to change install priority on Ubuntu Legacy
- Adds a toggle for enabling local-vars.ipxe

### Fixed

- Adjustments to index.html template, adds description
- Readme tweaks for new site

## [2.0.42] - 2021-08-01

### Added

- Debian 11 (Bullseye) ahead of release

### Fixed

- Gentoo more reliable, switches to initrd.magic to avoid modifying initrd
- Fixes to Mint menu to populate options correctly
- Cosmetic fixes to index.html.j2 tables

## [2.0.41] - 2021-07-08

### Added

- Adds support for openEuler
- Adds ping command to iPXE build

### Fixed

- NixOS working again, using images and iPXE configs that are generated upstream

### Changes

- Use non https repo for almalinux
- Switch to using initrd.magic (`https://github.com/ipxe/ipxe/commit/e5f02551735922eb235388bff08249a6f31ded3d`)
- Moves initrd= and cmdline values to single kernel parameter in Ansible

## [2.0.40] - 2021-06-12

### Added

- Adds support for VMware ESXi with user supplied media

## [2.0.39] - 2021-05-15

### Added

- Enabled gzip and zlib support on iPXE binaries

### Fixed

- Check for legacy undionly filename if running menu locally

## [2.0.38] - 2021-05-02

### Added

- Fedora 34 and Live Versions
- Redo Rescue
- Rescuezilla
- Rocky Linux

### Changed

- Switched to using upstream genfsimg for building hybrid images
- Merged Legacy and EFI disks into single image for USB and ISOs
- Can now use autoexec.ipxe on the root of a USB key to inject variables or modify the starting bootloader
- Renamed USB disk from .usb to .img

## [2.0.37] - 2021-04-25

### Added

- Ubuntu 21.04 Installer and Live Versions

### Fixed

- Version number variable tweaks

## [2.0.36] - 2021-04-18

### Added

- Support for ShredOS

## [2.0.35] - 2021-04-02

### Added

- Support for EndeavourOS

## [2.0.34] - 2021-03-13

### Added

- Support for AlmaLinux

### Fixed

- Updated Debian Kernel for Live images, transitioned over to Actions from Travis

## [2.0.33] - 2021-03-06

### Removed

- Parrot NetInstall images are no longer maintained
- Removed Velt as it appears deprecated

## [2.0.32] - 2021-02-09

### Fixed

- Update to latest Ubuntu maintenance release

### Changed

- Disabled Unix Menu on EFI as SmartOS not working in that mode and was the only option on EFI
- Various version updates

## [2.0.31] - 2021-01-18

### Fixed

- Fixes results too large bug introduced on Ubuntu menu

### Changed

- Change priority to low on Ubuntu Legacy installer

## [2.0.30] - 2021-01-17

### Added

- Can now download hybrid bootloaders that contain x86_64 Legacy and EFI builds in one image.
  Enables the user to use one ISO or USB key for multiple scenarios.
- Ability to use custom URLs for menus instead of just relying on Github netboot.xyz-custom repo.

### Changed

- Added the legacy installer back for Ubuntu 20.04 (Focal).  20.04 will be the last
  version to support legacy Debian Installer with autoinstall being the new Ubuntu
  standard going foward.
- Various version updates

## [2.0.29] - 2020-12-28

### Changed

- Various version updates
- Switched asset builders from Github to Travis
- Introduced changelog

## [2.0.28] - 2020-12-09

### Added

- VyOS Support

### Changed

- Switches to GitHub Actions from Travis CI for primary repo automation

## [2.0.27] - 2020-11-20

### Changed

- Change builder image name
- Remove older Kali images, fix menu for latest version
- Switch to inst.repo for Red Hat based OS
- Allow for static assigned networking to work on Ubuntu builds

## [2.0.26] - 2020-11-18

### Added

- 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.

### Changed

- Switches builder to netbootxyz docker image on Github Container Registry
- Simplfied Fedora Live menu

### Fixed

- Bugfix on NixOS menu

## [2.0.25] - 2020-11-07

### Added

- Initial support for Raspberry Pi iPXE bootloader which allows you to boot using SD Card or USB key. (Experimental)
- Ubuntu 20.10 Grovvy Live Images
- Added support for Ubuntu 20.04/20.10 Subiquity Server installers
- Added Fedora 33 net installer and live images

### Changed

- Fedora Core build version is now updated automatically.

## [2.0.24] - 2020-10-28

### Fixed

- Fixed github releases

## [2.0.23] - 2020-10-27

### Added

- Ubuntu 20.10 Groovy Gorilla - Live CD install only
- Fedora 33
- OpenBSD 6.8

## [2.0.22] - 2020-10-11

### Fixed

- Fixed Anarchy Linux

### Changed

- Pin builders to Ansible 2.10

## [2.0.21] - 2020-09-13

### Changed

- Version updates

## [2.0.20] - 2020-08-28

### Fixed

- Archlinux url fixes

## [2.0.19] - 2020-08-12

### Added

- Adds ability to add custom kernel command line parameters

### Fixed

- Sets proper RELEASE Tag when creating a Github Release

## [2.0.18] - 2020-07-24

### Fixed

- Fixed Fedora CoreOS build
- Various unnamed bugs

## [2.0.17] - 2020-06-30

### Added

- CentOS 8.2
- Mint 20
- OpenSUSE Leap 15.2

### Changed

- Changes to K3OS deployments
- Tweaks to ARM64 menus,  added ARM placeholders for Utility menu

## [2.0.16] - 2020-06-09

### Added

- Adds Devuan back in with latest Beowulf

### Fixed

- Corrects issue with Fedora and text mode

## [2.0.15] - 2020-05-20

### Added

- Backbox 7

### Fixed

- CentOS path fixes

## [2.0.14] - 2020-05-06

### Added

- Fedora 32 and Ubuntu 20.04 live assets
- PopOS 20.04
- Parrot 4.9

### Changed

- Bump to CentOS 7.8
- Moved NixOS to hosted live assets

## [2.0.13] - 2020-04-24

### Changed

- Ubuntu 20.04 url
- NixOS 20.03

## [2.0.12] - 2020-04-23

### Added

- Ubuntu 20.04 LTS added and 20.04 stock live builds updated

### Changed

- Fedora 32 added and 29 dropped

### Removed

- Removed test forked or branched code from github as it no longer works

## [2.0.11] - 2020-04-01

### Added

- Clonezilla Testing/Stable
- Gentoo instlaler LiveCD
- Nitrux Stable
- System Rescue CD
- Zorin Linux
- Manjaro Live CDs
- KDE-neon
- Sparky Linux Rolling and Stable
- 4mLinux core and SSS
- SmartOS version tags
- BlueStart Linux
- Parrot Linux installer
- Bodhi 5 standard and app pack
- Linux Mint Debian Edition

### Fixed

- Fixed CentOS kickstart url

### Removed

- Dropped tails support

## [2.0.10] - 2020-03-07

### Changed

- Various version updates

## [2.0.9] - 2020-02-16

### Changed

- Various version updates

## [2.0.8] - 2020-02-06

### Added

- SmartOS
- 4MLinux
- BakAndImgCD
- The Smallest Server Suite

### Fixed

- Various bug fixes

## [2.0.7] - 2020-01-25

### Added

- CentOS 8.1
- Gentoo (working now)
- Fatdog
- Kaspersky Rescue Disk
- LXLE
- Live Raise
- Septor
- Tiny Core Linux using kernels instead of memdisk

## [2.0.6] - 2020-01-19

### Added

- Oracle Linux
- Anarchy Installer
- Bluestart Live
- Zen Graphical Installer for Arch
- Kodachi Linux
- Bohdi Linux
- Boot Repair CD
- Devuan Live
- gparted Live
- grml Live
- Parrot Live
- Rescatux
- System Rescue CD
- CAINE
- Nitrux
- Velt Live
- Fedora CoreOS back in

### Removed

- Security Menu and merges those options into Linux and Live menus
- Unused external signature checking code

## [2.0.5] - 2020-01-11

### Added

- SparkyLinux
- K3OS
- RHEL menu option back to Linux Menu
- Support for text mode on RHEL/Fedora
- netboot.xyz endpoints menu under Utilities for testing Dev/Staging/Prod endpoints
- Enables auto login for Rancher

## [2.0.4] - 2020-01-06

### Added

- PCI Device List
- VLAN Tagging Support in Manual Configuration
- DBAN
- Clonezilla
- Breakin
- FerenOS
- Q4OS 3.10

### Fixed

- FreeBSD working
- Captures upstream iPXE version as ipxe_version
- Fixes Packet and GCE Versioning

## [2.0.3] - 2020-01-02

### Fixed

- Fixes for Live CD and Menus

## [2.0.2] - 2019-12-31

### Fixed

- Windows fixes, timeout for version checking
- Fixes for Deepin and Elementary

## [2.0.1] - 2019-12-27

### Fixed

- Fixes some index.html issues so that iPXE clients exit properly
- Change flags on genisoimage reflect el-torito options
- Move generate_signatures to end of playbook
- Moves retrieval of latest menu version from about to menu to ensure variable is always loaded
- Generates the version file for netboot.xyz site
- Enable epel for packages like figlet
- Fixes some discord messaging

## [2.0.0] - 2019-12-26

### Changes
- Switches primary boot.netboot.xyz to deploy deployed with Ansible and sets up 2.x rolling release series

## [1.9.9] - 2019-12-13

### Deprecated
- Pre 2.x series before being deployed with Ansible


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to netboot.xyz

First of all, thank you for supporting the netboot.xyz community and for 
considering contributing to the project!

## How to Contribute

Because netboot.xyz supports many different operating systems and utilities, it
takes work and time to keep the many options updated.  Distributions may add a
new version of the operating system, locations of files can change, and versions
might go end of life and drop off the mirrors.

The end goal is to support as many operating systems as possible so that it's
really easy to go explore new operating systems and tools from one location.

## What can I do to help?

### Help keep netboot.xyz updated

If you noticed one of your favorite operating system or tool has been updated,
feel free to open a [Pull Request] to get the operating system updated.  It 
will be reviewed and merged once validated.

### Add support for new OS and Utilities

Do you have a favorite utility that you use often but isn't on netboot.xyz?
Feel free to request it being added or submit a [Pull Request].

### Ask your distribution to become netboot friendly

If you don't see support for your favorite distribution in netboot.xyz, please
open up an [issue] with netboot.xyz and if possible, open up an issue with the
distribution.

Ask for the distribution to provide a way to load installer kernels from
their mirror directly or provide key files from their release ISO somewhere that
is accessible over HTTP. This usually might be a `vmlinuz`, an `initrd`, and
potentially a `rootfs` and could be extracted and hosted on the mirror when the
release is generated. Providing these allows not only netboot.xyz to load the
installer from a supported and trusted location but also users to do the same
from their own PXE servers. In this day and age as physical media is less
necessary, having the option to pull files as needed is much more efficient
especially when you may have limited bandwidth.

### Improve the documentation and knowledgebase

We are trying to make netboot.xyz a place to come to learn about infrastructure
automation so creating good docs on not only the project but how other distributions
automation works is important. A lot of the logic on booting is currently in code but
getting those into site documentation as well helps them to be better searchable by
search engines. If you are a technical writer, feel free to contribute docs that
would enable others to learn and grow.

### Submit ideas

We are always looking for new ideas to make the tool more useful, if you have an
idea, feel free to open up a Github [issue] or open up a [Pull Request].

### Communication Channels

* [Discord](https://discord.gg/An6PA2a) Chat Server for netboot.xyz discussions, questions, and development
* Follow us on [Twitter](https://twitter.com/netbootxyz) at [@netbootxyz](https://twitter.com/netbootxyz)
  for the latest updates
* Start a [discussion](https://github.com/netbootxyz/netboot.xyz/discussions) or share something cool you have done with the project.

### Donate

We 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!

## Enjoy and have fun!

[issue]: https://github.com/netbootxyz/netboot.xyz/issues/new
[Pull Request]: https://github.com/netbootxyz/netboot.xyz/pulls


================================================
FILE: Dockerfile
================================================
ARG NBXYZ_OVERRIDES=default

FROM ghcr.io/netbootxyz/builder:latest AS builder

# repo for build
COPY . /ansible

FROM builder AS netbootxyz-default
ENV EXTRA_VARS=""

FROM builder AS netbootxyz-production
ENV EXTRA_VARS="--extra-vars @script/netbootxyz-overrides.yml"

FROM netbootxyz-${NBXYZ_OVERRIDES} AS final
RUN \
  echo "**** running ansible ****" && \
  cd /ansible && \
  ansible-playbook site.yml ${EXTRA_VARS}

# runtime stage
FROM alpine:latest

COPY --from=final /var/www/html/ /mnt/
COPY docker-build-root/ /

ENTRYPOINT [ "/dumper.sh" ]


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.



================================================
FILE: README.md
================================================
## 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)

Your favorite operating systems in one place!

[![Build Status](https://github.com/netbootxyz/netboot.xyz/workflows/release/badge.svg)](https://github.com/netbootxyz/netboot.xyz/actions?query=workflow%3Arelease)
[![Discord](https://img.shields.io/discord/425186187368595466)](https://discord.gg/An6PA2a)
[![Release](https://img.shields.io/github/v/release/netbootxyz/netboot.xyz?color=hunter%20green)](https://github.com/netbootxyz/netboot.xyz/releases/latest)
![GitHub all releases](https://img.shields.io/github/downloads/netbootxyz/netboot.xyz/total)

![netboot.xyz menu](https://netboot.xyz/images/netboot.xyz.gif)

### Bootloader Downloads

#### Combined Legacy and UEFI iPXE Bootloaders

| Type | Bootloader | Description |
|------|------------|-------------|
|ISO| [netboot.xyz.iso](https://boot.netboot.xyz/ipxe/netboot.xyz.iso)| Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box |
|USB| [netboot.xyz.img](https://boot.netboot.xyz/ipxe/netboot.xyz.img)| Used for creation of USB Keys|

#### Legacy (PCBIOS) iPXE Bootloaders

| Type | Bootloader | Description |
|------|------------|-------------|
|Kernel| [netboot.xyz.lkrn](https://boot.netboot.xyz/ipxe/netboot.xyz.lkrn)|Used for booting from GRUB/EXTLINUX|
|Floppy| [netboot.xyz.dsk](https://boot.netboot.xyz/ipxe/netboot.xyz.dsk)| Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc|
|Padded Floppy| [netboot.xyz.pdsk](https://boot.netboot.xyz/ipxe/netboot.xyz.pdsk)| Padded Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc|
|DHCP| [netboot.xyz.kpxe](https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe)| DHCP boot image file, uses built-in iPXE NIC drivers|
|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|

#### UEFI iPXE Bootloaders

| Type | Bootloader | Description |
|------|------------|-------------|
|DHCP| [netboot.xyz.efi](https://boot.netboot.xyz/ipxe/netboot.xyz.efi)| DHCP boot image file, uses built-in iPXE NIC drivers|
|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|
|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|

#### ARM64 iPXE Bootloaders

| Type | Bootloader | Description |
|------|------------|-------------|
|DHCP| [netboot.xyz-arm64.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi)| DHCP boot image file, uses built-in iPXE NIC drivers|
|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|
|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|

#### Raspberry Pi iPXE Bootloaders

| Type | Bootloader | Description |
|------|------------|-------------|
|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|
|DHCP-snp| [netboot.xyz-rpi4-snp.efi](https://boot.netboot.xyz/ipxe/netboot.xyz-rpi4-snp.efi)| Raspberry Pi 4 - EFI Image|

SHA256 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).

### What is netboot.xyz?

[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.

If you already have iPXE up and running on the network, you can hit netboot.xyz at anytime by typing for Legacy (PCBIOS) mode:

    chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn

or when in UEFI mode:

    chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.efi

You 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.

### Documentation

See [netboot.xyz](https://netboot.xyz) for all documentation.  Some links to get started with are:

* [Downloads](https://netboot.xyz/downloads/)
* [Self Hosting](https://netboot.xyz/docs/selfhosting/)
* [Booting Methods](https://netboot.xyz/docs/booting/ipxe)
* [FAQ](https://netboot.xyz/docs/faq)
* [Blog](https://netboot.xyz/blog)

If 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).

### Self Hosting netboot.xyz

For 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.

Please see the [self-hosting docs](https://netboot.xyz/docs/selfhosting/) for more information but in short:

#### Deploying using Ansible

To generate, run:

```
ansible-playbook site.yml
```

The build output will be located in /var/www/html by default.

#### Deploying with Docker

```
docker build -t localbuild --platform=linux/amd64 -f Dockerfile .
docker run --rm -it --platform=linux/amd64 -v $(pwd):/buildout localbuild
```

The build output will be in the generated folder `buildout`

#### Local Overrides

Ansible 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. 

Using 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.

#### Self Hosted Custom Options

In 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.

### What Operating Systems are currently available on netboot.xyz?

#### Operating Systems

| Name       | URL             | Installer Kernel | Live OS       |
|------------|-----------------|------------------|---------------|
| AlmaLinux | https://almalinux.org/ | Yes | No |
| Alpine Linux | https://alpinelinux.org | Yes | No |
| Arch Linux | https://www.archlinux.org | Yes | No |
| Backbox | https://www.backbox.org | No | Yes |
| BlackArch Linux | https://blackarch.org | Yes | Yes |
| Bluestar Linux | https://sourceforge.net/projects/bluestarlinux | No | Yes |
| Bodhi Linux | https://www.bodhilinux.com | No | Yes |
| CachyOS | https://cachyos.org | No | Yes |
| CentOS | https://centos.org | Yes | No |
| Debian | https://debian.org | Yes | Yes|
| Devuan | https://devuan.org | Yes | No |
| Elementary OS | https://elementary.io | No | Yes |
| EndeavourOS | https://endeavouros.com | No | Yes |
| Fatdog64 | https://distro.ibiblio.org/fatdog/web/ | No | Yes |
| Fedora | https://fedoraproject.org | Yes | Yes |
| Fedora CoreOS | https://getfedora.org/en/coreos?stream=stable | Yes | No |
| Feren OS | https://ferenos.weebly.com/ | Yes | No |
| Flatcar Container Linux | https://www.flatcar.org | Yes | No |
| FreeBSD | https://freebsd.org | Yes, disk image | No |
| FreeDOS | https://www.freedos.org | ISO - Memdisk| No |
| Garuda Linux | https://garudalinux.org/ | No | Yes |
| Gentoo | https://gentoo.org | Yes | Yes |
| Harvester | https://harvesterhci.io | Yes | No |
| hrmpf | https://github.com/leahneukirchen/hrmpf/ | No | Yes |
| IPFire | https://www.ipfire.org | Yes | No |
| K3OS | https://k3os.io/ | Yes | Yes |
| Kairos | https://kairos.io/ | Yes | No |
| Kali Linux | https://www.kali.org | Yes | Yes |
| KDE Neon | https://neon.kde.org | No | Yes |
| Kodachi | https://www.digi77.com/linux-kodachi/ | No | Yes |
| Linux Lite | https://www.linuxliteos.com | No | Yes |
| LXLE | https://lxle.net/ | No | Yes |
| Mageia | https://www.mageia.org | Yes | No |
| Manjaro | https://manjaro.org | No | Yes |
| Mint | https://linuxmint.com | No | Yes |
| Microsoft Windows | https://www.microsoft.com | User supplied media | No |
| MirOS | http://www.mirbsd.org | Yes | No |
| Nitrux | https://nxos.org/ | No | Yes |
| NixOS | https://nixos.org | Yes | No |
| OpenBSD | https://openbsd.org | Yes | No |
| openEuler | https://openeuler.org | Yes | No |
| openSUSE | https://opensuse.org | Yes | No |
| Oracle Linux | https://www.oracle.com/linux/ | Yes | Installer |
| Parrot Security | https://www.parrotsec.org | No | Yes |
| Peppermint | https://peppermintos.com | No | Yes |
| Pop OS |https://system76.com/pop| No | Yes |
| Proxmox Open Source Products | https://www.proxmox.com/ | Yes | No |
| Q4OS | https://q4os.org | No | Yes |
| Raizo | https://sourceforge.net/projects/live-raizo/ | No | Yes |
| Red Hat Enterprise Linux | https://www.redhat.com | User supplied media | No |
| Regolith | https://regolith-linux.org | No | Yes |
| Rocky Linux | https://rockylinux.org/ | Yes | No |
| Septor | https://septor.sourceforge.io | No | Yes |
| Slackware | https://www.slackware.com | Yes | No |
| SmartOS | https://www.smartos.org/ | Yes | No |
| SparkyLinux | https://sparkylinux.org/ | No | Yes |
| Tails | https://tails.net | No | Yes |
| Talos | https://www.talos.dev/ | Yes | No |
| Tiny Core Linux | https://tinycorelinux.net | Yes | Yes |
| Ubuntu | https://www.ubuntu.com | Yes | Yes |
| VMware | https://www.vmware.com | User supplied media | No |
| VMware Photon | https://vmware.github.io/photon/ | Yes | No |
| Vanilla OS | https://vanillaos.org | No | Yes |
| Voyager | https://voyagerlive.org | No | Yes |
| VyOS | https://vyos.io | Yes | No |
| Zen Installer | https://sourceforge.net/projects/revenge-installer | Yes | No |
| Zorin OS | https://zorin.com | No | Yes |

### Utilities

| Name       | URL                     | Type |
|------------|-------------------------|------|
| 4MLinux | https://4mlinux.com/ | Kernel/Initrd |
| Boot Repair CD | https://sourceforge.net/projects/boot-repair-cd/ | LiveCD |
| Breakin | https://www.advancedclustering.com/products/software/breakin/ | Kernel/Initrd |
| CAINE | https://www.caine-live.net/ | LiveCD |
| Clonezilla | https://www.clonezilla.org/ | LiveCD |
| DBAN | https://www.dban.org/ | Kernel |
| GParted | https://gparted.org | LiveCD |
| Grml | https://grml.org | LiveCD |
| Kaspersky Rescue Disk | https://support.kaspersky.com/krd18 | LiveCD |
| Memtest | https://www.memtest.org/ | Kernel |
| MemTest86 Free | https://www.memtest86.com | USB Img |
| Redo Rescue | http://redorescue.com/ | LiveCD |
| Rescatux | https://www.supergrubdisk.org/rescatux/ | LiveCD |
| Rescuezilla | https://rescuezilla.com/ | LiveCD |
| ShredOS | https://github.com/PartialVolume/shredos.x86_64 | Kernel | 
| Super Grub2 Disk | https://www.supergrubdisk.org | ISO - Memdisk |
| System Rescue | https://system-rescue.org/ | LiveCD |
| Ultimate Boot CD | https://www.ultimatebootcd.com | ISO - Memdisk |
| ZFSBootMenu | https://docs.zfsbootmenu.org/ | Kernel |

### Stargazers over time

[![Stargazers over time](https://starchart.cc/netbootxyz/netboot.xyz.svg)](https://starchart.cc/netbootxyz/netboot.xyz)

### Feedback

Feel 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)!


================================================
FILE: docker-build-root/dumper.sh
================================================
#! /bin/sh

# check for dump dir
if [ -d /buildout ]; then
  # if there are no files in that directory use 777 perms as root
  if [ `find /buildout -prune -empty 2>/dev/null` ]; then
    /bin/mkdir -p /buildout/buildout
    /bin/cp -r /mnt/* /buildout/buildout/
    /bin/chmod 777 -R /buildout/buildout
  # match the ownership of the first file we see
  else
    PERMS=`/usr/bin/find /buildout/* -print -quit |xargs stat -c "%u:%g"`
    /bin/mkdir -p /buildout/buildout
    /bin/cp -r /mnt/* /buildout/buildout/
    /bin/chown $PERMS -R /buildout/buildout
  fi
else
  /bin/echo "/buildout not found exiting"  
  exit 1
fi  


================================================
FILE: endpoints.yml
================================================
endpoints:
  kali-xfce-squash:
    path: /debian-squash/releases/download/2025.4-f03c4b56/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: kali
    version: '2025.4'
    flavor: xfce
    kernel: kali-xfce-squash
  kde-neon-user:
    path: /ubuntu-squash/releases/download/20260312-0746-88395a11/
    files:
    - vmlinuz
    - filesystem.squashfs
    - initrd.lz
    os: neon
    version: 20260312-0746
    flavor: user
    kernel: kde-neon-user
  regolith-current:
    path: /ubuntu-squash/releases/download/1.2-e7db33e3/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: regolith
    version: current
    flavor: ubuntu
    kernel: regolith-current
  breakin:
    path: /asset-mirror/releases/download/4.26.1-f22abf78/
    files:
    - vmlinuz
    - initrd
    os: breakin
    version: 4.26.1
  dban:
    path: /asset-mirror/releases/download/2.3.0-dca9acb4/
    files:
    - DBAN.BZI
    os: dban
    version: 2.3.0
  sparky-stable-mingui:
    path: /debian-squash/releases/download/8.2-d8df60d4/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: stable
    flavor: xfce-min
    kernel: sparky-stable-mingui
  sparky-stable-gui:
    path: /debian-squash/releases/download/8.2-28fbf253/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: stable
    flavor: xfce
    kernel: sparky-stable-gui
  sparky-stable-lxqt:
    path: /debian-squash/releases/download/8.2-16df4761/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: stable
    flavor: lxqt
    kernel: sparky-stable-lxqt
  sparky-rolling-mingui:
    path: /debian-squash/releases/download/2026.03-8a7a4cf8/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: rolling
    flavor: xfce-min
    kernel: sparky-rolling-mingui
  sparky-rolling-gui:
    path: /debian-squash/releases/download/2026.03-314f0a50/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: rolling
    flavor: xfce
    kernel: sparky-rolling-gui
  sparky-rolling-lxqt:
    path: /debian-squash/releases/download/2026.03-1a7f6c6a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: sparky
    version: rolling
    flavor: lxqt
    kernel: sparky-rolling-lxqt
  oracle-8:
    path: /asset-mirror/releases/download/6-c7882e2d/
    files:
    - vmlinuz
    - initrd
    - squashfs.img
    os: oracle
    version: '8'
    arch: x86_64
  kodachi-6:
    path: /ubuntu-squash/releases/download/6.2-2a23039c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: kodachi
    version: '6'
  devuan-ascii:
    path: /debian-squash/releases/download/2.1-c1f637a9/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: devuan
    version: '2'
    flavor: ascii
  gparted-stable:
    path: /debian-squash/releases/download/1.8.0-2-5616e296/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: gparted
    version: stable
  rescatux:
    path: /debian-squash/releases/download/0.72-beta8-55ca0efd/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: rescatux
    version: current
  caine:
    path: /ubuntu-squash/releases/download/13.0-4216585a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: caine
    version: '13.0'
  dts:
    path: /dts/v2.7.1
    files:
    - initrd
    - vmlinuz
    os: dts
    version: 2.7.1
  bootrepair:
    path: /ubuntu-squash/releases/download/current-e035b00c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: bootrepair
    version: current
  blackarch-installer:
    path: /asset-mirror/releases/download/2023.04.01-cfc58a6d/
    files:
    - initrd
    - vmlinuz
    - airootfs.sfs
    os: blackarch
    version: current
  bluestar:
    path: /asset-mirror/releases/download/6.7.8-2024.03.04-d4e083fc/
    files:
    - initrd
    - vmlinuz
    - airootfs.sfs
    os: bluestar
    version: current
  zeninstall:
    path: /asset-mirror/releases/download/2020.05.27-b25da634/
    files:
    - initrd
    - vmlinuz
    - airootfs.sfs
    os: zeninstall
    version: current
  lxle:
    path: /ubuntu-squash/releases/download/18.04.3-83291c4b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: lxle
    version: current
  kaspersky-rescue:
    path: /asset-mirror/releases/download/18-7f6056db/
    files:
    - initrd.xz
    - initrd
    - vmlinuz
    - kernel.dat
    - 000-core.srm
    - 001-xorg.srm
    - 002-xfce.srm
    - 003-kl.srm
    - 004-krt.srm
    - 005-bases.srm
    - 008-firefox.srm
    os: kaspersky
    version: '18'
  septor:
    path: /debian-squash/releases/download/2022-32f07395/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: septor
    version: current
  manjaro-xfce-current:
    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-93c4b57e/
    files:
    - livefs.sfs
    - rootfs.sfs
    - mhwdfs.sfs
    - desktopfs.sfs
    - initrd
    - vmlinuz
    os: manjaro
    version: current
    flavor: xfce
    kernel: manjaro-xfce-current
  manjaro-gnome-current:
    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-917f9a0a/
    files:
    - livefs.sfs
    - rootfs.sfs
    - mhwdfs.sfs
    - desktopfs.sfs
    - initrd
    - vmlinuz
    os: manjaro
    version: current
    flavor: gnome
    kernel: manjaro-gnome-current
  manjaro-kde-current:
    path: /manjaro-squash/releases/download/26.0.3-260228-linux618-df3b24fa/
    files:
    - livefs.sfs
    - rootfs.sfs
    - mhwdfs.sfs
    - desktopfs.sfs
    - initrd
    - vmlinuz
    os: manjaro
    version: current
    flavor: kde
    kernel: manjaro-kde-current
  fatdog:
    path: /asset-mirror/releases/download/903-eefda31d/
    files:
    - vmlinuz
    - initrd
    os: fatdog
    version: current
  raizo:
    path: /debian-squash/releases/download/v17.26.01.25i-5c171de0/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: raizo
    version: current
  4mlinux:
    path: /asset-mirror/releases/download/50.1-fcaac630/
    files:
    - initrd
    - vmlinuz
    os: 4mlinux
    version: current
    flavor: full
  4mlinux-thesss:
    path: /asset-mirror/releases/download/51.0-bb45ecde/
    files:
    - initrd
    - vmlinuz
    os: 4mlinux
    version: current
    flavor: TheSSS
  4mlinux-bakandimg:
    path: /asset-mirror/releases/download/51.0-978b0518/
    files:
    - initrd
    - vmlinuz
    os: 4mlinux
    version: current
    flavor: BakAndImg
  4mlinux-antivirus:
    path: /asset-mirror/releases/download/51.0-1.5.1-6a1b14f1/
    files:
    - initrd
    - vmlinuz
    os: 4mlinux
    version: current
    flavor: AntivirusLiveCD
  ubuntu-20.04-default-squash:
    path: /ubuntu-squash/releases/download/20.04.6-edcc76af/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: GNOME
    kernel: ubuntu-20.04-default-squash
  ubuntu-20.04-KDE-squash:
    path: /ubuntu-squash/releases/download/20.04.6-de797e6a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: KDE
    kernel: ubuntu-20.04-KDE-squash
  ubuntu-20.04-XFCE-squash:
    path: /ubuntu-squash/releases/download/20.04.6-ecac5789/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: XFCE
    kernel: ubuntu-20.04-XFCE-squash
  ubuntu-20.04-Budgie-squash:
    path: /ubuntu-squash/releases/download/20.04.6-4901a824/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: Budgie
    kernel: ubuntu-20.04-Budgie-squash
  ubuntu-20.04-MATE-squash:
    path: /ubuntu-squash/releases/download/20.04.6-b988c78f/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: MATE
    kernel: ubuntu-20.04-MATE-squash
  ubuntu-20.04-kylin-squash:
    path: /ubuntu-squash/releases/download/20.04.6-fe97e81a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: kylin
    kernel: ubuntu-20.04-kylin-squash
  voyager-focal-squash:
    path: /ubuntu-squash/releases/download/focal-594b12a7/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: Voyager
    version: focal
    flavor: focal
    kernel: voyager-focal-squash
  pop-20.04-default-squash:
    path: /ubuntu-squash/releases/download/5-66b7e861/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: pop
    version: '20.04'
    flavor: intel-amd
    kernel: pop-20.04-default-squash
  pop-20.04-nvidia-squash:
    path: /ubuntu-squash/releases/download/5-6efd1d75/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: pop
    version: '20.04'
    flavor: nvidia
    kernel: pop-20.04-nvidia-squash
  nixos-20.03:
    path: /asset-mirror/releases/download/124244129-bd20f138/
    files:
    - bzImage
    - initrd
    - netboot.ipxe
    os: nixos
    version: '20.03'
  kodachi-7:
    path: /ubuntu-squash/releases/download/7.6-5b1ead62/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: kodachi
    version: '7'
  linux-lite-5-squash:
    path: /ubuntu-squash/releases/download/5.8-75cb937c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: lite
    version: 5.8
    kernel: linux-lite-5-squash
  vyos-rolling:
    path: /debian-squash/releases/download/2026.03.19-0028-rolling-bf6bd56c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: vyos
    version: rolling
    flavor: rolling
    kernel: vyos-rolling
  pureos-gnome:
    path: /ubuntu-squash/releases/download/2020-08-06-83257efc/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: pureos
    version: current
    flavor: gnome
    kernel: pureos-gnome
  rescuezilla:
    path: /asset-mirror/releases/download/2.6.1-123ed276/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: rescuezilla
    version: 2.6.1
  nitrux-release:
    path: /ubuntu-squash/releases/download/2022.02.28-e364d0a5/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: nitrux
    version: 2022.02.28
  endeavouros:
    path: /asset-mirror/releases/download/Neo-2026.01.12-a0604436/
    files:
    - airootfs.sfs
    - initrd
    - vmlinuz
    os: endeavouros
    version: Neo-2026.01.12
  kodachi-8:
    path: /ubuntu-squash/releases/download/8.2-625e11fa/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: kodachi
    version: '8'
  redorescue:
    path: /asset-mirror/releases/download/4.0.0-000d2575/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: redorescue
    version: 4.0.0
  elementaryos-6-default-squash:
    path: /ubuntu-squash/releases/download/6-3e90a5ea/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: elementary-os
    version: '6'
    kernel: elementaryos-6-default-squash
  voyager-bullseye-squash:
    path: /debian-squash/releases/download/bullseye-a59d37d9/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: Voyager
    version: bullseye
    flavor: bullseye
    kernel: voyager-bullseye-squash
  memtest86:
    path: /asset-mirror/releases/download/11.6-e4a137e7/
    files:
    - memtest86-usb.img
    os: memtest86-free
    version: '11.6'
  gentoo-x86:
    path: /asset-mirror/releases/download/20241209T170323Z-4e10abc5/
    files:
    - image.squashfs
    - initrd
    - vmlinuz
    os: gentoo
    version: 20241209T170323Z
    arch: x86
  gentoo-arm64:
    path: /asset-mirror/releases/download/20260113T194558Z-3c528165/
    files:
    - image.squashfs
    - initrd
    - vmlinuz
    os: gentoo
    version: 20260113T194558Z
    arch: arm64
  gentoo-amd64:
    path: /asset-mirror/releases/download/20260125T170113Z-9aa997ef/
    files:
    - image.squashfs
    - initrd
    - vmlinuz
    os: gentoo
    version: 20260125T170113Z
    arch: amd64
  tails:
    path: /asset-mirror/releases/download/7.5-17629562/
    files:
    - vmlinuz
    - initrd.img
    - 9990-misc-helpers.sh
    - tails-amd64.iso
    os: tails
    version: '7.5'
    arch: amd64
  hrmpf:
    path: /asset-mirror/releases/download/20231124-1008bb6d/
    files:
    - vmlinuz
    - initrd
    - squashfs.img
    os: hrmpf
    version: '20231124'
  ubuntu-netboot-20.04-arm64:
    path: /ubuntu-squash/releases/download/20.04.5-bb142c3d/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 20.04.5
    codename: focal
    flavor: netboot
    kernel: ubuntu-netboot-20.04-arm64
    arch: arm64
  ubuntu-netboot-20.04-amd64:
    path: /ubuntu-squash/releases/download/20.04.6-b13ed0a8/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 20.04.6
    codename: focal
    flavor: netboot
    kernel: ubuntu-netboot-20.04-amd64
    arch: amd64
  systemrescue-i686:
    path: /asset-mirror/releases/download/9.03-0f19cc5c/
    files:
    - airootfs.sfs
    - initrd
    - vmlinuz
    os: systemrescue
    version: 9.03
    arch: i686
  systemrescue-amd64:
    path: /asset-mirror/releases/download/12.03-d20a63ac/
    files:
    - airootfs.sfs
    - initrd
    - vmlinuz
    - archiso_pxe_http
    os: systemrescue
    version: 12.03
    arch: amd64
  shredos-i686:
    path: /asset-mirror/releases/download/0.34_32-bit_20221231-c4450e3a/
    files:
    - shredos
    os: shredos
    version: 0.34_32-bit_20221231
    arch: i686
  shredos-x86_64:
    path: /asset-mirror/releases/download/2025.11_28_x86-64_0.40-bf7a6bdf/
    files:
    - shredos
    os: shredos
    version: 2025.11_28_x86-64_0.40
    arch: x86_64
  archlinux-32:
    path: /asset-mirror/releases/download/2024.07.10-2797a944/
    files:
    - airootfs.sfs
    - initramfs-linux.img
    - vmlinuz-linux
    os: archlinux
    version: 2024.07.10
    arch: i686
  clonezilla-debian-stable-amd64:
    path: /debian-squash/releases/download/3.3.1-35-1a41a72c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: clonezilla
    version: 3.3.1-35
    flavor: stable
    kernel: clonezilla-debian-stable-amd64
    arch: amd64
  clonezilla-ubuntu-stable-amd64:
    path: /ubuntu-squash/releases/download/20260220-questing-b835723b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: clonezilla
    version: 20260220-questing
    flavor: stable
    kernel: clonezilla-ubuntu-stable-amd64
    arch: amd64
  clonezilla-debian-testing-amd64:
    path: /debian-squash/releases/download/3.3.2-8-8db01622/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: clonezilla
    version: 3.3.2-8
    flavor: testing
    kernel: clonezilla-debian-testing-amd64
    arch: amd64
  clonezilla-ubuntu-testing-amd64:
    path: /ubuntu-squash/releases/download/20260318-resolute-bea81d96/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: clonezilla
    version: 20260318-resolute
    flavor: testing
    kernel: clonezilla-ubuntu-testing-amd64
    arch: amd64
  garuda-dr460nized-gaming:
    path: /asset-mirror/releases/download/250801-a96201bb/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: dr460nized-gaming
    version: 250801
  garuda-dr460nized:
    path: /asset-mirror/releases/download/250801-f610be58/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: dr460nized
    version: 250801
  garuda-xfce:
    path: /asset-mirror/releases/download/250801-c866e6bf/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: xfce
    version: 250801
  garuda-gnome:
    path: /asset-mirror/releases/download/250801-c80a21be/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: gnome
    version: 250801
  garuda-lxqt-kwin:
    path: /asset-mirror/releases/download/230501-f13b4b24/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: lxqt-kwin
    version: 230501
  garuda-wayfire:
    path: /asset-mirror/releases/download/230501-61b681d1/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: wayfire
    version: 230501
  garuda-qtile:
    path: /asset-mirror/releases/download/231029-9dfb930b/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: qtile
    version: 231029
  garuda-i3wm:
    path: /asset-mirror/releases/download/250801-d48b8f05/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: i3wm
    version: 250801
  garuda-sway:
    path: /asset-mirror/releases/download/250801-8d451890/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: sway
    version: 250801
  garuda-mate:
    path: /asset-mirror/releases/download/230501-3af08aa6/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: mate
    version: 230501
  garuda-kde-barebones:
    path: /asset-mirror/releases/download/220329-198784ed/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: kde-barebones
    version: 220329
  proxmox-backup-server:
    path: /asset-mirror/releases/download/4.1-1-6f50261b/
    files:
    - initrd
    - vmlinuz
    - proxmox.iso
    os: proxmox-backup-server
    version: 4.1-1
  proxmox-ve:
    path: /asset-mirror/releases/download/9.1-1-1d6923a5/
    files:
    - initrd
    - proxmox.iso
    - vmlinuz
    os: proxmox-ve
    version: 9.1-1
  proxmox-mailgateway:
    path: /asset-mirror/releases/download/9.0-1-ded4eba1/
    files:
    - initrd
    - vmlinuz
    - proxmox.iso
    os: proxmox-mailgateway
    version: 9.0-1
  ubuntu-netboot-22.04-amd64:
    path: /ubuntu-squash/releases/download/22.04.5-be230164/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 22.04.5
    codename: jammy
    flavor: netboot
    kernel: ubuntu-netboot-22.04-amd64
    arch: amd64
  ubuntu-netboot-22.04-arm64:
    path: /ubuntu-squash/releases/download/22.04.5-9d9df014/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 22.04.5
    codename: jammy
    flavor: netboot
    kernel: ubuntu-netboot-22.04-arm64
    arch: arm64
  ubuntu-22.04-default-squash:
    path: /ubuntu-squash/releases/download/22.04.5-9d09e9e2/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: GNOME
    kernel: ubuntu-22.04-default-squash
  ubuntu-22.04-XFCE-squash:
    path: /ubuntu-squash/releases/download/22.04.5-f1d182b7/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: XFCE
    kernel: ubuntu-22.04-XFCE-squash
  ubuntu-22.04-MATE-squash:
    path: /ubuntu-squash/releases/download/22.04.5-96688be7/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: MATE
    kernel: ubuntu-22.04-MATE-squash
  ubuntu-22.04-Budgie-squash:
    path: /ubuntu-squash/releases/download/22.04.5-a893fa5a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: Budgie
    kernel: ubuntu-22.04-Budgie-squash
  ubuntu-22.04-KDE-squash:
    path: /ubuntu-squash/releases/download/22.04.5-45d5c769/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: KDE
    kernel: ubuntu-22.04-KDE-squash
  ubuntu-22.04-kylin-squash:
    path: /ubuntu-squash/releases/download/22.04.5-943f61f5/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: kylin
    kernel: ubuntu-22.04-kylin-squash
  voyager-jammy-squash:
    path: /ubuntu-squash/releases/download/jammy-e9ee9abe/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: Voyager
    version: jammy
    flavor: jammy
    kernel: voyager-jammy-squash
  pop-22.04-default-squash:
    path: /ubuntu-squash/releases/download/21-31dbd35b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: pop
    version: '22.04'
    flavor: intel-amd
    kernel: pop-22.04-default-squash
  vmware-photon-x86_64:
    path: /asset-mirror/releases/download/4.0-febcf67e/
    files:
    - initrd.img
    - vmlinuz
    os: vmware-photon
    version: '4.0'
    arch: x86_64
  vmware-photon-aarch64:
    path: /asset-mirror/releases/download/4.0-ed208546/
    files:
    - initrd.img
    - vmlinuz
    os: vmware-photon
    version: '4.0'
    arch: aarch64
  harvester:
    path: /asset-mirror/releases/download/v1.7.1-fcf0fd7f/
    files:
    - harvester-vmlinuz-amd64
    - harvester-initrd-amd64
    - harvester-rootfs-amd64.squashfs
    - harvester-amd64.sha512
    - version.yaml
    os: harvester
    version: v1.7.1
  linux-lite-6-squash:
    path: /ubuntu-squash/releases/download/6.4-2550834c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: lite
    version: 6.4
    kernel: linux-lite-6-squash
  mint-21-cinnamon-squash:
    path: /ubuntu-squash/releases/download/21-32bd7a0e/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '21'
    flavor: Cinnamon
    kernel: mint-21-cinnamon-squash
  mint-21-mate-squash:
    path: /ubuntu-squash/releases/download/21-f0dbd590/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '21'
    flavor: mate
    kernel: mint-21-mate-squash
  mint-21-xfce-squash:
    path: /ubuntu-squash/releases/download/21-48716442/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '21'
    flavor: xfce
    kernel: mint-21-xfce-squash
  oracle-9-x86_64:
    path: /asset-mirror/releases/download/U1-23c7d963/
    files:
    - vmlinuz
    - initrd
    - squashfs.img
    os: oracle
    version: '9'
    arch: x86_64
  oracle-9-aarch64:
    path: /asset-mirror/releases/download/U1-f576e989/
    files:
    - vmlinuz
    - initrd
    - squashfs.img
    os: oracle
    version: '9'
    arch: aarch64
  parrot-home:
    path: /debian-squash/releases/download/6.3.2-27d6d20b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: parrot
    version: 6.3.2
    flavor: home
  parrot-security:
    path: /debian-squash/releases/download/6.3.2-b763048a/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: parrot
    version: 6.3.2
    flavor: security
  xcp-ng:
    path: /asset-mirror/releases/download/8.3-55521b28/
    files:
    - xen.gz
    - vmlinuz
    - install.img
    os: xcp-ng
    version: '8.2'
  garuda-cinnamon:
    path: /asset-mirror/releases/download/250801-0b360492/
    files:
    - amd_ucode.img
    - desktopfs.sfs
    - intel_ucode.img
    - livefs.sfs
    - initramfs.img
    - mhwdfs.sfs
    - rootfs.sfs
    - vmlinuz
    os: garuda
    flavor: cinnamon
    version: 250801
  elementaryos-7-default-squash:
    path: /ubuntu-squash/releases/download/7-82f69428/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: elementary-os
    version: '7'
    kernel: elementaryos-7-default-squash
  ubuntu-20.04-LXQT-squash:
    path: /ubuntu-squash/releases/download/20.04.5-07228691/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '20.04'
    flavor: LXQT
    kernel: ubuntu-20.04-LXQT-squash
  ubuntu-22.04-LXQT-squash:
    path: /ubuntu-squash/releases/download/22.04.5-81dbf90b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: ubuntu
    version: '22.04'
    flavor: LXQT
    kernel: ubuntu-22.04-LXQT-squash
  backbox-default-squash:
    path: /ubuntu-squash/releases/download/8.1-c2287989/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: BackBox
    version: '8.1'
    flavor: desktop
    kernel: backbox-default-squash
  bodhi-standard:
    path: /ubuntu-squash/releases/download/7.0.0-f22738f2/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: bodhi
    version: 7.0.0
    flavor: standard
  bodhi-apppack:
    path: /ubuntu-squash/releases/download/7.0.0-b588d8e1/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: bodhi
    version: 7.0.0
    flavor: apppack
  mfsbsd-14:
    path: /asset-mirror/releases/download/14.2-f360f980/
    files:
    - default.img
    - special-edition.img
    os: freebsd
    version: '14'
  zorin-core-squash:
    path: /ubuntu-squash/releases/download/17.3-a87e018b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: zorin
    version: '17.3'
    flavor: Core
    kernel: zorin-core-squash
  q4os-plasma-squash:
    path: /debian-squash/releases/download/6.6-65fa9dd9/
    files:
    - filesystem.squashfs
    os: Q4OS
    version: '6.6'
    flavor: plasma
    kernel: q4os-default-squash
  q4os-default-squash:
    path: /debian-squash/releases/download/6.6-5d30850e/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: Q4OS
    version: '6.6'
    flavor: trinity
    kernel: q4os-default-squash
  memtest86plus:
    path: /asset-mirror/releases/download/8.00-32a14678/
    files:
    - memtest32.bin
    - memtest32.efi
    - memtest64.bin
    - memtest64.efi
    - mt86p_i586
    - mt86p_la64
    - mt86p_x86_64
    os: memtest86-plus
    version: '8.00'
  ubuntu-netboot-24.04-arm64:
    path: /ubuntu-squash/releases/download/24.04.4-b13d6c2e/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 24.04.4
    codename: noble
    flavor: netboot
    kernel: ubuntu-netboot-24.04-arm64
    arch: arm64
  ubuntu-netboot-24.04-amd64:
    path: /ubuntu-squash/releases/download/24.04.4-717d3a1a/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 24.04.4
    codename: noble
    flavor: netboot
    kernel: ubuntu-netboot-24.04-amd64
    arch: amd64
  fedora-40-gnome:
    path: /fedora-assets/releases/download/1.14-aefc8f89/
    files:
    - vmlinuz
    - initrd
    - squashfs.img
    os: fedora
    version: 40
    flavor: GNOME
  ubuntu-24.04-default-squash:
    path: /ubuntu-squash/releases/download/24.04.4-315cc059/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    - minimal.standard.live.squashfs
    - minimal.standard.squashfs
    - minimal.squashfs
    os: ubuntu
    version: '24.04'
    flavor: GNOME
    kernel: ubuntu-24.04-default-squash
  vanilla-os:
    path: /asset-mirror/releases/download/20240728-32e3ebb7/
    files:
    - initrd
    - filesystem.squashfs
    - vmlinuz
    os: vanilla-os
    version: 2-20240728
  zfsbootmenu:
    path: /asset-mirror/releases/download/3.1.0-1620b6a3/
    files:
    - zfsbootmenu-recovery-x86_64.efi
    os: zfsbootmenu
    version: 3.1.0
  supergrubdisk:
    path: /asset-mirror/releases/download/2.06s4-30515aca/
    files:
    - supergrub2-classic-x86_64.efi
    os: supergrubdisk
    version: 2.06s4
  mint-22-xfce-squash:
    path: /ubuntu-squash/releases/download/22-e45bc094/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '22'
    flavor: xfce
    kernel: mint-22-xfce-squash
  mint-22-cinnamon-squash:
    path: /ubuntu-squash/releases/download/22-14b93ac4/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '22'
    flavor: Cinnamon
    kernel: mint-22-cinnamon-squash
  mint-22-mate-squash:
    path: /ubuntu-squash/releases/download/22-482b71dc/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '22'
    flavor: mate
    kernel: mint-22-mate-squash
  ubuntu-netboot-24.10-amd64:
    path: /ubuntu-squash/releases/download/24.10-01d20dde/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '24.10'
    codename: oracular
    flavor: netboot
    kernel: ubuntu-netboot-24.10-amd64
    arch: amd64
  ubuntu-netboot-24.10-arm64:
    path: /ubuntu-squash/releases/download/24.10-f22a7742/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '24.10'
    codename: oracular
    flavor: netboot
    kernel: ubuntu-netboot-24.10-arm64
    arch: arm64
  grml-small-amd64:
    path: /debian-squash/releases/download/2025.12-ca5dc013/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: grml
    version: '2025.12'
    flavor: small
    arch: amd64
  grml-full-amd64:
    path: /debian-squash/releases/download/2025.12-ee78df85/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: grml
    version: '2025.12'
    flavor: full
    arch: amd64
  grml-full-arm64:
    path: /debian-squash/releases/download/2025.12-f76c469c/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: grml
    version: '2025.12'
    flavor: full
    arch: arm64
  grml-small-arm64:
    path: /debian-squash/releases/download/2025.12-d7d97ac4/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: grml
    version: '2025.12'
    flavor: small
    arch: arm64
  uefishell:
    path: /asset-mirror/releases/download/edk2-stable202002-a6917535/
    files:
    - uefi-shell-x64.efi
    - uefi-shell-aarch64.efi
    - uefi-shell-arm.efi
    os: uefi-shell
    version: edk2-stable202002
  uefi-shell-x64:
    path: /asset-mirror/releases/download/edk2-stable202002-a9ce7096/
    files:
    - uefi-shell-x64.efi
    os: uefi-shell-x64
    version: edk2-stable202002
  ubuntu-netboot-25.04-amd64:
    path: /ubuntu-squash/releases/download/25.04-fa10ffe9/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '25.04'
    codename: plucky
    flavor: netboot
    kernel: ubuntu-netboot-25.04-amd64
    arch: amd64
  ubuntu-netboot-25.04-arm64:
    path: /ubuntu-squash/releases/download/25.04-63097bc7/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '25.04'
    codename: plucky
    flavor: netboot
    kernel: ubuntu-netboot-25.04-arm64
    arch: arm64
  mint-20-xfce-squash:
    path: /ubuntu-squash/releases/download/20.3-af4b8d97/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '20.3'
    flavor: xfce
    kernel: mint-20-xfce-squash
  mint-20-cinnamon-squash:
    path: /ubuntu-squash/releases/download/20.3-33df4cad/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '20.3'
    flavor: Cinnamon
    kernel: mint-20-cinnamon-squash
  mint-20-mate-squash:
    path: /ubuntu-squash/releases/download/20.3-7b17290c/
    files:
    - initrd
    - vmlinuz
    - filesystem.squashfs
    os: mint
    version: '20.3'
    flavor: mate
    kernel: mint-20-mate-squash
  mint-lmde-cinnamon-squash:
    path: /debian-squash/releases/download/6-1834227b/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: mint
    version: '6'
    flavor: Cinnamon
    kernel: mint-lmde-cinnamon-squash
  ubuntu-spins:
    path: /asset-mirror/releases/download/0.0.3-d0cf8373/
    files:
    - vmlinuz
    - initrd
    os: ubuntu-spins
    version: 0.0.3
  cachyos:
    path: /asset-mirror/releases/download/260308-b5de98b7/
    files:
    - airootfs.sfs
    - initrd
    - vmlinuz
    - archiso_pxe_http
    os: cachyos
    version: '260308'
  deepin-20-squash:
    path: /debian-squash/releases/download/20.9-a4ce5fe4/
    files:
    - filesystem.squashfs
    - initrd
    - vmlinuz
    os: Deepin
    version: '20.9'
    kernel: deepin-20-squash
  debian-13-live-kernel:
    path: /debian-core-13/releases/download/13.3.0-0a426450/
    files:
    - initrd
    - vmlinuz
    os: debian
    version: '13'
  debian-13-default-squash:
    path: /debian-squash/releases/download/13.4.0-9d9b777e/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: core
    kernel: debian-13-live-kernel
  debian-13-lxde-squash:
    path: /debian-squash/releases/download/13.4.0-98209c44/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: lxde
    kernel: debian-13-live-kernel
  debian-13-kde-squash:
    path: /debian-squash/releases/download/13.4.0-c5f83616/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: kde
    kernel: debian-13-live-kernel
  debian-13-gnome-squash:
    path: /debian-squash/releases/download/13.4.0-0aea8fe2/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: gnome
    kernel: debian-13-live-kernel
  debian-13-lxqt-squash:
    path: /debian-squash/releases/download/13.4.0-6936b7a0/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: lxqt
    kernel: debian-13-live-kernel
  debian-13-mate-squash:
    path: /debian-squash/releases/download/13.4.0-f3c0e3ad/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: mate
    kernel: debian-13-live-kernel
  ubuntu-netboot-25.10-amd64:
    path: /ubuntu-squash/releases/download/25.10-64f54a86/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '25.10'
    codename: questing
    flavor: netboot
    kernel: ubuntu-netboot-25.10-amd64
    arch: amd64
  ubuntu-netboot-25.10-arm64:
    path: /ubuntu-squash/releases/download/25.10-9fc235de/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: '25.10'
    codename: questing
    flavor: netboot
    kernel: ubuntu-netboot-25.10-arm64
    arch: arm64
  debian-13-cinnamon-squash:
    path: /debian-squash/releases/download/13.4.0-bcf1dab7/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: cinnamon
    kernel: debian-13-live-kernel
  debian-13-xfce-squash:
    path: /debian-squash/releases/download/13.4.0-5048a26b/
    files:
    - filesystem.squashfs
    os: debian
    version: 13.4.0
    flavor: xfce
    kernel: debian-13-live-kernel
  proxmox-datacenter-manager:
    path: /asset-mirror/releases/download/1.0-2-6fa12487/
    files:
    - initrd
    - proxmox.iso
    - vmlinuz
    os: proxmox-datacenter-manager
    version: 1.0-2
  ubuntu-netboot-hwe-24.04-amd64:
    path: /ubuntu-squash/releases/download/24.04.4-5d65e4e9/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 24.04.4
    codename: noble
    flavor: netboot-hwe
    kernel: ubuntu-netboot-hwe-24.04-amd64
    arch: amd64
  ubuntu-netboot-hwe-24.04-arm64:
    path: /ubuntu-squash/releases/download/24.04.4-940f2f1c/
    files:
    - initrd
    - vmlinuz
    os: ubuntu
    version: 24.04.4
    codename: noble
    flavor: netboot-hwe
    kernel: ubuntu-netboot-hwe-24.04-arm64
    arch: arm64


================================================
FILE: etc/netbootxyz/custom/README.md
================================================
# Custom Menus for Self Hosted netboot.xyz

This directory contains custom iPXE files that are rendered
during menu generation and available from the main menu via
the custom menu option.

When these options are set:

```
custom_generate_menus: true
custom_templates_dir: "{{ netbootxyz_conf_dir }}/custom"
```

the menu will add an option for custom menus and attempt to load into
custom/custom.ipxe.  From there custom options can be built and
maintained seperately from the netboot.xyz source tree so that both
menus can be updated independently.

A sample menu is provided to demonstrate how to configure and set up
a menu.  You can copy the custom directory from the repo:

```
cp -r etc/netbootxyz/custom /etc/netbootxyz/custom
```

If you are building via Docker, you can create a `custom` folder in
the root source directory and then set the variable like so:

```
custom_generate_menus: true
custom_templates_dir: "/ansible/custom"
```


================================================
FILE: etc/netbootxyz/custom/custom.ipxe.j2
================================================
#!ipxe
###
### {{ site_name }} custom menu example
###

:custom
clear custom_choice
menu This is a Test Menu
item --gap This is the first sub menu
item option_one ${space} Loading a kernel and initrd
item option_two ${space} Loading an ISO
item --gap This is a second sub menu
item option_three ${space} Loads another custom sub menu
item option_four ${space} This is option four
choose custom_choice || goto custom_exit
echo ${cls}
goto ${custom_choice}
goto custom_exit

:option_one
kernel http://path.to/vmlinuz
initrd http://path.to/initrd
imgargs vmlinuz put_kernel_img_args_here
boot || goto custom_exit

:option_two
kernel {{ memdisk_location }} raw iso
initrd http://path.to/iso
boot || goto custom_exit

:option_three
echo Chains into another menu...
chain custom1.ipxe || goto custom

:custom_exit
exit


================================================
FILE: renovate.json
================================================
{
  "extends": [
    "config:recommended"
  ],
  "regexManagers": [
    {
      "fileMatch": ["^\\.github\\/workflows\\/.*\\.ya?ml$"],
      "matchStrings": [
        "pip(?:3)?\\s+install(?:\\s+(?:-U|--upgrade))?\\s+(?<depName>[A-Za-z0-9_.+-]+(?:\\[[^\\]]+\\])?)==(?<currentValue>\\d+(?:\\.\\d+)*)"
      ],
      "datasourceTemplate": "pypi"
    }
  ]
}


================================================
FILE: roles/netbootxyz/README.md
================================================
Ansible role: netbootxyz
========================

Uses Ansible to generate a self hosted environment of netboot.xyz for use anywhere

Requirements
------------

Any 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.

Role Variables
--------------

A 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.

Dependencies
------------

A 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.

Example Playbook
----------------

Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:

    - hosts: servers
      roles:
         - { role: username.rolename, x: 42 }

License
-------

Apache

Author Information
------------------

Website: https://netboot.xyz
Author: Antony Messerli

================================================
FILE: roles/netbootxyz/defaults/main.yml
================================================
boot_domain: boot.netboot.xyz
boot_timeout: 300000
boot_version: 3.x
bootloader_disks:
- netboot.xyz
bootloader_http_enabled: true
bootloader_https_enabled: true
bootloaders:
  arm:
  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box
    ipxe_bin: ipxe.iso
    output_bin: -arm64.iso
    type: ISO
  - desc: Used for creation of USB Keys
    ipxe_bin: ipxe.img
    output_bin: -arm64.img
    type: IMG
  - desc: DHCP EFI boot image file, uses built-in iPXE NIC drivers
    ipxe_bin: ipxe.efi
    output_bin: -arm64.efi
    type: DHCP
  - desc: EFI w/ Simple Network Protocol, attempts to boot all net devices
    ipxe_bin: snp.efi
    output_bin: -arm64-snp.efi
    type: DHCP-snp
  - desc: EFI w/ Simple Network Protocol, only boots from device chained from
    ipxe_bin: snponly.efi
    output_bin: -arm64-snponly.efi
    type: DHCP-snponly
  hybrid:
  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box
    ipxe_bin: ipxe.iso
    output_bin: .iso
    type: ISO
  - desc: Used for creation of USB Keys
    ipxe_bin: ipxe.img
    output_bin: .img
    type: IMG
  legacy:
  - desc: Used for booting from GRUB/EXTLINUX
    ipxe_bin: ipxe.lkrn
    output_bin: .lkrn
    type: Kernel
  - desc: Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc
    ipxe_bin: ipxe.dsk
    output_bin: .dsk
    type: Floppy
  - desc: Padded Virtual floppy disk for DRAC/iLO, VMware, Virtual Box, etc
    ipxe_bin: ipxe.pdsk
    output_bin: .pdsk
    type: Floppy
  - desc: DHCP boot image file, uses built-in iPXE NIC drivers
    ipxe_bin: ipxe.kpxe
    output_bin: .kpxe
    type: DHCP
  - desc: DHCP boot image file, use if you have NIC issues
    ipxe_bin: undionly.kpxe
    output_bin: -undionly.kpxe
    type: DHCP-undionly
  multiarch:
  - desc: Used for CD/DVD, Virtual CDs, DRAC/iLO, VMware, Virtual Box
    ipxe_bin: ipxe.iso
    output_bin: -multiarch.iso
    type: ISO
  - desc: Used for creation of USB Keys
    ipxe_bin: ipxe.img
    output_bin: -multiarch.img
    type: IMG
  rpi:
  - desc: Raspberry Pi 4 - USB/SD Card Image
    ipxe_bin: rpi4-sdcard.img
    output_bin: -rpi4-sdcard.img
    type: USB/SD Card
  - desc: Raspberry Pi 4 - EFI Image
    ipxe_bin: snp.efi
    output_bin: -rpi4-snp.efi
    type: DHCP-snp
  secureboot_arm64:
  - desc: Secure Boot ARM64 ISO for CD/DVD/Virtual Media
    output_bin: -sb-arm64.iso
    type: ISO
  - desc: Secure Boot ARM64 USB image
    output_bin: -sb-arm64.img
    type: IMG
  secureboot_x86_64:
  - desc: Secure Boot x86_64 ISO for CD/DVD/Virtual Media
    output_bin: -sb.iso
    type: ISO
  - desc: Secure Boot x86_64 USB image
    output_bin: -sb.img
    type: IMG
  uefi:
  - desc: DHCP EFI boot image file, uses built-in iPXE NIC drivers
    ipxe_bin: ipxe.efi
    output_bin: .efi
    type: DHCP
  - desc: EFI w/ Simple Network Protocol, attempts to boot all net devices
    ipxe_bin: snp.efi
    output_bin: -snp.efi
    type: DHCP-snp
  - desc: EFI w/ Simple Network Protocol, only boots from device chained from
    ipxe_bin: snponly.efi
    output_bin: -snponly.efi
    type: DHCP-snponly
  - desc: DHCP EFI Floppy boot image file, uses built-in iPXE NIC drivers
    ipxe_bin: ipxe.efi.dsk
    output_bin: .efi.dsk
    type: Floppy
  - desc: EFI Floppy image w/ Simple Network Protocol, attempts to boot all net devices
    ipxe_bin: snp.efi.dsk
    output_bin: -snp.efi.dsk
    type: Floppy-snp
cert_dir: /etc/netbootxyz/certs
cert_file_filename: ca-netboot-xyz.crt
checksums_filename: '{{ site_name }}-sha256-checksums.txt'
codesign_cert_filename: codesign.crt
codesign_key_filename: codesign.key
custom_generate_menus: false
custom_github_menus: true
custom_templates_dir: '{{ netbootxyz_conf_dir }}/custom'
custom_url_menus: true
early_menu_contents: '### put early ipxe settings here'
early_menu_enabled: false
generate_checksums: true
generate_disks: true
generate_disks_arm: false
generate_disks_efi: true
generate_disks_hybrid: false
generate_disks_legacy: true
generate_disks_linux: false
generate_disks_rpi: false
generate_disks_secureboot: false
generate_local_vars: true
generate_menus: true
generate_signatures: false
generate_version_file: true
ipxe_branch: master
ipxe_ca_filename: ca-ipxe-org.crt
ipxe_ca_url: http://ca.ipxe.org/ca.crt
ipxe_debug_enabled: false
ipxe_debug_options: httpcore,tls
ipxe_repo: https://github.com/ipxe/ipxe
ipxe_secureboot_archive_url: https://github.com/ipxe/ipxe/releases/download/{{ ipxe_secureboot_version
  }}/ipxeboot.tar.gz
ipxe_secureboot_version: v2.0.0
ipxe_source_dir: /usr/src/ipxe
kernel_params: initrd=initrd.magic ${cmdline}
live_endpoint: https://github.com/netbootxyz
make_num_jobs: 1
memdisk_location: http://${boot_domain}/memdisk
netbootxyz_conf_dir: /etc/netbootxyz
netbootxyz_root: /var/www/html
pciids_url: https://raw.githubusercontent.com/netbootxyz/pciids/master/pciids.ipxe
pipxe_branch: master
pipxe_repo: https://github.com/netbootxyz/pipxe
pipxe_source_dir: /usr/src/pipxe
releases:
  almalinux:
    base_dir: almalinux
    enabled: true
    menu: linux
    mirror: http://repo.almalinux.org
    name: AlmaLinux
    versions:
    - code_name: 10
      name: 10 (Latest)
    - code_name: 9
      name: 9 (Latest)
    - code_name: 8
      name: 8 (Latest)
  alpinelinux:
    base_dir: alpine
    enabled: true
    menu: linux
    mirror: http://dl-cdn.alpinelinux.org
    name: Alpine Linux
    versions:
    - code_name: v3.23
      name: '3.23'
    - code_name: edge
      name: Edge (development)
  archlinux:
    base_dir: archlinux
    enabled: true
    menu: linux
    mirror: mirrors.kernel.org
    name: Arch Linux
    versions:
    - code_name: 2026.03.01
      name: 2026.03.01
  blackarch:
    enabled: true
    menu: linux
    name: BlackArch
    versions:
    - code_name: current
      name: current
  centos:
    base_dir: null
    enabled: true
    menu: linux
    mirror: https://mirror.stream.centos.org
    name: CentOS Stream
    versions:
    - code_name: 10-stream
      name: 10.0 Stream
    - code_name: 9-stream
      name: 9.0 Stream
  coreos:
    base_dir: prod/streams
    enabled: true
    menu: linux
    mirror: https://builds.coreos.fedoraproject.org
    name: Fedora CoreOS
    versions:
    - code_name: 43.20260301.3.1
      name: stable
    - code_name: 43.20260316.2.1
      name: testing
    - code_name: 44.20260316.1.1
      name: next
  debian:
    archive_mirror: http://archive.debian.org
    base_dir: debian
    enabled: true
    menu: linux
    mirror: http://deb.debian.org
    name: Debian
    versions:
      stable:
      - code_name: trixie
        name: 13.0 (trixie)
      - code_name: bookworm
        name: 12.0 (bookworm)
      testing:
      - code_name: forky
        name: forky (testing)
      - code_name: sid
        name: sid (unstable)
  devuan:
    base_dir: devuan
    enabled: true
    menu: linux
    mirror: http://deb.devuan.org
    name: Devuan
    versions:
      stable:
      - code_name: daedalus
        name: 5.0 Daedalus (stable)
      - code_name: chimaera
        name: 4.0 Chimaera (oldstable)
      - code_name: beowulf
        name: 3.1 Beowulf (oldoldstable)
      testing:
      - code_name: excalibur
        name: Excalibur (testing)
  fedora:
    base_dir: fedora
    enabled: true
    menu: linux
    mirror: http://mirrors.kernel.org
    name: Fedora
    versions:
    - code_name: 43
      name: 43
    - code_name: 42
      name: 42
  flatcar:
    enabled: true
    menu: linux
    mirror: ''
    name: Flatcar Container Linux
    versions:
    - code_name: stable
      name: Stable Channel
    - code_name: beta
      name: Beta Channel
    - code_name: alpha
      name: Alpha Channel
    - code_name: edge
      name: Edge Channel
  freebsd:
    enabled: true
    menu: bsd
    name: FreeBSD
  freedos:
    base_dir: pub/micro/pc-stuff/freedos/files/distributions/1.4
    enabled: true
    menu: dos
    mirror: http://www.ibiblio.org
    name: FreeDOS
    versions:
    - code_name: FD14-FullUSB
      name: 1.4 Full Installer
    - code_name: FD14-LiteUSB
      name: 1.4 Lite Installer
  gentoo:
    enabled: true
    menu: linux
    name: Gentoo
  harvester:
    enabled: true
    menu: linux
    name: Harvester
  ipfire:
    base_dir: releases/ipfire-2.x
    enabled: true
    menu: linux
    mirror: https://downloads.ipfire.org
    name: IPFire
    versions:
    - code_name: 2.29-core200
      name: 2.29 Core200
  k3os:
    enabled: true
    menu: linux
    mirror: https://github.com/rancher/k3os/releases
    name: k3OS
  kairos:
    enabled: true
    flavors:
    - key: core
      name: Core
    - key: k3sv1.30.11-k3s1
      name: k3s v1.30.11-k3s1 (Standard)
    - key: k3sv1.31.7-k3s1
      name: k3s v1.31.7-k3s1 (Standard)
    - key: k3sv1.32.3-k3s1
      name: k3s v1.32.3-k3s1 (Standard)
    menu: linux
    mirror: https://github.com/kairos-io/kairos/releases
    name: Kairos
    platforms:
    - key: alpine-3.21
      name: Alpine Linux 3.21
    - key: debian-12
      name: Debian 12
    - key: fedora-40
      name: Fedora 40
    - key: opensuse-leap-15.6
      name: openSUSE Leap 15.6
    - key: opensuse-tumbleweed
      name: openSUSE Tumbleweed
    - key: rockylinux-9
      name: Rocky Linux 9
    - key: ubuntu-22.04
      name: Ubuntu 22.04
    - key: ubuntu-24.04
      name: Ubuntu 24.04
    - key: ubuntu-24.10
      name: Ubuntu 24.10
    version: v3.5.3
  kali:
    base_dir: kali
    enabled: true
    menu: linux
    mirror: http://http.kali.org
    name: Kali Linux
    versions:
    - code_name: rolling
      name: Rolling Edition
  mageia:
    base_dir: mageia
    enabled: true
    menu: linux
    mirror: http://mirrors.kernel.org
    name: Mageia
    versions:
    - code_name: '8'
      name: '8'
    - code_name: cauldron
      name: cauldron
  nixos:
    base_dir: nixos
    enabled: true
    menu: linux
    name: NixOS
    versions:
    - code_name: nixos-25.11
      name: nixos-25.11
    - code_name: nixos-25.05
      name: nixos-25.05
    - code_name: nixos-24.11
      name: nixos-24.11
    - code_name: nixos-24.05
      name: nixos-24.05
    - code_name: nixos-23.11
      name: nixos-23.11
    - code_name: nixos-23.05
      name: nixos-23.05
    - code_name: nixos-22.11
      name: nixos-22.11
    - code_name: nixos-22.05
      name: nixos-22.05
    - code_name: nixos-21.11
      name: nixos-21.11
    - code_name: nixos-21.05
      name: nixos-21.05
    - code_name: nixos-20.09
      name: nixos-20.09
  openEuler:
    base_dir: null
    enabled: true
    menu: linux
    mirror: http://repo.openeuler.org
    name: openEuler
    versions:
    - code_name: openEuler-24.09
      name: openEuler-24.09
    - code_name: openEuler-24.03-LTS-SP1
      name: openEuler-24.03-LTS-SP1
    - code_name: openEuler-20.03-LTS-SP3
      name: openEuler-20.03-LTS-SP3
    - code_name: openEuler-22.03-LTS
      name: openEuler-22.03-LTS
    - code_name: openEuler-22.03-LTS-SP1
      name: openEuler-22.03-LTS-SP1
    - code_name: openEuler-22.03-LTS-SP2
      name: openEuler-22.03-LTS-SP2
  openbsd:
    base_dir: pub/OpenBSD
    enabled: true
    menu: bsd
    mirror: http://cdn.openbsd.org
    name: OpenBSD
    versions:
    - code_name: snapshots
      image_ver: '78'
      name: 7.8 Latest Snapshot
    - code_name: '7.8'
      image_ver: '78'
      name: '7.8'
    - code_name: '7.7'
      image_ver: '77'
      name: '7.7'
  opensuse:
    base_dir: distribution/leap
    enabled: true
    menu: linux
    mirror: http://download.opensuse.org
    name: openSUSE
    versions:
    - code_name: '16.0'
      name: openSUSE Leap 16.0
    - code_name: '15.6'
      name: openSUSE Leap 15.6
    - code_name: tumbleweed
      name: openSUSE tumbleweed
  oracle:
    enabled: true
    menu: linux
    mirror: https://yum.oracle.com
    name: Oracle Linux
    paths:
      8: /repo/OracleLinux/OL8/baseos/latest
      9: /repo/OracleLinux/OL9/baseos/latest
  photon:
    enabled: true
    menu: linux
    name: VMware Photon
  proxmox:
    enabled: true
    menu: linux
    name: Proxmox
  rhel:
    enabled: true
    menu: linux
    name: Red Hat Enterprise Linux
  rockylinux:
    base_dir: pub/rocky
    enabled: true
    menu: linux
    mirror: http://download.rockylinux.org
    name: Rocky Linux
    versions:
    - code_name: 10
      name: 10 (Latest)
    - code_name: 9
      name: 9 (Latest)
    - code_name: 8
      name: 8 (Latest)
  slackware:
    base_dir: slackware
    enabled: true
    menu: linux
    mirror: http://mirrors.kernel.org
    name: Slackware
    versions:
    - code_name: current
      name: Current
    - code_name: '14.2'
      name: '14.2'
    - code_name: '14.1'
      name: '14.1'
    - code_name: '15.0'
      name: '15.0'
  smartos:
    base_dir: /platform/i86pc/
    enabled: true
    menu: unix
    mirror: https://netboot.smartos.org/os/
    name: SmartOS
    versions:
    - code_name: 20260319T000507Z
      name: 20260319T000507Z
    - code_name: 20260306T044811Z
      name: 20260306T044811Z
    - code_name: 20260305T000543Z
      name: 20260305T000543Z
    - code_name: 20260219T015737Z
      name: 20260219T015737Z
  talos:
    enabled: true
    menu: linux
    mirror: https://github.com/siderolabs/talos/releases
    name: Talos
    platforms:
    - key: metal
      name: Bare Metal
    - key: aws
      name: AWS
    - key: azure
      name: Azure
    - key: digitalocean
      name: Digital Ocean
    - key: equinixMetal
      name: Equinix Metal
    - key: gcp
      name: GCP
    - key: hcloud
      name: Hetzner Cloud
    - key: nocloud
      name: Nocloud
    - key: openstack
      name: Openstack
    - key: oracle
      name: oracle
    - key: scaleway
      name: Scaleway
    - key: upcloud
      name: Upcloud
    - key: vmware
      name: VMware
    - key: vultr
      name: Vultr
  tinycore:
    enabled: true
    menu: linux
    mirror: http://distro.ibiblio.org/tinycorelinux
    name: Tiny Core Linux
    versions:
    - arch: x86
      code_name: core
      initrd: /17.x/x86/release/distribution_files/core.gz
      kernel: /17.x/x86/release/distribution_files/vmlinuz
      name: Core
    - arch: x86_64
      code_name: corepure
      initrd: /17.x/x86_64/release/distribution_files/corepure64.gz
      kernel: /17.x/x86_64/release/distribution_files/vmlinuz64
      name: CorePure
    - arch: x86
      code_name: dcorebionic
      initrd: /dCore/x86/release/dCore-bionic/dCore-bionic.gz
      kernel: /dCore/x86/release/dCore-bionic/vmlinuz-bionic
      name: dCore Bionic
    - arch: x86
      code_name: dcorebionicplus
      initrd: /dCore/x86/release/dCore-bionic/dCorePlus-bionic.gz
      kernel: /dCore/x86/release/dCore-bionic/vmlinuz-bionic
      name: dCore Bionic Plus
    - arch: x86
      code_name: dcorejessie
      initrd: /dCore/x86/release/dCore-jessie/dCore-jessie.gz
      kernel: /dCore/x86/release/dCore-jessie/vmlinuz-jessie
      name: dCore Jessie
    - arch: x86
      code_name: dcorejessieplus
      initrd: /dCore/x86/release/dCore-jessie/dCorePlus-jessie.gz
      kernel: /dCore/x86/release/dCore-jessie/vmlinuz-jessie
      name: dCore Jessie Plus
    - arch: x86
      code_name: dcorestretch
      initrd: /dCore/x86/release/dCore-stretch/dCore-stretch.gz
      kernel: /dCore/x86/release/dCore-stretch/vmlinuz-stretch
      name: dCore Stretch
    - arch: x86
      code_name: dcorestretchplus
      initrd: /dCore/x86/release/dCore-stretch/dCorePlus-stretch.gz
      kernel: /dCore/x86/release/dCore-stretch/vmlinuz-stretch
      name: dCore Stretch Plus
    - arch: x86
      code_name: dcoretrusty
      initrd: /dCore/x86/release/dCore-trusty/dCore-trusty.gz
      kernel: /dCore/x86/release/dCore-trusty/vmlinuz-trusty
      name: dCore Trusty
    - arch: x86
      code_name: dcoretrustyplus
      initrd: /dCore/x86/release/dCore-trusty/dCorePlus-trusty.gz
      kernel: /dCore/x86/release/dCore-trusty/vmlinuz-trusty
      name: dCore Trusty Plus
    - arch: x86
      code_name: dcorewheezy
      initrd: /dCore/x86/release/dCore-wheezy/dCore-wheezy.gz
      kernel: /dCore/x86/release/dCore-wheezy/vmlinuz-wheezy
      name: dCore Wheezy
    - arch: x86
      code_name: dcorewheezyplus
      initrd: /dCore/x86/release/dCore-wheezy/dCorePlus-wheezy.gz
      kernel: /dCore/x86/release/dCore-wheezy/vmlinuz-wheezy
      name: dCore Wheezy Plus
    - arch: x86
      code_name: dcorexenial
      initrd: /dCore/x86/release/dCore-xenial/dCore-xenial.gz
      kernel: /dCore/x86/release/dCore-xenial/vmlinuz-xenial
      name: dCore Xenial
    - arch: x86
      code_name: dcorexenialplus
      initrd: /dCore/x86/release/dCore-xenial/dCorePlus-xenial.gz
      kernel: /dCore/x86/release/dCore-xenial/vmlinuz-xenial
      name: dCore Xenial Plus
    - arch: x86_64
      code_name: dcore64bionic
      initrd: /dCore/x86_64/release/dCore-bionic64/dCore-bionic64.gz
      kernel: /dCore/x86_64/release/dCore-bionic64/vmlinuz-bionic64
      name: dCore64 Bionic
    - arch: x86_64
      code_name: dcore64bionicplus
      initrd: /dCore/x86_64/release/dCore-bionic64/dCorePlus-bionic64.gz
      kernel: /dCore/x86_64/release/dCore-bionic64/vmlinuz-bionic64
      name: dCore64 Bionic Plus
    - arch: x86_64
      code_name: dcore64buster
      initrd: /dCore/x86_64/release/dCore-buster64/dCore-buster64.gz
      kernel: /dCore/x86_64/release/dCore-buster64/vmlinuz-buster64
      name: dCore64 Buster
    - arch: x86_64
      code_name: dcore64busterplus
      initrd: /dCore/x86_64/release/dCore-buster64/dCorePlus-buster64.gz
      kernel: /dCore/x86_64/release/dCore-buster64/vmlinuz-buster64
      name: dCore64 Buster Plus
    - arch: x86_64
      code_name: dcore64stretch
      initrd: /dCore/x86_64/release/dCore-stretch64/dCore-stretch64.gz
      kernel: /dCore/x86_64/release/dCore-stretch64/vmlinuz-stretch64
      name: dCore64 Stretch
    - arch: x86_64
      code_name: dcore64stretchplus
      initrd: /dCore/x86_64/release/dCore-stretch64/dCorePlus-stretch64.gz
      kernel: /dCore/x86_64/release/dCore-stretch64/vmlinuz-stretch64
      name: dCore Stretch Plus
  ubuntu:
    archive_mirror: http://old-releases.ubuntu.com
    base_dir: ubuntu
    enabled: true
    menu: linux
    mirror: http://archive.ubuntu.com
    name: Ubuntu
    versions:
    - code_name: questing
      name: 25.10 Questing Quokka
    - code_name: plucky
      name: 25.04 Plucky Puffin
    - code_name: oracular
      name: 24.10 Oracular Oriole
    - code_name: noble
      name: 24.04 LTS Noble Numbat
    - code_name: jammy
      name: 22.04 LTS Jammy Jellyfish
    - code_name: focal
      name: 20.04 LTS Focal Fossa (Subiquity)
    - code_name: focal-legacy
      name: 20.04 LTS Focal Fossa (Legacy)
    - code_name: bionic
      name: 18.04 LTS Bionic Beaver
    - code_name: xenial
      name: 16.04 LTS Xenial Xerus
  vmware:
    enabled: true
    menu: linux
    name: VMware ESXi
  vyos:
    enabled: true
    menu: linux
    name: VyOS
    versions:
    - code_name: rolling
      name: 1.5 rolling
  zeninstall:
    enabled: true
    menu: linux
    name: Zen Installer Arch
    versions:
    - code_name: current
      name: current
sigs_dir: '{{ netbootxyz_root }}/sigs'
sigs_enabled: false
sigs_location: http://${boot_domain}/sigs/
sigs_menu: false
site_name: netboot.xyz
time_server: 0.pool.ntp.org
utilitiesarm:
  memtest86:
    enabled: false
    kernel: ${live_endpoint}{{ endpoints.memtest86.path }}memtest86-usb.img
    name: Memtest86 Free - {{ endpoints.memtest86.version }}
    type: sanboot
  uefishell:
    enabled: true
    kernel: ${live_endpoint}{{ endpoints.uefishell.path }}uefi-shell-aarch64.efi
    name: UEFI Shell
    type: direct
utilitiesefi:
  4mlinux:
    enabled: true
    name: 4MLinux
    type: ipxemenu
  bootrepair:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.bootrepair.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.bootrepair.path }}vmlinuz ip=dhcp boot=casper
      netboot=http fetch=${live_endpoint}{{ endpoints.bootrepair.path }}filesystem.squashfs
      {{ kernel_params }}
    name: Boot Repair CD
    type: direct
  caine:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.caine.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.caine.path }}vmlinuz ip=dhcp boot=casper
      netboot=url url=${live_endpoint}{{ endpoints.caine.path }}filesystem.squashfs
      {{ kernel_params }}
    name: CAINE
    type: direct
  clonezilla:
    enabled: true
    name: Clonezilla
    type: ipxemenu
  dts:
    enabled: true
    initrd: https://boot.dasharo.com{{ endpoints.dts.path }}/dts-base-image-v{{ endpoints.dts.version
      }}.cpio.gz
    kernel: https://boot.dasharo.com{{ endpoints.dts.path }}/bzImage-v{{ endpoints.dts.version
      }}
    name: Dasharo Tools Suite
    type: direct
  gparted:
    enabled: true
    name: GParted
    type: ipxemenu
  kaspersky:
    enabled: true
    name: Kaspersky Rescue Disk
    type: ipxemenu
  memtest86plus:
    enabled: true
    name: Memtest86+ {{ endpoints.memtest86plus.version }}
    type: memtest
    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_x86_64
    version: '{{ endpoints.memtest86plus.version }}'
  redorescue:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.redorescue.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.redorescue.path }}vmlinuz boot=live noprompt
      nocomponents setkmap=us fetch=${live_endpoint}{{ endpoints.redorescue.path }}filesystem.squashfs
      {{ kernel_params }}
    name: RedoRescue
    type: direct
  rescatux:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.rescatux.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.rescatux.path }}vmlinuz boot=live fetch=${live_endpoint}{{
      endpoints.rescatux.path }}filesystem.squashfs selinux=1 security=selinux enforcing=0
      {{ kernel_params }}
    name: Rescatux
    type: direct
  rescuezilla:
    enabled: true
    name: Rescuezilla
    type: ipxemenu
  shredos:
    enabled: true
    name: ShredOS
    type: ipxemenu
  supergrubdisk:
    enabled: true
    kernel: ${live_endpoint}{{ endpoints.supergrubdisk.path }}supergrub2-classic-x86_64.efi
    name: Super Grub2 Disk
    type: direct
  systemrescue:
    enabled: true
    name: System Rescue CD
    type: ipxemenu
  uefishell:
    enabled: true
    kernel: ${live_endpoint}{{ endpoints.uefishell.path }}uefi-shell-x64.efi
    name: UEFI Shell
    type: direct
  zfsbootmenu:
    enabled: true
    kernel: ${live_endpoint}{{ endpoints.zfsbootmenu.path }}zfsbootmenu-recovery-x86_64.efi
    name: ZFSBootMenu
    type: direct
utilitiespcbios32:
  clonezilla:
    enabled: true
    name: Clonezilla
    type: ipxemenu
  memtest86legacy:
    enabled: true
    name: Memtest86+ 5.01.0
    type: memtest
    util_path: https://boot.netboot.xyz/utils/memtest86-5.01.0
    version: 5.01.0
  memtest86plus:
    enabled: true
    name: Memtest86+ {{ endpoints.memtest86plus.version }}
    type: memtest
    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_i586
    version: '{{ endpoints.memtest86plus.version }}'
  shredos:
    enabled: true
    name: ShredOS
    type: ipxemenu
  systemrescue:
    enabled: true
    name: System Rescue CD
    type: ipxemenu
utilitiespcbios64:
  4mlinux:
    enabled: true
    name: 4MLinux
    type: ipxemenu
  bootrepair:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.bootrepair.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.bootrepair.path }}vmlinuz ip=dhcp boot=casper
      netboot=http fetch=${live_endpoint}{{ endpoints.bootrepair.path }}filesystem.squashfs
      {{ kernel_params }}
    name: Boot Repair CD
    type: direct
  breakin:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.breakin.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.breakin.path }}vmlinuz sshpasswd=breakin
      startup=breakin {{ kernel_params }}
    name: Breakin
    type: direct
  caine:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.caine.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.caine.path }}vmlinuz ip=dhcp boot=casper
      netboot=http fetch=${live_endpoint}{{ endpoints.caine.path }}filesystem.squashfs
      {{ kernel_params }}
    name: CAINE
    type: direct
  clonezilla:
    enabled: true
    name: Clonezilla
    type: ipxemenu
  dban:
    enabled: true
    name: DBAN
    type: ipxemenu
  dts:
    enabled: true
    initrd: https://boot.dasharo.com{{ endpoints.dts.path }}/dts-base-image-v{{ endpoints.dts.version
      }}.cpio.gz
    kernel: https://boot.dasharo.com{{ endpoints.dts.path }}/bzImage-v{{ endpoints.dts.version
      }}
    name: Dasharo Tools Suite
    type: direct
  gparted:
    enabled: true
    name: GParted
    type: ipxemenu
  kaspersky:
    enabled: true
    name: Kaspersky Rescue Disk
    type: ipxemenu
  memtest86legacy:
    enabled: true
    name: Memtest86+ 5.01.0
    type: memtest
    util_path: https://boot.netboot.xyz/utils/memtest86-5.01.0
    version: 5.01.0
  memtest86plus:
    enabled: true
    name: Memtest86+ {{ endpoints.memtest86plus.version }}
    type: memtest
    util_path: ${live_endpoint}{{ endpoints.memtest86plus.path }}mt86p_x86_64
    version: '{{ endpoints.memtest86plus.version }}'
  redorescue:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.redorescue.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.redorescue.path }}vmlinuz boot=live noprompt
      nocomponents setkmap=us fetch=${live_endpoint}{{ endpoints.redorescue.path }}filesystem.squashfs
      {{ kernel_params }}
    name: RedoRescue
    type: direct
  rescatux:
    enabled: true
    initrd: ${live_endpoint}{{ endpoints.rescatux.path }}initrd
    kernel: ${live_endpoint}{{ endpoints.rescatux.path }}vmlinuz boot=live fetch=${live_endpoint}{{
      endpoints.rescatux.path }}filesystem.squashfs selinux=1 security=selinux enforcing=0
      {{ kernel_params }}
    name: Rescatux
    type: direct
  rescuezilla:
    enabled: true
    name: Rescuezilla
    type: ipxemenu
  shredos:
    enabled: true
    name: ShredOS
    type: ipxemenu
  supergrub:
    enabled: true
    name: Super GRUB2 Disk
    type: memdisk
    util_path: http://master.dl.sourceforge.net/project/supergrub2/2.04s1/super_grub2_disk_2.04s1/super_grub2_disk_hybrid_2.04s1.iso
    version: 2.04s1
  systemrescue:
    enabled: true
    name: System Rescue CD
    type: ipxemenu
  ubcd:
    enabled: true
    name: Ultimate Boot CD (UBCD)
    type: memdisk
    util_path: https://mirror.sysadminguide.net/ubcd/ubcd539.iso
    version: '539'
wimboot_location: http://${boot_domain}/wimboot
wimboot_upstream_url: https://github.com/ipxe/wimboot/releases/latest/download/wimboot


================================================
FILE: roles/netbootxyz/files/ipxe/local/colour.h
================================================
#undef COLOR_NORMAL_FG
#undef COLOR_NORMAL_BG
#undef COLOR_SELECT_FG
#undef COLOR_SELECT_BG
#undef COLOR_SEPARATOR_FG
#undef COLOR_SEPARATOR_BG
#undef COLOR_EDIT_FG
#undef COLOR_EDIT_BG
#undef COLOR_ALERT_FG
#undef COLOR_ALERT_BG
#undef COLOR_URL_FG
#undef COLOR_URL_BG
#undef COLOR_PXE_FG
#undef COLOR_PXE_BG
#define COLOR_NORMAL_FG		COLOR_CYAN
#define COLOR_NORMAL_BG		COLOR_BLACK
#define COLOR_SELECT_FG		COLOR_WHITE
#define COLOR_SELECT_BG		COLOR_BLUE
#define COLOR_SEPARATOR_FG	COLOR_WHITE
#define COLOR_SEPARATOR_BG	COLOR_BLACK
#define COLOR_EDIT_FG		COLOR_BLACK
#define COLOR_EDIT_BG		COLOR_CYAN
#define COLOR_ALERT_FG		COLOR_WHITE
#define COLOR_ALERT_BG		COLOR_RED
#define COLOR_URL_FG		COLOR_CYAN
#define COLOR_URL_BG		COLOR_BLUE
#define COLOR_PXE_FG		COLOR_BLACK
#define COLOR_PXE_BG		COLOR_WHITE


================================================
FILE: roles/netbootxyz/files/ipxe/local/console.h
================================================
#define	CONSOLE_FRAMEBUFFER	/* Graphical framebuffer console */

================================================
FILE: roles/netbootxyz/files/ipxe/local/crypto.h
================================================
#undef OCSP_CHECK


================================================
FILE: roles/netbootxyz/files/ipxe/local/general.h
================================================
#define CERT_CMD              /* Certificate management commands */
#define CONSOLE_CMD           /* Console command */
#define DIGEST_CMD            /* Image crypto digest commands */
#define DOWNLOAD_PROTO_HTTPS  /* Secure Hypertext Transfer Protocol */
#define DOWNLOAD_PROTO_NFS    /* NFS */
#define IMAGE_COMBOOT         /* COMBOOT */
#define IMAGE_TRUST_CMD       /* Image trust management commands */
#define IMAGE_GZIP            /* GZIP image support */
#define IMAGE_PNG             /* PNG image support */
#define IMAGE_ZLIB            /* ZLIB image support */
#define NET_PROTO_IPV6        /* IPv6 protocol */
#define NET_PROTO_LLDP        /* Link Layer Discovery protocol */
#define NSLOOKUP_CMD          /* DNS resolving command */
#define NTP_CMD               /* NTP commands */
#define PARAM_CMD             /* Form parameter commands */
#define PCI_CMD               /* PCI commands */
#define PING_CMD              /* Ping command */
#define POWEROFF_CMD          /* Power off commands */
#define REBOOT_CMD            /* Reboot command */
#define TIME_CMD              /* Time commands */
#define VLAN_CMD              /* VLAN commands */


================================================
FILE: roles/netbootxyz/files/ipxe/local/general.h.efi
================================================
#define CERT_CMD              /* Certificate management commands */
#define CONSOLE_CMD           /* Console command */
#define DIGEST_CMD            /* Image crypto digest commands */
#define DOWNLOAD_PROTO_HTTPS  /* Secure Hypertext Transfer Protocol */
#define DOWNLOAD_PROTO_NFS    /* NFS */
#define IMAGE_TRUST_CMD       /* Image trust management commands */
#define IMAGE_GZIP            /* GZIP image support */
#define IMAGE_PNG             /* PNG image support */
#define IMAGE_ZLIB            /* ZLIB image support */
#define NET_PROTO_IPV6        /* IPv6 protocol */
#define NET_PROTO_LLDP        /* Link Layer Discovery protocol */
#define NSLOOKUP_CMD          /* DNS resolving command */
#define NTP_CMD               /* NTP commands */
#define PARAM_CMD             /* Form parameter commands */
#define PCI_CMD               /* PCI commands */
#define PING_CMD              /* Ping command */
#define POWEROFF_CMD          /* Power off commands */
#define REBOOT_CMD            /* Reboot command */
#define TIME_CMD              /* Time commands */
#define VLAN_CMD              /* VLAN commands */


================================================
FILE: roles/netbootxyz/meta/main.yml
================================================
galaxy_info:
  author: Antony Messerli
  description: Installs a self hosted version of netboot.xyz
  license: Apache-2.0
  min_ansible_version: 2.7
  platforms:
    - name: Ubuntu
      versions:
        - all
    - name: Centos
      versions:
        - all
  galaxy_tags:
    - system
dependencies: []


================================================
FILE: roles/netbootxyz/tasks/generate_checksums.yml
================================================
---
- name: Register a listing of all created iPXE bootloaders
  ansible.builtin.shell: ls -p -I {{ checksums_filename }} {{ netbootxyz_root }}/ipxe/ | grep -v /
  register: netboot_disks

- name: Generate date
  ansible.builtin.command: date
  register: current_date

- name: Gather stat listing of directory
  ansible.builtin.command: sha256sum -b {{ item }}
  with_items:
    - "{{ netboot_disks.stdout_lines }}"
  args:
    chdir: "{{ netbootxyz_root }}/ipxe/"
  register: netboot_disks_stat

- name: Generate ipxe disk checksums
  ansible.builtin.template:
    src: checksums.txt.j2
    dest: "{{ netbootxyz_root }}/ipxe/{{ checksums_filename }}"

- name: Generate site name banner for index
  ansible.builtin.shell: toilet -f standard {{ site_name | quote }} --html | grep span
  register: index_title
  when: ansible_facts['os_family'] == "Debian"

- name: Reset bootloader filename to first in list
  ansible.builtin.set_fact:
    bootloader_filename: "{{ bootloader_disks | first }}"

- name: Generate netboot.xyz index template
  ansible.builtin.template:
    src: index.html.j2
    dest: "{{ netbootxyz_root }}/index.html"


================================================
FILE: roles/netbootxyz/tasks/generate_disks.yml
================================================
---

- name: Set up iPXE build environment
  ansible.builtin.include_tasks: generate_disks_base.yml

- name: Generate legacy iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_legacy.yml
  when:
    - generate_disks_legacy | default(true) | bool

- name: Generate linux iPXE bootloader
  ansible.builtin.include_tasks: generate_disks_linux.yml
  when:
    - generate_disks_linux | default(false) | bool

- name: Generate EFI iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_efi.yml
  when:
    - generate_disks_efi | default(true) | bool

- name: Generate ARM iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_arm.yml
  when:
    - generate_disks_arm | default(false) | bool

- name: Generate RPI iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_rpi.yml
  when:
    - generate_disks_rpi | default(false) | bool
    - bootloader_filename == "netboot.xyz"

- name: Generate hybrid iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_hybrid.yml
  when:
    - generate_disks_hybrid | default(false) | bool
    - bootloader_filename == "netboot.xyz"

- name: Generate Secure Boot iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks_secureboot.yml
  when:
    - generate_disks_secureboot | default(false) | bool
    - bootloader_filename == "netboot.xyz"

- name: Remove stale autoexec.ipxe when Secure Boot is disabled
  ansible.builtin.file:
    path: "{{ netbootxyz_root }}/ipxe/autoexec.ipxe"
    state: absent
  when:
    - not (generate_disks_secureboot | default(false) | bool)


================================================
FILE: roles/netbootxyz/tasks/generate_disks_arm.yml
================================================
---

- name: Copy netboot.xyz local EFI iPXE configs
  ansible.builtin.copy:
    src: "ipxe/local/{{ item }}"
    dest: "{{ ipxe_source_dir }}/src/config/local/{{ item }}"
  with_items:
    - colour.h
    - console.h
    - crypto.h

- name: Copy netboot.xyz general.h.efi iPXE config
  ansible.builtin.copy:
    src: "ipxe/local/general.h.efi"
    dest: "{{ ipxe_source_dir }}/src/config/local/general.h"

- name: Set trust file to ipxe ca
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }}"
  when: not generate_signatures

- name: Combine trust files if set
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}"
  when: generate_signatures | bool

# iPXE workaround
# http://lists.ipxe.org/pipermail/ipxe-devel/2018-August/006254.html
# apply patch to fix arm64 builds on amd64 builds
- name: Workaround in iPXE for arm
  ansible.builtin.shell: sed -i '/WORKAROUND_CFLAGS/d' arch/arm64/Makefile
  args:
    chdir: "{{ ipxe_source_dir }}/src"

- name: Compile iPXE bootloaders for EFI arm64
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         CROSS_COMPILE=aarch64-linux-gnu- \
         ARCH=arm64 \
         EMBED={{ bootloader_filename }} \
         TRUST={{ trust_files }} \
         bin-arm64-efi/ipxe.efi \
         bin-arm64-efi/snp.efi \
         bin-arm64-efi/snponly.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool == false

- name: Compile iPXE bootloader for EFI arm64 with debug flags
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         CROSS_COMPILE=aarch64-linux-gnu- \
         ARCH=arm64 \
         DEBUG={{ ipxe_debug_options }} \
         EMBED={{ bootloader_filename }} \
         TRUST={{ trust_files }} \
         bin-arm64-efi/snp.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool

- name: Copy iPXE arm64 EFI builds to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/{{ item.src }}"
    dest: "{{ netbootxyz_root }}/ipxe/{{ item.dest }}"
    remote_src: true
  with_items:
    - {src: "bin-arm64-efi/ipxe.efi", dest: "{{ bootloader_filename }}-arm64.efi"}
    - {src: "bin-arm64-efi/snp.efi", dest: "{{ bootloader_filename }}-arm64-snp.efi"}
    - {src: "bin-arm64-efi/snponly.efi", dest: "{{ bootloader_filename }}-arm64-snponly.efi"}


================================================
FILE: roles/netbootxyz/tasks/generate_disks_base.yml
================================================
---

- name: Gathering facts
  ansible.builtin.setup:

- name: Gather variables for each operating system
  ansible.builtin.include_vars: "{{ item }}"
  with_first_found:
    - "{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_version'] | lower }}.yml"
    - "{{ ansible_facts['distribution'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml"
    - "{{ ansible_facts['os_family'] | lower }}-{{ ansible_facts['distribution_major_version'] | lower }}.yml"
    - "{{ ansible_facts['distribution'] | lower }}.yml"
    - "{{ ansible_facts['os_family'] | lower }}.yml"

- name: Ensure EPEL is enabled
  ansible.builtin.dnf:
    name: epel-release
    state: present
  when:
    - ansible_facts['distribution'] == "CentOS"

- name: Set var to bootloader of loop
  ansible.builtin.set_fact:
    bootloader_filename: "{{ bootloader_file }}"

- name: Create iPXE file directories
  ansible.builtin.file:
    path: "{{ item }}"
    state: directory
  with_items:
    - "{{ netbootxyz_root }}/ipxe"
    - "{{ cert_dir }}"

- name: Retrieve latest wimboot
  ansible.builtin.get_url:
    url: "{{ wimboot_upstream_url }}"
    dest: "{{ netbootxyz_root }}/wimboot"

- name: Copy helper apps
  ansible.builtin.copy:
    src: "{{ item }}"
    dest: "{{ netbootxyz_root }}"
  with_items:
    - memdisk

- name: Install required packages
  ansible.builtin.package:
    name: "{{ item }}"
    state: present
  with_items: "{{ netbootxyz_packages }}"

- name: Check out latest iPXE sources
  ansible.builtin.git:
    repo: "{{ ipxe_repo }}"
    dest: "{{ ipxe_source_dir }}"
    version: "{{ ipxe_branch }}"
    force: true
  register: ipxe_git_checkout

- name: Copy iPXE Bootloader template to iPXE source directory
  ansible.builtin.template:
    src: "disks/{{ bootloader_filename }}.j2"
    dest: "{{ ipxe_source_dir }}/src/{{ bootloader_filename }}"

- name: Touch iPXE config local files
  ansible.builtin.file:
    path: "{{ ipxe_source_dir }}/{{ item }}"
    state: touch
  with_items:
    - src/config/local/umalloc.h
    - src/config/local/nap.h
    - src/config/local/timer.h
    - src/config/local/branding.h
    - src/config/local/serial.h
    - src/config/local/reboot.h
    - src/config/local/sanboot.h
    - src/config/local/fault.h
    - src/config/local/dhcp.h
    - src/config/local/sideband.h
    - src/config/local/entropy.h
    - src/config/local/crypto.h
    - src/config/local/usb.h
    - src/config/local/settings.h
    - src/config/local/isa.h

- name: Retrieve iPXE CA
  ansible.builtin.get_url:
    url: "{{ ipxe_ca_url }}"
    dest: "{{ cert_dir }}/{{ ipxe_ca_filename }}"


================================================
FILE: roles/netbootxyz/tasks/generate_disks_efi.yml
================================================
---

- name: Copy netboot.xyz local EFI iPXE configs
  ansible.builtin.copy:
    src: "ipxe/local/{{ item }}"
    dest: "{{ ipxe_source_dir }}/src/config/local/{{ item }}"
  with_items:
    - colour.h
    - console.h
    - crypto.h

- name: Copy netboot.xyz general.h.efi iPXE config
  ansible.builtin.copy:
    src: "ipxe/local/general.h.efi"
    dest: "{{ ipxe_source_dir }}/src/config/local/general.h"

- name: Set trust file to ipxe ca
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }}"
  when: not generate_signatures

- name: Combine trust files if set
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}"
  when: generate_signatures | bool

- name: Compile iPXE bootloader for EFI
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         TRUST={{ trust_files }} \
         bin-x86_64-efi/ipxe.efi \
         bin-x86_64-efi/snp.efi \
         bin-x86_64-efi/snponly.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool == false

- name: Compile iPXE bootloader for EFI with debug flags
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         DEBUG={{ ipxe_debug_options }} \
         TRUST={{ trust_files }} \
         bin-x86_64-efi/ipxe.efi \
         bin-x86_64-efi/snp.efi \
         bin-x86_64-efi/snponly.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool

- name: Generate iPXE floppy images for EFI
  ansible.builtin.shell: |
    truncate -s 1440k bin-x86_64-efi/ipxe.efi.dsk
    mformat -i bin-x86_64-efi/ipxe.efi.dsk -f 1440 ::
    mmd -i bin-x86_64-efi/ipxe.efi.dsk ::EFI
    mmd -i bin-x86_64-efi/ipxe.efi.dsk ::EFI/BOOT
    cp bin-x86_64-efi/ipxe.efi.dsk bin-x86_64-efi/snp.efi.dsk
    mcopy -i bin-x86_64-efi/ipxe.efi.dsk  bin-x86_64-efi/ipxe.efi ::EFI/BOOT/BOOTX64.EFI
    mcopy -i bin-x86_64-efi/snp.efi.dsk  bin-x86_64-efi/snp.efi ::EFI/BOOT/BOOTX64.EFI
  args:
    chdir: "{{ ipxe_source_dir }}/src"

- name: Copy iPXE EFI builds to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/{{ item.src }}"
    dest: "{{ netbootxyz_root }}/ipxe/{{ item.dest }}"
    remote_src: true
  with_items:
    - {src: "bin-x86_64-efi/ipxe.efi", dest: "{{ bootloader_filename }}.efi"}
    - {src: "bin-x86_64-efi/snp.efi", dest: "{{ bootloader_filename }}-snp.efi"}
    - {src: "bin-x86_64-efi/snponly.efi", dest: "{{ bootloader_filename }}-snponly.efi"}
    - {src: "bin-x86_64-efi/ipxe.efi.dsk", dest: "{{ bootloader_filename }}.efi.dsk"}
    - {src: "bin-x86_64-efi/snp.efi.dsk", dest: "{{ bootloader_filename }}-snp.efi.dsk"}


================================================
FILE: roles/netbootxyz/tasks/generate_disks_hybrid.yml
================================================
---

- name: Generate hybrid ISO x86_64 image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.iso \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_legacy | default(true) | bool
    - generate_disks_efi | default(true) | bool


- name: Generate hybrid ISO multiarch image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-multiarch.iso \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_legacy | default(true) | bool
    - generate_disks_arm | default(false) | bool
    - generate_disks_efi | default(true) | bool

- name: Generate hybrid ISO arm64 image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.iso \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_arm | default(false) | bool

- name: Generate hybrid USB x86_64 image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.img \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_legacy | default(true) | bool
    - generate_disks_efi | default(true) | bool

- name: Generate hybrid USB multiarch image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-multiarch.img \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.efi \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}.lkrn \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_legacy | default(true) | bool
    - generate_disks_arm | default(false) | bool
    - generate_disks_efi | default(true) | bool

- name: Generate hybrid USB arm64 image
  ansible.builtin.shell: |
    ./util/genfsimg -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.img \
      -s {{ bootloader_filename }} \
      {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-arm64.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when:
    - generate_disks_hybrid | default(false) | bool
    - generate_disks_arm | default(false) | bool


================================================
FILE: roles/netbootxyz/tasks/generate_disks_legacy.yml
================================================
---

- name: Copy netboot.xyz local legacy iPXE configs
  ansible.builtin.copy:
    src: "ipxe/local/{{ item }}"
    dest: "{{ ipxe_source_dir }}/src/config/local/{{ item }}"
  with_items:
    - colour.h
    - console.h
    - crypto.h
    - general.h

- name: Set trust file to ipxe ca
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }}"
  when: not generate_signatures

- name: Combine trust args if set
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}"
  when: generate_signatures | bool

- name: Compile iPXE bootloader for Legacy BIOS
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         TRUST={{ trust_files }} \
         bin/ipxe.dsk \
         bin/ipxe.pdsk \
         bin/ipxe.lkrn \
         bin/ipxe.kpxe \
         bin/undionly.kpxe
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool == false

- name: Compile iPXE bootloader for Legacy BIOS with debug flags
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         DEBUG={{ ipxe_debug_options }} \
         TRUST={{ trust_files }} \
         bin/ipxe.dsk \
         bin/ipxe.pdsk \
         bin/ipxe.lkrn \
         bin/ipxe.kpxe \
         bin/undionly.kpxe
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool

- name: Copy iPXE files for Legacy BIOS to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/bin/ipxe{{ item }}"
    dest: "{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}{{ item }}"
    remote_src: true
  with_items:
    - ".pdsk"
    - ".dsk"
    - ".lkrn"
    - ".kpxe"
  when: bootloader_filename != "netboot.xyz-metal"

- name: Copy iPXE files for Legacy BIOS to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/bin/ipxe{{ item }}"
    dest: "{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}{{ item }}"
    remote_src: true
  with_items:
    - ".kpxe"
  when: bootloader_filename == "netboot.xyz-metal"

- name: Copy undionly.kpxe for Legacy BIOS to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/bin/undionly.kpxe"
    dest: "{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-undionly.kpxe"
    remote_src: true
  when: bootloader_filename != "netboot.xyz-metal"


================================================
FILE: roles/netbootxyz/tasks/generate_disks_linux.yml
================================================
---

- name: Copy netboot.xyz local legacy iPXE configs
  ansible.builtin.copy:
    src: "ipxe/local/{{ item }}"
    dest: "{{ ipxe_source_dir }}/src/config/local/{{ item }}"
  with_items:
    - colour.h
    - console.h
    - crypto.h

- name: Copy netboot.xyz general.h.efi iPXE config
  ansible.builtin.copy:
    src: "ipxe/local/general.h.efi"
    dest: "{{ ipxe_source_dir }}/src/config/local/general.h"

- name: Set trust file to ipxe ca
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }}"
  when: not generate_signatures

- name: Combine trust args if set
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}"
  when: generate_signatures | bool

- name: Compile iPXE Linux bootloader for Legacy BIOS
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         TRUST={{ trust_files }} \
         bin-x86_64-linux/slirp.linux
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool == false

- name: Compile iPXE Linux bootloader for Legacy BIOS with debug flags
  ansible.builtin.shell: |
    make clean
    make -j{{ make_num_jobs }} \
         EMBED={{ bootloader_filename }} \
         DEBUG={{ ipxe_debug_options }} \
         TRUST={{ trust_files }} \
         bin-x86_64-linux/slirp.linux
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: ipxe_debug_enabled | bool

- name: Copy iPXE linux binary for Legacy BIOS to http directory
  ansible.builtin.copy:
    src: "{{ ipxe_source_dir }}/src/bin-x86_64-linux/slirp.linux"
    dest: "{{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-linux.bin"
    remote_src: true
  when: bootloader_filename != "netboot.xyz-metal"


================================================
FILE: roles/netbootxyz/tasks/generate_disks_rpi.yml
================================================
---
- name: Install required packages
  ansible.builtin.package:
    name: "{{ item }}"
    state: present
  with_items: "{{ pipxe_packages }}"

- name: Check out latest pipxe sources
  ansible.builtin.git:
    repo: "{{ pipxe_repo }}"
    dest: "{{ pipxe_source_dir }}"
    version: "{{ pipxe_branch }}"
    force: true
    recursive: true
  register: pipxe_git_checkout

- name: Copy iPXE Bootloader template to iPXE source directory
  ansible.builtin.template:
    src: "disks/{{ bootloader_filename }}.j2"
    dest: "{{ pipxe_source_dir }}/ipxe/src/{{ bootloader_filename }}"

- name: Copy netboot.xyz local EFI iPXE configs
  ansible.builtin.copy:
    src: "ipxe/local/{{ item }}"
    dest: "{{ pipxe_source_dir }}/ipxe/src/config/local/{{ item }}"
  with_items:
    - colour.h
    - console.h
    - crypto.h

- name: Copy netboot.xyz general.h.efi iPXE config
  ansible.builtin.copy:
    src: "ipxe/local/general.h.efi"
    dest: "{{ pipxe_source_dir }}/ipxe/src/config/local/general.h"

- name: Set trust file to ipxe ca
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }}"
  when: not generate_signatures

- name: Combine trust files if set
  ansible.builtin.set_fact:
    trust_files: "{{ cert_dir }}/{{ ipxe_ca_filename }},{{ cert_dir }}/{{ cert_file_filename }}"
  when: generate_signatures | bool

- name: Copy Makefile template into pipxe
  ansible.builtin.template:
    src: pipxe/Makefile-rpi4.j2
    dest: "{{ pipxe_source_dir }}/Makefile"

- name: Compile iPXE bootloader for RPI build
  ansible.builtin.shell: |
    make -j{{ make_num_jobs }}
  args:
    chdir: "{{ pipxe_source_dir }}"

- name: Copy iPXE RPI builds to http directory
  ansible.builtin.copy:
    src: "{{ pipxe_source_dir }}/{{ item.src }}"
    dest: "{{ netbootxyz_root }}/ipxe/{{ item.dest }}"
    remote_src: true
  with_items:
    - {src: "sdcard.img", dest: "{{ bootloader_filename }}-rpi4-sdcard.img"}
    - {src: "ipxe/src/bin-arm64-efi/snp.efi", dest: "{{ bootloader_filename }}-rpi4-snp.efi"}


================================================
FILE: roles/netbootxyz/tasks/generate_disks_secureboot.yml
================================================
---

- name: Create Secure Boot output directories
  ansible.builtin.file:
    path: "{{ item }}"
    state: directory
  with_items:
    - "{{ netbootxyz_root }}/ipxe/secureboot-x86_64"
    - "{{ netbootxyz_root }}/ipxe/secureboot-arm64"

- name: Download iPXE Secure Boot archive
  ansible.builtin.get_url:
    url: "{{ ipxe_secureboot_archive_url }}"
    dest: "/tmp/ipxeboot.tar.gz"

- name: Extract iPXE Secure Boot archive
  ansible.builtin.unarchive:
    src: "/tmp/ipxeboot.tar.gz"
    dest: "/tmp"
    remote_src: true

- name: Copy x86_64 Secure Boot binaries to output directory
  ansible.builtin.copy:
    src: "/tmp/ipxeboot/x86_64-sb/{{ item }}"
    dest: "{{ netbootxyz_root }}/ipxe/secureboot-x86_64/{{ item }}"
    remote_src: true
  with_items:
    - ipxe.efi
    - ipxe-shim.efi
    - shimx64.efi
    - snponly.efi
    - snponly-shim.efi

- name: Copy ARM64 Secure Boot binaries to output directory
  ansible.builtin.copy:
    src: "/tmp/ipxeboot/arm64-sb/{{ item }}"
    dest: "{{ netbootxyz_root }}/ipxe/secureboot-arm64/{{ item }}"
    remote_src: true
  with_items:
    - ipxe.efi
    - ipxe-shim.efi
    - shimaa64.efi
    - snponly.efi
    - snponly-shim.efi
  when: generate_disks_arm | default(false) | bool

- name: Template autoexec.ipxe for x86_64 Secure Boot
  ansible.builtin.template:
    src: "disks/autoexec.ipxe.j2"
    dest: "{{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe"

- name: Template autoexec.ipxe for ARM64 Secure Boot
  ansible.builtin.template:
    src: "disks/autoexec.ipxe.j2"
    dest: "{{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe"
  when: generate_disks_arm | default(false) | bool

- name: Generate Secure Boot x86_64 ISO image
  ansible.builtin.shell: |
    ./util/genfsimg \
      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb.iso \
      -s {{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe \
      -e /tmp/ipxeboot/x86_64-sb/shimx64.efi \
      /tmp/ipxeboot/x86_64-sb/ipxe.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"

- name: Generate Secure Boot x86_64 USB image
  ansible.builtin.shell: |
    ./util/genfsimg \
      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb.img \
      -s {{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe \
      -e /tmp/ipxeboot/x86_64-sb/shimx64.efi \
      /tmp/ipxeboot/x86_64-sb/ipxe.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"

- name: Generate Secure Boot ARM64 ISO image
  ansible.builtin.shell: |
    ./util/genfsimg \
      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb-arm64.iso \
      -s {{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe \
      -e /tmp/ipxeboot/arm64-sb/shimaa64.efi \
      /tmp/ipxeboot/arm64-sb/ipxe.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: generate_disks_arm | default(false) | bool

- name: Generate Secure Boot ARM64 USB image
  ansible.builtin.shell: |
    ./util/genfsimg \
      -o {{ netbootxyz_root }}/ipxe/{{ bootloader_filename }}-sb-arm64.img \
      -s {{ netbootxyz_root }}/ipxe/secureboot-arm64/autoexec.ipxe \
      -e /tmp/ipxeboot/arm64-sb/shimaa64.efi \
      /tmp/ipxeboot/arm64-sb/ipxe.efi
  args:
    chdir: "{{ ipxe_source_dir }}/src"
  when: generate_disks_arm | default(false) | bool

- name: Copy autoexec.ipxe to ipxe root as standalone release asset
  ansible.builtin.copy:
    src: "{{ netbootxyz_root }}/ipxe/secureboot-x86_64/autoexec.ipxe"
    dest: "{{ netbootxyz_root }}/ipxe/autoexec.ipxe"
    remote_src: true

- name: Remove Secure Boot directories after ISO/USB generation
  ansible.builtin.file:
    path: "{{ item }}"
    state: absent
  with_items:
    - "{{ netbootxyz_root }}/ipxe/secureboot-x86_64"
    - "{{ netbootxyz_root }}/ipxe/secureboot-arm64"

- name: Clean up Secure Boot archive
  ansible.builtin.file:
    path: "{{ item }}"
    state: absent
  with_items:
    - "/tmp/ipxeboot.tar.gz"
    - "/tmp/ipxeboot"


================================================
FILE: roles/netbootxyz/tasks/generate_menus.yml
================================================
---
- name: Combine overrides with release defaults
  ansible.builtin.set_fact:
    _releases: "{{ releases | combine(release_overrides, recursive=True) }}"
  when: release_overrides is defined

- name: Set releases with user overrides
  ansible.builtin.set_fact:
    releases: "{{ _releases }}"
  when: release_overrides is defined

# PC BIOS utilities
- name: Combine overrides with utilitiespcbios64 defaults
  ansible.builtin.set_fact:
    _utilitiespcbios64: "{{ utilitiespcbios64 | combine(utilitiespcbios64_overrides, recursive=True) }}"
  when: utilitiespcbios64_overrides is defined

- name: Set utilitypcbios64 with user overrides
  ansible.builtin.set_fact:
    utilitiespcbios64: "{{ _utilitiespcbios64 }}"
  when: utilitiespcbios64_overrides is defined

- name: Combine overrides with utilitiespcbios32 defaults
  ansible.builtin.set_fact:
    _utilitiespcbios32: "{{ utilitiespcbios32 | combine(utilitiespcbios32_overrides, recursive=True) }}"
  when: utilitiespcbios32_overrides is defined

- name: Set utilitypcbios32 with user overrides
  ansible.builtin.set_fact:
    utilitiespcbios32: "{{ _utilitiespcbios32 }}"
  when: utilitiespcbios32_overrides is defined

# EFI utilities
- name: Combine overrides with utilitiesefi defaults
  ansible.builtin.set_fact:
    _utilitiesefi: "{{ utilitiesefi | combine(utilitiesefi_overrides, recursive=True) }}"
  when: utilitiesefi_overrides is defined

- name: Set utilityefi with user overrides
  ansible.builtin.set_fact:
    utilitiesefi: "{{ _utilitiesefi }}"
  when: utilitiesefi_overrides is defined

- name: Generate directories
  ansible.builtin.file:
    path: "{{ netbootxyz_root }}"
    state: directory

- name: Set menu version
  ansible.builtin.set_fact:
    upstream_version: "{{ boot_version }}"
  when:
    - generate_version_file | bool

- name: Generate version.ipxe for upstream
  ansible.builtin.template:
    src: "version.ipxe.j2"
    dest: "{{ netbootxyz_root }}/version.ipxe"
  when:
    - generate_version_file | bool

- name: Generate netboot.xyz source files templates
  ansible.builtin.template:
    src: "{{ item.src }}"
    dest: "{{ netbootxyz_root }}/{{ item.path | regex_replace('.j2', '') }}"
  with_community.general.filetree: "{{ 'templates/menu/' }}"
  when: item.state == "file"

- name: Generate local-vars.ipxe if enabled
  ansible.builtin.template:
    src: "local-vars.ipxe.j2"
    dest: "{{ netbootxyz_root }}/local-vars.ipxe"
  when:
    - generate_local_vars | bool

- name: Retrieve pciids.ipxe
  ansible.builtin.get_url:
    url: "{{ pciids_url }}"
    dest: "{{ netbootxyz_root }}/pciids.ipxe"


================================================
FILE: roles/netbootxyz/tasks/generate_menus_custom.yml
================================================
---

- name: Generate directories
  ansible.builtin.file:
    path: "{{ item }}"
    state: directory
  with_items:
    - "{{ custom_templates_dir }}"
    - "{{ netbootxyz_root }}/custom"

- name: Generate custom user menu templates
  ansible.builtin.template:
    src: "{{ item.src }}"
    dest: "{{ netbootxyz_root }}/custom/{{ item.path | regex_replace('.j2', '') }}"
  with_community.general.filetree: "{{ custom_templates_dir }}"
  when: item.state == "file"


================================================
FILE: roles/netbootxyz/tasks/generate_signatures.yml
================================================
---
- name: Gather list of source files
  ansible.builtin.command: ls {{ netbootxyz_root }}
  register: source_files

- name: Create directories for signatures
  ansible.builtin.file:
    path: "{{ item }}"
    state: directory
  with_items:
    - "{{ sigs_dir }}"

- name: Generate signatures for source files
  ansible.builtin.shell: |
    openssl cms -sign -binary -noattr -in {{ netbootxyz_root }}/{{ item }} \
    -signer {{ codesign_cert_filename }} -inkey {{ codesign_key_filename }} -certfile {{ cert_file_filename }} -outform DER \
    -out {{ sigs_dir }}/{{ item }}.sig
  args:
    chdir: "{{ cert_dir }}"
  with_items:
    - "{{ source_files.stdout_lines }}"


================================================
FILE: roles/netbootxyz/tasks/main.yml
================================================
---

- name: Print Bootloader Disks to Build
  ansible.builtin.debug:
    var: bootloader_disks

- name: Generate menus
  ansible.builtin.include_tasks: generate_menus.yml
  when:
    - generate_menus | default(true) | bool

- name: Generate custom menus
  ansible.builtin.include_tasks: generate_menus_custom.yml
  when:
    - custom_generate_menus | default(false) | bool

- name: Generate iPXE bootloaders
  ansible.builtin.include_tasks: generate_disks.yml
  with_items:
    - "{{ bootloader_disks }}"
  loop_control:
    loop_var: bootloader_file
  when:
    - generate_disks | default(true) | bool

- name: Generate checksums
  ansible.builtin.include_tasks: generate_checksums.yml
  when:
    - generate_checksums | default(true) | bool

- name: Generate signatures
  ansible.builtin.include_tasks: generate_signatures.yml
  when:
    - generate_signatures | default(false) | bool


================================================
FILE: roles/netbootxyz/templates/checksums.txt.j2
================================================
# {{ site_name }} bootloaders generated at {{ current_date.stdout }}
# iPXE Commit: {{ ipxe_repo }}/commit/{{ ipxe_git_checkout.after }}

{% for item in netboot_disks_stat.results %}
{{ item.stdout }}
{% endfor %}

================================================
FILE: roles/netbootxyz/templates/disks/autoexec.ipxe.j2
================================================
#!ipxe
#
# {{ site_name }} - Secure Boot autoexec.ipxe
#
# This script is loaded automatically by iPXE v2.0.0+ Secure Boot
# binaries from the same directory. It replaces the embedded script
# used in self-compiled netboot.xyz bootloaders.
#

set esc:hex 1b
set bold ${esc:string}[1m
set boldoff ${esc:string}[22m
set fg_gre ${esc:string}[32m
set fg_cya ${esc:string}[36m
set fg_whi ${esc:string}[37m
set HTTPS_ERR HTTPS appears to have failed... attempting HTTP
set HTTP_ERR HTTP has failed, localbooting...
set site_name {{ site_name }}
set boot_domain {{ boot_domain }}
set ipxe_version ${version}
set version {{ boot_version }}
set conn_type https

:start
echo ${bold}${fg_gre}${site_name} - ${fg_whi}v${version} (Secure Boot)${boldoff}
iseq ${site_name} netboot.xyz || echo ${bold}${fg_whi}Powered by ${fg_gre}netboot.xyz${fg_whi}${boldoff}
prompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp

:dhcp
echo
dhcp || goto netconfig
goto menu

:failsafe
menu ${boot_domain} Failsafe Menu
item localboot Boot to local drive
item netconfig Manual network configuration
item retry Retry boot
item debug iPXE Debug Shell
item reboot Reboot System
choose failsafe_choice || exit
goto ${failsafe_choice}

:netconfig
echo Network Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n IP: && read net${net}/ip
echo -n Subnet mask: && read net${net}/netmask
echo -n Gateway: && read net${net}/gateway
echo -n DNS: && read dns
ifopen net${net}
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:menu
{% if bootloader_https_enabled | bool %}
:menu_https
set conn_type https
goto menu_start
{% endif %}

{% if bootloader_http_enabled | bool %}
:menu_http
set conn_type http
goto menu_start
{% endif %}

:menu_start
isset ${netX/dns6} && goto menu_v6 || goto menu_v4
:menu_v6
isset ${netX/dns6_bak} && set netX/dns6 ${netX/dns6_bak} ||
set netX/dns6_bak ${netX/dns6}
echo Attempting ${conn_type} boot over IPv6...
chain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv6 failed... attempting IPv4...
clear netX/dns6
:menu_v4
echo Attempting ${conn_type} boot over IPv4...
chain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv4 failed...
iseq ${conn_type} https && goto menu_http || goto localboot

:localboot
exit

:retry
goto start

:reboot
reboot
goto start

:debug
echo Type "exit" to return to menu
shell
goto failsafe


================================================
FILE: roles/netbootxyz/templates/disks/netboot.xyz-gce.j2
================================================
#!ipxe
set esc:hex 1b
set bold ${esc:string}[1m
set boldoff ${esc:string}[22m
set fg_gre ${esc:string}[32m
set fg_cya ${esc:string}[36m
set fg_whi ${esc:string}[37m
set HTTPS_ERR HTTPS appears to have failed... attempting HTTP
set HTTP_ERR HTTP has failed, localbooting...
set ipxe_version ${version}
set version {{ boot_version }}
set ipxe_cloud_config gce

:start
echo ${bold}${fg_gre}netboot.xyz ${fg_whi}v${version} for ${fg_cya}Google Compute Engine${boldoff}
prompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp

:dhcp
echo
dhcp || goto netconfig
goto menu

:failsafe
menu netboot.xyz Failsafe Menu
item localboot Boot to local drive
item netconfig Manual network configuration
item vlan Manual VLAN configuration
item retry Retry boot
item debug iPXE Debug Shell
item reboot Reboot System
choose failsafe_choice || exit
goto ${failsafe_choice}

:netconfig
echo Network Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n IP: && read net${net}/ip
echo -n Subnet mask: && read net${net}/netmask
echo -n Gateway: && read net${net}/gateway
echo -n DNS: && read dns
ifopen net${net}
echo Attempting chainload of netboot.xyz...
goto menu || goto failsafe

:vlan
echo VLAN Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan
vcreate --tag ${vlan} net${net}
ifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:netvlan
echo -n IP: && read net${net}-${vlan}/ip
echo -n Subnet mask: && read net${net}-${vlan}/netmask
echo -n Gateway: && read net${net}-${vlan}/gateway
echo -n DNS: && read dns
ifopen net${net}-${vlan}
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:menu
set conn_type https
chain --autofree https://boot.netboot.xyz/menu.ipxe || echo ${HTTPS_ERR}
sleep 5
set conn_type http
chain --autofree http://boot.netboot.xyz/menu.ipxe || echo ${HTTP_ERR}
goto localboot

:localboot
exit

:retry
goto start

:reboot
reboot
goto start

:debug
echo Type "exit" to return to menu
shell
goto failsafe


================================================
FILE: roles/netbootxyz/templates/disks/netboot.xyz-metal.j2
================================================
#!ipxe
set esc:hex 1b
set bold ${esc:string}[1m
set boldoff ${esc:string}[22m
set fg_gre ${esc:string}[32m
set fg_red ${esc:string}[31m
set fg_cya ${esc:string}[36m
set fg_whi ${esc:string}[37m
set HTTPS_ERR HTTPS appears to have failed... attempting HTTP
set HTTP_ERR HTTP has failed, localbooting...
set ipxe_version ${version}
set version {{ boot_version }}
set ipxe_cloud_config metal

:start
echo ${bold}${fg_gre}netboot.xyz ${fg_whi}v${version} for ${fg_red}metal.equinix.com${fg_whi}${boldoff}
prompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp

:dhcp
echo
dhcp || goto netconfig
goto menu

:failsafe
menu netboot.xyz Failsafe Menu
item localboot Boot to local drive
item netconfig Manual network configuration
item vlan Manual VLAN configuration
item retry Retry boot
item debug iPXE Debug Shell
item reboot Reboot System
choose failsafe_choice || exit
goto ${failsafe_choice}

:netconfig
echo Network Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n IP: && read net${net}/ip
echo -n Subnet mask: && read net${net}/netmask
echo -n Gateway: && read net${net}/gateway
echo -n DNS: && read dns
ifopen net${net}
echo Attempting chainload of netboot.xyz...
goto menu || goto failsafe

:vlan
echo VLAN Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan
vcreate --tag ${vlan} net${net}
ifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:netvlan
echo -n IP: && read net${net}-${vlan}/ip
echo -n Subnet mask: && read net${net}-${vlan}/netmask
echo -n Gateway: && read net${net}-${vlan}/gateway
echo -n DNS: && read dns
ifopen net${net}-${vlan}
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:menu
set conn_type https
chain --autofree https://boot.netboot.xyz/menu.ipxe || echo ${HTTPS_ERR}
sleep 5
set conn_type http
chain --autofree http://boot.netboot.xyz/menu.ipxe || echo ${HTTP_ERR}
goto localboot

:localboot
exit

:retry
goto start

:reboot
reboot
goto start

:debug
echo Type "exit" to return to menu
shell
goto failsafe


================================================
FILE: roles/netbootxyz/templates/disks/netboot.xyz.j2
================================================
#!ipxe
set esc:hex 1b
set bold ${esc:string}[1m
set boldoff ${esc:string}[22m
set fg_gre ${esc:string}[32m
set fg_cya ${esc:string}[36m
set fg_whi ${esc:string}[37m
set VARS_ERR Local vars file not found... attempting TFTP boot...
set TFTP_ERR Local TFTP failed... attempting remote HTTPS
set V6_ERR IPv6 appears to have failed... attempting IPv4...
set HTTPS_ERR HTTPS appears to have failed... attempting HTTP
set HTTP_ERR HTTP has failed, localbooting...
set site_name {{ site_name }}
set boot_domain {{ boot_domain }}
set ipxe_version ${version}
set version {{ boot_version }}
set conn_type https
set tftp-root-path /

:start
echo ${bold}${fg_gre}${site_name} - ${fg_whi}v${version}${boldoff}
iseq ${site_name} netboot.xyz || echo ${bold}${fg_whi}Powered by ${fg_gre}netboot.xyz${fg_whi}${boldoff}
prompt --key m --timeout 4000 Hit the ${bold}m${boldoff} key to open failsafe menu... && goto failsafe || goto dhcp

:dhcp
echo
dhcp || goto netconfig
isset ${next-server} && isset ${proxydhcp/next-server} && goto choose-tftp || set tftp-server ${next-server} && goto load-custom-ipxe

:choose-tftp
# Load "proxy settings" from root server
chain tftp://${next-server}/local-vars.ipxe || echo ${VARS_ERR}
# 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
isset ${use_proxydhcp_settings} && iseq ${use_proxydhcp_settings} true && goto set-next-server ||
prompt --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
goto set-next-server

:set-next-server
iseq ${use_proxydhcp_settings} true && set tftp-server ${proxydhcp/next-server} || set tftp-server ${next-server}
goto load-custom-ipxe

:load-custom-ipxe
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}.kpxe && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-undionly.kpxe && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-snp.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-snponly.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} {{ bootloader_filename }}-arm64.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}.kpxe && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-undionly.kpxe && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-snp.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-snponly.efi && goto tftpmenu ||
isset ${tftp-server} && iseq ${filename} ${tftp-root-path}{{ bootloader_filename }}-arm64.efi && goto tftpmenu ||
goto menu

:failsafe
menu ${boot_domain} Failsafe Menu
item localboot Boot to local drive
item netconfig Manual network configuration
item vlan Manual VLAN configuration
item retry Retry boot
item debug iPXE Debug Shell
item reboot Reboot System
choose failsafe_choice || exit
goto ${failsafe_choice}

:netconfig
echo Network Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n IP: && read net${net}/ip
echo -n Subnet mask: && read net${net}/netmask
echo -n Gateway: && read net${net}/gateway
echo -n DNS: && read dns
ifopen net${net}
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:vlan
echo VLAN Configuration:
echo Available interfaces...
ifstat
imgfree
echo -n Set network interface number [0 for net0, defaults to 0]: ${} && read net
isset ${net} || set net 0
echo -n Set VLAN 802.1Q tag [0 to 4094]: ${} && read vlan
vcreate --tag ${vlan} net${net}
ifconf --configurator dhcp net${net}-${vlan} || echo DHCP failed trying manual && goto netvlan
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:netvlan
echo -n IP: && read net${net}-${vlan}/ip
echo -n Subnet mask: && read net${net}-${vlan}/netmask
echo -n Gateway: && read net${net}-${vlan}/gateway
echo -n DNS: && read dns
ifopen net${net}-${vlan}
echo Attempting chainload of ${boot_domain}...
goto menu || goto failsafe

:tftpmenu
chain tftp://${tftp-server}/local-vars.ipxe || echo ${VARS_ERR}
isset ${hostname} && chain --autofree tftp://${tftp-server}/HOSTNAME-${hostname}.ipxe || echo Custom boot by Hostname not found trying MAC...
chain --autofree tftp://${tftp-server}/MAC-${mac:hexraw}.ipxe || echo Custom boot by MAC (hexraw) not found, attempting by MAC (hexhyp)...
chain --autofree tftp://${tftp-server}/MAC-${mac:hexhyp}.ipxe || echo Custom boot by MAC (hexhyp) not found, booting default...
chain --autofree tftp://${tftp-server}/menu.ipxe || echo ${TFTP_ERR} && goto menu

:menu
{% if bootloader_https_enabled | bool %}
:menu_https
set conn_type https
goto menu_start
{% endif %}

{% if bootloader_http_enabled | bool %}
:menu_http
set conn_type http
goto menu_start
{% endif %}

:menu_start
isset ${netX/dns6} && goto menu_v6 || goto menu_v4
:menu_v6
isset ${netX/dns6_bak} && set netX/dns6 ${netX/dns6_bak} ||
set netX/dns6_bak ${netX/dns6}
echo Attempting ${conn_type} boot over IPv6...
chain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv6 failed... attempting IPv4...
clear netX/dns6
:menu_v4
echo Attempting ${conn_type} boot over IPv4...
chain --autofree ${conn_type}://${boot_domain}/menu.ipxe || echo ${conn_type} IPv4 failed...
iseq ${conn_type} https && goto menu_http || goto localboot

:localboot
exit

:retry
goto start

:reboot
reboot
goto start

:debug
echo Type "exit" to return to menu
shell
goto failsafe


================================================
FILE: roles/netbootxyz/templates/index.html.j2
================================================
#!ipxe
####       {{ boot_domain }} initial loader        ####
#### see https://netboot.xyz for more information ####
{% if bootloader_https_enabled | bool %}
set conn_type https
chain --autofree https://{{ boot_domain }}/menu.ipxe || echo HTTPS failed... attempting HTTP...
{% endif %}
{% if bootloader_http_enabled | bool %}
set conn_type http
chain --autofree http://{{ boot_domain }}/menu.ipxe || echo HTTP failed, localbooting...
{% endif %}
exit

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>{{ site_name }} BootLoaders - Powered by netboot.xyz</title>
    <meta name='description' content='Download links for available {{ site_name }} bootloaders.'>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
      table, th, td {
      padding: 5px;
      border: 1px solid black; 
      }
    </style>
  </head>
  <body>
  <div style="font-family: monospace, fixed; font-weight: bold;">
  {% if index_title.stdout is defined %}
  {{ index_title.stdout }}
  {% else %}
  <h1>{{ site_name }}</h1>
  {% endif %}
  <p>
  Version: {{ boot_version }}<br>
  Powered by <a href=https://netboot.xyz>netboot.xyz</a>
  </p>

{% if generate_disks_hybrid == true %}
  <p>x86_64 Legacy and EFI Combined iPXE Bootloaders</p>
  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.hybrid %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
  <p>Multi-arch (x86_64 and arm64) Legacy and EFI Combined iPXE Bootloaders</p>
  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.multiarch %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}

{% if generate_disks_legacy == true %}
  <p>x86_64 Legacy (PCBIOS) iPXE Bootloaders</p>
  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.legacy %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}

{% if generate_disks_efi == true %}
  <p>x86_64 UEFI iPXE Bootloaders</p>

  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.uefi %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}

{% if generate_disks_arm == true %}
  <p>ARM64 UEFI iPXE Bootloaders</p>

  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.arm %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}

{% if generate_disks_secureboot == true %}
  <p>x86_64 UEFI Secure Boot iPXE Bootloaders</p>

  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.secureboot_x86_64 %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>

{% if generate_disks_arm == true %}
  <p>ARM64 UEFI Secure Boot iPXE Bootloaders</p>

  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.secureboot_arm64 %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}
{% endif %}

{% if generate_disks_rpi == true %}
  <p>Raspberry Pi iPXE Bootloaders</p>

  <table style="width:100%">
    <!-- table header -->
    <tr>
       <th style="width:10%;"> Type </th>
       <th style="width:20%;"> Bootloader </th>
       <th style="width:70%;"> Description </th>
    </tr>
    <!-- table rows -->
    {% for item in bootloaders.rpi %}
    <tr>
       <td> {{ item.type }} </td>
       <td> <a href="ipxe/{{ bootloader_filename }}{{ item.output_bin }}">{{ bootloader_filename }}{{ item.output_bin }}</a> </td>
       <td> {{ item.desc }} </td>
    </tr>
    {% endfor %}
  </table>
{% endif %}

  <p>Checksums<p>

  <a href="ipxe/{{ site_name }}-sha256-checksums.txt">SHA256 checksums</a>
  </div>
  </body>
</html>


================================================
FILE: roles/netbootxyz/templates/local-vars.ipxe.j2
================================================
#!ipxe
### used for adding local variables before loading the menu

### set to enable enable github custom menu
#set github_user my_github_username

# 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
# Please note that this variable is always read from the local-vars.ipxe onb the tftp server the root DHCP provided
# 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
#set use_proxydhcp_settings true

### Media Locations for Licensed Distros
#set rhel_base_url http://my_rhel_mirror/rhel/
#set win_base_url http://my_windows_mirror/windows/

### Sets the local live endpoint for the users local installation
#set live_endpoint http://my_ip_address:8080

### Sets the default boot timeout
#set boot_timeout 300000


================================================
FILE: roles/netbootxyz/templates/menu/4mlinux.ipxe.j2
================================================
#!ipxe

goto ${menu} ||

:live_menu
set os 4MLinux
menu ${os} - Current Arch [ ${arch} ]
item --gap ${os} Versions
{% for key, value in endpoints.items() | sort %}
{% if value.os == "4mlinux" %}
item {{ value.version }}-{{ value.flavor }} ${space} ${os} {{ value.version }} {{ value.flavor }}
{% endif %}
{% endfor %}
choose version || goto exit
goto ${version}

{% for key, value in endpoints.items() | sort %}
{% if value.os == "4mlinux" %}
:{{ value.version }}-{{ value.flavor }}
set url ${live_endpoint}{{ value.path }}
goto boot

{% endif %}
{% endfor %}

:boot
imgfree
kernel ${url}vmlinuz root=/dev/ram0 vga=normal {{ kernel_params }} 
initrd ${url}initrd
boot

:live_exit
clear menu
exit 0


================================================
FILE: roles/netbootxyz/templates/menu/about.ipxe.j2
================================================
#!ipxe
set esc:hex 1b
set bold ${esc:string}[1m
set ital ${esc:string}[3m
set under ${esc:string}[4m
set boldoff ${esc:string}[22m
set italoff ${esc:string}[23m
set underoff ${esc:string}[24m
set fs_bla ${esc:string}[30m
set fg_red ${esc:string}[31m
set fg_gre ${esc:string}[32m
set fg_yel ${esc:string}[33m
set fg_blu ${esc:string}[34m
set fg_mag ${esc:string}[35m
set fg_cya ${esc:string}[36m
set fg_whi ${esc:string}[37m

:netabout
menu ${fg_cya}${bold}About netboot.xyz ${fg_whi}(v${version})
item about  
item about    ${fg_gre}${bold}Thanks for using netboot.xyz! We'd love to hear your feedback.
item about  
item --gap -- ${fg_whi}${bold}--- Community --------------------------------------------------------------
item about    ${fg_cya}${bold}X (Twitter):       ${fg_whi}${boldoff}@netbootxyz
item about    ${fg_mag}${bold}Discord:           ${fg_whi}${boldoff}https://discord.gg/An6PA2a
item about    ${fg_cya}${bold}GitHub Repo:       ${fg_whi}${boldoff}https://github.com/netbootxyz/netboot.xyz
item about  
item --gap -- ${fg_whi}${bold}--- Support the Project ----------------------------------------------------
item about    ${fg_gre}${bold}Open Collective:   ${fg_whi}${boldoff}https://opencollective.com/netbootxyz
item about    ${fg_gre}${bold}Github Sponsors:   ${fg_whi}${boldoff}https://github.com/sponsors/netbootxyz
item about    ${fg_yel}${bold}Official Store:    ${fg_whi}${boldoff}https://store.netboot.xyz
isset ${upstream_version} && goto display_version || goto skip_version
:display_version
item about  
iseq ${version} ${upstream_version} || item about    ${fg_yel}${bold}>>> Update available: ${fg_whi}${boldoff}${upstream_version}
:skip_version
item --gap -- ${fg_whi}${bold}-------------------------------------------------------------------------------
item exit     ${fg_cya}${bold}<-- Back to main menu
choose selected || goto exit
goto ${selected}

:about
clear menu
goto netabout

:exit
clear menu
exit



================================================
FILE: roles/netbootxyz/templates/menu/almalinux.ipxe.j2
================================================
#!ipxe

# AlmaLinux Operating System
# https://almalinux.org/

isset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${dns}
set ipparam BOOTIF=${netX/mac} ${ipparam}

goto ${menu} ||

:almalinux
clear osversion
set os {{ releases.almalinux.name }}
set os_arch ${arch}
iseq ${os_arch} x86_64 && set os_arch x86_64 ||
iseq ${os_arch} arm64 && set os_arch aarch64 ||
menu ${os} - ${os_arch}
{% for item in releases.almalinux.versions %}
item {{ item.code_name }} ${space} ${os} {{ item.name }}
{% endfor %}
isset ${osversion} || choose osversion || goto linux_menu
echo ${cls}
set dir ${almalinux_base_dir}/${osversion}/BaseOS/${os_arch}/os
set repo ${almalinux_mirror}/${dir}
goto boottype

:boottype
set ova ${os} ${osversion}
menu ${os} ${os_arch} boot type
item graphical ${ova} graphical installer
item text ${ova} text based installer
item rescue ${ova} rescue
item kickstart ${ova} set kickstart url [ ${ks_url} ]
isset ${bt} || choose bt || goto almalinux
echo ${cls}
iseq ${bt} text && goto text ||
iseq ${bt} rescue && goto rescue ||
iseq ${bt} kickstart && goto kickstart ||
iseq ${bt} kickstart_device && goto kickstart_device ||
goto bootos_images

:graphical
set install_mode inst.graphical ||
goto bootos_images

:text
set install_mode inst.text ||
goto bootos_images

:rescue
set params inst.rescue ||
goto bootos_images

:kickstart
echo -n Specify kickstart URL for ${os} ${osversion}: && read ks_url
set params inst.ks=${ks_url} ||
clear bt
goto boottype

:bootos_images
imgfree
kernel ${almalinux_mirror}/${dir}/images/pxeboot/vmlinuz inst.repo=${repo} ${install_mode} ${params} ${ipparam} {{ kernel_params }}
initrd ${almalinux_mirror}/${dir}/images/pxeboot/initrd.img
echo
echo MD5sums:
md5sum vmlinuz initrd.img
boot
goto linux_menu

:linux_menu
clear menu
exit 0


================================================
FILE: roles/netbootxyz/templates/menu/alpinelinux.ipxe.j2
================================================
#!ipxe

# Alpine Linux
# https://alpinelinux.org

isset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}::::${dns}

goto ${menu}

:alpinelinux
clear alpine_version
set os {{ releases.alpinelinux.name }}
set os_arch ${arch}
iseq ${os_arch} x86_64 && set os_arch x86_64 ||
iseq ${os_arch} i386 && set os_arch x86 ||
iseq ${os_arch} arm64 && set os_arch aarch64 ||
menu ${os} - ${os_arch}
item --gap Releases
{% for item in releases.alpinelinux.versions %}
item {{ item.code_name }} ${space} ${os} {{ item.name }}
{% endfor %}
choose alpine_version || goto alpine_exit
goto boot

:boot
set base-url ${alpinelinux_mirror}
set dir ${alpinelinux_base_dir}/${alpine_version}/releases/${os_arch}/netboot
set repo-url ${alpinelinux_mirror}/${alpinelinux_base_dir}/${alpine_version}/main
imgfree
kernel ${base-url}/${dir}/vmlinuz-lts ${ipparam} alpine_repo=${repo-url} modules=loop,squashfs modloop=${base-url}/${dir}/modloop-lts quiet nomodeset {{ kernel_params }}
initrd ${base-url}/${dir}/initramfs-lts
echo
echo MD5sums:
md5sum vmlinuz-lts initramfs-lts
boot

:alpine_exit
clear menu
exit 0


================================================
FILE: roles/netbootxyz/templates/menu/arch
Download .txt
gitextract_zt7mag3n/

├── .ansible-lint
├── .dockerignore
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   └── feature_request.md
│   └── workflows/
│       ├── claude.yml
│       ├── development.yml
│       ├── pull-requests.yml
│       ├── release-candidate.yml
│       ├── release.yml
│       └── rolling.yml
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── docker-build-root/
│   └── dumper.sh
├── endpoints.yml
├── etc/
│   └── netbootxyz/
│       └── custom/
│           ├── README.md
│           └── custom.ipxe.j2
├── renovate.json
├── roles/
│   └── netbootxyz/
│       ├── README.md
│       ├── defaults/
│       │   └── main.yml
│       ├── files/
│       │   ├── ipxe/
│       │   │   └── local/
│       │   │       ├── colour.h
│       │   │       ├── console.h
│       │   │       ├── crypto.h
│       │   │       ├── general.h
│       │   │       └── general.h.efi
│       │   └── memdisk
│       ├── meta/
│       │   └── main.yml
│       ├── tasks/
│       │   ├── generate_checksums.yml
│       │   ├── generate_disks.yml
│       │   ├── generate_disks_arm.yml
│       │   ├── generate_disks_base.yml
│       │   ├── generate_disks_efi.yml
│       │   ├── generate_disks_hybrid.yml
│       │   ├── generate_disks_legacy.yml
│       │   ├── generate_disks_linux.yml
│       │   ├── generate_disks_rpi.yml
│       │   ├── generate_disks_secureboot.yml
│       │   ├── generate_menus.yml
│       │   ├── generate_menus_custom.yml
│       │   ├── generate_signatures.yml
│       │   └── main.yml
│       ├── templates/
│       │   ├── checksums.txt.j2
│       │   ├── disks/
│       │   │   ├── autoexec.ipxe.j2
│       │   │   ├── netboot.xyz-gce.j2
│       │   │   ├── netboot.xyz-metal.j2
│       │   │   └── netboot.xyz.j2
│       │   ├── index.html.j2
│       │   ├── local-vars.ipxe.j2
│       │   ├── menu/
│       │   │   ├── 4mlinux.ipxe.j2
│       │   │   ├── about.ipxe.j2
│       │   │   ├── almalinux.ipxe.j2
│       │   │   ├── alpinelinux.ipxe.j2
│       │   │   ├── archlinux.ipxe.j2
│       │   │   ├── blackarch.ipxe.j2
│       │   │   ├── boot.cfg.j2
│       │   │   ├── bsd.ipxe.j2
│       │   │   ├── centos.ipxe.j2
│       │   │   ├── clonezilla.ipxe.j2
│       │   │   ├── coreos.ipxe.j2
│       │   │   ├── dban.ipxe.j2
│       │   │   ├── debian.ipxe.j2
│       │   │   ├── devuan.ipxe.j2
│       │   │   ├── endeavouros.ipxe.j2
│       │   │   ├── fedora.ipxe.j2
│       │   │   ├── flatcar.ipxe.j2
│       │   │   ├── freebsd.ipxe.j2
│       │   │   ├── freedos.ipxe.j2
│       │   │   ├── gentoo.ipxe.j2
│       │   │   ├── gparted.ipxe.j2
│       │   │   ├── harvester.ipxe.j2
│       │   │   ├── ipfire.ipxe.j2
│       │   │   ├── k3os.ipxe.j2
│       │   │   ├── kairos.ipxe.j2
│       │   │   ├── kali.ipxe.j2
│       │   │   ├── kaspersky.ipxe.j2
│       │   │   ├── linux-arm.ipxe.j2
│       │   │   ├── linux-i386.ipxe.j2
│       │   │   ├── linux.ipxe.j2
│       │   │   ├── live-arm.ipxe.j2
│       │   │   ├── live-backbox.ipxe.j2
│       │   │   ├── live-bluestar.ipxe.j2
│       │   │   ├── live-bodhi.ipxe.j2
│       │   │   ├── live-cachyos.ipxe.j2
│       │   │   ├── live-debian.ipxe.j2
│       │   │   ├── live-devuan.ipxe.j2
│       │   │   ├── live-elementary.ipxe.j2
│       │   │   ├── live-endeavouros.ipxe.j2
│       │   │   ├── live-fatdog.ipxe.j2
│       │   │   ├── live-fedora.ipxe.j2
│       │   │   ├── live-feren.ipxe.j2
│       │   │   ├── live-garuda.ipxe.j2
│       │   │   ├── live-grml.ipxe.j2
│       │   │   ├── live-hrmpf.ipxe.j2
│       │   │   ├── live-k3os.ipxe.j2
│       │   │   ├── live-kali.ipxe.j2
│       │   │   ├── live-kodachi.ipxe.j2
│       │   │   ├── live-lite.ipxe.j2
│       │   │   ├── live-lxle.ipxe.j2
│       │   │   ├── live-manjaro.ipxe.j2
│       │   │   ├── live-mint.ipxe.j2
│       │   │   ├── live-neon.ipxe.j2
│       │   │   ├── live-nitrux.ipxe.j2
│       │   │   ├── live-parrot.ipxe.j2
│       │   │   ├── live-peppermint.ipxe.j2
│       │   │   ├── live-popos.ipxe.j2
│       │   │   ├── live-q4os.ipxe.j2
│       │   │   ├── live-raizo.ipxe.j2
│       │   │   ├── live-regolith.ipxe.j2
│       │   │   ├── live-septor.ipxe.j2
│       │   │   ├── live-sparky.ipxe.j2
│       │   │   ├── live-tails.ipxe.j2
│       │   │   ├── live-ubuntu.ipxe.j2
│       │   │   ├── live-vanillaos.ipxe
│       │   │   ├── live-voyager.ipxe.j2
│       │   │   ├── live-zorin.ipxe.j2
│       │   │   ├── live.ipxe.j2
│       │   │   ├── lspci.ipxe.j2
│       │   │   ├── mageia.ipxe.j2
│       │   │   ├── menu.ipxe.j2
│       │   │   ├── nbxyz.ipxe.j2
│       │   │   ├── netinfo.ipxe.j2
│       │   │   ├── nixos.ipxe.j2
│       │   │   ├── openEuler.ipxe.j2
│       │   │   ├── openbsd.ipxe.j2
│       │   │   ├── opensuse.ipxe.j2
│       │   │   ├── oracle.ipxe.j2
│       │   │   ├── photon.ipxe.j2
│       │   │   ├── proxmox.ipxe.j2
│       │   │   ├── rescuezilla.ipxe.j2
│       │   │   ├── rhel.ipxe.j2
│       │   │   ├── rockylinux.ipxe.j2
│       │   │   ├── shredos.ipxe.j2
│       │   │   ├── slackware.ipxe.j2
│       │   │   ├── smartos.ipxe.j2
│       │   │   ├── systemrescue.ipxe.j2
│       │   │   ├── talos.ipxe.j2
│       │   │   ├── tinycore.ipxe.j2
│       │   │   ├── ubuntu-spins.ipxe.j2
│       │   │   ├── ubuntu.ipxe.j2
│       │   │   ├── unix.ipxe.j2
│       │   │   ├── utils-arm.ipxe.j2
│       │   │   ├── utils-efi.ipxe.j2
│       │   │   ├── utils-pcbios-32.ipxe.j2
│       │   │   ├── utils-pcbios-64.ipxe.j2
│       │   │   ├── vmware.ipxe.j2
│       │   │   ├── vyos.ipxe.j2
│       │   │   ├── windows.ipxe.j2
│       │   │   └── zeninstall.ipxe.j2
│       │   ├── pipxe/
│       │   │   ├── Makefile-rpi3.j2
│       │   │   └── Makefile-rpi4.j2
│       │   └── version.ipxe.j2
│       ├── tests/
│       │   ├── inventory
│       │   └── test.yml
│       └── vars/
│           ├── debian.yml
│           ├── main.yml
│           ├── redhat.yml
│           └── ubuntu.yml
├── script/
│   ├── build_release
│   ├── message
│   ├── netbootxyz-overrides.yml
│   ├── retrieve_certs
│   └── tag
├── site.yml
├── user_overrides.yml
└── version.txt
Condensed preview — 170 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (363K chars).
[
  {
    "path": ".ansible-lint",
    "chars": 485,
    "preview": "# .ansible-lint\nskip_list:\n  - '208'\n  - command-instead-of-module  # Using command rather than module.\n  - command-inst"
  },
  {
    "path": ".dockerignore",
    "chars": 5,
    "preview": ".git\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 47,
    "preview": "github: netbootxyz\nopen_collective: netbootxyz\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 751,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: 'bug'\nassignees: ''\n\n---\n\n[]: This bug "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 384,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question in the Discussions area\n    url: https://github.com/"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 642,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**"
  },
  {
    "path": ".github/workflows/claude.yml",
    "chars": 1088,
    "preview": "name: Claude PR Assistant\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]"
  },
  {
    "path": ".github/workflows/development.yml",
    "chars": 1503,
    "preview": "name: development\n\non:\n  push:\n    branches:\n      - development\n  workflow_dispatch:\n\nenv:\n  DISCORD_HOOK_URL: ${{ secr"
  },
  {
    "path": ".github/workflows/pull-requests.yml",
    "chars": 1008,
    "preview": "name: pull-requests\n\non:\n  pull_request:\n    branches:\n      - development\n      - RC\n      - master\n\njobs:\n  test-pr:\n "
  },
  {
    "path": ".github/workflows/release-candidate.yml",
    "chars": 2537,
    "preview": "name: release-candidate\n\non:\n  push:\n    branches:\n      - RC\n  workflow_dispatch:\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2321,
    "preview": "name: release\n\non:\n  push:\n    branches:\n      - master\n\nenv:\n  DISCORD_HOOK_URL: ${{ secrets.DISCORD_HOOK_URL }}\n  GITH"
  },
  {
    "path": ".github/workflows/rolling.yml",
    "chars": 2125,
    "preview": "name: rolling\n\non:\n  workflow_dispatch:\n  # Disabled automatic rolling releases during version updates\n  # push:\n  #   p"
  },
  {
    "path": "AGENTS.md",
    "chars": 7587,
    "preview": "# AGENTS.md\n\nGuidelines for AI coding agents working in the netboot.xyz repository.\n\n## Project Summary\n\nnetboot.xyz gen"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 20158,
    "preview": "<!-- markdownlint-configure-file {\"MD024\": { \"siblings_only\": true } } -->\n# Changelog\n\nAll notable changes to this proj"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3624,
    "preview": "# Contributing to netboot.xyz\n\nFirst of all, thank you for supporting the netboot.xyz community and for \nconsidering con"
  },
  {
    "path": "Dockerfile",
    "chars": 552,
    "preview": "ARG NBXYZ_OVERRIDES=default\n\nFROM ghcr.io/netbootxyz/builder:latest AS builder\n\n# repo for build\nCOPY . /ansible\n\nFROM b"
  },
  {
    "path": "LICENSE",
    "chars": 10143,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 12451,
    "preview": "## netboot.xyz [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/inten"
  },
  {
    "path": "docker-build-root/dumper.sh",
    "chars": 624,
    "preview": "#! /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 "
  },
  {
    "path": "endpoints.yml",
    "chars": 35526,
    "preview": "endpoints:\n  kali-xfce-squash:\n    path: /debian-squash/releases/download/2025.4-f03c4b56/\n    files:\n    - filesystem.s"
  },
  {
    "path": "etc/netbootxyz/custom/README.md",
    "chars": 945,
    "preview": "# Custom Menus for Self Hosted netboot.xyz\n\nThis directory contains custom iPXE files that are rendered\nduring menu gene"
  },
  {
    "path": "etc/netbootxyz/custom/custom.ipxe.j2",
    "chars": 813,
    "preview": "#!ipxe\n###\n### {{ site_name }} custom menu example\n###\n\n:custom\nclear custom_choice\nmenu This is a Test Menu\nitem --gap "
  },
  {
    "path": "renovate.json",
    "chars": 356,
    "preview": "{\n  \"extends\": [\n    \"config:recommended\"\n  ],\n  \"regexManagers\": [\n    {\n      \"fileMatch\": [\"^\\\\.github\\\\/workflows\\\\/"
  },
  {
    "path": "roles/netbootxyz/README.md",
    "chars": 1344,
    "preview": "Ansible role: netbootxyz\n========================\n\nUses Ansible to generate a self hosted environment of netboot.xyz for"
  },
  {
    "path": "roles/netbootxyz/defaults/main.yml",
    "chars": 26562,
    "preview": "boot_domain: boot.netboot.xyz\nboot_timeout: 300000\nboot_version: 3.x\nbootloader_disks:\n- netboot.xyz\nbootloader_http_ena"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/colour.h",
    "chars": 807,
    "preview": "#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#u"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/console.h",
    "chars": 63,
    "preview": "#define\tCONSOLE_FRAMEBUFFER\t/* Graphical framebuffer console */"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/crypto.h",
    "chars": 18,
    "preview": "#undef OCSP_CHECK\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/general.h",
    "chars": 1159,
    "preview": "#define CERT_CMD              /* Certificate management commands */\n#define CONSOLE_CMD           /* Console command */\n"
  },
  {
    "path": "roles/netbootxyz/files/ipxe/local/general.h.efi",
    "chars": 1115,
    "preview": "#define CERT_CMD              /* Certificate management commands */\n#define CONSOLE_CMD           /* Console command */\n"
  },
  {
    "path": "roles/netbootxyz/meta/main.yml",
    "chars": 305,
    "preview": "galaxy_info:\n  author: Antony Messerli\n  description: Installs a self hosted version of netboot.xyz\n  license: Apache-2."
  },
  {
    "path": "roles/netbootxyz/tasks/generate_checksums.yml",
    "chars": 1134,
    "preview": "---\n- name: Register a listing of all created iPXE bootloaders\n  ansible.builtin.shell: ls -p -I {{ checksums_filename }"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks.yml",
    "chars": 1566,
    "preview": "---\n\n- name: Set up iPXE build environment\n  ansible.builtin.include_tasks: generate_disks_base.yml\n\n- name: Generate le"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_arm.yml",
    "chars": 2427,
    "preview": "---\n\n- name: Copy netboot.xyz local EFI iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: "
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_base.yml",
    "chars": 2632,
    "preview": "---\n\n- name: Gathering facts\n  ansible.builtin.setup:\n\n- name: Gather variables for each operating system\n  ansible.buil"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_efi.yml",
    "chars": 2774,
    "preview": "---\n\n- name: Copy netboot.xyz local EFI iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    dest: "
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_hybrid.yml",
    "chars": 3199,
    "preview": "---\n\n- name: Generate hybrid ISO x86_64 image\n  ansible.builtin.shell: |\n    ./util/genfsimg -o {{ netbootxyz_root }}/ip"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_legacy.yml",
    "chars": 2445,
    "preview": "---\n\n- name: Copy netboot.xyz local legacy iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    des"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_linux.yml",
    "chars": 1780,
    "preview": "---\n\n- name: Copy netboot.xyz local legacy iPXE configs\n  ansible.builtin.copy:\n    src: \"ipxe/local/{{ item }}\"\n    des"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_rpi.yml",
    "chars": 2019,
    "preview": "---\n- name: Install required packages\n  ansible.builtin.package:\n    name: \"{{ item }}\"\n    state: present\n  with_items:"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_disks_secureboot.yml",
    "chars": 3901,
    "preview": "---\n\n- name: Create Secure Boot output directories\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n "
  },
  {
    "path": "roles/netbootxyz/tasks/generate_menus.yml",
    "chars": 2600,
    "preview": "---\n- name: Combine overrides with release defaults\n  ansible.builtin.set_fact:\n    _releases: \"{{ releases | combine(re"
  },
  {
    "path": "roles/netbootxyz/tasks/generate_menus_custom.yml",
    "chars": 464,
    "preview": "---\n\n- name: Generate directories\n  ansible.builtin.file:\n    path: \"{{ item }}\"\n    state: directory\n  with_items:\n    "
  },
  {
    "path": "roles/netbootxyz/tasks/generate_signatures.yml",
    "chars": 670,
    "preview": "---\n- name: Gather list of source files\n  ansible.builtin.command: ls {{ netbootxyz_root }}\n  register: source_files\n\n- "
  },
  {
    "path": "roles/netbootxyz/tasks/main.yml",
    "chars": 888,
    "preview": "---\n\n- name: Print Bootloader Disks to Build\n  ansible.builtin.debug:\n    var: bootloader_disks\n\n- name: Generate menus\n"
  },
  {
    "path": "roles/netbootxyz/templates/checksums.txt.j2",
    "chars": 213,
    "preview": "# {{ site_name }} bootloaders generated at {{ current_date.stdout }}\n# iPXE Commit: {{ ipxe_repo }}/commit/{{ ipxe_git_c"
  },
  {
    "path": "roles/netbootxyz/templates/disks/autoexec.ipxe.j2",
    "chars": 2574,
    "preview": "#!ipxe\n#\n# {{ site_name }} - Secure Boot autoexec.ipxe\n#\n# This script is loaded automatically by iPXE v2.0.0+ Secure Bo"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz-gce.j2",
    "chars": 2405,
    "preview": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_cya ${"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz-metal.j2",
    "chars": 2441,
    "preview": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_red ${"
  },
  {
    "path": "roles/netbootxyz/templates/disks/netboot.xyz.j2",
    "chars": 5982,
    "preview": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset boldoff ${esc:string}[22m\nset fg_gre ${esc:string}[32m\nset fg_cya ${"
  },
  {
    "path": "roles/netbootxyz/templates/index.html.j2",
    "chars": 6246,
    "preview": "#!ipxe\n####       {{ boot_domain }} initial loader        ####\n#### see https://netboot.xyz for more information ####\n{%"
  },
  {
    "path": "roles/netbootxyz/templates/local-vars.ipxe.j2",
    "chars": 922,
    "preview": "#!ipxe\n### used for adding local variables before loading the menu\n\n### set to enable enable github custom menu\n#set git"
  },
  {
    "path": "roles/netbootxyz/templates/menu/4mlinux.ipxe.j2",
    "chars": 698,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os 4MLinux\nmenu ${os} - Current Arch [ ${arch} ]\nitem --gap ${os} Versions\n{% fo"
  },
  {
    "path": "roles/netbootxyz/templates/menu/about.ipxe.j2",
    "chars": 1945,
    "preview": "#!ipxe\nset esc:hex 1b\nset bold ${esc:string}[1m\nset ital ${esc:string}[3m\nset under ${esc:string}[4m\nset boldoff ${esc:s"
  },
  {
    "path": "roles/netbootxyz/templates/menu/almalinux.ipxe.j2",
    "chars": 1838,
    "preview": "#!ipxe\n\n# AlmaLinux Operating System\n# https://almalinux.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ippara"
  },
  {
    "path": "roles/netbootxyz/templates/menu/alpinelinux.ipxe.j2",
    "chars": 1121,
    "preview": "#!ipxe\n\n# Alpine Linux\n# https://alpinelinux.org\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::$"
  },
  {
    "path": "roles/netbootxyz/templates/menu/archlinux.ipxe.j2",
    "chars": 1973,
    "preview": "#!ipxe\n\n# Arch Linux Operating System\n# http://www.archlinux.org\n\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_a"
  },
  {
    "path": "roles/netbootxyz/templates/menu/blackarch.ipxe.j2",
    "chars": 759,
    "preview": "#!ipxe\n\n# BlackArch Linux Operating System\n# https://blackarch.org/\n\ngoto ${menu}\n\n:blackarch\nset os {{ releases.blackar"
  },
  {
    "path": "roles/netbootxyz/templates/menu/boot.cfg.j2",
    "chars": 3145,
    "preview": "#!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"
  },
  {
    "path": "roles/netbootxyz/templates/menu/bsd.ipxe.j2",
    "chars": 780,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:bsd_menu\n\nmenu BSD Installers - Current Arch [ ${arch} ]\n\n# BSD based systems\nitem --gap BSD B"
  },
  {
    "path": "roles/netbootxyz/templates/menu/centos.ipxe.j2",
    "chars": 1803,
    "preview": "#!ipxe\n\n# CentOS Stream\n# http://www.centos.org\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${"
  },
  {
    "path": "roles/netbootxyz/templates/menu/clonezilla.ipxe.j2",
    "chars": 1441,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch amd64 ||\niseq ${os_arch} i"
  },
  {
    "path": "roles/netbootxyz/templates/menu/coreos.ipxe.j2",
    "chars": 2049,
    "preview": "#!ipxe\n\n# Fedora CoreOS\n# https://getfedora.org/coreos/\n# https://github.com/coreos/coreos-installer/blob/master/README."
  },
  {
    "path": "roles/netbootxyz/templates/menu/dban.ipxe.j2",
    "chars": 1238,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:dban_menu\nmenu DBAN {{ endpoints.dban.version }} (Darik's Boot and Nuke)\nset kernel_url ${live"
  },
  {
    "path": "roles/netbootxyz/templates/menu/debian.ipxe.j2",
    "chars": 2583,
    "preview": "#!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 "
  },
  {
    "path": "roles/netbootxyz/templates/menu/devuan.ipxe.j2",
    "chars": 1932,
    "preview": "#!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 "
  },
  {
    "path": "roles/netbootxyz/templates/menu/endeavouros.ipxe.j2",
    "chars": 722,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os EndeavourOS\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\ni"
  },
  {
    "path": "roles/netbootxyz/templates/menu/fedora.ipxe.j2",
    "chars": 2209,
    "preview": "#!ipxe\n\n# Fedora Operating System\n# https://getfedora.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam i"
  },
  {
    "path": "roles/netbootxyz/templates/menu/flatcar.ipxe.j2",
    "chars": 1467,
    "preview": "#!ipxe\n\n# Flatcar Container Linux\n# https://flatcar-linux.org/\n# For further info on:\n# iPXE and flatcar Container Linux"
  },
  {
    "path": "roles/netbootxyz/templates/menu/freebsd.ipxe.j2",
    "chars": 1086,
    "preview": "#!ipxe\n\n# FreeBSD Operating System\n# http://www.freebsd.org\n\n:freebsd_menu\nset os {{ releases.freebsd.name }}\nmenu ${os}"
  },
  {
    "path": "roles/netbootxyz/templates/menu/freedos.ipxe.j2",
    "chars": 500,
    "preview": "#!ipxe\n\n# FreeDOS Operating System\n# http://www.freedos.org\n\n:freedos_menu\nset os {{ releases.freedos.name }}\nmenu ${os}"
  },
  {
    "path": "roles/netbootxyz/templates/menu/gentoo.ipxe.j2",
    "chars": 1085,
    "preview": "#!ipxe\n\n# Gentoo Operating System\n# http://www.gentoo.org\n\n:gentoo\nclear gentoo_version\nset os {{ releases.gentoo.name }"
  },
  {
    "path": "roles/netbootxyz/templates/menu/gparted.ipxe.j2",
    "chars": 789,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os GParted Live\nmenu ${os} - Current Arch [ ${arch} ]\nitem --gap ${os} Versions\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/harvester.ipxe.j2",
    "chars": 1574,
    "preview": "#!ipxe\n\n# Harvester\n# https://harvesterhci.io/\n# https://docs.harvesterhci.io/v1.0/install/pxe-boot-install/\n\ngoto ${men"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ipfire.ipxe.j2",
    "chars": 597,
    "preview": "#!ipxe\n\n# IPFire\n# https://www.ipfire.org/\n\ngoto ${menu} ||\n\n:ipfire\nclear osversion\nset os {{ releases.ipfire.name }}\nm"
  },
  {
    "path": "roles/netbootxyz/templates/menu/k3os.ipxe.j2",
    "chars": 2335,
    "preview": "#!ipxe\n\n# k3OS by Rancher\n# https://k3os.io/\n# https://github.com/rancher/k3os#configuration-reference\n\ngoto ${menu} ||\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kairos.ipxe.j2",
    "chars": 3699,
    "preview": "#!ipxe\n\n# Kairos\n# https://github.com/kairos-io/kairos/releases\n\ngoto ${menu} ||\n\n:kairos\n#set os {{ releases.kairos.nam"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kali.ipxe.j2",
    "chars": 946,
    "preview": "#!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}\ni"
  },
  {
    "path": "roles/netbootxyz/templates/menu/kaspersky.ipxe.j2",
    "chars": 789,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kaspersky Rescue Disk\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value "
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux-arm.ipxe.j2",
    "chars": 993,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Popular Linux Operating"
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux-i386.ipxe.j2",
    "chars": 633,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Popular Linux Operating"
  },
  {
    "path": "roles/netbootxyz/templates/menu/linux.ipxe.j2",
    "chars": 642,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:linux_menu\nmenu Linux Installers - Current Arch [ ${arch} ]\nitem --gap Linux Distros:\n{% for k"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-arm.ipxe.j2",
    "chars": 497,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nmenu Live Boot Distributions - Current Arch [ ${arch} ]\nitem --gap Live Boot Distrib"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-backbox.ipxe.j2",
    "chars": 925,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os BackBox\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.i"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-bluestar.ipxe.j2",
    "chars": 850,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Bluestar\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-bodhi.ipxe.j2",
    "chars": 797,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Bodhi\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.ite"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-cachyos.ipxe.j2",
    "chars": 1001,
    "preview": "#!ipxe\n\n# CachyOS Operating System\n# https://cachyos.org\n\ngoto ${menu} ||\n\n:live_menu\nset os CachyOS\nmenu ${os}\nset ippa"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-debian.ipxe.j2",
    "chars": 1146,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Debian Live\nmenu ${os}\nitem --gap ${os} Versions\nitem trixie ${space} ${os} 1"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-devuan.ipxe.j2",
    "chars": 791,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Devuan\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.it"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-elementary.ipxe.j2",
    "chars": 911,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os elementary OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpo"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-endeavouros.ipxe.j2",
    "chars": 902,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os EndeavourOS\nmenu ${os}\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\ni"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-fatdog.ipxe.j2",
    "chars": 619,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Fatdog64\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints."
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-fedora.ipxe.j2",
    "chars": 1317,
    "preview": "#!ipxe\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${d"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-feren.ipxe.j2",
    "chars": 757,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Feren OS Live\nmenu ${os}\nitem --gap ${os} Versions\nitem current ${space} ${os"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-garuda.ipxe.j2",
    "chars": 951,
    "preview": "#!ipxe\n\n# Garuda Linux\n# https://garudalinux.org/\n\ngoto ${menu} ||\n\n:live-garuda\nset os Garuda\nmenu ${os} Live\nset ippar"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-grml.ipxe.j2",
    "chars": 1000,
    "preview": "#!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 "
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-hrmpf.ipxe.j2",
    "chars": 976,
    "preview": "#!ipxe\n\n# hrmpf\n# https://github.com/leahneukirchen/hrmpf/\n\ngoto ${menu} ||\n\n:live-hrmpf\nclear hrmpf_version\nset os hrmp"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-k3os.ipxe.j2",
    "chars": 1582,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os {{ releases.k3os.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-kali.ipxe.j2",
    "chars": 750,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kali Linux\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoint"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-kodachi.ipxe.j2",
    "chars": 744,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Kodachi\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.i"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-lite.ipxe.j2",
    "chars": 630,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Linux Lite\nmenu ${os}\nitem --gap Use the username linuxlite with a blank pass"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-lxle.ipxe.j2",
    "chars": 735,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os LXLE\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.item"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-manjaro.ipxe.j2",
    "chars": 1127,
    "preview": "#!ipxe\n\n:live_menu\nset os Manjaro\nmenu ${os} Live\nset ipparam BOOTIF=${netX/mac} ip=dhcp net.ifnames=0\nitem --gap ${os} "
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-mint.ipxe.j2",
    "chars": 2525,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Mint Live\nmenu ${os}\nitem --gap ${os} Versions\nitem 21 ${space} ${os} 21\nitem"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-neon.ipxe.j2",
    "chars": 540,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os KDE Neon\nmenu ${os}\nitem --gap ${os} Versions\nitem user ${space} ${os} User\nc"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-nitrux.ipxe.j2",
    "chars": 741,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Nitrux\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.it"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-parrot.ipxe.j2",
    "chars": 778,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Parrot OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-peppermint.ipxe.j2",
    "chars": 792,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Peppermint\nmenu ${os}\nitem --gap ${os} Versions\nitem 10 ${space} ${os} 10\ncho"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-popos.ipxe.j2",
    "chars": 1954,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Pop os Live\nmenu ${os}\nitem --gap ${os} Versions\nitem jammy ${space} ${os} 22"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-q4os.ipxe.j2",
    "chars": 1281,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Q4OS Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-raizo.ipxe.j2",
    "chars": 720,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Live Raizo\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoint"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-regolith.ipxe.j2",
    "chars": 561,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Regolith\nmenu ${os}\nitem --gap ${os} Versions\nitem current ${space} ${os} Cur"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-septor.ipxe.j2",
    "chars": 718,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Septor\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoints.it"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-sparky.ipxe.j2",
    "chars": 1301,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os SparkyLinux Live\nmenu ${os}\nitem --gap ${os} Versions\nitem stable ${space} ${"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-tails.ipxe.j2",
    "chars": 1145,
    "preview": "#!ipxe\n\n# Tails Operating System\n# https://tails.boum.org/\n\ngoto ${menu} ||\n\n:live-tails\nclear tails_version\nset os Tail"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-ubuntu.ipxe.j2",
    "chars": 1506,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Ubuntu Live\nmenu ${os}\nitem --gap ${os} Versions\nitem jammy ${space} ${os} 22"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-vanillaos.ipxe",
    "chars": 807,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Vanilla OS\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoint"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-voyager.ipxe.j2",
    "chars": 908,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Voyager Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoi"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live-zorin.ipxe.j2",
    "chars": 1275,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Zorin Live\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoint"
  },
  {
    "path": "roles/netbootxyz/templates/menu/live.ipxe.j2",
    "chars": 1754,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nmenu Live Boot Distributions - Current Arch [ ${arch} ]\nitem --gap Live Boot Distrib"
  },
  {
    "path": "roles/netbootxyz/templates/menu/lspci.ipxe.j2",
    "chars": 736,
    "preview": "#!ipxe\n\n# gather pci devices and list them\nclear addr\npciscan addr && goto pciscan_found ||\necho No PCI devices found..."
  },
  {
    "path": "roles/netbootxyz/templates/menu/mageia.ipxe.j2",
    "chars": 1063,
    "preview": "#!ipxe\n\n# Mageia Operating System\n# http://www.mageia.org/\n\n# No way to set the network interface by MAC address, let th"
  },
  {
    "path": "roles/netbootxyz/templates/menu/menu.ipxe.j2",
    "chars": 4579,
    "preview": "#!ipxe\n{% if early_menu_enabled -%}\n{{ early_menu_contents }}\n{%- endif %}\n\n:start\nisset ${arch} && goto skip_arch_detec"
  },
  {
    "path": "roles/netbootxyz/templates/menu/nbxyz.ipxe.j2",
    "chars": 1101,
    "preview": "#!ipxe\n\n# netboot.xyz endpoints\n# used for accessing the latest internet build menus\ngoto ${menu} ||\n\n:nbxyz\nset os netb"
  },
  {
    "path": "roles/netbootxyz/templates/menu/netinfo.ipxe.j2",
    "chars": 949,
    "preview": "#!ipxe\n\nmenu Network info\nitem --gap MAC:\nitem mac ${space} ${netX/mac}\nitem --gap IP/mask:\nitem ip ${space} ${netX/ip}/"
  },
  {
    "path": "roles/netbootxyz/templates/menu/nixos.ipxe.j2",
    "chars": 553,
    "preview": "#!ipxe\n\n# NixOS\n# https://nixos.org/\n\nset os {{ releases.nixos.name }}\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set"
  },
  {
    "path": "roles/netbootxyz/templates/menu/openEuler.ipxe.j2",
    "chars": 1667,
    "preview": "#!ipxe\n\n# openEuler\n# https://openeuler.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gat"
  },
  {
    "path": "roles/netbootxyz/templates/menu/openbsd.ipxe.j2",
    "chars": 966,
    "preview": "#!ipxe\n\n# OpenBSD Operating System\n# http://www.openbsd.org\n\n:openbsd_menu\nset os {{ releases.openbsd.name }}\nset os_arc"
  },
  {
    "path": "roles/netbootxyz/templates/menu/opensuse.ipxe.j2",
    "chars": 3779,
    "preview": "#!ipxe\n\n# openSUSE Operating System\n# http://opensuse.org\n\nisset ${dhcp-server} || goto static_ip\nset netsetup netsetup="
  },
  {
    "path": "roles/netbootxyz/templates/menu/oracle.ipxe.j2",
    "chars": 1717,
    "preview": "#!ipxe\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${gateway}:${netmask}:::none nameserver=${d"
  },
  {
    "path": "roles/netbootxyz/templates/menu/photon.ipxe.j2",
    "chars": 1431,
    "preview": "#!ipxe\n\n# VMware Photon\n# https://vmware.github.io/photon/\n\ngoto ${menu} ||\n\n:photon\nset os {{ releases.photon.name }}\ns"
  },
  {
    "path": "roles/netbootxyz/templates/menu/proxmox.ipxe.j2",
    "chars": 3842,
    "preview": "#!ipxe\n\n# Proxmox Open Source Products\n# https://www.proxmox.com\n\ngoto ${menu} ||\n\n:proxmox\nclear proxmox_choice\nclear p"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rescuezilla.ipxe.j2",
    "chars": 790,
    "preview": "#!ipxe\n\n# Rescuezilla Disk imaging\n# https://rescuezilla.com/\n\n:rescuezilla\nset os {{ utilitiesefi.rescuezilla.name }}\nm"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rhel.ipxe.j2",
    "chars": 1553,
    "preview": "#!ipxe\n\n# Redhat Enterprise Linux (RHEL)\n# https://www.redhat.com\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ip"
  },
  {
    "path": "roles/netbootxyz/templates/menu/rockylinux.ipxe.j2",
    "chars": 1776,
    "preview": "#!ipxe\n\n# Rocky Linux\n# https://rockylinux.org/\n\nisset ${dhcp-server} && set ipparam ip=dhcp || set ipparam ip=${ip}::${"
  },
  {
    "path": "roles/netbootxyz/templates/menu/shredos.ipxe.j2",
    "chars": 1424,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:shredos\nset os_arch ${arch}\niseq ${os_arch} x86_64 && set os_arch x86_64 ||\niseq ${os_arch} i3"
  },
  {
    "path": "roles/netbootxyz/templates/menu/slackware.ipxe.j2",
    "chars": 814,
    "preview": "#!ipxe\n\n# Slackware Operating System\n# http://www.slackware.com\n\ngoto ${menu}\n\n:slackware\nset os slackware\niseq ${arch} "
  },
  {
    "path": "roles/netbootxyz/templates/menu/smartos.ipxe.j2",
    "chars": 2479,
    "preview": "#!ipxe\n######################################\n# SmartOS                            #\n# https://www.smartos.org/         "
  },
  {
    "path": "roles/netbootxyz/templates/menu/systemrescue.ipxe.j2",
    "chars": 1333,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os System Rescue\nset os_arch ${arch}\nisset ${rootpass_enabled} || set rootpass_e"
  },
  {
    "path": "roles/netbootxyz/templates/menu/talos.ipxe.j2",
    "chars": 3029,
    "preview": "#!ipxe\n\n# Talos\n# https://github.com/siderolabs/talos/releases\n# https://www.talos.dev/v1.6/talos-guides/install/bare-me"
  },
  {
    "path": "roles/netbootxyz/templates/menu/tinycore.ipxe.j2",
    "chars": 1191,
    "preview": "#!ipxe\n\n# Tiny Core Linux\n# http://tinycorelinux.net/downloads.html\n\nset tinycore_mirror {{ releases.tinycore.mirror }}\n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ubuntu-spins.ipxe.j2",
    "chars": 733,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:live_menu\nset os Ubuntu Spins\nmenu ${os}\nitem --gap ${os} Versions\n{% for key, value in endpoi"
  },
  {
    "path": "roles/netbootxyz/templates/menu/ubuntu.ipxe.j2",
    "chars": 5660,
    "preview": "#!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"
  },
  {
    "path": "roles/netbootxyz/templates/menu/unix.ipxe.j2",
    "chars": 608,
    "preview": "#!ipxe\n\ngoto ${menu} ||\n\n:unix_menu\nmenu Unix Installers\nitem --gap Unix Distros:\n{% for key, value in releases.items() "
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-arm.ipxe.j2",
    "chars": 927,
    "preview": "#!ipxe\n\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiesarm.items() | sort(attribute='1.name') %}\n{% "
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-efi.ipxe.j2",
    "chars": 2141,
    "preview": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiesefi.items() | sort(attribute='1.n"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-pcbios-32.ipxe.j2",
    "chars": 2816,
    "preview": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiespcbios32.items() | sort(attribute"
  },
  {
    "path": "roles/netbootxyz/templates/menu/utils-pcbios-64.ipxe.j2",
    "chars": 2816,
    "preview": "#!ipxe\n\n:utils_menu\nmenu Utilities\nitem --gap Utilities:\n{% for key, value in utilitiespcbios64.items() | sort(attribute"
  },
  {
    "path": "roles/netbootxyz/templates/menu/vmware.ipxe.j2",
    "chars": 1662,
    "preview": "#!ipxe\n\n# VMware ESXi\n# https://www.vmware.com\n\ngoto ${menu} ||\n\n:vmware\nset os VMware ESXi\nclear vmware_choice\nmenu ${o"
  },
  {
    "path": "roles/netbootxyz/templates/menu/vyos.ipxe.j2",
    "chars": 656,
    "preview": "#!ipxe\n\n# VyOS\n# https://vyos.io\n\ngoto ${menu}\n\n:vyos\nset os {{ releases.vyos.name }}\nmenu ${os} Installers\nitem --gap O"
  },
  {
    "path": "roles/netbootxyz/templates/menu/windows.ipxe.j2",
    "chars": 1715,
    "preview": "#!ipxe\n\n# Microsoft Windows\n# https://www.microsoft.com\n\nset win_arch x64\ngoto ${menu} ||\n\n:windows\nset os Microsoft Win"
  },
  {
    "path": "roles/netbootxyz/templates/menu/zeninstall.ipxe.j2",
    "chars": 738,
    "preview": "#!ipxe\n\n# Zen Installer for Arch\n# https://sourceforge.net/projects/revenge-installer/\n\n:zen\nset os {{ releases.zeninsta"
  },
  {
    "path": "roles/netbootxyz/templates/pipxe/Makefile-rpi3.j2",
    "chars": 2031,
    "preview": "FW_URL\t\t:= https://github.com/raspberrypi/firmware/branches/stable/boot\nSHELL\t\t:= /bin/bash\nEFI_BUILD\t:= RELEASE\nEFI_ARC"
  },
  {
    "path": "roles/netbootxyz/templates/pipxe/Makefile-rpi4.j2",
    "chars": 2031,
    "preview": "FW_URL\t\t:= https://github.com/raspberrypi/firmware/branches/stable/boot\nSHELL\t\t:= /bin/bash\nEFI_BUILD\t:= RELEASE\nEFI_ARC"
  },
  {
    "path": "roles/netbootxyz/templates/version.ipxe.j2",
    "chars": 94,
    "preview": "#!ipxe\n{% if upstream_version %}\nset upstream_version {{ upstream_version }}\n{% endif %}\nexit\n"
  },
  {
    "path": "roles/netbootxyz/tests/inventory",
    "chars": 10,
    "preview": "localhost\n"
  },
  {
    "path": "roles/netbootxyz/tests/test.yml",
    "chars": 69,
    "preview": "---\n- hosts: localhost\n  remote_user: root\n  roles:\n    - netbootxyz\n"
  },
  {
    "path": "roles/netbootxyz/vars/debian.yml",
    "chars": 282,
    "preview": "---\nnetbootxyz_packages:\n  - apache2\n  - binutils-dev\n  - binutils-aarch64-linux-gnu\n  - dosfstools\n  - figlet\n  - gcc-a"
  },
  {
    "path": "roles/netbootxyz/vars/main.yml",
    "chars": 4,
    "preview": "---\n"
  },
  {
    "path": "roles/netbootxyz/vars/redhat.yml",
    "chars": 165,
    "preview": "---\nnetbootxyz_packages:\n  - dosfstools\n  - figlet\n  - gcc\n  - genisoimage\n  - git\n  - httpd\n  - libslirp-devel\n  - mini"
  },
  {
    "path": "roles/netbootxyz/vars/ubuntu.yml",
    "chars": 473,
    "preview": "---\nnetbootxyz_packages:\n  - apache2\n  - binutils-dev\n  - binutils-aarch64-linux-gnu\n  - dosfstools\n  - figlet\n  - gcc-a"
  },
  {
    "path": "script/build_release",
    "chars": 2438,
    "preview": "#!/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"
  },
  {
    "path": "script/message",
    "chars": 1584,
    "preview": "#!/bin/bash\nset -e\n\nTYPE=$1\n\nif [ \"${TYPE}\" == \"dev-push\" ]; then\n  BOOT_URL=\"https://s3.amazonaws.com/dev.boot.netboot."
  },
  {
    "path": "script/netbootxyz-overrides.yml",
    "chars": 677,
    "preview": "---\nsigs_menu: true\nsigs_enabled: true\ngenerate_disks_arm: true\ngenerate_disks_hybrid: true\ngenerate_disks_linux: true\ng"
  },
  {
    "path": "script/retrieve_certs",
    "chars": 376,
    "preview": "#!/bin/bash\nset -e\n\n# retrieve certs\ngit clone https://$GIT_USER:$GIT_AUTH@$GIT_URL certs\necho \"Retrieved certs from rep"
  },
  {
    "path": "script/tag",
    "chars": 398,
    "preview": "#! /bin/bash\n\n# if tag exists append random string to it\nCODE=$(curl -s -o /dev/null -I -w \"%{http_code}\" https://api.gi"
  },
  {
    "path": "site.yml",
    "chars": 121,
    "preview": "---\n- hosts: localhost\n  user: root\n  roles:\n    - netbootxyz\n  vars_files:\n    - endpoints.yml\n    - user_overrides.yml"
  },
  {
    "path": "user_overrides.yml",
    "chars": 1108,
    "preview": "---\n\n# overrides defaults in netbootxyz role\ngenerate_menus: true\ngenerate_disks: true\ngenerate_checksums: true\ngenerate"
  },
  {
    "path": "version.txt",
    "chars": 6,
    "preview": "3.0.0\n"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the netbootxyz/netboot.xyz GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 170 files (329.2 KB), approximately 104.9k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!