{# Imaging floor rows. Rendered standalone by /imaging/tiles for the SSE refresh, and included by imaging.html and the Overview for first paint. Receives `sessions` (already in floor order, each with floor_state), and optionally `compact` / `more` from the Overview. One line per PC; everything else is in the row's expandable body. #} {% import '_ui.html' as ui %} {% set stage_labels = { 1: ('Booting from PXE', 'WinPE loaded - applying Windows image to disk.'), 2: ('Configuring Windows', 'First boot. Running shopfloor setup baseline scripts.'), 3: ('Installing apps', 'Type-specific app installs (eDNC, UDC, NTLARS, etc).'), 4: ('Apps installed', 'Type-specific scripts complete. Preparing for Intune enrollment.'), 5: ('Enrolling in Intune', 'PPKG installing - device joining Azure AD + Intune. ~5-10 min, reboot to follow.'), 6: ('Waiting on first Intune sync','Post-PPKG settle (~120s). Triggering Schedule #3 sync repeatedly.'), 7: ('Registered - assign category', 'Phase 1 (Intune Registration) complete. Click "set category" in the Intune portal to drop the bay into the right config-profile group.'), 8: ('Imaging complete', 'Lockdown applied. Bay rebooted into ShopFloor session. Ready for production.') } %} {# gea-standard / gea-engineer builds: WinPE push, then Send-ImagingStage.ps1 from the image's unattend; stage_total 3. Done at OOBE: everything after needs the employee's logon, off the PXE network. (4 and 5 are kept for builds still running the old unattend.) #} {% set desk_stage_labels = { 1: ('Applying Windows image', 'WinPE loaded - PESetup is applying the Windows image to disk.'), 2: ('Windows setup: installing apps','First boot (specialize): certificates, WiFi, fonts, Adobe, Java and the enrollment task.'), 3: ('Ready at OOBE', 'PXE imaging is done. Hand the PC to the employee: first logon (and the engineering layer on Engineer builds) runs when they sign in.'), 4: ('First logon', 'First logon commands running (the engineering layer on Engineer builds).'), 5: ('Setup complete', 'Imaging is done; bulk enrollment continues on the PC.') } %} {% set desk_kind = {'gea-standard': 'Standard', 'gea-engineer': 'Engineer'} %} {# Blancco Drive Eraser sessions (source/pctype "blancco"), posted by blancco-init.sh and blancco-progress.py; stage_total 7. #} {% set blancco_stage_labels = { 1: ('Downloading Blancco', 'PXE boot: loading the Blancco image into RAM.'), 2: ('Starting Blancco', 'Blancco is starting up.'), 3: ('Licensing', 'Waiting for the Blancco cloud licence (WiFi INTERNETACCESS).'), 4: ('Erasing', 'Drive erasure in progress. Do not power off.'), 5: ('Erasure finished', 'Report saved on the PC.'), 6: ('Report sent', 'Report uploaded to the Blancco cloud; a copy goes to the share.'), 7: ('Wipe complete', 'Erasure succeeded. Report is on the Blancco reports share.') } %} {% set inferred_stage_labels = { 'stage_0_dhcp': ('DHCP lease issued', 'Client got a DHCP lease but has not fetched the bootloader yet.'), 'stage_0_tftp_bios': ('TFTP bootloader (BIOS)','Client fetched undionly.kpxe via TFTP. Booting iPXE.'), 'stage_0_tftp_uefi': ('TFTP bootloader (UEFI)','Client fetched ipxe.efi via TFTP. Booting iPXE.'), 'stage_0_menu': ('Boot menu loaded', 'Client loaded the iPXE menu. Waiting on selection or auto-boot.'), 'stage_0_boot_pre': ('Pre-boot fetch', 'Client downloading WinPE boot files from HTTP.'), 'stage_1_wim_get': ('Downloading boot.wim', 'Client pulling WinPE image. No /imaging/status push yet.'), 'stage_2_smb_winpe': ('WinPE running (no push)','Client has opened SMB shares - WinPE is up but startnet has not pushed status.'), } %} {% set state_chip = { 'failed': ('Failed', 'fail'), 'action': ('Needs action', 'act'), 'running': ('In progress', 'run'), 'done': ('Done', 'ok'), 'logs': ('Seen in logs', 'off'), } %} {% set track_kind = {'failed': 'fail', 'action': 'act', 'running': 'run', 'done': 'ok'} %} {% macro floor_row(s) %} {# Sessions are sanitised on load; these guards keep a row rendering if a non-string still slips through (a lookup or `in` on a list raises). #} {% set pctype = s.pctype if s.pctype is string else '' %} {% set cur_stage = s.current_stage if s.current_stage is string else '' %} {% set is_inferred = (s.source == 'inferred') %} {% set is_blancco = (s.source == 'blancco' or pctype == 'blancco') %} {% set stage_idx = (s.stage_index or 0) | int(0) %} {% set stage_total = (s.stage_total or 0) | int(0) %} {% set state = s.floor_state if s.floor_state in state_chip else 'running' %} {% set drive_pct = None %} {% if is_blancco and stage_idx == 4 and cur_stage and '%]' in cur_stage %} {% set drive_pct = cur_stage.split('[')[-1].split('%')[0] | int(0) %} {% endif %} {% set warn = False %} {% if is_inferred %} {% set friendly = inferred_stage_labels.get(cur_stage, ('Inferred from logs', cur_stage)) %} {% elif is_blancco %} {% if s.status == 'failed' %} {% set friendly = ('Erasure FAILED', 'Blancco reported a failed erasure step. Check the log tail and the report.') %} {% else %} {% set friendly = blancco_stage_labels.get(stage_idx, ('Stage ' ~ stage_idx, '')) %} {% endif %} {% if stage_idx == 4 and s.status != 'failed' %}{% set warn = True %}{% endif %} {% else %} {% set friendly = (desk_stage_labels if pctype in desk_kind else stage_labels).get(stage_idx, ('Stage ' ~ stage_idx, '')) %} {% if stage_idx == 1 and cur_stage and 'bios update staged' in cur_stage|lower %} {% set friendly = ('Applying image - BIOS update staged', 'WinPE staged a firmware update for this model. It flashes during the reboot after the image is applied: do NOT power off then.') %} {% set warn = True %} {% elif stage_idx == 1 and cur_stage and 'bios' in cur_stage|lower %} {% set friendly = ('Updating BIOS: do not power off', 'WinPE detected a firmware update for this model. Do NOT power off until the next reboot. Imaging continues afterward.') %} {% set warn = True %} {% endif %} {% if stage_idx == 7 and cur_stage %} {% set _cs = cur_stage|lower %} {% if 'ready for lockdown' in _cs or 'request lockdown' in _cs %} {% set friendly = ('Ready - request lockdown', 'Phase 1-4 all complete (Registration, Device Config, Software Deploy, Credentials). Click "ARTS request" to initiate the lockdown workflow.') %} {% elif 'credentials' in _cs or 'phase 4' in _cs %} {% set friendly = ('Phase 3 / 4 - DSC + credentials', 'SFLD policy delivered, DSC pulling device-config.yaml + running per-app wrappers. SFLD share creds populating.') %} {% elif 'sfld policy' in _cs or 'phase 2' in _cs or 'device configuration' in _cs %} {% set friendly = ('Phase 2 - device configuration', 'Category was assigned in Intune. SFLD ConfigurationProfile (Function + SasToken) has delivered. DSC kicking off next.') %} {% endif %} {% endif %} {% endif %} {% set label = friendly[0] %} {% if drive_pct is not none and s.status != 'failed' %}{% set label = 'Erasing: ' ~ drive_pct ~ '%' %}{% endif %} {% set card_key = s.serial or ('mac-' ~ (s.mac or 'unknown') ~ '-' ~ (s.ip or '')) %} {% set ident = [] %} {% if s.machinenumber %}{% set _ = ident.append('Machine ' ~ s.machinenumber) %}{% endif %} {% if s.hostname_target and s.serial %}{% set _ = ident.append(s.hostname_target) %}{% endif %} {% if s.ip %}{% set _ = ident.append(s.ip) %}{% endif %} {% set title = s.serial or s.hostname_target or s.mac or s.ip or '(unknown bay)' %} {% set kind = 'Blancco wipe' if is_blancco else desk_kind.get(pctype, pctype) %}
{{ ui.chip(state_chip[state][0], state_chip[state][1]) }} {{ title }}{{ ident | join(' | ') or ('MAC ' ~ s.mac if s.mac else '') }} {% if warn %}{{ label }}{% else %}{{ label }}{% endif %}{% if kind %}{{ kind }}{% endif %}{% if not is_inferred %}{{ stage_idx }}/{{ stage_total or '?' }}{% endif %} {% if not is_inferred and stage_total %}{{ ui.track(stage_total, stage_idx, track_kind.get(state, 'run'), label=('Done, all ' ~ stage_total ~ ' stages' if state == 'done' else 'Stage ' ~ stage_idx ~ ' of ' ~ stage_total)) }}{% endif %}
{% if friendly[1] %}

{{ friendly[1] }}

{% endif %} {% if s.error %}
Error: {{ s.error }}
{% endif %}
Started {{ s.started_at | local_dt(true) }} Last update {{ s.last_updated | local_dt(true) }} MAC {{ s.mac or '-' }} {% if s.current_stage %}Raw stage {{ s.current_stage }}{% endif %}
{% if s.intune_device_id %}
Intune device {{ s.intune_device_id }} Set category ARTS request
{% endif %} {% if compact and not is_inferred and not is_blancco %}
LAPS QR and the live log are on the imaging floor.
{% elif not is_inferred and not is_blancco %}
LAPS password QR: paste, then scan on the bay. Kept until cleared.
{# Masked: the floor is on a shared screen; Show reveals it while typing. #}
{% endif %} {% if s.log_tail %}
{% if is_inferred %}Evidence{% else %}Log tail{% endif %} ({{ s.log_tail | length }} line{{ 's' if s.log_tail | length != 1 }})
{% for line in s.log_tail %}{{ line }}
{% endfor %}
{% endif %}
{% if s.intune_device_id %} {% endif %}
{% if state == 'action' and s.intune_device_id %} Set category {% elif is_blancco and state in ('done', 'failed') %} Report {% elif not is_inferred and s.serial %} {{ 'Full log' if state == 'failed' else 'Details' }} {% endif %} {% if not is_inferred and s.serial %} {% call ui.more(title) %} Details and full log {% if s.intune_device_id %} ARTS request{% endif %} {% if is_blancco %}Erasure reports{% endif %}
{% endcall %} {% endif %}
{% endmacro %} {% set real = sessions | rejectattr('floor_state', 'equalto', 'logs') | list %} {% set logs = sessions | selectattr('floor_state', 'equalto', 'logs') | list %} {% for s in real %}{{ floor_row(s) }}{% endfor %} {% if not compact and logs %}
{{ logs | length }} seen in DHCP/TFTP logs only, no status pushed yet {% for s in logs %}{{ floor_row(s) }}{% endfor %}
{% endif %} {% if compact and more %}
{{ more }} more on the floorOpen imaging floor
{% endif %} {% if not sessions %}
No PCs on the imaging network right now. A PC appears here once it touches DHCP, TFTP or boot.wim.
{% endif %}