- discovery.cpp: remove K_SERIAL emission from dmidecode CPU "ID" field
(it is the CPUID instruction result, identical across matching processors
in a multi-socket system, not a unique per-slot serial number)
→ upsert_part now falls through to K_SOCKET natural key, correctly
inserting both "Proc 1" and "Proc 2" as separate records
- discovery.cpp: skip memory slot blocks with missing or empty Locator
(HP ProLiant firmware returns a phantom type-17 block with no Locator;
this was causing a 19th slot record to be inserted with empty locator
that could never be deduplicated on subsequent runs)
Verified on HP ProLiant DL360 G7:
cpu=2, cpu_slots=2, memory_sticks=12, memory_slots=18, disks=5, nics=4
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- web-ui/main.go: full CRUD REST API + dark-theme SPA (servers, parts, part-types)
- Dockerfile.cli: add pciutils runtime dep for lspci NIC enrichment
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Hook interface (filter + execute contract) in server/hooks/hook.h
- Add HookRunner in server/hooks/hook_runner.h: spawns a detached thread
per matching hook, with try/catch protection against crashes
- Add DnsUpdaterHook in server/hooks/dns_updater_hook.{h,cpp}:
triggers on server name changes, logs in to Technitium, deletes the
old A record (ignores 404), and adds the new A record
Config via env vars: TECHNITIUM_HOST/PORT/USER/PASS/ZONE, DNS_TTL
- Add Database::get_nics_for_server() to resolve a server's IPv4 address
- Wire HookRunner into InventoryServer; cmd_edit_server now fires hooks
with before/after Server snapshots
- Update CMakeLists.txt to include dns_updater_hook.cpp
- Document env vars in Dockerfile
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>