diff options
Diffstat (limited to 'extensions/openpower-pels/registry.cpp')
-rw-r--r-- | extensions/openpower-pels/registry.cpp | 90 |
1 files changed, 63 insertions, 27 deletions
diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp index d749ab9..3c4e016 100644 --- a/extensions/openpower-pels/registry.cpp +++ b/extensions/openpower-pels/registry.cpp @@ -264,37 +264,34 @@ uint16_t getComponentID(uint8_t srcType, uint16_t reasonCode, } // namespace helper -std::optional<Entry> Registry::lookup(const std::string& name) +std::optional<Entry> Registry::lookup(const std::string& name, LookupType type, + bool toCache) { - // Look in /etc first in case someone put a test file there - fs::path debugFile{fs::path{debugFilePath} / registryFileName}; - nlohmann::json registry; - std::ifstream file; - - if (fs::exists(debugFile)) - { - log<level::INFO>("Using debug PEL message registry"); - file.open(debugFile); - } - else - { - file.open(_registryFile); - } - - try + std::optional<nlohmann::json> registryTmp; + auto& registryOpt = (_registry) ? _registry : registryTmp; + if (!registryOpt) { - registry = nlohmann::json::parse(file); - } - catch (std::exception& e) - { - log<level::ERR>("Error parsing message registry JSON", - entry("JSON_ERROR=%s", e.what())); - return std::nullopt; + registryOpt = readRegistry(_registryFile); + if (!registryOpt) + { + return std::nullopt; + } + else if (toCache) + { + // Save message registry in memory for peltool + _registry = std::move(registryTmp); + } } - + auto& reg = (_registry) ? _registry : registryTmp; + const auto& registry = reg.value(); // Find an entry with this name in the PEL array. - auto e = std::find_if(registry["PELs"].begin(), registry["PELs"].end(), - [&name](const auto& j) { return name == j["Name"]; }); + auto e = std::find_if( + registry["PELs"].begin(), registry["PELs"].end(), + [&name, &type](const auto& j) { + return ((name == j["Name"] && type == LookupType::name) || + (name == j["SRC"]["ReasonCode"] && + type == LookupType::reasonCode)); + }); if (e != registry["PELs"].end()) { @@ -371,6 +368,14 @@ std::optional<Entry> Registry::lookup(const std::string& name) entry.src.powerFault = src["PowerFault"]; } + auto& doc = (*e)["Documentation"]; + entry.doc.message = doc["Message"]; + entry.doc.description = doc["Description"]; + if (doc.find("MessageArgSources") != doc.end()) + { + entry.doc.messageArgSources = doc["MessageArgSources"]; + } + return entry; } catch (std::exception& e) @@ -383,6 +388,37 @@ std::optional<Entry> Registry::lookup(const std::string& name) return std::nullopt; } +std::optional<nlohmann::json> + Registry::readRegistry(const std::filesystem::path& registryFile) +{ + // Look in /etc first in case someone put a test file there + fs::path debugFile{fs::path{debugFilePath} / registryFileName}; + nlohmann::json registry; + std::ifstream file; + + if (fs::exists(debugFile)) + { + log<level::INFO>("Using debug PEL message registry"); + file.open(debugFile); + } + else + { + file.open(registryFile); + } + + try + { + registry = nlohmann::json::parse(file); + } + catch (std::exception& e) + { + log<level::ERR>("Error parsing message registry JSON", + entry("JSON_ERROR=%s", e.what())); + return std::nullopt; + } + return registry; +} + } // namespace message } // namespace pels } // namespace openpower |