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