dsh-onetree-log
Verified@inventec/dsh-onetree-log · v0.1.1 · MIT · Web UI
AMI MegaRAC OneTree 一键日志(OpenBMC dreport dump)上传与分析框架:设置面板「OneTree 日志」上传压缩包或登记服务器本地路径,安全解包、自动探测 dump 根、文件清单分类,为第二阶段逐域解析提供内核。
Install
dsh plugin add @inventec/dsh-onetree-log Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
dsh-onetree-log
AMI MegaRAC OneTree 一键日志(OpenBMC dreport dump)上传与分析框架 —— DSH 插件。
在 DSH「设置 → OneTree 日志」面板里上传 OneTree 一键日志压缩包(或登记服务器本地 路径),插件自动安全解包 → 探测 dump 根 → 文件清单与分类导航 → 文件预览。 本仓库是第一阶段(框架);第二阶段在同一内核上挂逐域解析器 (SEL / 传感器 / journal / 服务 / POST code …),见下文「第二阶段扩展点」。
设计蓝本:openUBMC bmcstudio_log_reviewer 的"内核 + 薄入口"架构(解析内核独立于 UI,路由化契约,机型知识外置)。 OneTree 背景:MegaRAC OneTree 是 AMI 的 OpenBMC 商业发行版,一键日志由 phosphor-debug-collector(dreport)产出(
selinfo.log、journal-pretty.log、dmesg.log、fru-info.log…一组命令输出文件,tar 打包,常为 zstd 压缩)。
功能(第一阶段)
- 上传:浏览器直传压缩包(原始字节流 POST,流式落盘,≤512MB;>20MB 受入口 网关限制时建议改走服务器路径)
- 登记服务器路径:压缩包或已解压 dump 目录原地登记(无大小限制,适合超大日志)
- 自动解包探测:
.tar / .tar.gz / .tgz / .tar.zst / .tzst / .zip;嵌套包装 (zip 套 tar 等)自动展开 ≤2 层;标记评分定位 dump 根;SP-X FFDC 血统给出专门提示 - 文件清单:按 14 个域分类(SEL/传感器/系统日志/FRU/服务/启动/网络…), 统计 chips 过滤 + 目录树 + 单文件文本预览(256KB,二进制探测)
- 生命周期:dump 登记持久化(重启不丢);删除时只清插件自建目录, path 登记的用户原文件/目录绝不动
安全
- 解包三防:zip-slip(绝对路径/
../NUL)、符号链接与硬链接条目直接拒绝、 单文件 1GiB / 总量 2GiB / 条目 20k 上限 - 文件预览路径二次校验(resolveFile 拒绝逃逸)
- 信任围栏与 dsh-obmc-web 同款:Host 须 loopback 或部署信任域、 Sec-Fetch-Site 不得 cross-site、Origin 须同 Host 主机名
- 上传/请求体限额:上传 512MB、JSON 8KB、预览 256KB
架构
lib/
├── index.js 宿主半身:/onetree-log* 路由(信任围栏 + JSON 契约)
├── client.js 客户端半身:settings.section「OneTree 日志」面板(React)
├── extract.js 解包内核:纯 JS 流式 tar(ustar/pax/GNU longname)+ zlib gz/zstd + zip 兜底
├── detect.js dump 探测:标记评分(强/中/SP-X)、嵌套包装展开
├── inventory.js 文件清单:KNOWN_FILES 分类表 + 统计 + 目录树
└── store.js 登记持久化:~/.local/share/dsh-onetree-log/dumps/<id>/
test/ node:test 单测(解包安全用例 / 探测 / 清单 / store 全链路)
scripts/e2e.mjs 宿主半身端到端自测(mock ctx + 临时 HTTP 服务)
HTTP 契约(宿主半身)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /onetree-log/upload?name=<原文件名> |
原始字节流上传 → 解包探测登记 |
| POST | /onetree-log/open-path {path,label?} |
登记服务器本地压缩包/目录 |
| GET | /onetree-log/dumps |
登记列表(时间倒序) |
| GET | /onetree-log/dumps/<id> |
详情(meta + inventory) |
| GET | /onetree-log/dumps/<id>/file?path=<rel> |
文件预览 |
| DELETE | /onetree-log/dumps/<id> |
删除登记 |
安装
# 市场(发布后)
dsh plugin --profile web add @inventec/dsh-onetree-log
# 源码本地(开发模式)
dsh plugin --profile web add link:/path/to/dsh-onetree-log
安装后重启 dsh web 生效。数据目录可用 ONETREE_LOG_DIR 环境变量覆盖。
开发
node --test 'test/*.test.js' # 17 个单测
node scripts/e2e.mjs # 宿主半身端到端
无构建步骤:lib/ 即发布产物(与 dsh-surf / dsh-obmc-web 一致的薄插件风格)。
宿主半身需要 Node ≥22.15(zlib 原生 zstd;旧版本自动回退系统 zstd -dc)。
发版
npm 包走 GitHub Actions OIDC Trusted Publishing(无静态 token,自带 provenance):
npm version patch # 或 minor / major:改 package.json 并打 v* tag
git push --follow-tags # Actions 自动发布到 @inventec/dsh-onetree-log
信任关系:package @inventec/dsh-onetree-log ↔ workflow publish.yml @ iasiv5/dsh-onetree-log,
registry 元数据里发布者显示为 GitHub Actions 即 OIDC 生效。
第二阶段扩展点(逐域解析)
内核已按 section 预留挂钩,第二阶段只需:
lib/sections/<name>.js:实现parse(files, ctx) → 结构化结果(如sel.js解析ipmitool sel list行为事件表、sensors.js解析传感器阈值矩阵)lib/index.js:新增路由GET /onetree-log/dumps/<id>/section/<name>(按inventory的 section 找到文件集 → 调解析器 → JSON 返回)lib/client.js:详情页为每个 section 加一个渲染卡片(表格/图表)- 规则诊断(对齐 bmcstudio_log_reviewer 的 detection-report 形态):
diagnose.js消费各 section 结果产出{Severity, Items:[{severity,msg,fix,evidence}]} - 真实样本回归:拿到脱敏真机 dump 后建
test/golden/冻结快照
分类表在 lib/inventory.js 的 KNOWN_FILES(文件名 → section),新文件名只需加一行。
License
MIT