所有redfish接口无法访问

// 此模板仅供参考,如果不适用可以修改

问题描述

所有redfish接口访问报错500
{
“error”: [
{
“code”: “HTTP_INTERNAL_SERVER_ERROR”
}
]
}

[在这里详细描述您遇到的问题]

环境信息

  • 操作系统:Ubuntu 24.04

  • 软件版本:OpenUBMC2512SP1

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

Customer设置为CTCC后redfish能正常访问

[您希望实现什么]

实际结果

[实际发生了什么,包含错误信息]
设置Customer为CTCC,重启BMC
启动阶段打印日志

redfish ERROR: app_preloader.lua(71): co[thread: 0x2fd60ca016a8] abnormal exit, err: ./opt/bmc/lualib/route_mapper/method/get.lua:148: attempt to index a nil value, traceback: stack traceback: ./opt/bmc/libmc/lualib/mc/app_preloader.lua:71: in function ‘’ /opt/bmc/skynet/lualib/skynet.lua: in function </opt/bmc/skynet/lualib/skynet.lua:0>

redfish访问:


每次访问redfish接口都有如下报错

redfish ERROR: portal_agent.lua(381): get reply falied, err=./opt/bmc/apps/redfish/service/portal_agent.lua:266: attempt to index field ‘ssl_verify’ (a nil value)
这个报错是什么意思

尝试过的解决方案

busctl --user set-property bmc.kepler.maca /bmc/kepler/Managers/1/Package bmc.kepler.Managers.Package Customer s “”
killall interface
执行后redfish接口不报错,且无问题中的2条报错日志

busctl --user set-property bmc.kepler.maca /bmc/kepler/Managers/1/Package bmc.kepler.Managers.Package Customer s “CTCC”
killall interface
出现上述2条报错日志

开启CTCC后重启interface日志:

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

总结

项目 内容
问题现象 所有 Redfish 接口返回 500 Internal Server Error
触发条件 Customer 设置为 CTCC 并重启 BMC
根本原因 CTCC 定制配置导致 Redfish 服务加载了不完整或错误的模块,使 ssl_verify 和路由映射相关对象为 nil,引发空指针异常
关键日志 attempt to index field 'ssl_verify' (a nil value)
解决方案 1. 检查并修复 CTCC 定制仓中的 Redfish 插件配置
2. 为可能为 nil 的字段添加默认值和判空保护
3. 验证 OemIdentifier 是否正确定义

强烈建议:在进行客户切换前,确保定制仓已通过 Redfish 接口兼容性测试套件 验证,避免因配置缺失引发服务不可用。

点击此处查看详细分析解答

所有 Redfish 接口无法访问问题分析与解决方案

问题概述

用户在将 Customer 设置为 CTCC 并重启 BMC 后,所有 Redfish 接口均返回 500 内部服务器错误HTTP_INTERNAL_SERVER_ERROR),表明 Redfish 服务在处理请求时出现内部异常。日志中关键错误信息为:

  • attempt to index a nil value,位于 Lua 脚本 /opt/bmc/lualib/route_mapper/method/get.lua:148/opt/bmc/apps/redfish/service/portal_agent.lua:266
  • 具体报错:index field 'ssl_verify' (a nil value)index a nil value

该问题表现为 Redfish 服务初始化可以完成,但在处理请求时发生空指针访问,导致服务崩溃并返回 500 错误。


问题根本原因分析

1. 错误日志定位

核心错误出现在以下两条日志中:

redfish ERROR: portal_agent.lua(381): get reply failed, err=/opt/bmc/apps/redfish/service/portal_agent.lua:266: attempt to index field 'ssl_verify' (a nil value)
redisfs ERROR: app_preloader.lua(71): co[thread: 0x...] abnormal exit, err: ./opt/bmc/lualib/route_mapper/method/get.lua:148: attempt to index a nil value

这两条错误表明:

  • 在 Lua 代码执行过程中,程序尝试访问一个 nil(空)值的字段 ssl_verify,说明某个对象未被正确初始化。
  • get.lua:148 是 Redfish 请求处理链路中的关键模块,其依赖的数据结构在 CTCC 定制环境下未被正确定义。

2. 与 Customer (CTCC) 配置的关联性

用户通过如下命令切换客户:

busctl --user set-property bmc.kepler.maca /bmc/kepler/Managers/1/Package bmc.kepler.Managers.Package Customer s “CTCC”

关键验证结果

  • Customer 设置为空字符串 → 重启 interface 服务后,Redfish 可正常访问
  • Customer 设置为 CTCC → 重启 interface 服务后,重现 500 错误与上述日志。

