- 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>
Add soft,timeo=30 mount options to all nfs-subdir-external-provisioner
Helm values files so that newly created PVs use non-blocking NFS mounts.
StorageClasses have been patched directly in the cluster.
Motivation: a USB drive disconnect on kube-node-1 caused the NFS server
to go down for ~2.5 days. The HP Proxmox host had hard NFS mounts to
the Dell which blocked df -h indefinitely until the NFS server recovered.
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>
- media-pool/jellyfin renamed to media-pool/media (mountpoint /data/media unchanged)
- media-pool/immich renamed to media-pool/photos (mountpoint /data/photos unchanged)
- media-pool/minecraft → media-pool/games/minecraft (child of games)
- media-pool/factorio → media-pool/games/factorio (child of games)
- media-pool/openttd → media-pool/games/openttd (child of games)
- Individual game quotas removed; single 1T quota set on media-pool/games
- Removed stale legacy /media-pool/jellyfin etc. from HP /etc/exports
- Updated pvs.yaml section headers to reflect new ZFS dataset names
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>