Repository navigation
Releases
WorkshopService 2.30.5
What changed since the previous release (up to 2.30.5)
2.30.5
- G-code bridge contract put to work. The Services page and four readers of the service (health poller, origin of the calls, the safe-stop operations, the bridge probe) now read the bridge state through ONE adapter (
dsf/bridge_contract.py) and the page through the same rules indwc36/bridge-contract.js; both pass the same 65 test vectors (bridge/contract/vectors.json), so they cannot drift. With a healthy bridge nothing changes. A stopped bridge no longer shows the programs it had when it died, and a bridge state of a format the service does not know is not acted on (the safe stop says the bridge is too old; the page warns). The bridge card shows which contract version the bridge declares ("old" until the bridge is installed again). - The bridge as a versioned artifact (
bridge/VERSION,bridge/bridge-manifest.json,bridge/bridge_manifest.py) and a saferinstall.sh: it keeps a backup in/opt/workshop-bridge.prev, hasrollbackandstatus, and refuses to restart the bridge while a job or orders are active (--forceoverrides). Written and tested on a scratch root; never run on the machine yet. - NOT moved yet, on purpose: the jog, the laser guard, the motion owner and the restart guard keep their own readers until they are tried with the machine present.
2.30.4
- G-code bridge: written contract between the service and the bridge (
bridge/CONTRACT.md, JSON schemas inbridge/contract/, decision recordbridge/ARCHITECTURE.md), a read-only adapter in the service (dsf/bridge_contract.py, called by nothing yet) and 38 new tests that pin how the bridge behaves today (reply framing withok, query cache, ordering, state and action files). The bridge only gains the key"contract": 1in its state file after its next install. Nothing in what the bridge or the service do changes. - Bridge README brought up to date with the code (version 3.8.0,
order_timeout_s120, the old.api-tokenfile is no longer read). The address of the workshop PC that was used as an example indocs/HARDENING.mdand in two tests is now a documentation address (192.0.2.16).
2.30.3
- Sessions survive a restart of the service (the kiosk and every browser no longer ask for the PIN after each install or restart). They are kept in a second private file next to the users file (
<users file>.sessions, mode 600) and ONLY the SHA-256 of each token is written, never the token. At start a session is kept only if it is still alive (the same 12 h limits), its person still exists and the entry is well formed; a file that is missing, damaged or wrong opens nothing. A closed session (logout, new PIN, role change, person removed, roles switched off) is removed from the file at once, and the role used is always the current one. Writing the file never breaks a login or a request. - New operation
users.close_sessions(administrator only, not delegable like everyusers.*) and a button in the Users tab ("Close the other sessions", two touches): it ends every session except the caller's, now that a restart no longer does it. - The first start after this version has no sessions file, so everybody types the PIN once more.
2.30.2
- Bridge card, port: when the bridge cannot open its port the error is now in the language of the page and appears next to the port field (it used to be the raw English text at the top of the card, far from the input); the header no longer shows a port the bridge is not listening on. While typing, a note warns about ports below 1024 and about ports that something else on a Pi normally uses (22, 80, 443). The bridge itself is not changed.
2.30.1
- Bed zones geometry: no automatic layout any more. The geometry is
{bed: {width, length}}plus arectper zone, kept exactly as the user left it; a zone without a rect is placed once in a free spot.mode,gap,align,mirrorandsizeof the earlier shape are ignored when read.
2.30.0
- Bed zones: optional real geometry in the
bed-zonesconfig (bed size, a rectangle per zone, auto layout for any number of zones, manual placement); validated by the service (dsf/bed_zones_geometry.py). A config without geometry behaves as before; the heating (M140 / M190 interception) is unchanged. - Pellet temperature by layer: profiles of temperatures per heating zone by layer or height (steps or ramp), operations
pelletlayers.list/get/status/set/remove/arm/disarm, capabilitysystem.pelletlayers, and a service processpellet_layersthat, only for an armed job and only while the machine is processing, sendsM568 P<tool> S...at each layer change. Off by default; never above the heater maximum minus 10 C nor below 30 C; pause holds; cancel or end disarms; every change goes to the activity log and the audit.
Full history: CHANGELOG.md.
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.29.4
What changed since the previous release (up to 2.29.4)
2.29.4
- Password tab: changing or removing the DWC password is administrator-only and the tab now says so: the fields and buttons are disabled for other roles, each button carries its lock, and one reason shows at the top of the card (it blinks on a touch).
- Database tab: the card shows ONE reason instead of up to six repeated ones, the gated buttons carry their lock, and a touch on the card blinks the reason.
- Bridge card: the example address in the trusted-IP field is a documentation address (192.0.2.16), no real address of this workshop.
2.29.3
- Processes page, summary: "Restart the service" carries its own lock icon when this role cannot use it, its reason appears only after a touch on it, and the blink rings the words instead of the whole width of the card.
- Shared design family: a reason next to a locked control (
.wf-reason) fits its text, so the blink of every page of the service no longer draws a box across the whole row. - Bridge card: type an IP address to trust (it only offered the addresses that had already tried to connect).
- Service page: a session cover (Audit, Users, API) has no sign-in button of its own any more, the chip of the bar is the one sign-in. The mode switch of a process only calls the service when its value really changed.
2.29.2
- Internal processes page: a control this person cannot use now carries its own lock icon (inside each locked button, and once before the mode switch) instead of a loose "sign-in required" line under the group. The reason of a group appears only after a touch on THAT group, and only that reason (and the sign-in chip) blinks; the blink rings the words, not the whole width of the card.
- The last error of a process is shown in gray with "recovered" when a heartbeat arrived after it; red stays for a process that is failing now.
2.29.1
- Internal processes page, redone in three phases. Phase 1 (visibility): five groups (safety, machine, data, support, separate services) with a safety tile, filters and search; every row answers what it does, what it depends on, what stops if it fails and who reads it. Nine threads that were invisible now report heartbeats (guardian_laser, intercept_watchdog, watchdog_lock, publisher, communication, commands_extra, base_backup, api, api_macros) and the protection guard also watches the laser guardian and the interception watchdog.
dsf/process_catalog.pyclassifies every process. - Phase 2 (honest control): the auto/on/off switch says when it applies (only
bed_zonesre-reads the mode each pass; every other change applies when the service restarts) and shows a pending-restart note and banner.modules.setrefuses the nine locked processes. New capabilityprocesses.control("Procesos: parar y arrancar"); the four base roles decide as before. - Phase 3 (real control):
processes.pause,processes.resumeandprocesses.restartfor consumption, motors, maintenance, pid_trace and trace (cooperative, in memory, they do not survive a restart), andservice.restart(administrator, confirmation level 3, only when the machine is idle: status off or idle, no job, no laser, no owned movement, no protection down).service.restartis its own capability, not part ofprocesses.control. The page answers at once (spinner, state shown before the next publication, confirmation line), a paused process is unmistakable, and a touch on a locked control makes its reason blink. - Fixed while trying it on the Pi: threads nobody launches through the supervisor showed as stopped on the page; a tick now marks them live.
- NOT tried on a real machine: that DSF revives the service after
service.restart(exit code 1, same path as the interception watchdog) and the five pausable loops against a live job.
Full history: CHANGELOG.md.
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.29.0
What changed since the previous release (up to 2.29.0)
2.29.0
- Service page: the session follows a sign-in made in another tab (the page reconciles its token when it comes back to the front); the package card redraws with the role; the family.css copies carry the shared pieces of the side bar (icon box with a lock mark, text column).
2.28.4
- "No users" no longer means "the whole network may change things" (Duet3D catalogue review, hardening): on the camera relay (port 8090) a request from
the network can only read until the first administrator exists (403 first_admin_requiredfor the camera settings, the look files and any route not
classified); the Pi itself is not limited; a machine whose owner switched the roles off with the administrator's PIN keeps the old open behaviour
(UserStore.network_open(), also sent byauth.resolveandauth.whoamiasnetwork_open). Vision applies the same rule (WorkshopVision 2.7.28). - G-code bridge: orders from the network are refused unless the Pi itself sends them, or the address is trusted, or the client typed the password, or the owner
wrote anallowedlist; with none set only queries are answered.install.shasks for a password / allowed list / trusted address (BRIDGE_PASSWORD,
BRIDGE_ALLOW,BRIDGE_TRUST, orinstall.sh guard). A bridge that had none refuses the PC's orders until one is set. - The start-up row of the users says what a machine without users does and does not allow. Docs: README, HARDENING, api README.
2.28.3
- Nothing leaves the machine by default (Duet3D catalogue review, issue #2053): phone notifications (ntfy) are OFF until the owner turns them on;
init()no longer creates a topic or contacts any server, the topic is created when they are turned on, and installs that already saved the setting keep it. Turning them on through the API needsacknowledge_outbound: true(the Activity page asks for a confirmation first); the test sends andnotifications.sendare refused while they are off. - Pi health: the latency check to the notices server runs only while the notifications are on and uses the configured server; the ping to
1.1.1.1runs only withhealth.internet_checktrue (off by default); a missing value hides its row. - Docs: README notice at the top, outbound traffic described in "Permissions and what it changes",
security.md,HARDENING.md.
2.28.2
- Roles card: the capability pills no longer redeclare the font size of the family pill (family-design rule).
2.28.1
- Service page: Database, Bridge and the black box hide button are disabled before the click when the role cannot use them, with one reason; Users and Audit decide admin with the operation table (
users.list,audit.list) like the rest of the page; the start-up master tells a role refusal apart from a missing session.
2.28.0
- Own roles with capabilities: 55 capabilities, own roles (base role plus grants and denials, stored in
workshop-roles.json), operationsroles.list/get/set/remove/effective,auth.whoamiwithrole_name,allowanddeny; the four base roles decide exactly as before (golden fixture). Seedocs/ROLES.md. - Roles and permissions card on the service page (matrix, own roles, what a person can do); own roles in the role selector of each user.
- API keys accept
cap:<id>entries inopsanddeny,keys.preview, andallowed_opsresolved by the service. Keys saved before this version decide exactly as before; new or re-saved keys never reach non-delegable operations. plugin.jsonlistsmachine_bed_edit.pyandreal_mode.pyindsfFiles.
2.27.0
- The macros of
sys/workshop/macrosare grouped in folders (axis, zcal, focus, work, guard, laser, probe, system): every call, the whitelist of G-code, the zcal hook and the macros the service writes (lights.g, lasercorrection.g, zcal.g, enable/disable_pi_status.g) use the new paths. Install it together with the plugins and runtools/migrate_macro_folders.pyof TallerPlugins on the SD. - power.off is open to every role and to nobody signed in; the last time a person was seen is kept after the session ends.
2.26.0
- Bed heaters and tool pins: new
tempcapability for the dedicated temperature inputs (temp0..temp3); thermistor and pt1000 sensors ask for it, so the io pins are no longer offered. New bed sensor types: thermocouple (MAX31855) and pt100 (MAX31865, new preset), thermistor with optionaltandb. - Keys page: the new-key button is locked with its reason when the role is not administrator.
2.25.0
- Plan kind
config.bed_edit(dsf/machine_bed_edit.py): change the heater and / or the sensor number of a bed the configuration already defines, with the plan of Machine (diff of each file, snapshot, rollback).machine.beds.getaddssensorandeditableto each defined bed.
2.24.3
- Beds: the limit of beds and heaters is the board's own (
limits.bedHeaters,limits.heatersof the object model) instead of a fixed 8; without board limits the cap is the RRF ceiling (32 beds, 20 heaters). Bed zones layout cap isLAYOUT_MAX * LAYOUT_MAX.
Full history: CHANGELOG.md.
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.24.2
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.19
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.18
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.17
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.16
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.15
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.
WorkshopService 2.22.10
Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.