event_policy(事件策略)

版本信息

项目内容
组件版本1.140.13
首发版本1.130.7
文档作者o1315548501
最后更新2026-09-13

1. 组件概述

1.1 组件简介

event_policy 是 openUBMC 中的事件策略服务。服务从 event 组件读取 Event 和 SEL 记录,将符合事件通道、类型及严重度配置的记录分发到 SNMP Trap、SMTP 和 Syslog 通道,并对处于 Asserted 状态的事件执行其 ActionId 指定的主机电源动作。

服务还负责启动时补报未处理记录、未恢复告警重上报(Rearm)、配置持久化、OEM IPMI 命令注册以及可选的跨板事件同步。Redfish 订阅配置对象仍由本组件创建,但源码已明确将 Redfish 告警上报逻辑迁移到 redfish 组件,本组件不直接发送 Redfish 事件。

1.2 解决什么问题

  • 统一接收 Event 和 SEL,避免事件产生方分别实现外部告警上报。
  • 为 SNMP、SMTP 和 Syslog 提供统一的使能、过滤、接收端和凭据配置。
  • 从已持久化的记录号继续同步,降低服务重启造成的漏报风险。
  • 根据事件策略执行强制下电、强制重启或下电再上电。
  • 在双节点场景中向对端同步事件及通道位置数据。

1.3 核心功能

  • 事件同步与监听:监听 EventRecordSeqRecordSeq,同步新产生及停机期间遗漏的 Event/SEL。
  • 多通道上报:按 ReportChannelEventType、使能状态和 SeverityFilter 分发事件。
  • SNMP 配置:支持 SNMPv1、SNMPv2c、SNMPv3,NMS、SNMP Destination、团体名、Trap 模式和服务器标识配置。
  • SMTP 配置:支持服务器、TLS、认证/匿名模式、发件人、最多四个收件人、主题和测试邮件。
  • 事件策略:仅对告警产生的事件根据ActionId判断是否要执行对应的主机电源动作。
  • 事件重上报:将未恢复告警重新投递到指定通道或全部通道。
  • 配置管理:注册配置导入、导出和可信配置回调,敏感值通过 KMC 加密后持久化。
  • Trap 插件:按客户名加载 Lua 插件,替换 SNMP Trap OID 和 bindings 封装逻辑。

1.4 关键术语表

术语解释
Eventevent 组件提供的告警事件记录。
SELSensor Event Log;本组件将其转换为统一事件结构后分发。
ActionId字符串 123 分别映射到强制下电、强制重启、下电再上电;其他值不执行动作。
SeverityFilter4 位严重度过滤掩码,合法范围为 0~15。
ServerIdentityTrap 中服务器标识的来源:BoardSNProductAssetTagHostName
Rearm将当前未恢复告警重新投递到选定的上报通道。
NMSNetwork Management System,SNMP Trap 接收端。

1.5 外部交互边界图

mds/service.json 还声明了证书、网络、FRU、机箱等必选或可选资源接口;上图仅展示主处理链路。Syslog 远端配置由 bmc.kepler.Managers.Syslog 依赖提供,本组件通过 syslog.core 提交消息。

1.6 构建、测试与部署

工具与依赖

  • CMake 最低版本为 3.14,Conan 最低版本为 2.13.0。
  • 构建依赖包含 libmc4lualsnmp;DT(Developer Test)测试依赖清单见 mds/service.jsondependencies.test

测试入口

bash
bingo test

该命令依赖 openUBMC DT 环境、Lua/Skynet 运行时及组件依赖,不能视为在普通源码检出中可直接运行。单元、集成和 fuzz 用例分别位于 test/unittest/integrationtest/fuzz

安装与启动

  • 安装目录:/opt/bmc/apps/event_policy
  • systemd 单元:event_policy.service
  • 工作目录:/opt/bmc/apps/event_policy
  • 启动命令:/opt/bmc/skynet/skynet /opt/bmc/apps/event_policy/config.cfg
  • 服务异常退出后自动重启,间隔为 1 秒。
  • systemd 依赖 dbus.serviceframework.servicepersistence.servicekey_mgmt.serviceevent.service

