Add support for vendor specific FruDbusLookup

In the current state, a vendor could not define the FRU's
that he wants to send to the host.

This commit adds a fru_master.json that can be used while
building the master , and the json would be replaced with
fru_master.json from the oem/<vendor>/configurations
directory when compiling for oem's.

Tested By:

IBM machine test :
1. meson build -Doem-ibm=enabled -Dprefix=<>
2. ninja -C build && ninja install
3. in the prefix directory we should see the json file
   from the oem/ibm/configurations folder

Non IBM machine test :
1. meson build -Doem-ibm=disabled -Dprefix=<>
2. ninja -C build && ninja install
3. in the prefix directory we should see the json file
   from the pldm/configurations folder.

Runtime test:
1. on an IBM machine make sure the pldm builds the fru record
   table.

Signed-off-by: Manojkiran Eda <manojkiran.eda@gmail.com>
Change-Id: Id3c2746c51a1f99f2038b2af48137133e9d0b405
diff --git a/libpldmresponder/fru_parser.cpp b/libpldmresponder/fru_parser.cpp
index a59d61a..28f48a7 100644
--- a/libpldmresponder/fru_parser.cpp
+++ b/libpldmresponder/fru_parser.cpp
@@ -24,9 +24,13 @@
 const std::vector<Json> emptyJsonList{};
 const std::vector<std::string> emptyStringVec{};
 
-FruParser::FruParser(const std::string& dirPath)
+FruParser::FruParser(const std::string& dirPath,
+                     const fs::path& fruMasterJsonPath)
 {
-    setupDefaultDBusLookup();
+    if (fs::exists(fruMasterJsonPath))
+    {
+        setupDefaultDBusLookup(fruMasterJsonPath);
+    }
     setupDefaultFruRecordMap();
 
     fs::path dir(dirPath);
@@ -36,31 +40,35 @@
     }
 }
 
-void FruParser::setupDefaultDBusLookup()
+void FruParser::setupDefaultDBusLookup(const fs::path& masterJsonPath)
 {
     constexpr auto service = "xyz.openbmc_project.Inventory.Manager";
     constexpr auto rootPath = "/xyz/openbmc_project/inventory";
+    std::ifstream jsonFile(masterJsonPath);
+    auto data = Json::parse(jsonFile, nullptr, false);
+    if (data.is_discarded())
+    {
 
-    // DSP0249 1.0.0    Table 15 Entity ID Codes
-    const std::map<Interface, EntityType> defIntfToEntityType = {
-        {"xyz.openbmc_project.Inventory.Item.Chassis", 45},
-        {"xyz.openbmc_project.Inventory.Item.Board", 60},
-        {"xyz.openbmc_project.Inventory.Item.PCIeDevice", 61},
-        {"xyz.openbmc_project.Inventory.Item.Board.Motherboard", 64},
-        {"xyz.openbmc_project.Inventory.Item.Dimm", 66},
-        {"xyz.openbmc_project.Inventory.Item.Panel", 69},
-        {"xyz.openbmc_project.Inventory.Item.DiskBackplane", 73},
-        {"xyz.openbmc_project.Inventory.Item.Fan", 93},
-        {"xyz.openbmc_project.Inventory.Item.PowerSupply", 120},
-        {"xyz.openbmc_project.Inventory.Item.Battery", 121},
-        {"xyz.openbmc_project.Inventory.Item.Vrm", 123},
-        {"xyz.openbmc_project.Inventory.Item.Cpu", 135},
-        {"xyz.openbmc_project.Inventory.Item.Bmc", 137},
-        {"xyz.openbmc_project.Inventory.Item.Connector", 185},
-        {"xyz.openbmc_project.Inventory.Item.PCIeSlot", 186},
-        {"xyz.openbmc_project.Inventory.Item.System", 11521},
-        {"xyz.openbmc_project.Inventory.Item.Tpm", 24576},
-    };
+        std::cerr << "Parsing FRU Dbus Lookup Map config file failed, FILE="
+                  << masterJsonPath;
+        std::abort();
+    }
+    std::map<Interface, EntityType> defIntfToEntityType;
+    auto dbusMap = data.value("FruDBusLookupMap", emptyJson);
+    for (const auto& element : dbusMap.items())
+
+    {
+        try
+        {
+            defIntfToEntityType[static_cast<Interface>(element.key())] =
+                static_cast<EntityType>(element.value());
+        }
+        catch (const std::exception& e)
+        {
+            std::cerr << "FRU DBus lookup map format error\n";
+            throw InternalFailure();
+        }
+    }
 
     Interfaces interfaces{};
     for (auto [intf, entityType] : defIntfToEntityType)