fix(parser): support Inspur onekeylog per-file component/*.txt D-Bus layout

Some onekeylog BMC firmware variants split the combined component.log
into per-file D-Bus GetAll transcripts under component/ (e.g.
PowerSupplyInfo.txt, FanInfo.txt), which the inspur parser did not
read, leaving PSU and fan data empty. Add a GETALL block parser and
wire it as a fallback for PSU and fan telemetry when component.log is
absent; document the layout and known gaps in bible-local.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Chusavitin
2026-07-23 12:24:17 +03:00
co-authored by Claude Sonnet 5
parent 4ce0251ce4
commit 5677c49998
4 changed files with 298 additions and 2 deletions
+31
View File
@@ -1198,3 +1198,34 @@ Do not keep parallel report sections, filters, or table renderers in shell JavaS
- Report-level filtering or extra report sections must be implemented in `internal/chart`, not in
`web/static/js/app.js`.
- Removing legacy DOM renderers from the shell is a correctness fix, not a behavior regression.
---
## ADL-047 — Inspur onekeylog per-file `component/*.txt` D-Bus layout is parsed alongside `component.log`
**Date:** 2026-07-23
**Context:** A field dump (`dump_29E201150_20260723-1418.tar.gz`) came from an Inspur/Kaytus
onekeylog BMC that does not produce the combined `component/component.log` the `inspur` parser
expected. Instead it dumps each component separately under `component/*.txt` as raw D-Bus `GetAll`
transcripts (`GETALL <object> OBJect` blocks, tab-separated `"field" "type":"x" "data":value`
triples, not valid JSON). The archive root is also named `dump_<serial>_<timestamp>/` rather than
`onekeylog/`, so path-based detection did not recognize the layout either. As a result PSU and fan
data were silently empty on this archive class even though the source files carried full data.
**Decision:** Treat the per-file `component/*.txt` D-Bus transcript as a second supported onekeylog
layout, not a new vendor. Added `internal/parser/vendors/inspur/component_dbus.go` with a
line-oriented GETALL block parser (`parseDBusGetAllObjects`), wired as a fallback in `parser.go`
when `component.log` is absent: `ParseComponentDirPowerSupply` from `PowerSupplyInfo.txt` and
`ParseComponentDirFan` from `FanInfo.txt`. Extended `Detect()` with `onekeylog_dreport.log` and
`component/powersupplyinfo.txt` markers so this layout is recognized without relying solely on
`asset.json` content markers. GETALL object names can recur across command sections with different
field subsets (e.g. `Pwm_N` under FanPWM has a `Value` reading, the same name under FanControl has
only a `Target` setpoint); fields are unioned across occurrences with first-seen-wins per key so a
later content-free duplicate cannot blank out an earlier real reading.
**Consequences:**
- PSU and fan RPM/PWM telemetry now parse correctly for this onekeylog layout.
- `component/NetworkAdapter.txt`, `component/HDDBpListInfo.txt` (busctl `--verbose` object-tree
dump) and `component/RAID.txt` (mixed per-controller formats) remain unparsed for this layout;
NIC data is not lost since PCIe inventory from `asset.json` already carries NIC model/MAC.
Revisit only if a real archive needs that specific data and asset.json does not cover it.
- Any future component/*.txt GETALL consumer should reuse `parseDBusGetAllObjects` rather than
re-implementing block splitting or field extraction.