xref: /openbmc/phosphor-led-manager/fault-monitor/fru-fault-monitor.cpp (revision aebfde81481ee93d78ade02803b931b2bd1e4419)
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>>;
29*aebfde81SDhruvaraj Subhashchandran using Attributes = sdbusplus::message::variant<bool,AssociationList>;
30*aebfde81SDhruvaraj Subhashchandran using AttributeName = std::string;
31*aebfde81SDhruvaraj Subhashchandran using AttributeMap = std::map<AttributeName, Attributes>;
32*aebfde81SDhruvaraj Subhashchandran using PropertyName = std::string;
33*aebfde81SDhruvaraj Subhashchandran using PropertyMap = std::map<PropertyName, AttributeMap>;
34*aebfde81SDhruvaraj Subhashchandran using LogEntryMsg = std::pair<sdbusplus::message::object_path, PropertyMap>;
35*aebfde81SDhruvaraj Subhashchandran 
363c6f29a0SDhruvaraj Subhashchandran using MethodErr  =
373c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::MethodError;
383c6f29a0SDhruvaraj Subhashchandran using ObjectNotFoundErr =
393c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::ObjectNotFoundError;
403c6f29a0SDhruvaraj Subhashchandran using InventoryPathErr =
413c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::
423c6f29a0SDhruvaraj Subhashchandran     Led::Fru::Monitor::Error::InventoryPathError;
433c6f29a0SDhruvaraj Subhashchandran 
443c6f29a0SDhruvaraj Subhashchandran std::string getService(sdbusplus::bus::bus& bus,
453c6f29a0SDhruvaraj Subhashchandran                        const std::string& path)
463c6f29a0SDhruvaraj Subhashchandran {
473c6f29a0SDhruvaraj Subhashchandran     auto mapper = bus.new_method_call(MAPPER_BUSNAME,
483c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_OBJ_PATH,
493c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_IFACE, "GetObject");
503c6f29a0SDhruvaraj Subhashchandran     mapper.append(path.c_str(), std::vector<std::string>({OBJMGR_IFACE}));
513c6f29a0SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapper);
523c6f29a0SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
533c6f29a0SDhruvaraj Subhashchandran     {
543c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
553c6f29a0SDhruvaraj Subhashchandran         elog<MethodErr>(
563c6f29a0SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetObject"),
573c6f29a0SDhruvaraj Subhashchandran             MethodError::PATH(path.c_str()),
583c6f29a0SDhruvaraj Subhashchandran             MethodError::INTERFACE(
593c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
603c6f29a0SDhruvaraj Subhashchandran     }
613c6f29a0SDhruvaraj Subhashchandran 
623c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> mapperResponse;
633c6f29a0SDhruvaraj Subhashchandran     mapperResponseMsg.read(mapperResponse);
643c6f29a0SDhruvaraj Subhashchandran     if (mapperResponse.empty())
653c6f29a0SDhruvaraj Subhashchandran     {
663c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
673c6f29a0SDhruvaraj Subhashchandran         elog<ObjectNotFoundErr>(
683c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::METHOD_NAME("GetObject"),
693c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::PATH(path.c_str()),
703c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::INTERFACE(
713c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
723c6f29a0SDhruvaraj Subhashchandran     }
733c6f29a0SDhruvaraj Subhashchandran 
743c6f29a0SDhruvaraj Subhashchandran     return mapperResponse.cbegin()->first;
753c6f29a0SDhruvaraj Subhashchandran }
763c6f29a0SDhruvaraj Subhashchandran 
7759b86cd7SDhruvaraj Subhashchandran void action(sdbusplus::bus::bus& bus,
783c6f29a0SDhruvaraj Subhashchandran             const std::string& path,
7959b86cd7SDhruvaraj Subhashchandran             bool assert)
8059b86cd7SDhruvaraj Subhashchandran {
813c6f29a0SDhruvaraj Subhashchandran     std::string service;
823c6f29a0SDhruvaraj Subhashchandran     try
833c6f29a0SDhruvaraj Subhashchandran     {
843c6f29a0SDhruvaraj Subhashchandran         service = getService(bus, LED_GROUPS);
853c6f29a0SDhruvaraj Subhashchandran     }
863c6f29a0SDhruvaraj Subhashchandran     catch (MethodErr& e)
873c6f29a0SDhruvaraj Subhashchandran     {
883c6f29a0SDhruvaraj Subhashchandran         commit<MethodErr>();
893c6f29a0SDhruvaraj Subhashchandran         return;
903c6f29a0SDhruvaraj Subhashchandran     }
913c6f29a0SDhruvaraj Subhashchandran     catch (ObjectNotFoundErr& e)
923c6f29a0SDhruvaraj Subhashchandran     {
933c6f29a0SDhruvaraj Subhashchandran         commit<ObjectNotFoundErr>();
943c6f29a0SDhruvaraj Subhashchandran         return;
953c6f29a0SDhruvaraj Subhashchandran     }
963c6f29a0SDhruvaraj Subhashchandran 
973c6f29a0SDhruvaraj Subhashchandran     auto pos = path.rfind("/");
983c6f29a0SDhruvaraj Subhashchandran     if (pos == std::string::npos)
993c6f29a0SDhruvaraj Subhashchandran     {
1003c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Fru::Monitor;
1013c6f29a0SDhruvaraj Subhashchandran         report<InventoryPathErr>(
1023c6f29a0SDhruvaraj Subhashchandran             InventoryPathError::PATH(
1033c6f29a0SDhruvaraj Subhashchandran                 path.c_str()));
1043c6f29a0SDhruvaraj Subhashchandran         return;
1053c6f29a0SDhruvaraj Subhashchandran     }
1063c6f29a0SDhruvaraj Subhashchandran     auto unit = path.substr(pos + 1);
1073c6f29a0SDhruvaraj Subhashchandran 
1083c6f29a0SDhruvaraj Subhashchandran     std::string ledPath = LED_GROUPS +
1093c6f29a0SDhruvaraj Subhashchandran                           unit + '_' + LED_FAULT;
1103c6f29a0SDhruvaraj Subhashchandran 
1113c6f29a0SDhruvaraj Subhashchandran     auto method =  bus.new_method_call(service.c_str(),
1123c6f29a0SDhruvaraj Subhashchandran                                        ledPath.c_str(),
1133c6f29a0SDhruvaraj Subhashchandran                                        "org.freedesktop.DBus.Properties",
1143c6f29a0SDhruvaraj Subhashchandran                                        "Set");
1153c6f29a0SDhruvaraj Subhashchandran     method.append("xyz.openbmc_project.Led.Group");
1163c6f29a0SDhruvaraj Subhashchandran     method.append("Asserted");
1173c6f29a0SDhruvaraj Subhashchandran 
1183c6f29a0SDhruvaraj Subhashchandran     method.append(sdbusplus::message::variant<bool>(assert));
1193c6f29a0SDhruvaraj Subhashchandran     bus.call_noreply(method);
1203c6f29a0SDhruvaraj Subhashchandran 
12159b86cd7SDhruvaraj Subhashchandran     return;
12259b86cd7SDhruvaraj Subhashchandran }
12359b86cd7SDhruvaraj Subhashchandran 
1243eedbe44SPatrick Williams void Add::created(sdbusplus::message::message& msg)
12559b86cd7SDhruvaraj Subhashchandran {
1263eedbe44SPatrick Williams     auto bus = msg.get_bus();
1273c6f29a0SDhruvaraj Subhashchandran 
128*aebfde81SDhruvaraj Subhashchandran     LogEntryMsg logEntry;
129*aebfde81SDhruvaraj Subhashchandran     msg.read(logEntry);
130*aebfde81SDhruvaraj Subhashchandran     std::string objectPath(std::move(logEntry.first));
1313c6f29a0SDhruvaraj Subhashchandran 
1323c6f29a0SDhruvaraj Subhashchandran     std::size_t found = objectPath.find(ELOG_ENTRY);
1333c6f29a0SDhruvaraj Subhashchandran     if (found == std::string::npos)
1343c6f29a0SDhruvaraj Subhashchandran     {
1353c6f29a0SDhruvaraj Subhashchandran         //Not a new error entry skip
1363eedbe44SPatrick Williams         return;
1373c6f29a0SDhruvaraj Subhashchandran     }
138*aebfde81SDhruvaraj Subhashchandran     log<level::ERR>(objectPath.c_str());
1393c6f29a0SDhruvaraj Subhashchandran 
140*aebfde81SDhruvaraj Subhashchandran     auto iter = logEntry.second.find("org.openbmc.Associations");
141*aebfde81SDhruvaraj Subhashchandran     if (iter == logEntry.second.end())
1423c6f29a0SDhruvaraj Subhashchandran     {
1433eedbe44SPatrick Williams         return;
1443c6f29a0SDhruvaraj Subhashchandran     }
1453c6f29a0SDhruvaraj Subhashchandran 
146*aebfde81SDhruvaraj Subhashchandran     auto attr = iter->second.find("associations");
147*aebfde81SDhruvaraj Subhashchandran     if (attr == iter->second.end())
1483c6f29a0SDhruvaraj Subhashchandran     {
1493eedbe44SPatrick Williams         return;
1503c6f29a0SDhruvaraj Subhashchandran     }
1513c6f29a0SDhruvaraj Subhashchandran 
152*aebfde81SDhruvaraj Subhashchandran     auto& assocs =
153*aebfde81SDhruvaraj Subhashchandran         sdbusplus::message::variant_ns::get<AssociationList>(attr->second);
1543c6f29a0SDhruvaraj Subhashchandran     if (assocs.empty())
1553c6f29a0SDhruvaraj Subhashchandran     {
1563c6f29a0SDhruvaraj Subhashchandran         //No associations skip
1573eedbe44SPatrick Williams         return;
1583c6f29a0SDhruvaraj Subhashchandran     }
1593c6f29a0SDhruvaraj Subhashchandran 
1603c6f29a0SDhruvaraj Subhashchandran     for (const auto& item : assocs)
1613c6f29a0SDhruvaraj Subhashchandran     {
1623c6f29a0SDhruvaraj Subhashchandran         if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
1633c6f29a0SDhruvaraj Subhashchandran         {
1643c6f29a0SDhruvaraj Subhashchandran             action(bus, std::get<2>(item), true);
1653eedbe44SPatrick Williams             removeWatches.emplace_back(
1663c6f29a0SDhruvaraj Subhashchandran                 std::make_unique<Remove>(bus, std::get<2>(item)));
1673c6f29a0SDhruvaraj Subhashchandran         }
1683c6f29a0SDhruvaraj Subhashchandran     }
169*aebfde81SDhruvaraj Subhashchandran 
1703eedbe44SPatrick Williams     return;
17159b86cd7SDhruvaraj Subhashchandran }
17259b86cd7SDhruvaraj Subhashchandran 
1733eedbe44SPatrick Williams void Remove::removed(sdbusplus::message::message& msg)
17459b86cd7SDhruvaraj Subhashchandran {
1753eedbe44SPatrick Williams     auto bus = msg.get_bus();
1763c6f29a0SDhruvaraj Subhashchandran     std::string assoc;
1773eedbe44SPatrick Williams     msg.read(assoc);
1783c6f29a0SDhruvaraj Subhashchandran 
1793c6f29a0SDhruvaraj Subhashchandran     if (assoc.compare("org.openbmc.Association"))
1803c6f29a0SDhruvaraj Subhashchandran     {
1813c6f29a0SDhruvaraj Subhashchandran         //Skip if not about association
1823eedbe44SPatrick Williams         return;
1833c6f29a0SDhruvaraj Subhashchandran     }
1843c6f29a0SDhruvaraj Subhashchandran 
1853c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> endPoints;
1863eedbe44SPatrick Williams     msg.read(endPoints);
1873c6f29a0SDhruvaraj Subhashchandran     auto it = endPoints.find("endpoints");
1883c6f29a0SDhruvaraj Subhashchandran 
1893c6f29a0SDhruvaraj Subhashchandran     if (it == endPoints.end())
1903c6f29a0SDhruvaraj Subhashchandran     {
1913c6f29a0SDhruvaraj Subhashchandran         //No end points,skip
1923eedbe44SPatrick Williams         return;
1933c6f29a0SDhruvaraj Subhashchandran     }
1943c6f29a0SDhruvaraj Subhashchandran 
1953c6f29a0SDhruvaraj Subhashchandran     if (!((*it).second.empty()))
1963c6f29a0SDhruvaraj Subhashchandran     {
1973c6f29a0SDhruvaraj Subhashchandran         //Skip, end points are not empty
1983eedbe44SPatrick Williams         return;
1993c6f29a0SDhruvaraj Subhashchandran     }
2003c6f29a0SDhruvaraj Subhashchandran 
2013eedbe44SPatrick Williams     action(bus, inventoryPath, false);
2023eedbe44SPatrick Williams     return;
20359b86cd7SDhruvaraj Subhashchandran }
20459b86cd7SDhruvaraj Subhashchandran 
20559b86cd7SDhruvaraj Subhashchandran }//namespace monitor
20659b86cd7SDhruvaraj Subhashchandran }//namespace fault
20759b86cd7SDhruvaraj Subhashchandran }//namespace fru
20859b86cd7SDhruvaraj Subhashchandran }//namespace led
20959b86cd7SDhruvaraj Subhashchandran }//namespace phosphor
210