Add class and stub for fru fault monitor application

This application waits for new fault entries and resolution of
exiting faults to assert or deassert LED for the corresponding FRUs,
respectively.

Change-Id: I92ead0c8d3132dd7a6740b536231d6588ac42471
Signed-off-by: Dhruvaraj Subhashchandran <dhruvaraj@in.ibm.com>
diff --git a/fault-monitor/fru-fault-monitor.hpp b/fault-monitor/fru-fault-monitor.hpp
new file mode 100644
index 0000000..8d5195d
--- /dev/null
+++ b/fault-monitor/fru-fault-monitor.hpp
@@ -0,0 +1,143 @@
+#pragma once
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server.hpp>
+#include "config.h"
+
+namespace phosphor
+{
+namespace led
+{
+namespace fru
+{
+namespace fault
+{
+namespace monitor
+{
+
+/** @brief Assert or deassert an LED based on the input FRU
+  *  @param[in] bus       -  The Dbus bus object
+  *  @param[in] path      -  Inventory path of the FRU
+  *  @param[in] assert    -  Assert if true deassert if false
+  */
+void action(sdbusplus::bus::bus& bus,
+            const std::string& path,
+            bool assert);
+
+class Remove;
+
+/** @class Add
+ *  @brief Implementation of LED handling during FRU fault
+ *  @details This implements methods for watching for a FRU fault
+ *  being logged to assert the corresponding LED
+ */
+class Add
+{
+    public:
+        Add() = delete;
+        ~Add() = default;
+        Add(const Add&) = delete;
+        Add& operator=(const Add&) = delete;
+        Add(Add&&) = default;
+        Add& operator=(Add&&) = default;
+
+        /** @brief constructs Add a watch for FRU faults.
+         *  @param[in] bus -  The Dbus bus object
+         */
+        Add(sdbusplus::bus::bus& bus):
+            matchCreated(
+                bus,
+                "type='signal',"
+                "interface='org.freedesktop.DBus.ObjectManager',"
+                "member='InterfacesAdded',"
+                "path_namespace='/xyz/openbmc_project/logging'",
+                created,
+                this)
+        {
+            //Do nothing
+        }
+    private:
+
+        /** @brief sdbusplus signal match for fault created */
+        sdbusplus::server::match::match matchCreated;
+
+        std::vector<std::unique_ptr<Remove>> removeWatches;
+
+        /** @brief Callback function for fru fault created
+         *  @param[in] msg       - Data associated with subscribed signal
+         *  @param[in] data      - Pointer to this object instance
+         *  @param[out] retError - Error returned
+         *  @return zero on success and error code upon failure
+         */
+        static int created(sd_bus_message* msg,
+                           void* data,
+                           sd_bus_error* retError);
+};
+
+/** @class Remove
+ *  @brief Implementation of LED handling after resolution of FRU fault
+ *  @details Implement methods for watching the resolution of FRU faults
+ *  and deasserting corresponding LED.
+ */
+class Remove
+{
+    public:
+        Remove() = delete;
+        ~Remove() = default;
+        Remove(const Remove&) = delete;
+        Remove& operator=(const Remove&) = delete;
+        Remove(Remove&&) = default;
+        Remove& operator=(Remove&&) = default;
+
+        /** @brief constructs Remove
+         *  @param[in] bus  -  The Dbus bus object
+         *  @param[in] path -  Inventory path to fru
+         */
+        Remove(sdbusplus::bus::bus& bus, const std::string& path):
+            inventoryPath(path),
+            matchRemoved(
+                bus,
+                match(path).c_str(),
+                removed,
+                this)
+        {
+            //Do nothing
+        }
+
+    private:
+
+        /** @brief inventory path of the FRU */
+        std::string inventoryPath;
+
+        /** @brief sdbusplus signal matches for fault removed */
+        sdbusplus::server::match::match matchRemoved;
+
+        /** @brief Callback function for fru fault created
+         *  @param[in] msg       - Data associated with subscribed signal
+         *  @param[in] data      - Pointer to this object instance
+         *  @param[out] retError - Error returned
+         *  @return zero on success and error code upon failure
+         */
+        static int removed(sd_bus_message* msg,
+                           void* data,
+                           sd_bus_error* retError);
+
+        /** @brief function to create fault remove match for a fru
+         *  @param[in] path  - Inventory path of the faulty unit.
+         */
+        std::string match(const std::string& path)
+        {
+            std::string matchStmt =
+                "type='signal',"
+                "interface='org.freedesktop.DBus.Properties',"
+                "member='PropertiesChanged',"
+                "path='" + path +
+                "/" + CALLOUT_REV_ASSOCIATION + "'";
+            return matchStmt;
+        }
+};
+}//namespace monitor
+}//namespace fault
+}//namespace fru
+}//namespace led
+}//namespace phosphor