2. API 使用说明与示例

本组件对外提供 D-Bus 资源接口和 OEM IPMI 命令。D-Bus 服务名为 bmc.kepler.event_policy,运行配置使用 user bus,以下命令统一带 --user。类型 byqtsas 分别表示布尔、无符号 8 位、无符号 16 位、无符号 64 位、字符串和字符串数组。

2.1 D-Bus 配置与控制接口

功能说明

D-Bus 模型定义以 mds/model.json 为准,需要查看接口时,可按对象名搜索该文件;例如下面的命令可定位 SNMP 配置,继续查看其 interfacespropertiesmethodssignals

bash
rg -n -A 120 '^    "Snmp":' mds/model.json

模型经代码生成后由 gen/event_policy/service.lua 注册;生成文件适合核对运行时签名,但不应直接修改。以 SNMP 配置为例,mds/model.json 当前定义的对象路径为 /bmc/kepler/EventService/Subscriptions/Snmp,接口为 bmc.kepler.EventService.Subscriptions.Snmp

参数说明

参数名方向类型描述取值范围
Version输入/输出sSNMP 版本SNMPv1SNMPv2cSNMPv3
SeverityFilter输入/输出ySNMP/SMTP 严重度过滤掩码0~15
ServerIdentity输入/输出sTrap 服务器标识来源BoardSNProductAssetTagHostName
TrapMode输入/输出y旧 SNMP 配置的 Trap 模式1 或 2;值 0 被当前校验拒绝
Address输入/输出sNMS 或 SMTP 地址空字符串,或最大 255 字符的 IPv4、IPv6、域名
Port输入/输出qNMS 或 SMTP 端口1~65535
PasswordChanged输入b同次配置流程中密码是否已更新truefalse
SubscriptionType输入asRearm 目标通道SNMPTrapSmtpSyslog,或单独使用 All;不可为空

SNMP 团体名仅适用于 SNMPv1/v2c。关闭密码复杂度检查时长度为 1~32 且不得含空格;开启复杂度检查时长度为 8~32,并须通过系统复杂度校验。

返回值与异常

返回值含义触发条件处理建议
无返回值配置或操作成功方法正常完成重新读取相关属性确认状态
sGetCommunity 返回团体名配置对象和持久化数据可用按敏感信息处理返回值
yCreateDestination 返回新 ID参数通过校验并成功创建使用 ID 访问新对象
D-Bus 错误参数、依赖或内部处理失败PropertyValueNotInListPropertyValueFormatErrorInternalError结合错误名称和组件日志排查

应用场景

用于配置上报端点和过滤条件、发送测试事件,以及对未恢复事件执行 Rearm。SyncEvent 由双节点内部 CNC 链路调用。

限制条件

  • EventSync.SyncEvent 是跨板内部协作接口,不建议作为人工调试接口。
  • SMTP 非匿名模式修改服务器地址、匿名状态或用户名时,可能要求先在同一配置流程中更新密码。
  • SMTP 用户名长度为 1~64,密码长度为 1~50,邮箱及主题相关字符串最大 255 字符。
  • 默认数据包含 4 个 NMS 和 4 个 SMTP Receiver,ID 为 1~4。

调试示例

命令行调试
bash
# 读取 SNMP 版本
busctl --user get-property \
  bmc.kepler.event_policy \
  /bmc/kepler/EventService/Subscriptions/Snmp \
  bmc.kepler.EventService.Subscriptions.Snmp Version

# 设置严重度过滤掩码为 12
busctl --user call \
  bmc.kepler.event_policy \
  /bmc/kepler/EventService/Subscriptions/Snmp \
  org.freedesktop.DBus.Properties Set \
  ssv bmc.kepler.EventService.Subscriptions.Snmp SeverityFilter y 12

# 为 SNMPv1/v2c 设置团体名
busctl --user call \
  bmc.kepler.event_policy \
  /bmc/kepler/EventService/Subscriptions/Snmp \
  bmc.kepler.EventService.Subscriptions.Snmp SetCommunity \
  'a{ss}s' 3 Interface CLI UserName Administrator ClientIp 127.0.0.1 'Admin@9000'

