1d4d97a53STOM JOSEPH #include "event_parser.hpp"
2d4d97a53STOM JOSEPH
349cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp>
46492f524SGeorge Liu #include <xyz/openbmc_project/Common/error.hpp>
56492f524SGeorge Liu
6d4d97a53STOM JOSEPH #include <filesystem>
7d4d97a53STOM JOSEPH #include <fstream>
8d4d97a53STOM JOSEPH #include <set>
9d4d97a53STOM JOSEPH
1049cfb138SRiya Dixit PHOSPHOR_LOG2_USING;
1149cfb138SRiya Dixit
12d4d97a53STOM JOSEPH namespace pldm::responder::events
13d4d97a53STOM JOSEPH {
14d4d97a53STOM JOSEPH namespace fs = std::filesystem;
15d4d97a53STOM JOSEPH using InternalFailure =
16d4d97a53STOM JOSEPH sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
17d4d97a53STOM JOSEPH
18d4d97a53STOM JOSEPH const Json emptyJson{};
19d4d97a53STOM JOSEPH const std::vector<Json> emptyJsonList{};
20d4d97a53STOM JOSEPH
21d4d97a53STOM JOSEPH const std::set<std::string_view> supportedDbusPropertyTypes = {
22d4d97a53STOM JOSEPH "bool", "uint8_t", "int16_t", "uint16_t", "int32_t",
23d4d97a53STOM JOSEPH "uint32_t", "int64_t", "uint64_t", "double", "string"};
24d4d97a53STOM JOSEPH
StateSensorHandler(const std::string & dirPath)25d4d97a53STOM JOSEPH StateSensorHandler::StateSensorHandler(const std::string& dirPath)
26d4d97a53STOM JOSEPH {
27d4d97a53STOM JOSEPH fs::path dir(dirPath);
28d4d97a53STOM JOSEPH if (!fs::exists(dir) || fs::is_empty(dir))
29d4d97a53STOM JOSEPH {
3089644441SRiya Dixit error("Event config directory at '{PATH}' does not exist or empty",
31*1e5c81e0SRiya Dixit "PATH", dirPath);
32d4d97a53STOM JOSEPH return;
33d4d97a53STOM JOSEPH }
34d4d97a53STOM JOSEPH
35a792b216STom Joseph for (auto& file : fs::directory_iterator(dirPath))
36d4d97a53STOM JOSEPH {
37a792b216STom Joseph std::ifstream jsonFile(file.path());
38d4d97a53STOM JOSEPH
39d4d97a53STOM JOSEPH auto data = Json::parse(jsonFile, nullptr, false);
40d4d97a53STOM JOSEPH if (data.is_discarded())
41d4d97a53STOM JOSEPH {
4289644441SRiya Dixit error("Failed to parse event state sensor JSON file at '{PATH}'",
43*1e5c81e0SRiya Dixit "PATH", file.path());
44a792b216STom Joseph continue;
45d4d97a53STOM JOSEPH }
46d4d97a53STOM JOSEPH
47d4d97a53STOM JOSEPH auto entries = data.value("entries", emptyJsonList);
48d4d97a53STOM JOSEPH for (const auto& entry : entries)
49d4d97a53STOM JOSEPH {
50d4d97a53STOM JOSEPH StateSensorEntry stateSensorEntry{};
51d4d97a53STOM JOSEPH stateSensorEntry.containerId =
52fa084700SManojkiran Eda static_cast<uint16_t>(entry.value("containerID", 0xFFFF));
53d4d97a53STOM JOSEPH stateSensorEntry.entityType =
54d4d97a53STOM JOSEPH static_cast<uint16_t>(entry.value("entityType", 0));
55d4d97a53STOM JOSEPH stateSensorEntry.entityInstance =
56d4d97a53STOM JOSEPH static_cast<uint16_t>(entry.value("entityInstance", 0));
57d4d97a53STOM JOSEPH stateSensorEntry.sensorOffset =
58d4d97a53STOM JOSEPH static_cast<uint8_t>(entry.value("sensorOffset", 0));
59e3607a3cSSagar Srinivas stateSensorEntry.stateSetid =
60e3607a3cSSagar Srinivas static_cast<uint16_t>(entry.value("stateSetId", 0));
61d4d97a53STOM JOSEPH
62fa084700SManojkiran Eda // container id is not found in the json
63fa084700SManojkiran Eda stateSensorEntry.skipContainerId =
64fa084700SManojkiran Eda (stateSensorEntry.containerId == 0xFFFF) ? true : false;
65fa084700SManojkiran Eda
66d4d97a53STOM JOSEPH pldm::utils::DBusMapping dbusInfo{};
67d4d97a53STOM JOSEPH
68d4d97a53STOM JOSEPH auto dbus = entry.value("dbus", emptyJson);
69d4d97a53STOM JOSEPH dbusInfo.objectPath = dbus.value("object_path", "");
70d4d97a53STOM JOSEPH dbusInfo.interface = dbus.value("interface", "");
71d4d97a53STOM JOSEPH dbusInfo.propertyName = dbus.value("property_name", "");
72d4d97a53STOM JOSEPH dbusInfo.propertyType = dbus.value("property_type", "");
73d4d97a53STOM JOSEPH if (dbusInfo.objectPath.empty() || dbusInfo.interface.empty() ||
74d4d97a53STOM JOSEPH dbusInfo.propertyName.empty() ||
7506f9b29eSSagar Srinivas !supportedDbusPropertyTypes.contains(dbusInfo.propertyType))
76d4d97a53STOM JOSEPH {
7749cfb138SRiya Dixit error(
7889644441SRiya Dixit "Invalid dbus config at '{PATH}', interface '{DBUS_INTERFACE}', property name '{PROPERTY_NAME}' and property type '{PROPERTY_TYPE}'",
79*1e5c81e0SRiya Dixit "PATH", dbusInfo.objectPath, "DBUS_INTERFACE",
8089644441SRiya Dixit dbusInfo.interface, "PROPERTY_NAME", dbusInfo.propertyName,
8189644441SRiya Dixit "PROPERTY_TYPE", dbusInfo.propertyType);
82d4d97a53STOM JOSEPH continue;
83d4d97a53STOM JOSEPH }
84d4d97a53STOM JOSEPH
85d4d97a53STOM JOSEPH auto eventStates = entry.value("event_states", emptyJsonList);
86d4d97a53STOM JOSEPH auto propertyValues = dbus.value("property_values", emptyJsonList);
87d4d97a53STOM JOSEPH if ((eventStates.size() == 0) || (propertyValues.size() == 0) ||
88d4d97a53STOM JOSEPH (eventStates.size() != propertyValues.size()))
89d4d97a53STOM JOSEPH {
9049cfb138SRiya Dixit error(
9189644441SRiya Dixit "Invalid event state JSON config size '{EVENT_STATE_SIZE}' and property value size '{PROPERTY_VALUE_SIZE}'",
9289644441SRiya Dixit "EVENT_STATE_SIZE", eventStates.size(),
9389644441SRiya Dixit "PROPERTY_VALUE_SIZE", propertyValues.size());
94d4d97a53STOM JOSEPH continue;
95d4d97a53STOM JOSEPH }
96d4d97a53STOM JOSEPH
97d4d97a53STOM JOSEPH auto eventStateMap = mapStateToDBusVal(eventStates, propertyValues,
98d4d97a53STOM JOSEPH dbusInfo.propertyType);
99d4d97a53STOM JOSEPH eventMap.emplace(
100d4d97a53STOM JOSEPH stateSensorEntry,
101d4d97a53STOM JOSEPH std::make_tuple(std::move(dbusInfo), std::move(eventStateMap)));
102d4d97a53STOM JOSEPH }
103d4d97a53STOM JOSEPH }
104a792b216STom Joseph }
105d4d97a53STOM JOSEPH
mapStateToDBusVal(const Json & eventStates,const Json & propertyValues,std::string_view type)106d4d97a53STOM JOSEPH StateToDBusValue StateSensorHandler::mapStateToDBusVal(
107d4d97a53STOM JOSEPH const Json& eventStates, const Json& propertyValues, std::string_view type)
108d4d97a53STOM JOSEPH {
109d4d97a53STOM JOSEPH StateToDBusValue eventStateMap{};
110d4d97a53STOM JOSEPH auto stateIt = eventStates.begin();
111d4d97a53STOM JOSEPH auto propIt = propertyValues.begin();
112d4d97a53STOM JOSEPH
113d4d97a53STOM JOSEPH for (; stateIt != eventStates.end(); ++stateIt, ++propIt)
114d4d97a53STOM JOSEPH {
115d4d97a53STOM JOSEPH auto propValue = utils::jsonEntryToDbusVal(type, propIt.value());
116d4d97a53STOM JOSEPH eventStateMap.emplace((*stateIt).get<uint8_t>(), std::move(propValue));
117d4d97a53STOM JOSEPH }
118d4d97a53STOM JOSEPH
119d4d97a53STOM JOSEPH return eventStateMap;
120d4d97a53STOM JOSEPH }
121d4d97a53STOM JOSEPH
eventAction(const StateSensorEntry & entry,pdr::EventState state)122d4d97a53STOM JOSEPH int StateSensorHandler::eventAction(const StateSensorEntry& entry,
123d4d97a53STOM JOSEPH pdr::EventState state)
124d4d97a53STOM JOSEPH {
125d4d97a53STOM JOSEPH try
126d4d97a53STOM JOSEPH {
127d4d97a53STOM JOSEPH const auto& [dbusMapping, eventStateMap] = eventMap.at(entry);
128d4d97a53STOM JOSEPH utils::PropertyValue propValue{};
129d4d97a53STOM JOSEPH try
130d4d97a53STOM JOSEPH {
131d4d97a53STOM JOSEPH propValue = eventStateMap.at(state);
132d4d97a53STOM JOSEPH }
133d4d97a53STOM JOSEPH catch (const std::out_of_range& e)
134d4d97a53STOM JOSEPH {
13589644441SRiya Dixit error("Invalid event state '{EVENT_STATE}', error - {ERROR}",
13689644441SRiya Dixit "EVENT_STATE", state, "ERROR", e);
137d4d97a53STOM JOSEPH return PLDM_ERROR_INVALID_DATA;
138d4d97a53STOM JOSEPH }
139d4d97a53STOM JOSEPH
140d4d97a53STOM JOSEPH try
141d4d97a53STOM JOSEPH {
142d4d97a53STOM JOSEPH pldm::utils::DBusHandler().setDbusProperty(dbusMapping, propValue);
143d4d97a53STOM JOSEPH }
144d4d97a53STOM JOSEPH catch (const std::exception& e)
145d4d97a53STOM JOSEPH {
14649cfb138SRiya Dixit error(
14789644441SRiya Dixit "Failed to set property '{PROPERTY}' on interface '{INTERFACE}' at path '{PATH}', error - {ERROR}",
14858cbcaf2SKamalkumar Patel "PROPERTY", dbusMapping.propertyName, "INTERFACE",
14958cbcaf2SKamalkumar Patel dbusMapping.interface, "PATH", dbusMapping.objectPath, "ERROR",
15058cbcaf2SKamalkumar Patel e);
151d4d97a53STOM JOSEPH return PLDM_ERROR;
152d4d97a53STOM JOSEPH }
153d4d97a53STOM JOSEPH }
15458cbcaf2SKamalkumar Patel catch (const std::out_of_range&)
155d4d97a53STOM JOSEPH {
156d4d97a53STOM JOSEPH // There is no BMC action for this PLDM event
157d4d97a53STOM JOSEPH return PLDM_SUCCESS;
158d4d97a53STOM JOSEPH }
159d4d97a53STOM JOSEPH return PLDM_SUCCESS;
160d4d97a53STOM JOSEPH }
161d4d97a53STOM JOSEPH
162d4d97a53STOM JOSEPH } // namespace pldm::responder::events
163