{% extends "base.html" %} {% import '_ui.html' as ui %} {% block title %}Dell drivers and BIOS - PXE Manager{% endblock %} {% macro size(n) -%} {%- if not n -%}-{%- elif n >= 1000000000 -%}{{ '%.2f' | format(n / 1000000000) }} GB{%- elif n >= 1000000 -%}{{ '%.0f' | format(n / 1000000) }} MB{%- else -%}{{ '%.0f' | format(n / 1000) }} KB{%- endif -%} {%- endmacro %} {% macro drv_chip(r) -%} {% if r.status == 'update' and r.warnings %}{{ ui.chip('Update: decide', 'warn') }} {% elif r.status == 'update' %}{{ ui.chip('Update', 'act') }} {% elif r.status == 'current' %}{{ ui.chip('Current', 'ok') }} {% elif r.status == 'no-match' %}{{ ui.chip('No match', 'off') }} {% elif r.status == 'unknown-version' %}{{ ui.chip('Unknown version', 'neutral') }} {% else %}{{ ui.chip(r.status, 'neutral') }}{% endif %} {%- endmacro %} {% macro bios_chip(s) -%} {% if s == 'update' %}{{ ui.chip('Update', 'act') }} {% elif s == 'current' %}{{ ui.chip('Current', 'ok') }} {% elif s == 'different-file-family' %}{{ ui.chip('Different file', 'err') }} {% elif s == 'ambiguous' %}{{ ui.chip('Ambiguous', 'err') }} {% elif s == 'no-match' %}{{ ui.chip('No match', 'off') }} {% elif s == 'error' %}{{ ui.chip('Catalog error', 'err') }} {% else %}{{ ui.chip(s, 'neutral') }}{% endif %} {%- endmacro %} {% macro stage_chip(s) -%} {% if s == 'ready' %}{{ ui.chip('Ready', 'ok') }} {% elif s == 'applied' %}{{ ui.chip('Applied', 'neutral') }} {% elif s in ('error', 'interrupted', 'cancelled') %}{{ ui.chip(s | capitalize, 'err') }} {% else %}{{ ui.chip(s | capitalize, 'run') }}{% endif %} {%- endmacro %} {# One driver-pack row. The checkbox sits outside so ticking it never toggles the row. #} {% macro drv_row(r) -%}
{% if r.pack and r.status != 'current' or r.pack and r.warnings %}
{% endif %}
{{ r.tokens | join(', ') }} {% if r.pack %}{{ r.cur_ver or '?' }} to {{ r.pack.ver }}{% else %}{{ r.cur_ver or '-' }}{% endif %} {% set imgs = r.images | map('replace', 'gea-', '') | join(', ') %} {{ imgs }} {{ drv_chip(r) }}
{% for w in r.warnings %}
{{ w }}
{% endfor %}
Current file
{{ r.current }}
{% if r.pack %}
Dell pack
{{ r.pack.name }}
{{ r.pack.ver }}, {{ r.pack.date }}, {{ size(r.pack.size) }}
Stages as
{{ r.pack.zip }}
Pack covers
{{ r.pack.models | join(', ') }}
{% endif %}
Models (WMI)
{{ r.tokens | join(', ') }}
Images
{{ r.images | join(', ') }}
{% for n in r.notes %}
{{ n }}
{% endfor %}
{%- endmacro %} {% macro bios_row(r) -%}
{% if r.candidates and (r.status != 'current') %}
{% endif %}
{{ r.sub }} {% if r.candidates %}{{ r.cur_ver }} to {{ r.candidates[0].version }}{% if r.candidates | length > 1 %} (+{{ r.candidates | length - 1 }}){% endif %}{% else %}{{ r.cur_ver or '-' }}{% endif %} {{ r.current }} {{ bios_chip(r.status) }}
{% for w in r.warnings %}
{{ w }}
{% endfor %}
Manifest line
{{ r.line }}
Current file
{{ r.current }} {{ r.cur_ver }}
Dell latest
{% if r.candidates | length > 1 %} {% elif r.candidates %} {% set c = r.candidates[0] %} {{ c.file }}
{{ c.version }}, {{ c.date }}, {{ size(c.size) }}; {{ c.models | join(', ') }}
sha256 {{ c.sha256 }}
{% else %}none found{% endif %}
{% for n in r.notes %}
{{ n }}
{% endfor %}
{%- endmacro %} {% block extra_head %} {% endblock %} {% block content %} {% set chk = prog.check %} {% set dl = prog.download %} {% set n_drv = scan.drivers | selectattr('status', 'equalto', 'update') | list | length if scan else 0 %} {% set n_bios = scan.bios | selectattr('status', 'equalto', 'update') | list | length if scan else 0 %}
Updates

Dell drivers and BIOS

{% if prog.check_running %}{{ ui.chip('Checking', 'run') }} {% elif not scan %}{{ ui.chip('Not checked yet', 'off') }} {% elif n_drv or n_bios %}{{ ui.chip(n_drv ~ ' driver / ' ~ n_bios ~ ' BIOS update' ~ ('s' if n_drv + n_bios != 1), 'act') }} {% else %}{{ ui.chip('Up to date', 'ok') }}{% endif %} {% if scan %}Checked {{ scan.checked | local_dt }}{% endif %}
Speed cap {{ ('%g MB/s' | format(settings.max_mbps)) if settings.max_mbps else 'none' }}
{% if prog.check_running %}
{% else %}
{% endif %}
{# ---- Progress and job outcomes ------------------------------------------ #} {% if prog.check_running %}
Checking Dell's catalogs: {{ chk.step or 'Starting' }}...
{% elif chk.state == 'error' %}
Last check failed: {{ chk.error }}
{% elif chk.state == 'interrupted' %}
The last check stopped before it finished. Run it again.
{% endif %} {% if prog.download_running %}
Downloading at {{ '%g MB/s' | format(settings.max_mbps) if settings.max_mbps else 'full speed' }}. Progress per item is under Staged downloads; you can leave this page.
{% endif %} {% if scan and history and history[0].at and scan.checked and history[0].at > scan.checked %}
These results are from before the last apply ({{ history[0].at | local_dt }}), so rows it changed can still show as updates. Run Check now again to refresh them.
{% endif %}
How Dell updates work

Compares every Win11 entry in the three images' HardwareDriver.json and every line of the WinPE BIOS manifest models.txt with Dell's current catalogs. Downloads are checked against Dell's sha256, driver packs are repacked into the zip PESetup expects, and nothing on the share changes until you preview and apply. Applying puts the new file next to the one it replaces, rewrites the maps and models.txt (backed up first, never reordered) and never deletes old zips or BIOS files.

{% if not scan %} {% if not prog.check_running %}

Not checked yet. Check now fetches Dell's two catalog files (under 1 MB) and the small per-model BIOS catalogs it needs, then compares.

{% endif %} {% else %} {% set cats = scan.catalogs or {} %} {% for e in scan.map_errors %}
{{ e }}
{% endfor %} {% if scan.cab_errors %}
{{ scan.cab_errors | length }} per-model catalog(s) failed to load; their BIOS lines show as Catalog error.
{% endif %}
{# ---- Driver packs ------------------------------------------------------ #} {% set cur_d = scan.drivers | selectattr('status', 'equalto', 'current') | list %}

Win11 driver packs

One row per zip in use; standard and engineer share their zips. Updates are ticked unless a warning needs a decision.
{{ scan.drivers | length }} pack{{ 's' if scan.drivers | length != 1 }}
{% for r in scan.drivers if r.status != 'current' %}{{ drv_row(r) }}{% endfor %} {% if cur_d %}
Show {{ cur_d | length }} current pack{{ 's' if cur_d | length != 1 }} {% for r in cur_d %}{{ drv_row(r) }}{% endfor %}
{% endif %}
An entry whose current pack carries NVIDIA drivers is skipped at apply time if the Dell pack has no NVIDIA INFs.
{# ---- BIOS -------------------------------------------------------------- #} {% set cur_b = scan.bios | selectattr('status', 'equalto', 'current') | list %}

BIOS (models.txt)

One row per manifest line. check-bios.cmd flashes the file of the first line whose text is in the machine's model name.
{{ scan.bios | length }} line{{ 's' if scan.bios | length != 1 }}
{% for r in scan.bios if r.status != 'current' %}{{ bios_row(r) }}{% endfor %} {% if cur_b %}
Show {{ cur_b | length }} current line{{ 's' if cur_b | length != 1 }} {% for r in cur_b %}{{ bios_row(r) }}{% endfor %}
{% endif %}
Each Dell model is credited to the first line that catches it. Applying changes only the file and version fields of the ticked lines; their order and the comments stay as they are.
Ticked driver packs and BIOS lines. Runs in the background at {{ '%g MB/s' | format(settings.max_mbps) if settings.max_mbps else 'full speed (no cap)' }}; you can leave this page. Already staged items are not fetched again.
Driver pack catalog dated {{ cats.drivers | local_dt }}, catalog index dated {{ cats.index | local_dt }}. Maps read: {{ (scan.images or []) | join(', ') or 'none' }}.
{# ---- Missing coverage ---------------------------------------------------- #} {% if scan.missing %}

Seen models without coverage

For information only: new entries are added by hand (see Hardware coverage).
{{ ui.chip(scan.missing | length ~ ' model' ~ ('s' if scan.missing | length != 1), 'neutral') }}
{% for m in scan.missing %}
{{ m.model }}
SKU {{ m.skus | join(', ') or '-' }}. Missing {% if m.no_drivers %}drivers ({{ m.no_drivers | map('replace', 'gea-', '') | join(', ') }}){% endif %}{% if m.no_drivers and m.no_bios %}, {% endif %}{% if m.no_bios %}BIOS line{% endif %}
Dell pack
{% if m.pack %}{{ m.pack.name }} ({{ m.pack.ver }}, {{ size(m.pack.size) }}){% elif m.no_drivers %}none found{% else %}-{% endif %}
Dell BIOS
{% if m.bios %}{{ m.bios.file }} ({{ m.bios.version }}){% elif m.no_bios %}none found{% else %}-{% endif %}
{% endfor %}
{% endif %} {% endif %} {# ---- Staged downloads ---------------------------------------------------- #}

Staged downloads

Tick what to apply, then preview. Nothing on the share changes until you apply.
{% if dl.state %}Last run {{ dl.state }}{% if dl.finished %} {{ dl.finished | local_dt }}{% endif %}{% endif %}
{% if dl.error %}
{{ dl.error }}
{% endif %} {% if staged %}
{% for it in staged %} {% set label = it.zip if it.kind == 'driver' else it.name %}
{% if it.status in ('ready', 'error', 'cancelled', 'interrupted', 'applied') %}
{% endif %}
{{ label }} {{ 'Driver pack' if it.kind == 'driver' else 'BIOS' }} {{ it.ver }} {{ size(it.size_file or it.size) }} {{ stage_chip(it.status) }} {% if it.status in ('queued', 'downloading', 'verified', 'extracting', 'zipping') %} {{ it.percent if it.percent is not none else 0 }}% {% endif %}
{% if it.error %}
{{ it.error }}
{% endif %}
{% if it.kind == 'driver' %}
Dell file
{{ it.name }}
Replaces
{% for c in it.replaces %}
{{ c }}
{% endfor %}
{% if it.infs %}
Contents
{{ it.infs }} INFs, {{ it.nvidia_infs }} NVIDIA
{% endif %} {% else %}
BIOS lines
{% for ln in it.lines %}
{{ ln.sub }}
{% endfor %}
{% endif %}
Version
{{ it.ver }}
{% if it.applied %}
Applied
apply {{ it.applied }}
{% endif %}
{% endfor %}
{% else %}
Nothing staged. Tick rows above and use Download selected.
{% endif %}
{# ---- Preview ------------------------------------------------------------- #} {% if preview %}

Preview: what Apply will change

{% for image, rows in preview.drivers.items() %}
{{ image }} HardwareDriver.json
{% if rows %}
    {% for r in rows %}
  • {{ r.old }}to{{ r.new }} {{ r.models }} | {{ r.dir }}
  • {% endfor %}
{% else %}
No change.
{% endif %}
{% endfor %}
models.txt
{% if preview.bios %}
    {% for b in preview.bios %}
  • {{ b.old }}to{{ b.new }}
  • {% endfor %}
{% else %}
No change.
{% endif %}
{% if preview.errors %}
{{ preview.errors | join('; ') }}
{% endif %} {% for s in preview.skipped %}
Will skip {{ s }}
{% endfor %} {% if preview.missing %}
Not ready, ignored: {{ preview.missing | join(', ') }}
{% endif %}
{% for k in preview_keys %}{% endfor %} Cancel
{% endif %} {# ---- History ------------------------------------------------------------- #} {% if history %}

Applied

Rollback opens a review page first; it restores only files nobody has changed since the apply.
{% for h in history %} {% set can = not h.rolled_back and h.unchanged > 0 %}
{{ h.at | local_dt }} {{ h.title }} {% if h.rolled_back %}{{ ui.chip('Rolled back', 'neutral') }} {% elif h.errors and not h.total %}{{ ui.chip('Apply failed', 'err') }} {% elif not h.total %}{{ ui.chip('Nothing written', 'off') }} {% elif h.unchanged == h.total %}{{ ui.chip(h.unchanged ~ '/' ~ h.total ~ ' unchanged', 'ok') }} {% elif h.unchanged %}{{ ui.chip(h.unchanged ~ '/' ~ h.total ~ ' unchanged', 'warn') }} {% else %}{{ ui.chip('0/' ~ h.total ~ ' unchanged', 'off') }}{% endif %}
    {% for c in h.changes %}
  • {{ c }}
  • {% endfor %} {% for d in h.drivers %}
  • {{ d.old }} to {{ d.new }}
  • {% endfor %}
{% if h.skipped %}
Skipped: {{ h.skipped | join('; ') }}
{% endif %} {% if h.errors %}
{{ h.errors | join('; ') }}
{% endif %} {% if h.files %}
    {% for f in h.files %}
  • {{ f.label }} {% if f.state == 'unchanged' %}unchanged since this apply {% elif f.state == 'changed' %}content differs from what this apply wrote{% if f.mtime %} (last modified {{ f.mtime | local_dt }}){% endif %} {% else %}missing{% endif %}
  • {% endfor %}
{% endif %} {% if h.backups %}
Backups: {% for p, b in h.backups.items() %}{{ b.rsplit('/', 1)[-1] }}{{ ', ' if not loop.last }}{% endfor %}
{% endif %} {% if h.rolled_back %}
Rolled back {{ h.rolled_back | local_dt }}.
{% endif %}
Apply {{ h.id }}.
{% if can %}{% endif %}
{% endfor %}
{% endif %}
{% if prog.check_running or prog.download_running %} {% endif %} {% endblock %}