# 向第一个 NMS 发送测试事件
busctl --user call \
  bmc.kepler.event_policy \
  /bmc/kepler/EventService/Subscriptions/Snmp/Nmses/1 \
  bmc.kepler.EventService.Subscriptions.Snmp.Nms SubmitTestEvent \
  'a{ss}' 3 Interface CLI UserName Administrator ClientIp 127.0.0.1

# 将未恢复事件重报到 SNMP Trap 和 SMTP
busctl --user call \
  bmc.kepler.event_policy \
  /bmc/kepler/EventService/Event \
  bmc.kepler.EventService.Event Rearm \
  'a{ss}as' 3 Interface CLI UserName Administrator ClientIp 127.0.0.1 \
  2 SNMPTrap Smtp

2.2 OEM IPMI 命令

功能说明

组件按 mds/ipmi.json 注册 LAN 参数和 OEM 命令,用于查询或设置 NMS、SNMP 团体名、Trap 版本/严重度/使能、事件类型、测试 Trap 和 Rearm。

参数说明

命令的 netfncmd、请求字段、响应字段和权限均由 mds/ipmi.json 定义。可先查询模型:

bash
rg -n -A 70 '^        "GetAlertDestNum":' mds/ipmi.json

返回值与异常

命令成功时返回标准 IPMI 完成码 0x00;参数、权限、长度或状态错误返回 5.2 节列出的非零完成码。

应用场景

供 IPMI 客户端查询或配置告警目标、SNMP 参数和事件上报策略。

限制条件

实际调用必须满足相应的 User/Operator 角色和 ReadOnly/BasicSetting 权限;标记 sysLockedPolicy: Forbidden 的写命令在系统锁定时不可调用。

调试示例

优先在测试设备上使用与实际调用一致的命令参数,避免直接对生产设备执行写操作。模型查询方式如下:

bash
rg -n -A 70 '^        "GetAlertDestNum":' mds/ipmi.json

3. 组件扩展案例

3.1 扩展能力概述

组件提供 SNMP Trap Lua 插件扩展点,可替换事件、SEL 和测试 Trap 的企业 OID 及 bindings 封装逻辑。除此之外,仓库未定义通用插件框架。

3.2 扩展点说明

src/lualib/libpolicy/plugin_mgmt.lua 读取 /bmc/kepler/Managers/1/PackageCustomer 属性,并执行 require(Customer .. '.apps.trap_plugin')。结合 /opt/bmc/extend/?.lua 搜索路径,实际文件路径为:

text
/opt/bmc/extend/<Customer>/apps/trap_plugin.lua
函数作用触发时机
pack_trap_bindings(event, sequence, trap_mode)生成事件 Trap bindings上报真实事件时
pack_trap_test_bindings(sequence)生成测试 Trap bindings调用 NMS 测试事件时
get_trap_oem_event_oid()返回事件 Trap OID发送事件 Trap 时
get_trap_sel_oid()返回 SEL Trap OID发送 SEL Trap 时
get_trap_test_oid()返回测试 Trap OID发送测试 Trap 时

插件加载失败或模块不存在时,代码静默使用内置实现,不会阻止服务启动。

3.3 二次开发指导

步骤一

复制 example/trap_plugin.lua,保留五个函数的模块接口,并按目标 MIB 修改 OID、字段值和 SNMP 类型字符。

步骤二

部署到 /opt/bmc/extend/<Customer>/apps/trap_plugin.lua<Customer> 必须与 Package 对象的 Customer 属性完全一致。随后重启 om 进程。完整实现请直接参考仓库中的 example/trap_plugin.lua

