4.7 KiB
Quick pickup (last updated 2026-08-25)
Read this first. AGENT.md has the full history/design rationale if you need depth on
any specific decision below.
What this project is
Two things, in one working tree:
~/code/experiments/hpe/(this dir) -- a Python reference implementation (extractors/,actions/) for scraping/writing an HP ProCurve/OfficeConnect 1810 (J9450A) switch's web UI at192.168.2.10, no password.~/code/experiments/hpe/terraform-provider-hpe1810/-- the real deliverable: a Go/OpenTofu Terraform Plugin Framework provider that does the same thing properly. Example usage lives in~/code/experiments/hpe/terraform/.
The Python side is essentially done and frozen as a reference; almost all active work now is in the Go provider.
Current state (2026-08-25)
Provider builds clean. tofu plan in ~/code/experiments/hpe/terraform/ shows zero
drift -- state matches the real switch exactly.
13 data sources (all read-only pages) -- done.
10 write resources -- all built, all verified live on real hardware:
hpe1810_locator, hpe1810_green_features, hpe1810_port (for_each over var.ports),
hpe1810_system_description, hpe1810_time_zone, hpe1810_lldp_configuration (Global
Mode only), hpe1810_daylight_saving_time (Disable/Recurring only), hpe1810_flow_control,
hpe1810_port_mirroring (global settings only), hpe1810_trunk (create/delete LAGs +
membership).
Plus: save_running_config provider flag (only saves to flash if something actually
changed this run) and admin_port provider flag (default 24 -- hpe1810_port and
hpe1810_trunk both hard-refuse to write to it, guard verified live).
Still on TODO.md as wanted ("y") but not built
Loop Protection Cfg (LoopProtectionCfg.html), Advanced Security (security.html),
Secure Connection (SSLCfg.html), LLDP Local/Remote Device (read-only summary pages).
Check TODO.md's "Want it?" column before picking a next target -- don't assume the risk
triage in AGENT.md is the same as what's actually wanted (learned this the hard way once
already this session).
Also explicitly deferred (not on the TODO list, just noted as future work if ever wanted):
per-port tables on LLDPConfig.html (Interface Mode) and FDBConfig.html (per-source-port
Direction) -- same complexity class as resource_port.go/resource_trunk.go.
Things to remember before touching the switch again
- Proxy: always
NO_PROXY=192.168.2.10 no_proxy=192.168.2.10before any curl/tofu command, or requests silently go throughfproxy.tutus.se:8080and hang/502. - Single session limit: the switch allows exactly one active web session. A stray
browser tab or leftover curl cookie jar session will lock out the next login. The Go
provider logs itself out at process exit (
Client.Logout()viaShutdown()inmain.go) so back-to-backtofuruns are fine now -- but manual curl testing sessions (like/tmp/*.txtcookie jars used during dev) need an explicitcurl ".../index.html?logout=1"when you're done, or wait out the ~5 min timeout. - Rebuild after any Go change:
cd terraform-provider-hpe1810 && go build -o terraform-provider-hpe1810 .--~/.tofurcdev_overrides picks it up automatically, notofu initneeded/possible. - Port 24 is the only real uplink right now. Never write to it directly; the
admin_portguard covershpe1810_port/hpe1810_trunk, but there's no such guard on any other resource (nor should there need to be, since nothing else targets a specific interface). - This firmware has repeatedly needed live experimentation to find the real write
protocol -- static HTML snapshots in
page_snapshots/are useful for structure but have been wrong or incomplete more than once (FILTER_MISSINGon omitted hidden fields;TrunkMembership.html's real form is JS-rendered, not in the static HTML at all; DST's duplicate field labels). Budget time for a probe-with-curl step before writing Go for any new write target.
How to pick up
- Ask the user (or check
TODO.md) what's next. - If it's a new write page: fetch it live with curl (logged in via the pattern used
throughout this session -- GET
/then POST/hp_login.htmlwith emptypwd), checkpage_snapshots/<Page>.html.htmlfor structure, but verify writes live with curl before writing any Go. - Follow the established resource shape:
client/<name>.go(or a new method onclient.Client) for the HTTP protocol,resource_<name>.gofor the Terraform side, register inprovider.go'sResources(), add example usage to~/code/experiments/hpe/terraform/main.tf, verify live (Create/Update/Delete round-trip confirmed against the real switch, not just "no error"), updateTODO.mdandAGENT.md.