From b1e329a6e5763cd40933f446bce759b585169e2d Mon Sep 17 00:00:00 2001 From: Brad Bishop Date: Wed, 2 Aug 2017 01:23:12 -0400 Subject: Add phosphor-msl-verify phosphor-msl-verify is a oneshot application for basic minimum ship level (MSL) verification. https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Control/README.msl.md Change-Id: Ifa036bb0a45255af7c7773bd910e83c64842d868 Signed-off-by: Brad Bishop --- mslverify/util.hpp | 225 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 mslverify/util.hpp (limited to 'mslverify/util.hpp') diff --git a/mslverify/util.hpp b/mslverify/util.hpp new file mode 100644 index 0000000..2c26fc2 --- /dev/null +++ b/mslverify/util.hpp @@ -0,0 +1,225 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace util +{ +namespace detail +{ +namespace errors = sdbusplus::xyz::openbmc_project::Common::Error; +} // namespace detail + +/** @brief Alias for PropertiesChanged signal callbacks. */ +template +using Properties = std::map>; + +namespace sdbusplus +{ + +/** @brief Get the bus connection. */ +static auto& getBus() __attribute__((pure)); +static auto& getBus() +{ + static auto bus = ::sdbusplus::bus::new_default(); + return bus; +} + +/** @brief Invoke a method. */ +template +static auto callMethod( + ::sdbusplus::bus::bus& bus, + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& method, + Args&& ... args) +{ + auto reqMsg = bus.new_method_call( + busName.c_str(), + path.c_str(), + interface.c_str(), + method.c_str()); + reqMsg.append(std::forward(args)...); + auto respMsg = bus.call(reqMsg); + + if (respMsg.is_method_error()) + { + phosphor::logging::log( + "Failed to invoke DBus method.", + phosphor::logging::entry("PATH=%s", path.c_str()), + phosphor::logging::entry( + "INTERFACE=%s", interface.c_str()), + phosphor::logging::entry("METHOD=%s", method.c_str())); + phosphor::logging::elog(); + } + + return respMsg; +} + +/** @brief Invoke a method. */ +template +static auto callMethod( + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& method, + Args&& ... args) +{ + return callMethod( + getBus(), + busName, + path, + interface, + method, + std::forward(args)...); +} + +/** @brief Invoke a method and read the response. */ +template +static auto callMethodAndRead( + ::sdbusplus::bus::bus& bus, + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& method, + Args&& ... args) +{ + ::sdbusplus::message::message respMsg = + callMethod( + bus, + busName, + path, + interface, + method, + std::forward(args)...); + Ret resp; + respMsg.read(resp); + return resp; +} + +/** @brief Invoke a method and read the response. */ + template +static auto callMethodAndRead( + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& method, + Args&& ... args) +{ + return callMethodAndRead( + getBus(), + busName, + path, + interface, + method, + std::forward(args)...); +} + + +/** @brief Get service from the mapper. */ +static auto getService( + ::sdbusplus::bus::bus& bus, + const std::string& path, + const std::string& interface) +{ + using namespace std::literals::string_literals; + using GetObject = std::map>; + + auto mapperResp = callMethodAndRead( + bus, + "xyz.openbmc_project.ObjectMapper"s, + "/xyz/openbmc_project/object_mapper"s, + "xyz.openbmc_project.ObjectMapper"s, + "GetObject"s, + path, + GetObject::mapped_type{interface}); + + if (mapperResp.empty()) + { + phosphor::logging::log( + "Object not found.", + phosphor::logging::entry("PATH=%s", path.c_str()), + phosphor::logging::entry( + "INTERFACE=%s", interface.c_str())); + phosphor::logging::elog(); + } + return mapperResp.begin()->first; +} + +/** @brief Get a property without mapper lookup. */ +template +static auto getProperty( + ::sdbusplus::bus::bus& bus, + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& property) +{ + using namespace std::literals::string_literals; + + auto msg = callMethod( + bus, + busName, + path, + "org.freedesktop.DBus.Properties"s, + "Get"s, + interface, + property); + ::sdbusplus::message::variant value; + msg.read(value); + return value.template get(); +} + +/** @brief Get a property without mapper lookup. */ +template +static auto getProperty( + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& property) +{ + return getProperty( + getBus(), + busName, + path, + interface, + property); +} + +/** @brief Get a property with mapper lookup. */ +template +static auto getProperty( + ::sdbusplus::bus::bus& bus, + const std::string& path, + const std::string& interface, + const std::string& property) +{ + return getProperty( + bus, + getService(bus, path, interface), + path, + interface, + property); +} + +/** @brief Get a property with mapper lookup. */ +template +static auto getProperty( + const std::string& path, + const std::string& interface, + const std::string& property) +{ + return getProperty( + getBus(), + path, + interface, + property); +} + +} // namespace sdbusplus +} // namespace util -- cgit v1.2.1