cli

版本信息

项目内容
组件版本1.130.13
首发版本1.130.6
文档作者openUBMC 社区
最后更新2026-09-13

1. 组件概述

1.1 组件简介

cli 组件是 openUBMC 对外的人机交互入口,向上提供命令行界面,向下屏蔽资源协作接口与后端服务差异。由两部分组成:

部分语言说明
受限 Shell(CLP)C(src/clp/登录后进入的命令行环境,仅放行固定命令集
ipmcget / ipmcsetLua(src/lualib/src/service/将命令解析为 URI,经路由映射器转成后端资源协作接口对象调用

1.2 解决什么问题

1、解决服务器底层管理的标准化、自动化与可追溯性问题

服务器内部硬件组件众多,配置项复杂。如果缺乏统一的接口,运维将面临配置不一致、批量操作困难、接口随意变更导致自动化脚本失效等问题。

2、CLI 的解决方案:

统一配置与接口,屏蔽硬件差异,允许用户通过简单的命令完成所有管理操作。

支持基于 Shell / Python 的自动化运维,使得大规模服务器集群的批量配置、状态监控成为可能。

接口基线与生命周期管控,解决接口变更导致上下游系统兼容性问题,确保自动化流程的稳定性和可维护性。

1.3 核心功能

1. 受限 Shell:登录提示符、命令历史、会话超时(默认 900 秒,notimeout 可取消)、敏感信息遮蔽;命令集含 helpipmcgetipmcsetmdbctlpingrebootrollbackpasswdssh 等。

2. ipmcget / ipmcset:参数化命令 [-l <location>] [-t <target>] -d <dataitem> [-s <systemid>] [-v <value>],支持普通/分页/任务三类执行模式、敏感命令二次确认与鉴权、SOL 会话管理、一键日志收集入口(ipmcget -d diaginfo)。

1.4 关键术语表

术语解释
CLP受限 Shell 环境,只允许执行预定义命令集。
ipmcget查询类 CLI 命令。
ipmcset配置类 CLI 命令。
URICLI 命令映射到后端资源协作接口的路由标识。
interface_filter.json根据资源树条件隐藏部分 CLI 命令的产品定制配置。

1.5 外部交互边界图

只有Release包才会默认使用clp_commands。本组件不持有数据,所有查询/配置最终通过 D-Bus 用户会话总线(sd_bus)访问资源协作接口对象(path + interface)与后端服务(账号、重启、SOL、任务服务等)。


2. API 使用说明与示例

运行help指令可以查看clp_commands下所有可用指令

2.1 ipmcget / ipmcset 命令

功能说明

ipmcget 查询 BMC 状态、配置、日志等信息;ipmcset 下发配置与控制命令。

参数说明

命令语法:

ipmcget/ipmcset [-l <location>] [-t <target>] -d <dataitem> [-s <systemid>] [-v <value>]
参数必选说明
-l <location>机框/位置(仅当构建开启 cli_l_supported 时可用,默认关闭)
-t <target>目标资源类型,缺省为 _(通配)
-d <dataitem>数据项,如 versionsensorsel
-s <systemid>多机形态下的系统 ID
-v <value>附加参数/配置值

返回值与异常

可能抛出的异常及触发条件如下。错误通过 pcall 捕获并打印到标准输出,不向调用方抛出堆栈:

输出触发条件
Invalid Command路由映射器响应异常,或命令执行类型未注册
Request failed.后端服务返回错误(errs 非空)
Request failed, the echo profile does not exist.回显模板文件缺失
Invalid input鉴权提示后,密码输入失败
内部错误消息Lua 执行抛出未预期异常

参数不完整/非法时打印对应层级的帮助信息(Usage/参数列表/Example),不算异常。

应用场景

  • 日常巡检:查询版本、传感器、SEL、日志等信息。
  • 配置下发:通过 ipmcset 修改 BMC 配置。
  • 会话管理:管理 SOL 会话和用户口令。

限制条件

  • 写操作需要对应权限。
  • 部分命令需要二次确认或密码鉴权。

调试示例

以下命令与在受限 Shell 内执行等价:

bash
# 查询版本
ipmcget -d version

# 设置 SOL 超时时间
ipmcset -t sol -d timeout -v 15
# 期望输出:Set SOL timeout period successfully.

对于非 Release 构建,ipmcget/ipmcset 命令支持 --verbose=<level> 调整运行日志级别。

调试日志示例
bash
# 设置日志级别为debug,查看详细调试信息
ipmcget --verbose=debug -d version
<level>说明
error仅错误信息
warning警告及以上
notice重要通知及以上
info一般信息(默认)
debug详细调试信息
mass大量日志(最高级别)

2.2 受限 Shell 命令

功能说明

列出受限 Shell 中可直接使用的内置命令。

参数说明

各命令参数以 help 输出为准;pingtoproute 等命令只接受受限参数。

返回值与异常

命令成功时输出查询结果或成功提示;未注册、未使能或越权时输出错误信息。

应用场景

用于登录后的现场巡检、网络检查、资源调试和 BMC 重启操作。

限制条件

仅 Release 包默认进入受限 Shell;可用命令受产品配置和 interface_filter.json 控制。

调试示例

命令作用
help打印命令帮助
exit中止CLP会话
ping测试IPv4网络状态
ping6测试IPv6网络状态
ifconfig查看网络设备信息
notimeout取消登录会话超时
free检测内存状态
top检查系统资源使用情况。不接受参数
df检查磁盘使用情况
netstat用于检查端口状态
route用于检查路由信息。不接受参数
reboot [-f] [-r] [-R]重启 BMC(-f 强制、-r 进入恢复模式、-R 重启并回滚)
rollback强制重启并回滚
mdbctl在线调试命令(实现位于 mdbctl 组件)

3. 组件扩展案例

3.1 扩展能力概述

本组件支持声明式配置 + 模板扩展命令(主要在rackmount仓的interface_config/cli/目录下),无需改动核心代码。

3.2 扩展点说明

扩展点位置作用
接口配置 JSON(rackmount仓)interface_config/{ipmcget,ipmcset}/*.jsonURI → 后端调用映射、参数校验、回显引用
回显模板(rackmount仓)interface_config/echoes/**自定义输出格式(Lua 模板引擎)
客户/产品定制(rackmount仓)interface_config/customer/**
interface_config/<platform_board>/
按客户/产品替换配置与模板
自定义路由脚本(cli组件仓)src/lualib/route/**复杂命令定制逻辑(如 SOL activate)
命令隐藏过滤(cli组件仓)interface_config/interface_filter.json按资源树条件隐藏指定 CLI 命令(见 3.5)

3.3 二次开发指导

openUBMC社区的CLI接口采用接口映射配置方案实现,需要将命令配置到json文件中。CLI命令的接口映射配置文件位于 rackmount 代码仓的 interface_config/cli 路径下。参考社区文档:

3.4 案例:新增一条配置命令(以 sol/timeout 为例,取自单元测试数据)

Step 1:接口配置 interface_config/cli/ipmcset/sol.jsonUri 对应 /cli/v1/sol/timeout

json
{
    "Resources": [{
        "Uri": "/cli/v1/sol/timeout",
        "Interfaces": [{
            "Type": "Patch",
            "Usage": "ipmcset -t sol -d timeout -v <value>",
            "ReqBody": {
                "Type": "object",
                "Required": true,
                "Properties": {
                    "Value": { "Required": true, "Type": "integer", "Validator": [{ "Type": "Range", "Formula": [0, 480] }] }
                }
            },
            "ProcessingFlow": [{
                "Type": "Method",
                "Path": "sol/SetTimeout",
                "Interface": "interface",
                "Name": "SetTimeout",
                "Params": ["${ReqBody/Value}"],
                "Destination": { "Result": "Result" }
            }],
            "Echoes": ["ipmcset/sol_timeout", ""]
        }]
    }]
}

Step 2:回显模板 interface_config/cli/echoes/ipmcset/sol_timeout

text
Set SOL timeout period {* Result == 0 and 'successfully' or 'failed' *}.

Step 3:验证

bash
ipmcset -t sol -d timeout -v 15
# Set SOL timeout period successfully.

模板标记(src/lualib/template/parser.lua):{* expr *} 原样输出、{{ expr }} 输出expr的结果(一些特殊符号将会被转义)、{% lua %} 语句、{( view, ctx )} 引入模板、{# comment #} 注释。

参考文档产品多层级接口定制

3.5 产品定制命令隐藏(interface_filter.json)

产品可通过 interface_config/interface_filter.json按资源树条件隐藏部分 CLI 命令。被隐藏的命令执行时按“命令不存在”处理,且不会出现在 -t/-d/-l 提示列表中。

配置结构

json
{
    "Conditions": {
        "ServiceEnabled": {
            "Path": "/bmc/kepler/EventService",
            "Interface": "bmc.kepler.EventService",
            "Property": "ServiceEnabled",
            "Value": true,
            "Description": "资源树匹配示例"
        }
    },
    "CLIFilter": [
        {
            "Conditions": ["ServiceEnabled"],
            "ErrorMessage": "该命令在当前产品下不可用",
            "Get": [
                { "ParentUri": "/cli/v1/sol", "Command": "*" },
                { "ParentUri": "/cli/v1/shelf/_", "Command": "chassisid", "LocationCommand": true }
            ],
            "Set": [
                { "ParentUri": "/cli/v1/shelf/_", "Command": "*", "LocationCommand": true }
            ]
        }
    ]
}
字段说明
Conditions资源树条件定义:Path/Interface/Property/Value,条件全部满足时对应过滤条目才生效
CLIFilter[].Conditions引用的条件名列表,全部满足则该条目的 Get/Set 生效
CLIFilter[].ErrorMessage可选;命令被隐藏时向用户打印的错误信息
CLIFilter[].Get / .Set要隐藏的命令列表(Get 对应 ipmcgetSet 对应 ipmcset

命令条目字段

字段说明
ParentUri命令路径 /cli/v1/<target>,段可用 _ 占位
Command命令名,或 *(隐藏 ParentUri 下的全部命令,含 ParentUri 本身)
LocationCommandtrue 表示当前命令包含-l(location)场景
(条目级)ErrorMessage命中隐藏时打印的错误信息,无则不打印

参考:示例配置见 example/interface_filter.json;实现位于 src/lualib/interface_filter.lua


4. 日志说明

4.1 一键日志收集

CLI 通过 ipmcget -d diaginfo 触发一键日志收集,默认生成 /tmp/dump_info.tar.gz,也可通过 -v <path> 指定输出路径。收集内容由诊断信息框架和各组件注册项共同决定。

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
Invalid command typeERROR命令类型未注册或接口配置中的执行类型非法。检查 interface_config 中的 URI 和命令类型。
Request failed.ERROR后端资源协作接口返回错误。根据请求 URI 检查后端组件日志和参数。
echo profile does not existERROR回显模板缺失。检查 interface_config/echoes 下的模板文件。
COMMAND NOT SUPPORTEDERROR命令未在受限 Shell 注册或功能未使能。检查 help 输出和产品使能开关。
get task failedERROR命令对应的异步任务查询失败。检查 TaskService 和任务对象状态。

5. 问题定界指南

5.1 典型问题定界

快速定位:提示不完整/Usage 异常 → 参数解析层(ipmc.lua);Invalid Command/类型未注册 → 命令执行层;输出格式不符/模板缺失 → 回显层;登录提示符/超时/COMMAND NOT SUPPORTED → 受限 Shell 层(src/clp/)。

典型问题

现象可能原因定位
Invalid Command接口配置缺 URI 或命令类型未注册运行日志搜 Invalid command type
Request failed.后端服务返回错误查后端服务日志
COMMAND NOT SUPPORTEDverb 未注册或功能未使能(如 passwd检查 help 输出与 Enabled 开关
任务命令卡在进度任务对象异常运行日志搜 get task failed

5.2 最小化复现与证据收集

  1. 使用 ipmcget --verbose=debug -d <dataitem>ipmcset --verbose=debug ... 开启调试日志并复现问题。
  2. 核对 interface_config 中对应的 URI、参数校验和回显模板。
  3. 使用 busctlmdbctl 直接访问后端对象,判断问题位于 CLI 层还是后端资源层。
  4. 保留完整命令、标准输出、错误码、/var/log/app.logipmcget -d diaginfo 收集结果。

5.3 调试方法

  • 参数提示或 Usage 异常:检查参数解析和命令帮助配置。
  • Invalid Command 或命令类型错误:检查路由映射和命令注册。
  • 回显格式错误:检查 echoes 模板和模板变量。
  • 受限 Shell 命令缺失:检查 Release/Debug 构建类型、命令注册和 interface_filter.json

5.4 错误码速查表

错误码名称含义排查建议
241FUNCTION_NOT_SUPPORTED功能未实现或不支持。检查当前产品是否使能该功能。
245REQUIRED_OPTION_MISSING缺少必选参数。help 或 Usage 补齐参数。
253COMMAND_NOT_RECOGNIZED命令无法识别。检查 -t/-d 与接口配置。
254COMMAND_NOT_SUPPORTED命令不支持。检查命令注册和产品过滤条件。
255COMMAND_ERROR_UNSPECIFIED未分类命令错误。收集 CLI 和后端日志进一步定位。
0x83用户锁定账号处于锁定状态。检查账号锁定状态和管理策略。
0x96初始口令需重置用户必须先修改初始口令。修改口令后重试。

6. 常见问题解答

Q1:ipmcgetipmcsetInvalid Command,如何处理?

  • 问题描述:命令未执行,输出 Invalid Command
  • 一句话答案:命令未命中合法接口配置,或命令执行类型未注册。
  • 根因说明:路由映射器响应异常,或 interface_config 中缺少对应 URI/命令类型。
  • 解决方案:检查 interface_config 的 URI、-t/-d 参数和命令类型;在运行日志中检索 Invalid command type
  • 规避方案:新增命令后先在测试环境执行 help 和只读命令验证,再纳入产品配置。
  • 适用版本:1.130.13。

Q2:配置命令返回 Request failed.,如何定位?

  • 问题描述:命令已被 CLI 接收,但后端返回失败。
  • 一句话答案:CLI 已完成后端调用,需要结合请求 URI 检查后端组件。
  • 根因说明:后端服务返回非空错误列表,或参数未通过后端校验。
  • 解决方案:从调试日志获取请求对象和接口,检查对应微组件日志、权限和参数。
  • 规避方案:生产变更前在维护窗口验证参数,并保存原值和回显结果。
  • 适用版本:1.130.13。

Q3:一键日志包在哪里?

  • 问题描述:需要收集 CLI 和系统诊断信息。
  • 一句话答案:执行 ipmcget -d diaginfo,默认生成 /tmp/dump_info.tar.gz
  • 根因说明:诊断信息由系统框架统一收集,CLI 通过 diaginfo 数据项触发。
  • 解决方案:使用 ipmcget -d diaginfo -v <path> 指定输出路径,生成后确认文件存在。
  • 规避方案:不要在空间不足或业务高峰时执行,避免影响现场维护。
  • 适用版本:1.130.13。