D-113(a2) write path PROVEN on the live edge: API -> OPNsense -> Kea -> daemon
The read half was proven earlier today; this closes the other half. Configuration written
through the REST API reaches the running daemon. (a2) is now demonstrated end to end.

Executed (live, operator-approved, deliberately IDEMPOTENT -- the payload was the exact values
read back from the API moments before, so the edge's behaviour should not change; the point was
to exercise the WRITE path):

  POST kea/dhcpv4/set_subnet/93473635-... -> {"result":"saved"}
  POST kea/service/reconfigure            -> {"status":"ok"}

GROUND TRUTH after the write (the API's {"result":"saved"} is only the service's own verdict):

  kea-dhcp4 pid 30027 (RESTARTED), bound udp4 10.10.0.1:67
  Kea's OWN generated /usr/local/etc/kea/kea-dhcp4.conf:
    interfaces ['vtnet0'], subnet 10.10.0.0/24, pools ['10.10.0.100-10.10.0.199'],
    routers 10.10.0.1, domain-name-servers 10.10.0.1

Router unaffected: WAN 172.30.1.2, LAN 10.10.0.1, default route 172.30.1.1, 8 LAN pass rules in
pf, egress to 1.1.1.1 at 0.0% packet loss.

Payload gotcha, measured -- do NOT infer this: a GET response is not directly re-POSTable.
OPNsense GET returns select fields as {value: {selected: 0|1}}; SET expects the comma-joined
selected values, so the GET must be flattened first. And kea/service/reconfigure is the apply
verb -- without it the config saves but the daemon never reloads.

CONSEQUENCE: the config.xml push path is now RETIRED IN PRACTICE for Office1. DHCP is
API-managed, so pushing a full rendered config.xml WOULD CLOBBER IT. Do not run the old
scp/install/reboot path against this edge. Reducing the template to a minimal bootstrap
(sshd + root key + console) is the next step under D-113(a2) and is NOT yet done.

Revert: re-POST the previous values (unchanged, so nothing to undo), or edit in the GUI at
Services > Kea DHCP > DHCPv4 > Subnets. Pre-API config.xml backups remain in /conf/backup/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B6Fzre1CxCY8tzwFCudu57
1 parent cdc31b3 commit 047f6578c057ae56720a7944bf44eea8e434a084
@JANeumatrix JANeumatrix authored 15 hours ago
Showing 2 changed files
View
docs/changelog-20260713-opnsense-api-write-proven.md 0 → 100644
View
docs/session-ledger.md