Added SPDX

This commit is contained in:
ScottW514
2026-09-18 12:14:22 -04:00
parent 07158e5d7f
commit 0eb764bf75
157 changed files with 634 additions and 1 deletions
+9
View File
@@ -5,5 +5,14 @@ the associated recipe (.bb file) unless otherwise stated.
See: See:
COPYING.MIT (MIT) COPYING.MIT (MIT)
The code in this repository that is not layer metadata is MIT licensed:
forgetest/ the release acceptance tool (see forgetest/LICENSE)
scripts/ the release, install and bench scripts
fixture/ the bench actuator firmware, excluding
fixture/managed_components/, which carries its own licenses
Every file in those directories states MIT in its own header.
License information for any other files is either explicitly stated License information for any other files is either explicitly stated
or defaults to GPL version 2. or defaults to GPL version 2.
+4
View File
@@ -1,4 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
# forgefixture: build, flash and watch the bench actuator's firmware. # forgefixture: build, flash and watch the bench actuator's firmware.
# #
# ./fixture.sh env fixture.env from the example, with a fresh API key # ./fixture.sh env fixture.env from the example, with a fresh API key
+5
View File
@@ -1,3 +1,8 @@
/*
* Copyright 2026 514 LLC d/b/a OpenGlow
* Written by Scott Wiederhold
* SPDX-License-Identifier: MIT
*/
/* forgefixture firmware version, reported by GET /. */ /* forgefixture firmware version, reported by GET /. */
#pragma once #pragma once
+4
View File
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
# The host test of the fixture's policy: needs only a C compiler. # The host test of the fixture's policy: needs only a C compiler.
set -e set -e
cd "$(dirname "$0")" cd "$(dirname "$0")"
+23
View File
@@ -0,0 +1,23 @@
ForgeFIRM release acceptance tool (forgetest/) and the bench scripts it
drives (scripts/bench/).
Copyright 2026 514 LLC d/b/a OpenGlow
Written by Scott Wiederhold
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+4
View File
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: forgetest # Provides: forgetest
# Required-Start: $network forgectrl # Required-Start: $network forgectrl
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""forgetest - the ForgeFIRM release acceptance tool. """forgetest - the ForgeFIRM release acceptance tool.
A daemon on the dev image (HTTP :8090) that runs the acceptance catalog A daemon on the dev image (HTTP :8090) that runs the acceptance catalog
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""forgetest daemon entry point. """forgetest daemon entry point.
python3 -m forgetest [--port 8090] [--host ::] [--manifest PATH] python3 -m forgetest [--port 8090] [--host ::] [--manifest PATH]
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The release artifact (acceptance.json / acceptance.md) and its verification. """The release artifact (acceptance.json / acceptance.md) and its verification.
The exporter serializes the campaign state with, for every catalog test, The exporter serializes the campaign state with, for every catalog test,
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The fresh-boot idle state: what every test starts from and leaves behind. """The fresh-boot idle state: what every test starts from and leaves behind.
The runner checks the machine against this baseline before a run and The runner checks the machine against this baseline before a run and
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The bench diagnostics page: registry of the bench tools and the """The bench diagnostics page: registry of the bench tools and the
subprocess runner behind the #bench tab. subprocess runner behind the #bench tab.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Campaign rules: which results apply, what is required, and whether a """Campaign rules: which results apply, what is required, and whether a
release is authorized. release is authorized.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The acceptance catalog: test definitions and the registry. """The acceptance catalog: test definitions and the registry.
A test is a function decorated with @test(...). The decorator records A test is a function decorated with @test(...). The decorator records
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Coverage lint: every source path in the manifest must be selected by """Coverage lint: every source path in the manifest must be selected by
some test's coverage globs, except the allowlisted non-behavioral paths, some test's coverage globs, except the allowlisted non-behavioral paths,
and every coverage glob must select at least one path of its component. and every coverage glob must select at least one path of its component.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The bench actuator (forgefixture): the box on the bench network that """The bench actuator (forgefixture): the box on the bench network that
opens the lid loop, pulls the interlock loop and presses the button on opens the lid loop, pulls the interlock loop and presses the button on
request, so an operator test can run with nobody in the room. request, so an operator test can run with nobody in the room.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Hardware and service access for the suite: forgectrl's HTTP API, the """Hardware and service access for the suite: forgectrl's HTTP API, the
kernel module's sysfs, the init scripts, and the Grbl TCP port. kernel module's sysfs, the init scripts, and the Grbl TCP port.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The append-only result log (JSONL) and the export helpers. """The append-only result log (JSONL) and the export helpers.
One JSON object per line under the data directory (default One JSON object per line under the data directory (default
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The image manifest and the domain fingerprint. """The image manifest and the domain fingerprint.
/etc/forgefirm-manifest.json (written by forgefirm-image-manifest.bbclass) /etc/forgefirm-manifest.json (written by forgefirm-image-manifest.bbclass)
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The single page: acceptance tab + bench tab, assembled from ui/ into """The single page: acceptance tab + bench tab, assembled from ui/ into
one self-contained response (no external assets). Bootstrap and the one self-contained response (no external assets). Bootstrap and the
OpenGlow theme are inlined; theme.css and the vendor/ files are the same OpenGlow theme are inlined; theme.css and the vendor/ files are the same
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Pulse files for the offline cloud service: a job the machine will run """Pulse files for the offline cloud service: a job the machine will run
without the service having cut it. without the service having cut it.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The runner: executes one acceptance test or one bench tool at a time. """The runner: executes one acceptance test or one bench tool at a time.
Acceptance tests run in a worker thread with a Context: log lines, an Acceptance tests run in a worker thread with a Context: log lines, an
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""HTTP: the page, the JSON API, and the access rules. """HTTP: the page, the JSON API, and the access rules.
Access follows forgectrl's panel (auth.c): the Host header must be an Access follows forgectrl's panel (auth.c): the Host header must be an
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The acceptance suite: one module per subsystem, imported in display """The acceptance suite: one module per subsystem, imported in display
order. Each module registers its tests with @catalog.test.""" order. Each module registers its tests with @catalog.test."""
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""camera.* - the lid camera pipeline through forgectrl.""" """camera.* - the lid camera pipeline through forgectrl."""
import json import json
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""cloud.* - the controller mode switch and the optional Glowforge web-service """cloud.* - the controller mode switch and the optional Glowforge web-service
mode (gfcloud daemon, gfhome homing runner). The mode-switch test makes the mode (gfcloud daemon, gfhome homing runner). The mode-switch test makes the
grbl -> cloud -> grbl round trip with the connect-time hunt run lid-open and grbl -> cloud -> grbl round trip with the connect-time hunt run lid-open and
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""cooling.* - the cooling engine: flow verification through forgectrl's """cooling.* - the cooling engine: flow verification through forgectrl's
diagnostics runner (the same check the fire gate runs), the fan profile diagnostics runner (the same check the fire gate runs), the fan profile
returning to idle after motion, the gate settings (a value inside the returning to idle after motion, the gate settings (a value inside the
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""forgectrl.* - the machine-services daemon's API, access control, and panel.""" """forgectrl.* - the machine-services daemon's API, access control, and panel."""
import json import json
import os import os
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""image.* - the post-flash health of the running image (always-required).""" """image.* - the post-flash health of the running image (always-required)."""
import glob import glob
import gzip import gzip
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""kernel.* - glowforge.ko safety readbacks and the pulse-engine drills. """kernel.* - glowforge.ko safety readbacks and the pulse-engine drills.
The drills are the bench scripts `scripts/bench/gate_a_kernel_drills.py` The drills are the bench scripts `scripts/bench/gate_a_kernel_drills.py`
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""laser.* - LIVE laser tests, ported from `scripts/bench/live_fire_drills.py`. """laser.* - LIVE laser tests, ported from `scripts/bench/live_fire_drills.py`.
Every test here can emit, except `laser.power-floor`, which only reads Every test here can emit, except `laser.power-floor`, which only reads
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""logs.* - unified logging: the log tree, tail, and the sanitized export; """logs.* - unified logging: the log tree, tail, and the sanitized export;
the routing path (emitters, relays, rendered rules); the level settings.""" the routing path (emitters, relays, rendered rules); the level settings."""
import gzip import gzip
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""motion.* - the motion controller under grblHAL: dry motion, no emission. """motion.* - the motion controller under grblHAL: dry motion, no emission.
Ported from `scripts/bench/pacing_test.py` (protocol-loop pacing) and Ported from `scripts/bench/pacing_test.py` (protocol-loop pacing) and
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""setup.* - the first-run setup: the record and the """setup.* - the first-run setup: the record and the
controller gate, the advisories, the account and its login, the HTTPS controller gate, the advisories, the account and its login, the HTTPS
boundary, SSH, the cloud switch, the machine's name, and the factory boundary, SSH, the cloud switch, the machine's name, and the factory
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""setup.check-* - the setup's checks (the dark wizards), driven the """setup.check-* - the setup's checks (the dark wizards), driven the
way the page drives them: POST /wiz/<id>/start, GET /wiz/dark polled, way the page drives them: POST /wiz/<id>/start, GET /wiz/dark polled,
the prompts answered from here (the bench fixture works the lid and the the prompts answered from here (the bench fixture works the lid and the
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""setup.sheet - the setup's sheet (the live wizards) in one run, """setup.sheet - the setup's sheet (the live wizards) in one run,
driven the way the page drives them: POST /wiz/<id>/start, GET /wiz/dark driven the way the page drives them: POST /wiz/<id>/start, GET /wiz/dark
polled, the prompts answered from here, each burn armed by a press, the polled, the prompts answered from here, each burn armed by a press, the
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""update.* - the A/B slot inventory and the firmware verification path.""" """update.* - the A/B slot inventory and the firmware verification path."""
import os import os
import re import re
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Shared fixtures for the forgetest unit tests: synthetic manifests and """Shared fixtures for the forgetest unit tests: synthetic manifests and
catalog entries that never touch hardware.""" catalog entries that never touch hardware."""
import hashlib import hashlib
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
import copy import copy
import json import json
import unittest import unittest
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The baseline: fixed resting values are restored, preserved values are """The baseline: fixed resting values are restored, preserved values are
handed back, every deviation is a recorded leftover. Runs against a fake handed back, every deviation is a recorded leftover. Runs against a fake
sysfs tree; forgectrl is unreachable (service-side checks skip).""" sysfs tree; forgectrl is unreachable (service-side checks skip)."""
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The bench registry against scripts/bench: every python tool is """The bench registry against scripts/bench: every python tool is
registered (or named as not-a-tool), every registered script exists, registered (or named as not-a-tool), every registered script exists,
every argument spec builds a command line, every script compiles, and every argument spec builds a command line, every script compiles, and
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
import unittest import unittest
import helpers import helpers
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Every phrase the cloud suite greps for in the gfcloud log must be a """Every phrase the cloud suite greps for in the gfcloud log must be a
phrase the pinned cloud app can actually log. phrase the pinned cloud app can actually log.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The cloud.* job-behavior tests against a fake forgectrl and a replayed """The cloud.* job-behavior tests against a fake forgectrl and a replayed
gfcloud log: the real test functions run under the real runner Context, gfcloud log: the real test functions run under the real runner Context,
the operator prompts answered - and the standing notices of the machine the operator prompts answered - and the standing notices of the machine
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""cooling.aa-offset-calibrate is registered before the heater tools, so """cooling.aa-offset-calibrate is registered before the heater tools, so
a queue runs it first: a heater trial leaves a warm slug circulating past a queue runs it first: a heater trial leaves a warm slug circulating past
the coolant sensors for minutes, and the tool's edges read it as the coolant sensors for minutes, and the tool's edges read it as
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""cooling.fans-quiet-after-motion and cooling.gate-off replayed host-side """cooling.fans-quiet-after-motion and cooling.gate-off replayed host-side
under the real runner Context against a scripted machine: a fake under the real runner Context against a scripted machine: a fake
forgectrl (/status fans, /cool/status phase and verdict, /settings with forgectrl (/status fans, /cool/status phase and verdict, /settings with
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The bench actuator as the tool sees it. """The bench actuator as the tool sees it.
The fixture is a box on the network that opens the lid loop, pulls the The fixture is a box on the network that opens the lid loop, pulls the
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
import unittest import unittest
from forgetest.suite import image from forgetest.suite import image
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""wait_hv_off against a scripted charge-pump readback: a chain that """wait_hv_off against a scripted charge-pump readback: a chain that
releases inside the window passes, a chain held past it is the refusal, releases inside the window passes, a chain held past it is the refusal,
and a chain already off costs no wait.""" and a chain already off costs no wait."""
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The dwell-gap verdict of laser.emission-witness over synthetic trails: """The dwell-gap verdict of laser.emission-witness over synthetic trails:
the button latch judged from the first emission through every sample the button latch judged from the first emission through every sample
whose readback word shows the laser latch unlocked, both bits from that whose readback word shows the laser latch unlocked, both bits from that
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
import os import os
import unittest import unittest
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The controller mode a test declares: the runner puts the machine there """The controller mode a test declares: the runner puts the machine there
before the test and the baseline keeps it there afterward. before the test and the baseline keeps it there afterward.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The operator channel: notices, `ready`, `act`, and the precheck. """The operator channel: notices, `ready`, `act`, and the precheck.
A test asks for the operator's part in a way the page can show before A test asks for the operator's part in a way the page can show before
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The page assembly: the ui/ files inlined in order, the gzipped install """The page assembly: the ui/ files inlined in order, the gzipped install
(what the dev image carries) assembling to the same bytes as a checkout, (what the dev image carries) assembling to the same bytes as a checkout,
the token placeholder carried exactly once, and a missing marker refused the token placeholder carried exactly once, and a missing marker refused
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The two queues: what they select, the order they run in, and where """The two queues: what they select, the order they run in, and where
they stop. they stop.
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""What keeps the page answering the operator instead of the timer. """What keeps the page answering the operator instead of the timer.
Two things went wrong on the bench and are pinned here: Two things went wrong on the bench and are pinned here:
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""Runner + HTTP API end to end on localhost with a fake catalog and a """Runner + HTTP API end to end on localhost with a fake catalog and a
fake bench tool. No hardware, no forgectrl.""" fake bench tool. No hardware, no forgectrl."""
import json import json
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The setup's checks in the catalog: registered as automatic tests with """The setup's checks in the catalog: registered as automatic tests with
no precheck, the takeover ones marked so, every covers map naming the no precheck, the takeover ones marked so, every covers map naming the
check runner; and the check driver itself against the fake daemon: a check runner; and the check driver itself against the fake daemon: a
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The setup's sheet in the catalog: one live test on the button with a """The setup's sheet in the catalog: one live test on the button with a
piece of wood at hand, its covers map naming the live runner, the piece of wood at hand, its covers map naming the live runner, the
renderer, the sender, the page, and the driver's laser module; and the renderer, the sender, the page, and the driver's laser module; and the
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""The setup.* suite on the host: the registration (ids, kinds, the """The setup.* suite on the host: the registration (ids, kinds, the
takeover tests, the operator tests' hands), the record builders, the takeover tests, the operator tests' hands), the record builders, the
machine's name, the cookie parsing, the LED cue, the settle rule for a machine's name, the cookie parsing, the LED cue, the settle rule for a
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""scripts/source-bundle.py - the source that a release publishes. """scripts/source-bundle.py - the source that a release publishes.
The bundle must hold the source of every recipe of the image whose license The bundle must hold the source of every recipe of the image whose license
+5
View File
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
"""scripts/manifest-from-tree.py - the workstation/CI mirror of the image """scripts/manifest-from-tree.py - the workstation/CI mirror of the image
manifest: recipe pins are read through their pin files, and a layer's manifest: recipe pins are read through their pin files, and a layer's
content hash leaves the pin files out (a component bump is not a platform content hash leaves the pin files out (a component bump is not a platform
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# forgefirm-image-manifest.bbclass - assemble /etc/forgefirm-manifest.json # forgefirm-image-manifest.bbclass - assemble /etc/forgefirm-manifest.json
# #
# Inherited by the ForgeFIRM images. At rootfs postprocess it collects the # Inherited by the ForgeFIRM images. At rootfs postprocess it collects the
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# forgefirm-manifest.bbclass - source fingerprint of one ForgeFIRM component # forgefirm-manifest.bbclass - source fingerprint of one ForgeFIRM component
# #
# A component recipe that inherits this class records what source it was # A component recipe that inherits this class records what source it was
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
require conf/distro/include/fslc-base.inc require conf/distro/include/fslc-base.inc
DISTRO = "forgefirm" DISTRO = "forgefirm"
+2
View File
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# We have a conf and classes directory, add to BBPATH # We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}" BBPATH .= ":${LAYERDIR}"
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# NXP distributes the i.MX VPU/EPDC firmware blobs under its firmware EULA # NXP distributes the i.MX VPU/EPDC firmware blobs under its firmware EULA
# (accepted with ACCEPT_FSL_EULA), so an image carrying those blobs has to # (accepted with ACCEPT_FSL_EULA), so an image carrying those blobs has to
# carry the license text with them. # carry the license text with them.
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# ForgeFIRM SSH policy, set in the installed files so the release image # ForgeFIRM SSH policy, set in the installed files so the release image
# carries it as built: # carries it as built:
# PermitRootLogin no root logs in at the serial console only # PermitRootLogin no root logs in at the serial console only
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# ForgeFIRM image manifest: source fingerprint of the hardware library # ForgeFIRM image manifest: source fingerprint of the hardware library
# (forgefirm-manifest.bbclass in this layer). # (forgefirm-manifest.bbclass in this layer).
inherit forgefirm-manifest inherit forgefirm-manifest
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# ForgeFIRM image manifest: source fingerprint of the cloud-mode service # ForgeFIRM image manifest: source fingerprint of the cloud-mode service
# layer (forgefirm-manifest.bbclass in this layer). # layer (forgefirm-manifest.bbclass in this layer).
inherit forgefirm-manifest inherit forgefirm-manifest
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# urllib3's optional pyOpenSSL/cryptography backend is not used here: the cloud # urllib3's optional pyOpenSSL/cryptography backend is not used here: the cloud
# client and the machine glue talk TLS through the standard library's ssl # client and the machine glue talk TLS through the standard library's ssl
# module (nothing imports OpenSSL or cryptography). Dropping the two runtime # module (nothing imports OpenSSL or cryptography). Dropping the two runtime
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "Configurable embedded Linux firmware update creator and runner" SUMMARY = "Configurable embedded Linux firmware update creator and runner"
DESCRIPTION = "Applies and creates signed .fw firmware archives. ForgeFIRM \ DESCRIPTION = "Applies and creates signed .fw firmware archives. ForgeFIRM \
uses the factory's own update format: fwup applies ForgeFIRM upgrades and \ uses the factory's own update format: fwup applies ForgeFIRM upgrades and \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "Potluck with different functions for C programs (babelouest base library)" DESCRIPTION = "Potluck with different functions for C programs (babelouest base library)"
HOMEPAGE = "https://github.com/babelouest/orcania" HOMEPAGE = "https://github.com/babelouest/orcania"
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# /etc/rsyslog.conf - ForgeFIRM # /etc/rsyslog.conf - ForgeFIRM
# #
# rsyslog is the only log writer on the machine. Every ForgeFIRM process # rsyslog is the only log writer on the machine. Every ForgeFIRM process
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# rsyslog is the ForgeFIRM system logger: the only log writer, one # rsyslog is the ForgeFIRM system logger: the only log writer, one
# directory per logger under /data/log/forgefirm. This appends the # directory per logger under /data/log/forgefirm. This appends the
# ForgeFIRM /etc/rsyslog.conf (inputs, line format, and the include of # ForgeFIRM /etc/rsyslog.conf (inputs, line format, and the include of
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "Web Framework to build REST APIs, Webservices or any HTTP endpoint in C" DESCRIPTION = "Web Framework to build REST APIs, Webservices or any HTTP endpoint in C"
HOMEPAGE = "https://github.com/babelouest/ulfius" HOMEPAGE = "https://github.com/babelouest/ulfius"
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "Logging library for C applications (babelouest)" DESCRIPTION = "Logging library for C applications (babelouest)"
HOMEPAGE = "https://github.com/babelouest/yder" HOMEPAGE = "https://github.com/babelouest/yder"
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "Boot-slot selection and inventory for Glowforge factory hardware" SUMMARY = "Boot-slot selection and inventory for Glowforge factory hardware"
DESCRIPTION = "Inventories the bootable partitions (ffboot -l) and switches \ DESCRIPTION = "Inventories the bootable partitions (ffboot -l) and switches \
the boot target by rewriting the saved U-Boot environment with read-back \ the boot target by rewriting the saved U-Boot environment with read-back \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# forgectrl pin. Bump deliberately after pushing forgectrl changes; keep # forgectrl pin. Bump deliberately after pushing forgectrl changes; keep
# only SRCREV and PV here - the image manifest leaves *-pin.inc out of the # only SRCREV and PV here - the image manifest leaves *-pin.inc out of the
# layer content hash because the component entry already identifies the # layer content hash because the component entry already identifies the
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "System Control Daemon for ForgeFIRM powered Glowforge" DESCRIPTION = "System Control Daemon for ForgeFIRM powered Glowforge"
HOMEPAGE = "https://github.com/openglow-org/forgectrl" HOMEPAGE = "https://github.com/openglow-org/forgectrl"
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# forgefirm-app pin (python3-gfhardware repository, forgefirm-app/ tree). # forgefirm-app pin (python3-gfhardware repository, forgefirm-app/ tree).
# Bump deliberately (AUTOREV is not reproducible); keep only SRCREV and PV # Bump deliberately (AUTOREV is not reproducible); keep only SRCREV and PV
# here - the image manifest leaves *-pin.inc out of the layer content hash # here - the image manifest leaves *-pin.inc out of the layer content hash
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# Shared fetch for the ForgeFIRM web-service apps (gfhome, python3-ffmachine, # Shared fetch for the ForgeFIRM web-service apps (gfhome, python3-ffmachine,
# gfcloud). Their sources live in the forgefirm-app/ directory of the # gfcloud). Their sources live in the forgefirm-app/ directory of the
# python3-gfhardware repository. # python3-gfhardware repository.
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "Full Glowforge web-service controller daemon for ForgeFIRM (cloud mode)" DESCRIPTION = "Full Glowforge web-service controller daemon for ForgeFIRM (cloud mode)"
require forgefirm-app.inc require forgefirm-app.inc
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "One-shot Glowforge web-service homing for ForgeFIRM" DESCRIPTION = "One-shot Glowforge web-service homing for ForgeFIRM"
require forgefirm-app.inc require forgefirm-app.inc
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "Shared ForgeFIRM web-service hardware-machine glue (gfhome + gfcloud)" DESCRIPTION = "Shared ForgeFIRM web-service hardware-machine glue (gfhome + gfcloud)"
require forgefirm-app.inc require forgefirm-app.inc
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: forgefirm-banner # Provides: forgefirm-banner
# Required-Start: $network # Required-Start: $network
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM console banner: the control panel addresses in /etc/issue" SUMMARY = "ForgeFIRM console banner: the control panel addresses in /etc/issue"
DESCRIPTION = "Keeps an address block in the serial-console login banner \ DESCRIPTION = "Keeps an address block in the serial-console login banner \
(/etc/issue): one control panel URL per global address of wlan0 and eth0. \ (/etc/issue): one control panel URL per global address of wlan0 and eth0. \
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: forgefirm-hostname # Provides: forgefirm-hostname
# Required-Start: $local_fs # Required-Start: $local_fs
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM hostname: forgefirm-<xxxx> from the MAC address" SUMMARY = "ForgeFIRM hostname: forgefirm-<xxxx> from the MAC address"
DESCRIPTION = "Names the machine forgefirm-<xxxx>, where xxxx is the last \ DESCRIPTION = "Names the machine forgefirm-<xxxx>, where xxxx is the last \
four hex digits of the wlan0 MAC address (eth0 on a machine with no WiFi). \ four hex digits of the wlan0 MAC address (eth0 on a machine with no WiFi). \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "Firmware verification public keys" SUMMARY = "Firmware verification public keys"
DESCRIPTION = "Trust anchors for firmware archive verification: the \ DESCRIPTION = "Trust anchors for firmware archive verification: the \
ForgeFIRM release-signing public key (verifies release downloads and \ ForgeFIRM release-signing public key (verifies release downloads and \
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: forgefirm-logging # Provides: forgefirm-logging
# Required-Start: $local_fs # Required-Start: $local_fs
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM logging tree: rsyslog rules at boot, rotation" SUMMARY = "ForgeFIRM logging tree: rsyslog rules at boot, rotation"
DESCRIPTION = "Boot-time glue for the ForgeFIRM logging tree \ DESCRIPTION = "Boot-time glue for the ForgeFIRM logging tree \
(/data/log/forgefirm/<logger>/): renders the per-logger rsyslog rules \ (/data/log/forgefirm/<logger>/): renders the per-logger rsyslog rules \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM boot state on /data: the timestamp and the random seed" SUMMARY = "ForgeFIRM boot state on /data: the timestamp and the random seed"
DESCRIPTION = "The two files the poky init scripts keep across boots, \ DESCRIPTION = "The two files the poky init scripts keep across boots, \
pointed at /data/forgefirm because the rootfs is read-only: the boot \ pointed at /data/forgefirm because the rootfs is read-only: the boot \
@@ -1,3 +1,8 @@
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
# ForgeFIRM: an interactive root shell (the serial console, or SSH on # ForgeFIRM: an interactive root shell (the serial console, or SSH on
# the dev image) starts with a warning. Non-interactive shells (scp, # the dev image) starts with a warning. Non-interactive shells (scp,
# rsync, ssh with a command) print nothing. # rsync, ssh with a command) print nothing.
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: forgefirm-users # Provides: forgefirm-users
# Required-Start: $local_fs # Required-Start: $local_fs
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM operator accounts: record render and the root shell warning" SUMMARY = "ForgeFIRM operator accounts: record render and the root shell warning"
DESCRIPTION = "Renders the account record (/data/forgefirm/users, written \ DESCRIPTION = "Renders the account record (/data/forgefirm/users, written \
by forgectrl) into the system account files at boot and on reload. The \ by forgectrl) into the system account files at boot and on reload. The \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
SUMMARY = "ForgeFIRM release acceptance tool (dev image)" SUMMARY = "ForgeFIRM release acceptance tool (dev image)"
DESCRIPTION = "Runs the release acceptance catalog against the machine from a \ DESCRIPTION = "Runs the release acceptance catalog against the machine from a \
self-contained web page (HTTP :8090), keeps the append-only result log under \ self-contained web page (HTTP :8090), keeps the append-only result log under \
@@ -5,7 +7,7 @@ self-contained web page (HTTP :8090), keeps the append-only result log under \
carries the bench diagnostics page. Installed only on the dev image." carries the bench diagnostics page. Installed only on the dev image."
HOMEPAGE = "https://github.com/openglow-org/forgefirm" HOMEPAGE = "https://github.com/openglow-org/forgefirm"
LICENSE = "MIT" LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" LIC_FILES_CHKSUM = "file://forgetest/LICENSE;md5=6657cce322ff8bed163c02ceffb4c60c"
# The tool's canonical home is forgetest/ in this repo; the bench scripts # The tool's canonical home is forgetest/ in this repo; the bench scripts
# it drives live in scripts/bench/. Both are packaged from the same tree # it drives live in scripts/bench/. Both are packaged from the same tree
@@ -16,6 +18,7 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/../../../:"
# host unit tests and their caches would otherwise enter the fetch checksum # host unit tests and their caches would otherwise enter the fetch checksum
# and rebuild the dev image after a workstation test run. # and rebuild the dev image after a workstation test run.
SRC_URI = " \ SRC_URI = " \
file://forgetest/LICENSE \
file://forgetest/forgetest/ \ file://forgetest/forgetest/ \
file://forgetest/forgetest.init \ file://forgetest/forgetest.init \
file://scripts/bench/ \ file://scripts/bench/ \
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
# grblHAL-glowforge pin. Bump deliberately after pushing grblHAL-glowforge # grblHAL-glowforge pin. Bump deliberately after pushing grblHAL-glowforge
# changes; keep only SRCREV and PV here - the image manifest leaves # changes; keep only SRCREV and PV here - the image manifest leaves
# *-pin.inc out of the layer content hash because the component entry # *-pin.inc out of the layer content hash because the component entry
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
DESCRIPTION = "grblHAL motion controller for the Glowforge factory board" DESCRIPTION = "grblHAL motion controller for the Glowforge factory board"
HOMEPAGE = "https://github.com/openglow-org/grblHAL-glowforge" HOMEPAGE = "https://github.com/openglow-org/grblHAL-glowforge"
@@ -1,4 +1,8 @@
#!/bin/sh #!/bin/sh
# Copyright 2026 514 LLC d/b/a OpenGlow
# Written by Scott Wiederhold
# https://community.openglow.org
# SPDX-License-Identifier: MIT
### BEGIN INIT INFO ### BEGIN INIT INFO
# Provides: grblhal # Provides: grblhal
# Required-Start: $local_fs # Required-Start: $local_fs
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: MIT
require forgefirm-image.bb require forgefirm-image.bb
DESCRIPTION = "OpenGlow/ForgeFIRM development image for Glowforge" DESCRIPTION = "OpenGlow/ForgeFIRM development image for Glowforge"

Some files were not shown because too many files have changed in this diff Show More