xref: /openbmc/phosphor-led-manager/fault-monitor/fru-fault-monitor.hpp (revision f05925599f7ad2b07e326eb3413a488ce21bd1c6)
1 #pragma once
2 
3 #include "config.h"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <sdbusplus/server.hpp>
7 
8 #include <string>
9 
10 namespace phosphor
11 {
12 namespace led
13 {
14 namespace fru
15 {
16 namespace fault
17 {
18 namespace monitor
19 {
20 
21 /** @brief Assert or deassert an LED based on the input FRU
22  *  @param[in] bus       -  The Dbus bus object
23  *  @param[in] path      -  Inventory path of the FRU
24  *  @param[in] assert    -  Assert if true deassert if false
25  */
26 void action(sdbusplus::bus_t& bus, const std::string& path, bool assert);
27 
28 /** @class Remove
29  *  @brief Implementation of LED handling after resolution of FRU fault
30  *  @details Implement methods for watching the resolution of FRU faults
31  *  and deasserting corresponding LED.
32  */
33 class Remove
34 {
35   public:
36     Remove() = delete;
37     ~Remove() = default;
38     Remove(const Remove&) = delete;
39     Remove& operator=(const Remove&) = delete;
40     Remove(Remove&&) = default;
41     Remove& operator=(Remove&&) = default;
42 
43     /** @brief constructs Remove
44      *  @param[in] bus  -  The Dbus bus object
45      *  @param[in] path -  Inventory path to fru
46      */
Remove(sdbusplus::bus_t & bus,const std::string & path)47     Remove(sdbusplus::bus_t& bus, const std::string& path) :
48         inventoryPath(path),
49         matchRemoved(bus, match(path),
50                      [this](sdbusplus::message_t& m) { removed(m); })
51     {
52         // Do nothing
53     }
54 
55   private:
56     /** @brief inventory path of the FRU */
57     std::string inventoryPath;
58 
59     /** @brief sdbusplus signal matches for fault removed */
60     sdbusplus::bus::match_t matchRemoved;
61 
62     /** @brief Callback function for fru fault created
63      *  @param[in] msg       - Data associated with subscribed signal
64      */
65     void removed(sdbusplus::message_t& msg);
66 
67     /** @brief function to create fault remove match for a fru
68      *  @param[in] path  - Inventory path of the faulty unit.
69      */
match(const std::string & path)70     static std::string match(const std::string& path)
71     {
72         namespace MatchRules = sdbusplus::bus::match::rules;
73 
74         std::string matchStmt =
75             MatchRules::interfacesRemoved() +
76             MatchRules::argNpath(0, path + "/" + CALLOUT_REV_ASSOCIATION);
77 
78         return matchStmt;
79     }
80 };
81 
82 /** @class Add
83  *  @brief Implementation of LED handling during FRU fault
84  *  @details This implements methods for watching for a FRU fault
85  *  being logged to assert the corresponding LED
86  */
87 class Add
88 {
89   public:
90     Add() = delete;
91     ~Add() = default;
92     Add(const Add&) = delete;
93     Add& operator=(const Add&) = delete;
94     Add(Add&&) = default;
95     Add& operator=(Add&&) = default;
96 
97     /** @brief constructs Add a watch for FRU faults.
98      *  @param[in] bus -  The Dbus bus object
99      */
Add(sdbusplus::bus_t & bus)100     explicit Add(sdbusplus::bus_t& bus) :
101         matchCreated(bus,
102                      sdbusplus::bus::match::rules::interfacesAdded() +
103                          sdbusplus::bus::match::rules::path_namespace(
104                              "/xyz/openbmc_project/logging"),
105                      [this](sdbusplus::message_t& m) { created(m); })
106     {
107         processExistingCallouts(bus);
108     }
109 
110   private:
111     /** @brief sdbusplus signal match for fault created */
112     sdbusplus::bus::match_t matchCreated;
113 
114     std::vector<std::unique_ptr<Remove>> removeWatches;
115 
116     /** @brief Callback function for fru fault created
117      *  @param[in] msg       - Data associated with subscribed signal
118      */
119     void created(sdbusplus::message_t& msg);
120 
121     /** @brief This function process all callouts at application start
122      *  @param[in] bus - The Dbus bus object
123      */
124     void processExistingCallouts(sdbusplus::bus_t& bus);
125 };
126 } // namespace monitor
127 } // namespace fault
128 } // namespace fru
129 } // namespace led
130 } // namespace phosphor
131