此现象表明:CTCC 定制配置导致某些 Redfish 所依赖的服务或数据未正确加载或初始化,尤其是涉及 SSL 验证 (ssl_verify) 和路由映射 (route_mapper) 的模块。

3. 可能故障点:定制仓配置缺失或不兼容

根据开源社区文档 《Redfish定制指南》 和系统架构逻辑:

  • Redfish 的行为(如接口响应、安全策略、OEM 字段)可通过 custom_request_response.lua 等脚本在 Customer 定制仓 中进行定制。
  • 若 CTCC 定制仓中:
    • 缺少必要的 Redfish 插件定义;
    • 或覆盖了默认的 SSL 安全配置但未提供 ssl_verify 字段;
    • OemIdentifier 等关键字段未正确定义;

则可能导致运行时某些模块引用了未初始化的变量,引发 nil 指针访问错误。

4. 结合知识库信息分析

  • Redfish 服务严重依赖 D-Bus 接口和服务注册机制。若定制后某服务未正确注册,会导致调用失败。
  • 日志中多次出现 no service json info,说明服务元信息加载异常。
  • 错误发生在 portal_agent.lua(Redfish 网关代理模块),该模块负责前端请求与后端服务的桥接,其配置易受客户定制影响。

解决方案建议

:white_check_mark: 临时规避方法

当前可临时恢复 Redfish 访问的方法如下:

# 清除客户设置
busctl --user set-property bmc.kepler.maca /bmc/kepler/Managers/1/Package bmc.kepler.Managers.Package Customer s ""

# 重启 interface 服务
killall interface

此操作验证了 CTCC 定制是引发问题的直接诱因


:white_check_mark: 长期解决方案

1. 检查 CTCC 定制仓 Redfish 配置

进入 CTCC 定制代码仓库,检查以下文件是否存在且正确配置:

  • 文件路径:/opt/bmc/extend/CTCC/apps/CTCC/plugins/redfish/custom_request_response.lua
  • 确保该文件:
    • 返回了正确的 rsp_postprocessreq_preprocess 函数;
    • 不覆盖或移除关键的安全配置字段,如 ssl_verify
    • 若未进行 Redfish 定制,应 删除该文件或确保其兼容默认行为

:magnifying_glass_tilted_left: 参考文档:Redfish定制指南(开发中)

2. 验证 OemIdentifier 配置

用户提到配置了 "OemIdentifier": "Chinatelecom",但未生效。

检查以下配置路径:

  • 文件:CTCC/interface_config/redfish/config.json
  • 字段:
    "GlobalVariable": {
      "OemIdentifier": "Chinatelecom"
    }
    

:warning: 注意:若此配置未被正确加载,可能导致后续 Redfish 服务初始化失败。建议添加日志打印验证该值是否被读取。


3. 添加空值保护(防御性编程)

建议在以下源码位置增加判空逻辑:

  • /opt/bmc/apps/redfish/service/portal_agent.lua 第 266 行附近:
-- 修改前(出错)
if config.ssl_verify then ... end

-- 修改后(建议)
if config and config.ssl_verify ~= nil then
    -- 安全访问
else
    config.ssl_verify = false -- 设置默认值
end

此修改可避免因配置缺失导致的服务崩溃。


4. 使用默认配置回滚测试

创建一个测试分支:

  • 保留 Customer=CTCC
  • 但使用 openUBMC 默认的 Redfish 插件配置
  • 验证是否仍报错

若不再报错,则确认为 CTCC 定制脚本缺陷


总结

项目 内容
问题现象 所有 Redfish 接口返回 500 Internal Server Error
触发条件 Customer 设置为 CTCC 并重启 BMC
根本原因 CTCC 定制配置导致 Redfish 服务加载了不完整或错误的模块,使 ssl_verify 和路由映射相关对象为 nil,引发空指针异常
关键日志 attempt to index field 'ssl_verify' (a nil value)
解决方案 1. 检查并修复 CTCC 定制仓中的 Redfish 插件配置
2. 为可能为 nil 的字段添加默认值和判空保护
3. 验证 OemIdentifier 是否正确定义

强烈建议:在进行客户切换前,确保定制仓已通过 Redfish 接口兼容性测试套件 验证,避免因配置缺失引发服务不可用。

已定位发现是因为,定制接口中使用了rackmount的script文件,script文件代码写了ProcessingFlow[xx].Destination.xx。但是json中未定义这个属性。


猜测是2512SP1的libroute_mapper相比2509中新增了Script的通路校验

没有定位日志,只能在代码中一步步删除文件排查
有两点问题:
1.script中的该写法极难维护,出问题极难发现
2.无有效日志定位