Skip to content

Releases

WorkshopService 2.30.5

Choose a tag to compare

@jhonf441 jhonf441 released this 07 Nov 05:35

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 in dwc36/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 safer install.sh: it keeps a backup in /opt/workshop-bridge.prev, has rollback and status, and refuses to restart the bridge while a job or orders are active (--force overrides). 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 in bridge/contract/, decision record bridge/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 with ok, query cache, ordering, state and action files). The bridge only gains the key "contract": 1 in 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_s 120, the old .api-token file is no longer read). The address of the workshop PC that was used as an example in docs/HARDENING.md and 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 every users.*) 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 a rect per zone, kept exactly as the user left it; a zone without a rect is placed once in a free spot. mode, gap, align, mirror and size of the earlier shape are ignored when read.

2.30.0

  • Bed zones: optional real geometry in the bed-zones config (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, capability system.pelletlayers, and a service process pellet_layers that, only for an armed job and only while the machine is processing, sends M568 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

Choose a tag to compare

@jhonf441 jhonf441 released this 06 Nov 23:24

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.py classifies every process.
  • Phase 2 (honest control): the auto/on/off switch says when it applies (only bed_zones re-reads the mode each pass; every other change applies when the service restarts) and shows a pending-restart note and banner. modules.set refuses the nine locked processes. New capability processes.control ("Procesos: parar y arrancar"); the four base roles decide as before.
  • Phase 3 (real control): processes.pause, processes.resume and processes.restart for consumption, motors, maintenance, pid_trace and trace (cooperative, in memory, they do not survive a restart), and service.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.restart is its own capability, not part of processes.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

Choose a tag to compare

@jhonf441 jhonf441 released this 06 Nov 21:12

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_required for 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 by auth.resolve and auth.whoami as network_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 an allowed list; with none set only queries are answered. install.sh asks for a password / allowed list / trusted address (BRIDGE_PASSWORD,
    BRIDGE_ALLOW, BRIDGE_TRUST, or install.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 needs acknowledge_outbound: true (the Activity page asks for a confirmation first); the test sends and notifications.send are 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.1 runs only with health.internet_check true (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), operations roles.list/get/set/remove/effective, auth.whoami with role_name, allow and deny; the four base roles decide exactly as before (golden fixture). See docs/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 in ops and deny, keys.preview, and allowed_ops resolved by the service. Keys saved before this version decide exactly as before; new or re-saved keys never reach non-delegable operations.
  • plugin.json lists machine_bed_edit.py and real_mode.py in dsfFiles.

2.27.0

  • The macros of sys/workshop/macros are 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 run tools/migrate_macro_folders.py of 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 temp capability 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 optional t and b.
  • 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.get adds sensor and editable to each defined bed.

2.24.3

  • Beds: the limit of beds and heaters is the board's own (limits.bedHeaters, limits.heaters of 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 is LAYOUT_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

Choose a tag to compare

@jhonf441 jhonf441 released this 06 Nov 03:40

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.19

Choose a tag to compare

@jhonf441 jhonf441 released this 05 Nov 21:45

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.18

Choose a tag to compare

@jhonf441 jhonf441 released this 05 Nov 14:51

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.17

Choose a tag to compare

@jhonf441 jhonf441 released this 05 Nov 14:27

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.16

Choose a tag to compare

@jhonf441 jhonf441 released this 05 Nov 03:19

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.15

Choose a tag to compare

@jhonf441 jhonf441 released this 04 Nov 21:01

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.

WorkshopService 2.22.10

Choose a tag to compare

@jhonf441 jhonf441 released this 04 Nov 04:32

Zip for DWC/DSF 3.6.x (-dwc3.6.zip). Compare its SHA-256 sum with SHA256SUMS.txt.