{% extends "ui/_layout.html" %} {% block title %}Netboot artifacts - bty-web{% endblock %} {% block subnav %} {# Three jump links: artifacts inventory (with live fetch UI), TFTP daemon control, recent activity. v0.41.2+: the old /ui/downloads page collapsed into here since the only downloads bty-web does are netboot artifacts. #} {% endblock %} {% block intro %} {% from "ui/_intro_box.html" import render as intro_box %} {% call intro_box() %} The bty live env PXE clients chain into when their assignment has boot_mode=bty-flash-always. Trigger a fetch from the artifacts header to pull the kernel + initrd + squashfs + sha256 manifest for tag {{ netboot_tag }} from {{ netboot_repo }}; rows below tick from missing to present as each file lands. The TFTP daemon panel is purely observational; the router-side DHCP / PXE cheatsheet lives on the Settings page. {% endcall %} {% endblock %} {% block content %}
Netboot artifacts refreshing... {# Fetch artifacts: enqueues the netboot trio + sha256 manifest. The release tag is an editable magic value (Settings -> Upstream sources). Disabled when all four files are already cached on disk; re-enables when one disappears (operator ``rm``, state-dir migrate, etc.). #}
{% for a in artifacts %} {% endfor %}
File Status Size SHA256 Last fetched Action
{{ a.name }} {% if a.present %} present {% else %} missing {% endif %} {% if a.size is not none %} {{ "{:,}".format(a.size) }} bytes {% else %} - {% endif %} {% set sha = artifact_shas.get(a.name) %} {% if sha %} {{ sha[:12] }}... {% else %} - {% endif %} {% if a.mtime %} {{ a.mtime | fmt_ts }} {% else %} - {% endif %} {% if a.present %} {% else %} - {% endif %}
{# Active fetch jobs (release-tag rows, one progress bar per artifact). Hidden when no fetch is in flight; appears when "Fetch artifacts" is clicked. Cancel re-arms the trigger button. #}
Active fetches
Item Status Progress Bytes Action
No active fetches.
{# TFTP daemon: observational only. Lifecycle (start / stop / restart) belongs to systemd or Podman, not the web UI. The card just surfaces what bty-web can see: the local ``dnsmasq.service`` state, what that state implies, and where to look next. #}
TFTP daemon

Network probe

Target {{ tftp_probe.host }}:{{ tftp_probe.port }}
Reachable {% if tftp_probe.reachable %} yes {% else %} no {% endif %}
{{ tftp_probe.filename }} present {% if tftp_probe.file_present %} yes {% elif tftp_probe.reachable %} missing {% else %} unknown {% endif %}
Detail {{ tftp_probe.detail or "-" }}

{% if tftp_probe.ok %} The TFTP server at {{ tftp_probe.host }}:{{ tftp_probe.port }} is up and serves the UEFI iPXE bootfile -- PXE clients on this subnet should chainload successfully. {% elif tftp_probe.reachable %} The server is reachable but doesn't have {{ tftp_probe.filename }}. UEFI PXE-Boot clients will 404 at the bootfile step. Check the TFTP root contents (the bty-tftp sidecar bakes ipxe.efi in by default). {% else %} Nothing answered on {{ tftp_probe.host }}:{{ tftp_probe.port }}. On a container deploy: is bty-tftp.service up (systemctl status bty-tftp / podman ps)? On a host install: systemctl status dnsmasq.service. The probe aims at the withcache host by default; override it with [netboot] tftp_probe_host (env $BTY_NETBOOT_TFTP_PROBE_HOST) if your TFTP daemon lives elsewhere (e.g. on the LAN router). {% endif %}

Local dnsmasq.service

{% if tftp.state == 'active' %} {{ tftp.state }} {% elif tftp.state == 'failed' %} {{ tftp.state }} {% elif tftp.state in ('activating', 'deactivating', 'reloading') %} {{ tftp.state }} {% else %} {{ tftp.state }} {% endif %} {% if tftp.state == 'active' %} co-located dnsmasq is running on this host {% elif tftp.state in ('inactive', 'unknown') %} no local dnsmasq (normal in container deploys; the bty-tftp sidecar runs separately and the probe above is the canonical signal there) {% else %} check journalctl -u dnsmasq.service {% endif %}

DHCP / PXE cheatsheet

{# Recent netboot activity (release fetches + fetch failures). #} {% with events=boot_events, title="Recent Events", link_to_full="/ui/events?subject_kind=netboot", card_id="netboot-activity" %} {% include "ui/_events_card.html" %} {% endwith %} {% endblock %}