diff options
author | Tom Joseph <tomjoseph@in.ibm.com> | 2017-07-12 19:54:44 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-07-18 21:21:28 +0000 |
commit | be5eaa10b211fd3116762fee5e1b86475bed092f (patch) | |
tree | 370341e430cc4843764d9aef8d0078759cef16f3 | |
parent | 10f4959a020f33d40e7387d93fdab9bba46963d7 (diff) | |
download | phosphor-host-ipmid-be5eaa10b211fd3116762fee5e1b86475bed092f.tar.gz phosphor-host-ipmid-be5eaa10b211fd3116762fee5e1b86475bed092f.zip |
dcmi: asset-tag: Add API to read asset tag from dbus
Change-Id: I00958d4bb54896ea7d13aaffd7e0ebf3c20ef3de
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
-rw-r--r-- | dcmihandler.cpp | 78 | ||||
-rw-r--r-- | dcmihandler.h | 12 | ||||
-rw-r--r-- | dcmihandler.hpp | 51 |
3 files changed, 128 insertions, 13 deletions
diff --git a/dcmihandler.cpp b/dcmihandler.cpp index 19187ba..c7497f0 100644 --- a/dcmihandler.cpp +++ b/dcmihandler.cpp @@ -1,8 +1,15 @@ -#include "dcmihandler.h" +#include "dcmihandler.hpp" #include "host-ipmid/ipmid-api.h" +#include <phosphor-logging/elog-errors.hpp> #include <stdio.h> #include <string.h> #include <stdint.h> +#include "utils.hpp" +#include "xyz/openbmc_project/Common/error.hpp" + +using namespace phosphor::logging; +using InternalFailure = + sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; void register_netfn_dcmi_functions() __attribute__((constructor)); @@ -30,6 +37,75 @@ ipmi_ret_t ipmi_dcmi_get_power_limit(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } +namespace dcmi +{ + +void readAssetTagObjectTree(dcmi::assettag::ObjectTree& objectTree) +{ + static constexpr auto mapperBusName = "xyz.openbmc_project.ObjectMapper"; + static constexpr auto mapperObjPath = "/xyz/openbmc_project/object_mapper"; + static constexpr auto mapperIface = "xyz.openbmc_project.ObjectMapper"; + static constexpr auto inventoryRoot = "/xyz/openbmc_project/inventory/"; + + sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()}; + auto depth = 0; + + auto mapperCall = bus.new_method_call(mapperBusName, + mapperObjPath, + mapperIface, + "GetSubTree"); + + mapperCall.append(inventoryRoot); + mapperCall.append(depth); + mapperCall.append(std::vector<std::string>({dcmi::assetTagIntf})); + + auto mapperReply = bus.call(mapperCall); + if (mapperReply.is_method_error()) + { + log<level::ERR>("Error in mapper call"); + elog<InternalFailure>(); + } + + mapperReply.read(objectTree); + + if (objectTree.empty()) + { + log<level::ERR>("AssetTag property is not populated"); + elog<InternalFailure>(); + } +} + +std::string readAssetTag() +{ + sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()}; + dcmi::assettag::ObjectTree objectTree; + + // Read the object tree with the inventory root to figure out the object + // that has implemented the Asset tag interface. + readAssetTagObjectTree(objectTree); + + auto method = bus.new_method_call( + (objectTree.begin()->second.begin()->first).c_str(), + (objectTree.begin()->first).c_str(), + dcmi::propIntf, + "Get"); + method.append(dcmi::assetTagIntf); + method.append(dcmi::assetTagProp); + + auto reply = bus.call(method); + if (reply.is_method_error()) + { + log<level::ERR>("Error in reading asset tag"); + elog<InternalFailure>(); + } + + sdbusplus::message::variant<std::string> assetTag; + reply.read(assetTag); + + return assetTag.get<std::string>(); +} + +} // namespace dcmi void register_netfn_dcmi_functions() { diff --git a/dcmihandler.h b/dcmihandler.h deleted file mode 100644 index 5fc0c10..0000000 --- a/dcmihandler.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __HOST_IPMI_DCMI_HANDLER_H__ -#define __HOST_IPMI_DCMI_HANDLER_H__ - -// IPMI commands for net functions. -enum ipmi_netfn_sen_cmds -{ - // Get capability bits - IPMI_CMD_DCMI_GET_POWER = 0x03, - -}; - -#endif diff --git a/dcmihandler.hpp b/dcmihandler.hpp new file mode 100644 index 0000000..dfe1d4e --- /dev/null +++ b/dcmihandler.hpp @@ -0,0 +1,51 @@ +#ifndef __HOST_IPMI_DCMI_HANDLER_H__ +#define __HOST_IPMI_DCMI_HANDLER_H__ + +#include <map> +#include <string> +#include <vector> + +// IPMI commands for net functions. +enum ipmi_netfn_sen_cmds +{ + // Get capability bits + IPMI_CMD_DCMI_GET_POWER = 0x03, +}; + +namespace dcmi +{ + +static constexpr auto propIntf = "org.freedesktop.DBus.Properties"; +static constexpr auto assetTagIntf = + "xyz.openbmc_project.Inventory.Decorator.AssetTag"; +static constexpr auto assetTagProp = "AssetTag"; + +namespace assettag +{ + + using ObjectPath = std::string; + using Service = std::string; + using Interfaces = std::vector<std::string>; + using ObjectTree = std::map<ObjectPath, std::map<Service, Interfaces>>; + +} //namespace assettag + +/** @brief Read the object tree to fetch the object path that implemented the + * Asset tag interface. + * + * @param[in,out] objectTree - object tree + * + * @return On success return the object tree with the object path that + * implemented the AssetTag interface. + */ +void readAssetTagObjectTree(dcmi::assettag::ObjectTree& objectTree); + +/** @brief Read the asset tag of the server + * + * @return On success return the asset tag. + */ +std::string readAssetTag(); + +} // namespace dcmi + +#endif |