{% 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 the Release fetches page, 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. Until these files are present, machines with boot_mode=bty-flash-always cannot actually flash: fetch them from the Artifact Fetches page (the download indicator in the navbar). The TFTP daemon controls are below; the router-side DHCP / PXE cheatsheet lives on the Settings page. {% endcall %} {% endblock %} {% block content %} {# The netboot artifacts inventory: present/missing, size, sha256, and a download link for each. The Fetch button enqueues the fetch and hands off to the Release fetches page to watch progress. #}
Netboot artifacts {# The release tag is an editable magic value (Settings -> Upstream sources); the button just fetches whatever it resolves to, then jumps to the Release fetches 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

The local dnsmasq.service serves the TFTP root (/var/lib/tftpboot). Stop it to take PXE offline without disabling DHCP; restart it to pick up new bootfiles staged into the TFTP root. 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 Docker container, where the entrypoint supervises it) -- no start / stop / restart {% endif %}
{# 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 %}