xref: /openbmc/phosphor-led-manager/fault-monitor/fru-fault-monitor.cpp (revision 3eedbe446da22b1339616cd04f56b1da520a4fd9)
13c6f29a0SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
23c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Fru/Monitor/error.hpp"
33c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Mapper/error.hpp"
43c6f29a0SDhruvaraj Subhashchandran #include "elog-errors.hpp"
559b86cd7SDhruvaraj Subhashchandran #include "fru-fault-monitor.hpp"
63c6f29a0SDhruvaraj Subhashchandran 
759b86cd7SDhruvaraj Subhashchandran namespace phosphor
859b86cd7SDhruvaraj Subhashchandran {
959b86cd7SDhruvaraj Subhashchandran namespace led
1059b86cd7SDhruvaraj Subhashchandran {
1159b86cd7SDhruvaraj Subhashchandran namespace fru
1259b86cd7SDhruvaraj Subhashchandran {
1359b86cd7SDhruvaraj Subhashchandran namespace fault
1459b86cd7SDhruvaraj Subhashchandran {
1559b86cd7SDhruvaraj Subhashchandran namespace monitor
1659b86cd7SDhruvaraj Subhashchandran {
1759b86cd7SDhruvaraj Subhashchandran 
183c6f29a0SDhruvaraj Subhashchandran using namespace phosphor::logging;
193c6f29a0SDhruvaraj Subhashchandran 
203c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_BUSNAME   = "xyz.openbmc_project.ObjectMapper";
213c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_OBJ_PATH  = "/xyz/openbmc_project/object_mapper";
223c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_IFACE     = "xyz.openbmc_project.ObjectMapper";
233c6f29a0SDhruvaraj Subhashchandran constexpr auto OBJMGR_IFACE     = "org.freedesktop.DBus.ObjectManager";
243c6f29a0SDhruvaraj Subhashchandran constexpr auto LED_GROUPS       = "/xyz/openbmc_project/led/groups/";
253c6f29a0SDhruvaraj Subhashchandran constexpr auto LOG_PATH         = "/xyz/openbmc_project/logging";
263c6f29a0SDhruvaraj Subhashchandran 
273c6f29a0SDhruvaraj Subhashchandran using AssociationList = std::vector<std::tuple<
283c6f29a0SDhruvaraj Subhashchandran                         std::string, std::string, std::string>>;
293c6f29a0SDhruvaraj Subhashchandran using MethodErr  =
303c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::MethodError;
313c6f29a0SDhruvaraj Subhashchandran using ObjectNotFoundErr =
323c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::ObjectNotFoundError;
333c6f29a0SDhruvaraj Subhashchandran using AssociationRetrieveErr =
343c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::
353c6f29a0SDhruvaraj Subhashchandran     Led::Fru::Monitor::Error::AssociationRetrieveError;
363c6f29a0SDhruvaraj Subhashchandran using InventoryPathErr =
373c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::
383c6f29a0SDhruvaraj Subhashchandran     Led::Fru::Monitor::Error::InventoryPathError;
393c6f29a0SDhruvaraj Subhashchandran 
403c6f29a0SDhruvaraj Subhashchandran std::string getService(sdbusplus::bus::bus& bus,
413c6f29a0SDhruvaraj Subhashchandran                        const std::string& path)
423c6f29a0SDhruvaraj Subhashchandran {
433c6f29a0SDhruvaraj Subhashchandran     auto mapper = bus.new_method_call(MAPPER_BUSNAME,
443c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_OBJ_PATH,
453c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_IFACE, "GetObject");
463c6f29a0SDhruvaraj Subhashchandran     mapper.append(path.c_str(), std::vector<std::string>({OBJMGR_IFACE}));
473c6f29a0SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapper);
483c6f29a0SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
493c6f29a0SDhruvaraj Subhashchandran     {
503c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
513c6f29a0SDhruvaraj Subhashchandran         elog<MethodErr>(
523c6f29a0SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetObject"),
533c6f29a0SDhruvaraj Subhashchandran             MethodError::PATH(path.c_str()),
543c6f29a0SDhruvaraj Subhashchandran             MethodError::INTERFACE(
553c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
563c6f29a0SDhruvaraj Subhashchandran     }
573c6f29a0SDhruvaraj Subhashchandran 
583c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> mapperResponse;
593c6f29a0SDhruvaraj Subhashchandran     mapperResponseMsg.read(mapperResponse);
603c6f29a0SDhruvaraj Subhashchandran     if (mapperResponse.empty())
613c6f29a0SDhruvaraj Subhashchandran     {
623c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
633c6f29a0SDhruvaraj Subhashchandran         elog<ObjectNotFoundErr>(
643c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::METHOD_NAME("GetObject"),
653c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::PATH(path.c_str()),
663c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::INTERFACE(
673c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
683c6f29a0SDhruvaraj Subhashchandran     }
693c6f29a0SDhruvaraj Subhashchandran 
703c6f29a0SDhruvaraj Subhashchandran     return mapperResponse.cbegin()->first;
713c6f29a0SDhruvaraj Subhashchandran }
723c6f29a0SDhruvaraj Subhashchandran 
7359b86cd7SDhruvaraj Subhashchandran void action(sdbusplus::bus::bus& bus,
743c6f29a0SDhruvaraj Subhashchandran             const std::string& path,
7559b86cd7SDhruvaraj Subhashchandran             bool assert)
7659b86cd7SDhruvaraj Subhashchandran {
773c6f29a0SDhruvaraj Subhashchandran     std::string service;
783c6f29a0SDhruvaraj Subhashchandran     try
793c6f29a0SDhruvaraj Subhashchandran     {
803c6f29a0SDhruvaraj Subhashchandran         service = getService(bus, LED_GROUPS);
813c6f29a0SDhruvaraj Subhashchandran     }
823c6f29a0SDhruvaraj Subhashchandran     catch (MethodErr& e)
833c6f29a0SDhruvaraj Subhashchandran     {
843c6f29a0SDhruvaraj Subhashchandran         commit<MethodErr>();
853c6f29a0SDhruvaraj Subhashchandran         return;
863c6f29a0SDhruvaraj Subhashchandran     }
873c6f29a0SDhruvaraj Subhashchandran     catch (ObjectNotFoundErr& e)
883c6f29a0SDhruvaraj Subhashchandran     {
893c6f29a0SDhruvaraj Subhashchandran         commit<ObjectNotFoundErr>();
903c6f29a0SDhruvaraj Subhashchandran         return;
913c6f29a0SDhruvaraj Subhashchandran     }
923c6f29a0SDhruvaraj Subhashchandran 
933c6f29a0SDhruvaraj Subhashchandran     auto pos = path.rfind("/");
943c6f29a0SDhruvaraj Subhashchandran     if (pos == std::string::npos)
953c6f29a0SDhruvaraj Subhashchandran     {
963c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Fru::Monitor;
973c6f29a0SDhruvaraj Subhashchandran         report<InventoryPathErr>(
983c6f29a0SDhruvaraj Subhashchandran             InventoryPathError::PATH(
993c6f29a0SDhruvaraj Subhashchandran                 path.c_str()));
1003c6f29a0SDhruvaraj Subhashchandran         return;
1013c6f29a0SDhruvaraj Subhashchandran     }
1023c6f29a0SDhruvaraj Subhashchandran     auto unit = path.substr(pos + 1);
1033c6f29a0SDhruvaraj Subhashchandran 
1043c6f29a0SDhruvaraj Subhashchandran     std::string ledPath = LED_GROUPS +
1053c6f29a0SDhruvaraj Subhashchandran                           unit + '_' + LED_FAULT;
1063c6f29a0SDhruvaraj Subhashchandran 
1073c6f29a0SDhruvaraj Subhashchandran     auto method =  bus.new_method_call(service.c_str(),
1083c6f29a0SDhruvaraj Subhashchandran                                        ledPath.c_str(),
1093c6f29a0SDhruvaraj Subhashchandran                                        "org.freedesktop.DBus.Properties",
1103c6f29a0SDhruvaraj Subhashchandran                                        "Set");
1113c6f29a0SDhruvaraj Subhashchandran     method.append("xyz.openbmc_project.Led.Group");
1123c6f29a0SDhruvaraj Subhashchandran     method.append("Asserted");
1133c6f29a0SDhruvaraj Subhashchandran 
1143c6f29a0SDhruvaraj Subhashchandran     method.append(sdbusplus::message::variant<bool>(assert));
1153c6f29a0SDhruvaraj Subhashchandran     bus.call_noreply(method);
1163c6f29a0SDhruvaraj Subhashchandran 
11759b86cd7SDhruvaraj Subhashchandran     return;
11859b86cd7SDhruvaraj Subhashchandran }
11959b86cd7SDhruvaraj Subhashchandran 
120*3eedbe44SPatrick Williams void Add::created(sdbusplus::message::message& msg)
12159b86cd7SDhruvaraj Subhashchandran {
122*3eedbe44SPatrick Williams     auto bus = msg.get_bus();
1233c6f29a0SDhruvaraj Subhashchandran 
1243c6f29a0SDhruvaraj Subhashchandran     sdbusplus::message::object_path obPath;
125*3eedbe44SPatrick Williams     msg.read(obPath);
1263c6f29a0SDhruvaraj Subhashchandran     std::string objectPath(std::move(obPath));
1273c6f29a0SDhruvaraj Subhashchandran 
1283c6f29a0SDhruvaraj Subhashchandran     std::size_t found = objectPath.find(ELOG_ENTRY);
1293c6f29a0SDhruvaraj Subhashchandran     if (found == std::string::npos)
1303c6f29a0SDhruvaraj Subhashchandran     {
1313c6f29a0SDhruvaraj Subhashchandran         //Not a new error entry skip
132*3eedbe44SPatrick Williams         return;
1333c6f29a0SDhruvaraj Subhashchandran     }
1343c6f29a0SDhruvaraj Subhashchandran 
1353c6f29a0SDhruvaraj Subhashchandran     std::string service;
1363c6f29a0SDhruvaraj Subhashchandran     try
1373c6f29a0SDhruvaraj Subhashchandran     {
1383c6f29a0SDhruvaraj Subhashchandran         service = getService(bus, LOG_PATH);
1393c6f29a0SDhruvaraj Subhashchandran     }
1403c6f29a0SDhruvaraj Subhashchandran     catch (MethodErr& e)
1413c6f29a0SDhruvaraj Subhashchandran     {
1423c6f29a0SDhruvaraj Subhashchandran         commit<MethodErr>();
143*3eedbe44SPatrick Williams         return;
1443c6f29a0SDhruvaraj Subhashchandran     }
1453c6f29a0SDhruvaraj Subhashchandran     catch (ObjectNotFoundErr& e)
1463c6f29a0SDhruvaraj Subhashchandran     {
1473c6f29a0SDhruvaraj Subhashchandran         commit<ObjectNotFoundErr>();
148*3eedbe44SPatrick Williams         return;
1493c6f29a0SDhruvaraj Subhashchandran     }
1503c6f29a0SDhruvaraj Subhashchandran 
1513c6f29a0SDhruvaraj Subhashchandran     auto method =  bus.new_method_call(service.c_str(), objectPath.c_str(),
1523c6f29a0SDhruvaraj Subhashchandran                                        "org.freedesktop.DBus.Properties",
1533c6f29a0SDhruvaraj Subhashchandran                                        "Get");
1543c6f29a0SDhruvaraj Subhashchandran 
1553c6f29a0SDhruvaraj Subhashchandran     method.append("org.openbmc.Associations");
1563c6f29a0SDhruvaraj Subhashchandran     method.append("associations");
1573c6f29a0SDhruvaraj Subhashchandran     auto reply = bus.call(method);
1583c6f29a0SDhruvaraj Subhashchandran     if (reply.is_method_error())
1593c6f29a0SDhruvaraj Subhashchandran     {
1603c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Fru::Monitor;
1613c6f29a0SDhruvaraj Subhashchandran         report<AssociationRetrieveErr>(
1623c6f29a0SDhruvaraj Subhashchandran             AssociationRetrieveError::ELOG_ENTRY_PATH(
1633c6f29a0SDhruvaraj Subhashchandran                 objectPath.c_str()));
164*3eedbe44SPatrick Williams         return;
1653c6f29a0SDhruvaraj Subhashchandran     }
1663c6f29a0SDhruvaraj Subhashchandran 
1673c6f29a0SDhruvaraj Subhashchandran     sdbusplus::message::variant<AssociationList> assoc;
1683c6f29a0SDhruvaraj Subhashchandran     reply.read(assoc);
1693c6f29a0SDhruvaraj Subhashchandran 
1703c6f29a0SDhruvaraj Subhashchandran     auto assocs =
1713c6f29a0SDhruvaraj Subhashchandran         sdbusplus::message::variant_ns::get<AssociationList>(assoc);
1723c6f29a0SDhruvaraj Subhashchandran     if (assocs.empty())
1733c6f29a0SDhruvaraj Subhashchandran     {
1743c6f29a0SDhruvaraj Subhashchandran         //No associations skip
175*3eedbe44SPatrick Williams         return;
1763c6f29a0SDhruvaraj Subhashchandran     }
1773c6f29a0SDhruvaraj Subhashchandran 
1783c6f29a0SDhruvaraj Subhashchandran     for (const auto& item : assocs)
1793c6f29a0SDhruvaraj Subhashchandran     {
1803c6f29a0SDhruvaraj Subhashchandran         if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
1813c6f29a0SDhruvaraj Subhashchandran         {
1823c6f29a0SDhruvaraj Subhashchandran             action(bus, std::get<2>(item), true);
183*3eedbe44SPatrick Williams             removeWatches.emplace_back(
1843c6f29a0SDhruvaraj Subhashchandran                     std::make_unique<Remove>(bus, std::get<2>(item)));
1853c6f29a0SDhruvaraj Subhashchandran         }
1863c6f29a0SDhruvaraj Subhashchandran     }
187*3eedbe44SPatrick Williams     return;
18859b86cd7SDhruvaraj Subhashchandran }
18959b86cd7SDhruvaraj Subhashchandran 
190*3eedbe44SPatrick Williams void Remove::removed(sdbusplus::message::message& msg)
19159b86cd7SDhruvaraj Subhashchandran {
192*3eedbe44SPatrick Williams     auto bus = msg.get_bus();
1933c6f29a0SDhruvaraj Subhashchandran     std::string assoc;
194*3eedbe44SPatrick Williams     msg.read(assoc);
1953c6f29a0SDhruvaraj Subhashchandran 
1963c6f29a0SDhruvaraj Subhashchandran     if (assoc.compare("org.openbmc.Association"))
1973c6f29a0SDhruvaraj Subhashchandran     {
1983c6f29a0SDhruvaraj Subhashchandran         //Skip if not about association
199*3eedbe44SPatrick Williams         return;
2003c6f29a0SDhruvaraj Subhashchandran     }
2013c6f29a0SDhruvaraj Subhashchandran 
2023c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> endPoints;
203*3eedbe44SPatrick Williams     msg.read(endPoints);
2043c6f29a0SDhruvaraj Subhashchandran     auto it = endPoints.find("endpoints");
2053c6f29a0SDhruvaraj Subhashchandran 
2063c6f29a0SDhruvaraj Subhashchandran     if (it == endPoints.end())
2073c6f29a0SDhruvaraj Subhashchandran     {
2083c6f29a0SDhruvaraj Subhashchandran         //No end points,skip
209*3eedbe44SPatrick Williams         return;
2103c6f29a0SDhruvaraj Subhashchandran     }
2113c6f29a0SDhruvaraj Subhashchandran 
2123c6f29a0SDhruvaraj Subhashchandran     if (!((*it).second.empty()))
2133c6f29a0SDhruvaraj Subhashchandran     {
2143c6f29a0SDhruvaraj Subhashchandran         //Skip, end points are not empty
215*3eedbe44SPatrick Williams         return;
2163c6f29a0SDhruvaraj Subhashchandran     }
2173c6f29a0SDhruvaraj Subhashchandran 
218*3eedbe44SPatrick Williams     action(bus, inventoryPath, false);
219*3eedbe44SPatrick Williams     return;
22059b86cd7SDhruvaraj Subhashchandran }
22159b86cd7SDhruvaraj Subhashchandran 
22259b86cd7SDhruvaraj Subhashchandran }//namespace monitor
22359b86cd7SDhruvaraj Subhashchandran }//namespace fault
22459b86cd7SDhruvaraj Subhashchandran }//namespace fru
22559b86cd7SDhruvaraj Subhashchandran }//namespace led
22659b86cd7SDhruvaraj Subhashchandran }//namespace phosphor
227