验证方法

  1. 参考 openUBMC 社区的 SNMP Trap 上报测试环境搭建指南 在与 BMC 网络互通的 Windows 主机安装 MIB Browser,并在 Trap Ringer Console 配置监听地址和端口。免费版本仅适合验证 SNMPv1/v2c;验证 SNMPv3 时需使用支持 SNMPv3 的版本。
  2. 在 BMC Web 界面的“维护诊断 > 告警上报 > SNMP 报文通知”中,将 NMS 地址设为接收端主机 IP,端口设为 Trap Ringer Console 的监听端口,并启用对应配置。SNMPv3 还需在“用户&安全 > 本地用户”中为 V3 用户配置加密密码和算法,并在接收端配置相同的用户、鉴权及加密参数。
  3. 部署插件并重启 om 进程后,在 SNMP 报文通知页面点击对应 NMS 的“测试”按钮;随后产生一条满足上报通道、事件类型和严重度过滤条件的真实告警。
  4. 在 Trap Ringer Console 中分别确认测试 Trap 和真实告警 Trap 已到达,并核对企业 OID、bindings、值及 SNMP 类型是否符合插件实现。Trap 是单向协议,BMC 侧测试操作成功不等于接收端一定收到报文,应以接收端结果为准。

注意事项

  • require 会将模块名中的点转换为目录分隔,必须按上文所示的 <Customer>/apps/ 两级目录部署。
  • bindings 的每项格式为 {oid_table, value, type}
  • 插件函数缺失时对应注册项为空,应实现并测试全部五个函数。
  • 源码没有插件加载成功/失败日志,应以测试 Trap 内容判断是否生效。

4. 日志说明

4.1 一键日志收集

组件未注册自定义 on_dump 回调,一键日志按框架默认逻辑收集。诊断时应同时保留 event_policy 的标准日志、event 组件事件记录和相关配置属性。

4.2 关键日志信息

日志片段日志级别含义解读建议处理动作
event_policy service startINFOSkynet 服务入口已启动,见 src/service/main.lua继续确认后续初始化日志。
initialize base service completely.NOTICE基础服务及单例对象已创建。若缺失,检查 D-Bus、持久化和模型初始化。
register ipmi commands completely.NOTICEOEM IPMI 命令注册完成。若缺失,检查 IPMI 依赖及此前错误。
received a event[%s]. / received a sel[%s]NOTICEEventRecordSeq/RecordSeq 变化后的回调已收到 Event/SEL 通知;没有新事件时不出现该日志也属于正常现象。仅当已经确认产生了 Event/SEL、对应序号已变化,而日志仍未出现时,检查 event 组件的 Events/SensorSelInfo 对象及属性订阅。
synchronous the %s %s, cost %dms.NOTICE服务启动时从持久化记录号开始同步 Event 或 SEL;日志中的 successfully 表示完成,failed 表示连续重试约 180 秒仍未完成。successfully 无需处理;仅出现 failed,或服务启动后应补报的历史记录缺失时,才检查 event 组件的 Events/SensorSelInfo 对象、查询接口、返回数据及 persistence 中的记录号。
update the %s record id %d failed, error is %s.ERROR上报记录号持久化失败。检查 persistence 服务和数据库。
execute the strategy of event(RecordId:%d, EventCode:%s) failed.ERROR主机电源动作失败。检查 ActionId、FruCtrl 及 PowerCtrl 返回值。
send a event email to SMTP server failed, receiver address is %s, ret = %sERRORSMTP 发送失败。检查服务器、TLS、认证和收件人。
Post syslog event failed, ret: %s.ERROR向 Syslog 服务提交失败。检查 Managers.Syslog 依赖及服务。
send sync data to [%s] failed, [%s]ERROR跨板同步发送失败。检查角色、地址及 CNC 链路。

5. 问题定界指南

5.1 典型问题定界

现象描述是否为本组件问题判断依据关键证据收集方法
已收到事件但所有通道均未上报可能是分发受通道位、类型、使能和过滤器共同控制。读取事件字段及接口属性,检查上报错误日志。
测试 Trap 成功,真实事件 Trap 缺失可能是链路正常时,更可能是事件通道位、类型或严重度过滤。对比测试结果、真实事件字段和 SNMP 配置。
邮件测试失败可能是SMTP 发送、TLS、认证和收件人配置由本组件处理。调用 Receiver 测试方法,收集 SMTP 错误日志和属性。
主机意外强制下电或重启可能是Asserted 事件且 ActionId 为 1~3 时会触发动作。收集 State、ActionId、EventCode 和 FruCtrl 日志。
跨板事件不同步可能是还依赖 CSR 配置、对端服务和 CNC 通信。检查 EventSync.State、角色、地址和同步日志。

