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      */
47     Remove(sdbusplus::bus_t& bus, const std::string& path) :
48         inventoryPath(path),
49         matchRemoved(bus, match(path),
50                      std::bind(std::mem_fn(&Remove::removed), this,
51                                std::placeholders::_1))
52     {
53         // Do nothing
54     }
55 
56   private:
57     /** @brief inventory path of the FRU */
58     std::string inventoryPath;
59 
60     /** @brief sdbusplus signal matches for fault removed */
61     sdbusplus::bus::match_t matchRemoved;
62 
63     /** @brief Callback function for fru fault created
64      *  @param[in] msg       - Data associated with subscribed signal
65      */
66     void removed(sdbusplus::message_t& msg);
67 
68     /** @brief function to create fault remove match for a fru
69      *  @param[in] path  - Inventory path of the faulty unit.
70      */
71     std::string match(const std::string& path)
72     {
73         namespace MatchRules = sdbusplus::bus::match::rules;
74 
75         std::string matchStmt =
76             MatchRules::interfacesRemoved() +
77             MatchRules::argNpath(0, path + "/" + CALLOUT_REV_ASSOCIATION);
78 
79         return matchStmt;
80     }
81 };
82 
83 /** @class Add
84  *  @brief Implementation of LED handling during FRU fault
85  *  @details This implements methods for watching for a FRU fault
86  *  being logged to assert the corresponding LED
87  */
88 class Add
89 {
90   public:
91     Add() = delete;
92     ~Add() = default;
93     Add(const Add&) = delete;
94     Add& operator=(const Add&) = delete;
95     Add(Add&&) = default;
96     Add& operator=(Add&&) = default;
97 
98     /** @brief constructs Add a watch for FRU faults.
99      *  @param[in] bus -  The Dbus bus object
100      */
101     explicit Add(sdbusplus::bus_t& bus) :
102         matchCreated(
103             bus,
104             sdbusplus::bus::match::rules::interfacesAdded() +
105                 sdbusplus::bus::match::rules::path_namespace(
106                     "/xyz/openbmc_project/logging"),
107             std::bind(std::mem_fn(&Add::created), this, std::placeholders::_1))
108     {
109         processExistingCallouts(bus);
110     }
111 
112   private:
113     /** @brief sdbusplus signal match for fault created */
114     sdbusplus::bus::match_t matchCreated;
115 
116     std::vector<std::unique_ptr<Remove>> removeWatches;
117 
118     /** @brief Callback function for fru fault created
119      *  @param[in] msg       - Data associated with subscribed signal
120      */
121     void created(sdbusplus::message_t& msg);
122 
123     /** @brief This function process all callouts at application start
124      *  @param[in] bus - The Dbus bus object
125      */
126     void processExistingCallouts(sdbusplus::bus_t& bus);
127 };
128 } // namespace monitor
129 } // namespace fault
130 } // namespace fru
131 } // namespace led
132 } // namespace phosphor
133