Per decision: displays need none of the fleet-wide common scope's software, so the gea-shopfloor-display scope carries everything it enforces and does not inherit common. This avoids repackaging common's SMB-backed payloads for a share-less display. - Invert the client common-merge switch: -NoCommon (default-on) becomes -IncludeCommon (default OFF). A scope now enforces alone unless opted in. The capability stays for a future share-less non-display PC; displays omit it. - Drop the common SMB-payload audit + inheritance sections from the display seed comments and docs (GE-ENFORCE-DISPLAY.md); document self-sufficiency. - GE-ENFORCE-CLIENT.md: common-scope inheritance is now opt-in.
3.8 KiB
GE-Enforce: the gea-shopfloor-display scope
Displays are the share-less corner of the fleet. They are Intune/Entra-joined,
credential-less kiosk PCs that pull their manifest over HTTPS on port 443 and
authenticate with a read-only service PAT scoped geenforce.fetch, sent as
X-API-Key. They have no SMB share mount. The kiosk engine and the kiosk
browser are baked into the display image, not shipped over HTTPS, so the display
manifest heals POLICY / CONFIG drift only, never EXEs. It is self-sufficient and
does not inherit the fleet-wide common scope (see below).
There are three display subtypes, selected by C:\Enrollment\display-type.txt:
Dashboard, Lobby, and 3DPrintRoom.
Authoring the scope
The scope is authored programmatically by
plugins/geenforce/seed_display_scope.py, which builds a manifest dict and
hands it to service.replace_scope_draft (the same call the import-share CLI
uses), then attaches the inline dispatcher payload. From a Flask app context:
from plugins.geenforce.seed_display_scope import seed_display_scope
seed_display_scope(publish=True) # publish=False leaves it as a draft
replace_scope_draft is an idempotent draft rebuild. publish=True additionally
freezes an immutable published snapshot (that step is not idempotent: it always
creates a new version).
What the scope contains
- Four
Registrydrift-heal entries that re-assert the Microsoft Edge kiosk relaunch policies set at imaging by09-Setup-Display.ps1. Each writes the value and detects drift withDetectionMethod = ValueMatchesagainst the same path/name, so a display that loses a policy self-heals on the next enforce cycle with no keyboard or mouse on site:RelaunchNotification = 2(DWord, Required auto-restart)RelaunchNotificationPeriod = 3600000(DWord, 1 hour)RelaunchHeadsUpPeriod = 60000(DWord, 1 minute)RelaunchWindow(String, JSON, 02:00 start, 120 minute duration)
- One
PS1dispatcher, delivered inline over HTTPS. It readsC:\Enrollment\display-type.txtand launches the kiosk target for the subtype. The subtype -> route map is a data-driven table (DISPLAY_TYPE_TARGETS) at the top of both the seed module and the generated script, so targets are easy to edit.DetectionMethod = Alwaysso it re-asserts each cycle, but the script is idempotent (it skips relaunch if a kiosk process is already serving the target URL).
display-type -> target map
| display-type.txt | kiosk route | notes |
|---|---|---|
Dashboard |
/shopfloor |
core ShopfloorDashboard, standalone full-screen |
Lobby |
/tv |
slides plugin TV dashboard (surface lobby) |
3DPrintRoom |
/parts-kiosk |
PLACEHOLDER, TODO-confirm printedparts parts kiosk route; confirm the real 3D-print-room target with the floor team before publishing to production displays |
Self-sufficient: displays do NOT inherit common
The gea-shopfloor-display scope carries everything a display enforces. It does
NOT inherit the fleet-wide common scope. Displays run the enforcer with
common-merge off (the client default; common-merge is opt-in via
Invoke-ShopdbEnforce.ps1 -IncludeCommon), so common's SMB-backed fleet
entries (Adobe, Oracle, OpenText, Defect Tracker, EventSaver, printer map,
self-update, asset-reporting, ...) never reach a share-less display.
This was a deliberate decision: a display needs none of common's software, and
inheriting common would have forced repackaging every SMB common payload as
http/inline for a share-less box. Keeping the display scope self-sufficient
avoids all of that. If a future non-display share-less PC genuinely needs the
fleet-wide entries, that is what -IncludeCommon plus a per-entry SMB->http
payload conversion would be for -- but displays do not use it.