{% extends "ui/_layout.html" %} {% block title %}Netboot artifacts - bty-web{% endblock %} {% block subnav %} {# In-page jump links to the artifacts inventory + the activity table, separated by a vertical rule. (DHCP / PXE moved to Settings, the live fetch jobs to /ui/downloads, TFTP into the body.) #} {% endblock %} {% block intro %} {% from "ui/_intro_box.html" import render as intro_box %} {% call intro_box() %} The bty live env that PXE clients chain into when their assignment has boot_mode=bty-flash-always. Pure inventory view: which files are present, sizes, sha256s, last-fetched. The "Fetch artifacts" trigger lives on the Downloads page (under the navbar's Downloads icon); enqueue there and the rows here tick from missing to present as each file lands. The TFTP daemon controls are below; the router-side DHCP / PXE cheatsheet lives on the Settings page. {% endcall %} {% endblock %} {% block content %} {# Pure inventory: present/missing, size, sha256, last-fetched. The Fetch trigger moved to /ui/downloads. #}
Netboot artifacts Fetch on the Downloads page
{% 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 %}
{# Local dnsmasq.service state + start/stop/restart. The "take PXE offline briefly" knob, next to the artifacts it serves. #}
TFTP daemon

On a host/systemd install a co-located dnsmasq.service serves the TFTP root. Stop it to take PXE offline without disabling DHCP; restart it to pick up new bootfiles staged into the TFTP root. The container deploy serves TFTP from a separate sidecar instead, so these controls don't appear there. DHCP / PXE config details

{% 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 %} dnsmasq.service
{% if tftp_controllable %}
{% else %} dnsmasq isn't systemd-managed here (e.g. the container deploy, where TFTP is a separate sidecar) -- no start / stop / restart {% endif %}
{# The Fetch trigger moved to /ui/downloads; nothing on this page enqueues a fetch any more. The inventory table here just renders the current present/missing state from inspect_boot_dir. #} {# Recent netboot activity (release fetches + fetch failures). The "Activity" sub-nav anchor jumps here; always rendered (empty-state row when there's nothing yet). #} {% 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 %}