5.2 错误码速查表

以下完成码定义于 src/lualib/ipmi/base.lua,仅适用于 OEM IPMI 路径;D-Bus 失败返回框架错误对象。

错误码含义可能原因排查建议
0x00成功命令正常完成
0x80参数不支持NMS 索引、地址或网关类型不受支持对照 mds/ipmi.json 检查字段。
0x82只读参数尝试设置只读告警目标参数改用受支持的配置接口。
0x88团体名校验失败未通过复杂度检查检查长度、空格和复杂度策略。
0xC7长度无效地址数据长度不符按接口定义重新构造请求。
0xC9参数超出范围请求字段超过允许范围检查字段范围和编码。

5.3 最小化复现与证据收集

  1. 记录事件对象、EventCode、State、ReportChannel、EventType 和 SeverityFilter。
  2. 使用测试 Trap 或测试邮件接口验证通道链路,并与真实事件配置逐项比较。
  3. 收集 event_policy、event、SNMP/SMTP 对应服务和 persistence 日志。
  4. 主机电源动作问题还应收集 ActionId、FruCtrl 和 PowerCtrl 返回结果。

5.4 调试方法

  • 在测试环境先验证 SNMP Trap、SMTP、Syslog 三类通道,再切换到真实事件。
  • 使用 busctl --user 读取配置属性和错误对象。
  • 开启相关组件调试日志后复现,禁止在未确认影响时执行写操作。

6. 常见问题解答

Q1:为什么设置 SNMP 团体名失败?

  • 问题描述:SetCommunity 返回参数或复杂度错误。
  • 一句话答案:团体名必须满足当前 SNMP 版本、长度、空格和复杂度规则。
  • 根因说明:校验会检查当前版本、长度、空格和复杂度策略。
  • 解决方案:确认版本为 SNMPv1/v2c,并按 2.1 节规则调整团体名。
  • 规避方案:配置前读取当前版本与密码复杂度策略。
  • 适用版本:1.140.13。

Q2:已收到事件但网管没有收到告警,如何定位?

  • 问题描述:event 或 SEL 记录已经产生,但目标通道没有上报。
  • 一句话答案:先核对事件通道位、事件类型、使能状态和严重度过滤,再检查通道发送错误。
  • 根因说明:事件分发受 ReportChannelEventType、使能和 SeverityFilter 共同控制。
  • 解决方案:读取事件字段和订阅对象属性,使用测试 Trap/邮件确认链路,再逐项比对真实事件配置。
  • 规避方案:上线前同时验证测试告警和真实告警,并保存配置原值。
  • 适用版本:1.140.13。

Q3:SMTP 测试失败或真实邮件未发送,如何处理?

  • 问题描述:邮件通道测试失败,或事件触发后没有收到邮件。
  • 一句话答案:优先检查 SMTP 地址、端口、TLS、认证、发件人和收件人配置。
  • 根因说明:SMTP 连接、认证、TLS 协商和收件人校验失败都会阻止发送。
  • 解决方案:调用收发件人测试接口,检查 send a event email to SMTP server failed 日志和相关属性。
  • 规避方案:修改服务器或凭据前先导出配置,在维护窗口完成验证。
  • 适用版本:1.140.13。

Q4:配置的 ActionId 没有触发主机电源动作,如何排查?

  • 问题描述:事件已产生,但没有执行强制下电、重启或下电再上电。
  • 一句话答案:确认事件处于 Asserted 状态、ActionId 有效,并检查 FruCtrl 执行结果。
  • 根因说明:组件只对符合策略的产生事件执行 ActionId,执行失败时资源协作接口会返回错误。
  • 解决方案:收集 EventCode、State、ActionId 和 execute the strategy of event 日志,核对 FruCtrl/PowerCtrl。
  • 规避方案:启用电源动作前先在测试环境验证事件策略和恢复路径。
  • 适用版本:1.140.13。

社区资料

更多 event_policy 组件说明及相关服务测试环境搭建方法,可在 openUBMC 社区文档中心搜索 event_policySNMP TrapSMTPrsyslog,也可直接参考: