配置导入导出与定制化引擎
概述
ipmi_mgmt 模块提供了配置导入导出和装备定制化能力,支持通道权限配置、通道编号配置、厂商 ID(Manufacturer ID)以及防火墙模式的持久化与定制。本文档描述导入导出引擎和定制化引擎的设计与使用。
防火墙运行时策略与 IPMI 命令见 防火墙(黑白名单)。
服务集成
ipmi_mgmt 服务通过以下回调集成导入导出和定制化能力:
on_import_config
void ipmi_mgmt_service::on_import_config(mc::string data, mc::string type)
- type="custom":调用
customize_engine::import_data();单项失败只记录日志,不中断其余项 - 否则:调用
import_export_engine::import_data();单项失败抛出CollectingConfigurationErrorDesc并立即退出,后续项不再导入(对齐 ipmi_core)
on_export_config
mc::string ipmi_mgmt_service::on_export_config(mc::string type)
- type="custom":调用
customize_engine::export_data() - 否则:调用
import_export_engine::export_data()
导入导出引擎
设计目标
导入导出引擎用于支持 BMC 配置的导入导出功能,允许将通道权限配置、通道编号配置、厂商 ID 和防火墙模式导出到配置文件,以及从配置文件导入配置。
接口定义
namespace ipmi_mgmt::import_export_engine {
void import_data(const mc::dict& datas); // 失败抛 CollectingConfigurationErrorDesc
mc::dict export_data();
}
处理顺序与入参一致:先遍历传入的 datas,无对应 handler 则跳过,有则处理。Import=true 且校验失败时:
- 记录
Import Com [FireWallMode] failed一类错误日志 - 抛出
CollectingConfigurationErrorDesc(参数为失败项名,对齐 ipmi_coreerror(custom_messages.CollectingConfigurationErrorDesc(k))),OMS 将本次导入标为失败 - 已处理成功的项保留,后续项不再执行
type="custom" 不走此路径,单项失败不影响其它项。
Com
Com 配置项用于导入导出 IPMI 公共配置,包含:
- ManufacturerID:写入
IpmiCore.CustomManufacturerId - FireWallMode:写入共享内存
bw_mode及Firewall.Mode属性
导入数据结构
{
"Com": {
"ManufacturerID": {
"Import": true,
"Value": 4660
},
"FireWallMode": {
"Import": true,
"Value": 0
}
}
}
上例 ManufacturerID.Value 为十进制 4660,对应厂商 ID 0x001234;FireWallMode.Value 为 0(黑名单模式)。
导出数据结构
{
"Com": {
"ManufacturerID": 4660,
"FireWallMode": 0
}
}
导出为当前属性/运行时值的标量,不含 Import 字段。
ManufacturerID(厂商 ID)
导入字段说明
| 字段 | 说明 |
|---|---|
ManufacturerID.Import |
是否导入厂商 ID(bool);为 false 时忽略 Value |
ManufacturerID.Value |
厂商 ID(uint32),有效范围 0~0xFFFFFF(24 位) |
导出字段说明
| 字段 | 说明 |
|---|---|
ManufacturerID |
当前 CustomManufacturerId(uint32) |
校验与默认值
| 项 | 说明 |
|---|---|
| 有效范围 | 0 ≤ Value ≤ 0xFFFFFF;超出范围记录错误日志、不更新属性,并抛出 CollectingConfigurationErrorDesc 中止后续导入 |
| 默认值 | 未导入或 Import=false 时保持现有属性;新建 IpmiCore 默认为 0x0007db |
使用场景
场景1:配置导出
- 导出备份或迁移时包含当前厂商 ID
场景2:配置导入
Import=true且 Value 合法时写入CustomManufacturerId
场景3:配置恢复
- 从备份恢复厂商 ID,与通道配置一并导入
FireWallMode(防火墙模式)
导入字段说明
| 字段 | 说明 |
|---|---|
FireWallMode.Import |
是否导入防火墙模式(bool);为 false 时忽略 Value |
FireWallMode.Value |
防火墙模式(uint8):0 黑名单,1 白名单,255(0xFF)关闭 |
导出字段说明
| 字段 | 说明 |
|---|---|
FireWallMode |
当前防火墙模式(uint8),与 bw_list_mgr::get_firewall_mode() 一致 |
校验与默认值
| 项 | 说明 |
|---|---|
| 有效取值 | 0、1、255(0xFF);其余值拒绝并保持原模式,抛出 CollectingConfigurationErrorDesc 中止后续导入 |
| 默认值 | 未导入或 Import=false 时保持当前模式;新建系统默认为关闭(0xFF) |
| 副作用 | 导入成功后同步更新 Firewall 对象的 Mode 属性(对象存在时) |
使用场景
场景1:配置导出
- 备份或迁移时导出当前防火墙模式
场景2:配置导入
Import=true且 Value 合法时切换黑/白/关闭模式
场景3:配置恢复
- 从备份恢复防火墙策略,与通道、厂商 ID 配置一并导入
说明:导入导出仅覆盖防火墙模式,不包含自定义黑/白名单条目;名单条目通过 IPMI
BWListAddDel或 D-BusFirewall接口维护。
IPMIChannel
IPMIChannel 配置项包含通道权限和通道编号映射两个子配置项。
导入数据结构
导入数据采用分层结构,包含 IPMIChannelAccess 和 NCSILanChannelNumber 两个配置项:
{
"IPMIChannel": {
"IPMIChannelAccess": {
"ICMBAccessRole": {"Import": true, "Value": 3},
"IPMBAccessRole": {"Import": true, "Value": 2},
"SMSAccessRole": {"Import": true, "Value": 4}
},
"NCSILanChannelNumber": {
"Import": true,
"Value": 6
}
}
}
导出数据结构
导出数据同样采用分层结构,包含当前通道权限和通道编号配置:
{
"IPMIChannel": {
"IPMIChannelAccess": {
"ICMBAccessRole": 3,
"IPMBAccessRole": 2,
"SMSAccessRole": 4
},
"NCSILanChannelNumber": 6
}
}
IPMIChannelAccess(通道权限)
IPMIChannelAccess 配置项用于导入导出通道权限角色配置。
导入字段说明
| 字段 | 说明 |
|---|---|
ICMBAccessRole.Import |
是否导入 ICMB 通道角色配置(bool) |
ICMBAccessRole.Value |
ICMB 通道角色编号(uint8):0=NoAccess, 2=User, 3=Operator, 4=Administrator |
IPMBAccessRole.Import |
是否导入 IPMB 通道角色配置(bool) |
IPMBAccessRole.Value |
IPMB 通道角色编号(uint8) |
SMSAccessRole.Import |
是否导入 SMS 通道角色配置(bool) |
SMSAccessRole.Value |
SMS 通道角色编号(uint8) |
导出字段说明
导出数据包含当前所有通道的角色编号:
| 字段 | 说明 |
|---|---|
ICMBAccessRole |
ICMB 通道当前角色编号(uint8) |
IPMBAccessRole |
IPMB 通道当前角色编号(uint8) |
SMSAccessRole |
SMS 通道当前角色编号(uint8) |
使用场景
场景1:配置导出
- 用户通过 BMC 管理界面导出配置
- 系统调用
export_data()获取当前配置 - 通道权限数据被序列化并保存到文件
场景2:配置导入
- 用户通过 BMC 管理界面导入配置
- 系统解析配置文件并调用
import_data() - 指定 Import=true 的通道权限配置被应用到系统
场景3:配置恢复
- BMC 重装或恢复出厂设置后
- 从备份配置文件导入恢复配置
- 通道权限恢复到之前的状态
NCSILanChannelNumber(通道编号映射)
NCSILanChannelNumber 配置项用于导入导出通道编号映射配置。
导入字段说明
| 字段 | 说明 |
|---|---|
NCSILanChannelNumber.Import |
是否导入通道编号配置(bool) |
NCSILanChannelNumber.Value |
LAN2 通道的目标外部编号(uint8) |
导出字段说明
导出数据包含当前 LAN2 通道的外部编号:
| 字段 | 说明 |
|---|---|
NCSILanChannelNumber |
LAN2 通道当前外部编号(uint8) |
使用场景
场景1:配置导出
- 用户通过 BMC 管理界面导出配置
- 系统调用
export_data()获取当前配置 - 通道编号映射数据被序列化并保存到文件
场景2:配置导入
- 用户通过 BMC 管理界面导入配置
- 系统解析配置文件并调用
import_data() - 指定 Import=true 的通道编号配置被应用到系统
场景3:配置恢复
- BMC 重装或恢复出厂设置后
- 从备份配置文件导入恢复配置
- 通道编号映射恢复到之前的状态
定制化引擎
设计目标
定制化引擎用于支持装备定制化功能,允许根据装备型号定制通道权限配置、通道编号配置、厂商 ID 和防火墙模式。支持自定义配置和恢复默认配置。
接口定义
namespace ipmi_mgmt::customize_engine {
void import_data(const mc::dict& datas);
mc::dict export_data();
}
厂商 ID 定制
厂商 ID 定制用于根据装备型号设置 IPMI 自定义厂商 ID,写入 IpmiCore.CustomManufacturerId。
导入数据结构
定制化数据通过 CustomSettings 传入:
{
"BMCSet_IpmiCustomManuID": {
"Value": 43981
}
}
上例 Value 为十进制 43981,对应厂商 ID 0x00ABCD。
导出数据结构
{
"BMCSet_IpmiCustomManuID": 43981
}
导出为当前 CustomManufacturerId 数值,字段结构与通道定制项一致(导出为标量,导入为 {"Value": ...})。
导入字段说明
| 字段 | 说明 |
|---|---|
BMCSet_IpmiCustomManuID.Value |
定制厂商 ID(uint32),有效范围 0~0xFFFFFF |
| 不存在该字段 | 不修改当前厂商 ID |
导出字段说明
| 字段 | 说明 |
|---|---|
BMCSet_IpmiCustomManuID |
当前 CustomManufacturerId(uint32) |
校验与默认值
| 项 | 说明 |
|---|---|
| 有效范围 | 0 ≤ Value ≤ 0xFFFFFF;超出范围记录错误日志且不更新属性 |
| 默认值 | IpmiCore 默认 0x0007db;未配置定制项时导出反映当前属性值 |
使用场景
场景1:装备定制化
- 按装备型号写入指定厂商 ID
场景2:定制配置导出
- 导出当前定制厂商 ID 供备份或装备模板复用
防火墙模式定制
防火墙模式定制用于装备出厂时预设 IPMI 黑白名单策略开关,写入共享内存 bw_mode 及 Firewall.Mode。
导入数据结构
定制化数据通过 CustomSettings 传入,须同时提供状态与模式:
{
"BMCSet_FirewallStatus": {"Value": 1},
"BMCSet_FireWallMode": {"Value": 0}
}
| 组合 | BMCSet_FirewallStatus |
BMCSet_FireWallMode |
含义 |
|---|---|---|---|
| 开启黑名单 | 1 |
0 |
黑名单模式 |
| 开启白名单 | 1 |
1 |
白名单模式 |
| 关闭防火墙 | 0 |
255 |
关闭自定义策略 |
导出数据结构
{
"BMCSet_FireWallMode": 0,
"BMCSet_FirewallStatus": 1
}
关闭时导出示例:BMCSet_FireWallMode 为 255,BMCSet_FirewallStatus 为 0。
导入字段说明
| 字段 | 说明 |
|---|---|
BMCSet_FirewallStatus.Value |
开关状态:0 关闭,1 开启 |
BMCSet_FireWallMode.Value |
模式:0 黑名单,1 白名单,255 关闭 |
导出字段说明
| 字段 | 说明 |
|---|---|
BMCSet_FireWallMode |
当前模式(uint8) |
BMCSet_FirewallStatus |
当前开关:0 当模式为关闭,1 否则 |
校验与一致性
| 项 | 说明 |
|---|---|
| 有效 Status | 仅 0、1 |
| 有效 Mode | 0、1、255 |
| 一致性 | Status=0 时 Mode 必须为 255;Status=1 时 Mode 不得为 255 |
| 不一致处理 | Status 与 Mode 矛盾时记录错误日志,不更新当前模式 |
使用场景
场景1:装备定制化
- 按型号预设黑名单或白名单策略(如带内通信默认黑名单)
场景2:关闭防火墙定制
- 设置
BMCSet_FirewallStatus=0、BMCSet_FireWallMode=255
场景3:定制配置导出
- 导出当前
BMCSet_FireWallMode/BMCSet_FirewallStatus供装备模板复用
通道权限定制
通道权限定制用于根据装备型号需求定制各通道的访问权限角色。
导入数据结构
定制化数据包含开关标志和角色配置:
{
"BMCSet_IPMIChannelAccessEnabled": {"Value": "on"},
"Custom_ICMBAccessRole": {"Value": 3},
"Custom_IPMBAccessRole": {"Value": 2},
"Custom_SMSAccessRole": {"Value": 4}
}
导入字段说明
定制开关:
| 字段 | 说明 |
|---|---|
BMCSet_IPMIChannelAccessEnabled.Value |
定制开关状态:"on"=启用定制,"off"=恢复默认 |
| 不存在该字段 | 默认恢复默认配置 |
角色配置:
| 字段 | 说明 |
|---|---|
Custom_ICMBAccessRole.Value |
ICMB 通道自定义角色编号(uint8) |
Custom_IPMBAccessRole.Value |
IPMB 通道自定义角色编号(uint8) |
Custom_SMSAccessRole.Value |
SMS 通道自定义角色编号(uint8) |
导出数据结构
导出数据包含当前各通道的角色编号:
{
"Custom_ICMBAccessRole": 3,
"Custom_IPMBAccessRole": 2,
"Custom_SMSAccessRole": 4
}
导出字段说明
| 字段 | 说明 |
|---|---|
Custom_ICMBAccessRole |
ICMB 通道当前角色编号(uint8) |
Custom_IPMBAccessRole |
IPMB 通道当前角色编号(uint8) |
Custom_SMSAccessRole |
SMS 通道当前角色编号(uint8) |
默认角色配置
系统预定义了默认通道角色:
| 通道类型 | 默认角色 | 角色编号 |
|---|---|---|
| ICMB | Administrator | 4 |
| IPMB | Operator | 3 |
| SMS | Operator | 3 |
使用场景
场景1:装备定制化
- 根据装备型号需求定制通道权限
- 配置 BMCSet_IPMIChannelAccessEnabled="on"
- 设置各通道的 Custom_*AccessRole
- 应用定制配置到系统
场景2:恢复默认配置
- 用户或系统需要恢复默认通道权限
- 配置 BMCSet_IPMIChannelAccessEnabled="off"
- 或不配置该字段
- 所有通道恢复为默认角色
场景3:定制配置导出
- 导出当前定制化配置供备份或查看
- 调用
export_data()获取定制数据 - 定制数据可用于配置验证或重新应用
通道编号映射定制
通道编号映射定制用于根据装备型号需求定制 LAN2 通道的对外编号。
导入数据结构
定制化数据包含通道编号配置:
{
"Custom_ChannelNumber": {"Value": 6}
}
导入字段说明
| 字段 | 说明 |
|---|---|
Custom_ChannelNumber.Value |
LAN2 通道自定义外部编号(uint8) |
导出数据结构
导出数据包含当前 LAN2 通道的外部编号:
{
"Custom_ChannelNumber": 6
}
导出字段说明
| 字段 | 说明 |
|---|---|
Custom_ChannelNumber |
LAN2 通道当前外部编号(uint8) |
使用场景
场景1:通道编号定制化
- 根据装备型号需求定制通道编号
- 设置 Custom_ChannelNumber 为目标编号
- 应用定制配置到系统
场景2:定制配置导出
- 导出当前定制化配置供备份或查看
- 调用
export_data()获取定制数据 - 定制数据可用于配置验证或重新应用