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