diff options
-rw-r--r-- | special-mode-mgr/CMakeLists.txt | 12 | ||||
-rw-r--r-- | special-mode-mgr/include/specialmodemgr.hpp | 25 | ||||
-rw-r--r-- | special-mode-mgr/src/specialmodemgr.cpp | 46 |
3 files changed, 55 insertions, 28 deletions
diff --git a/special-mode-mgr/CMakeLists.txt b/special-mode-mgr/CMakeLists.txt index ea54904..fa69da8 100644 --- a/special-mode-mgr/CMakeLists.txt +++ b/special-mode-mgr/CMakeLists.txt @@ -24,6 +24,15 @@ pkg_check_modules(SYSTEMD libsystemd REQUIRED) # import sdbusplus find_package(PkgConfig REQUIRED) pkg_check_modules(SDBUSPLUSPLUS sdbusplus REQUIRED) +include_directories(${SDBUSPLUSPLUS_INCLUDE_DIRS}) +link_directories(${SDBUSPLUSPLUS_LIBRARY_DIRS}) +find_program(SDBUSPLUSPLUS sdbus++) + +# phosphor-dbus-interfaces +find_package(PkgConfig REQUIRED) +pkg_check_modules(DBUSINTERFACE phosphor-dbus-interfaces REQUIRED) +include_directories(${DBUSINTERFACE_INCLUDE_DIRS}) +link_directories(${DBUSINTERFACE_LIBRARY_DIRS}) # import phosphor-logging find_package(PkgConfig REQUIRED) @@ -31,7 +40,8 @@ pkg_check_modules(LOGGING phosphor-logging REQUIRED) add_executable(${PROJECT_NAME} ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} systemd) -target_link_libraries(${PROJECT_NAME} sdbusplus) +target_link_libraries(${PROJECT_NAME} ${SDBUSPLUSPLUS_LIBRARIES}) +target_link_libraries(${PROJECT_NAME} ${DBUSINTERFACE_LIBRARIES}) target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES}) target_link_libraries(${PROJECT_NAME} phosphor_logging) diff --git a/special-mode-mgr/include/specialmodemgr.hpp b/special-mode-mgr/include/specialmodemgr.hpp index 9146b01..2e60a2c 100644 --- a/special-mode-mgr/include/specialmodemgr.hpp +++ b/special-mode-mgr/include/specialmodemgr.hpp @@ -19,18 +19,11 @@ #include <sdbusplus/asio/object_server.hpp> #include <chrono> #include <filesystem> +#include <xyz/openbmc_project/Control/Security/SpecialMode/server.hpp> -static constexpr const char* strSpecialMode = "SpecialMode"; - -enum SpecialMode : uint8_t +namespace specialMode { - none = 0, - manufacturingExpired = 1, - manufacturingMode = 2, -#ifdef BMC_VALIDATION_UNSECURE_FEATURE - validationUnsecure = 3, -#endif -}; +static constexpr const char* strSpecialMode = "SpecialMode"; class SpecialModeMgr { @@ -38,7 +31,8 @@ class SpecialModeMgr sdbusplus::asio::object_server& server; std::shared_ptr<sdbusplus::asio::connection> conn; std::shared_ptr<sdbusplus::asio::dbus_interface> iface; - uint8_t specialMode = none; + sdbusplus::xyz::openbmc_project::Control::Security::server::SpecialMode:: + Modes specialMode; std::unique_ptr<boost::asio::steady_timer> timer = nullptr; std::unique_ptr<sdbusplus::bus::match::match> intfAddMatchRule = nullptr; std::unique_ptr<sdbusplus::bus::match::match> propUpdMatchRule = nullptr; @@ -48,14 +42,19 @@ class SpecialModeMgr void updateTimer(int countInSeconds); public: - void setSpecialModeValue(uint8_t value) const + void setSpecialModeValue( + const sdbusplus::xyz::openbmc_project::Control::Security::server:: + SpecialMode::Modes value) const { if (iface != nullptr && iface->is_initialized()) { - iface->set_property(strSpecialMode, value); + iface->set_property(strSpecialMode, + sdbusplus::xyz::openbmc_project::Control:: + Security::server::convertForMessage(value)); } } SpecialModeMgr(boost::asio::io_service& io, sdbusplus::asio::object_server& srv, std::shared_ptr<sdbusplus::asio::connection>& conn); }; +} // namespace specialMode diff --git a/special-mode-mgr/src/specialmodemgr.cpp b/special-mode-mgr/src/specialmodemgr.cpp index 44f12cc..b685550 100644 --- a/special-mode-mgr/src/specialmodemgr.cpp +++ b/special-mode-mgr/src/specialmodemgr.cpp @@ -22,6 +22,8 @@ #include <phosphor-logging/log.hpp> #include <string> +namespace specialMode +{ static constexpr const char* specialModeMgrService = "xyz.openbmc_project.SpecialMode"; static constexpr const char* specialModeIntf = @@ -42,18 +44,21 @@ using VariantValue = std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, double, std::string>; +namespace secCtrl = sdbusplus::xyz::openbmc_project::Control::Security::server; + SpecialModeMgr::SpecialModeMgr( boost::asio::io_service& io_, sdbusplus::asio::object_server& srv_, std::shared_ptr<sdbusplus::asio::connection>& conn_) : io(io_), server(srv_), conn(conn_), - timer(std::make_unique<boost::asio::steady_timer>(io)) + timer(std::make_unique<boost::asio::steady_timer>(io)), + specialMode(secCtrl::SpecialMode::Modes::None) { #ifdef BMC_VALIDATION_UNSECURE_FEATURE if (std::filesystem::exists(validationModeFile)) { - specialMode = validationUnsecure; + specialMode = secCtrl::SpecialMode::Modes::ValidationUnsecure; addSpecialModeProperty(); return; } @@ -131,7 +136,7 @@ SpecialModeMgr::SpecialModeMgr( { phosphor::logging::log<phosphor::logging::level::INFO>( "Mode is not provisioning"); - setSpecialModeValue(manufacturingExpired); + setSpecialModeValue(secCtrl::SpecialMode::Modes::None); } }); @@ -182,7 +187,7 @@ void SpecialModeMgr::checkAndAddSpecialModeProperty(const std::string& provMode) int specialModeLockoutSeconds = 0; if (mtmAllowedTime > sysInfo.uptime) { - specialMode = manufacturingMode; + specialMode = secCtrl::SpecialMode::Modes::Manufacturing; specialModeLockoutSeconds = mtmAllowedTime - sysInfo.uptime; sd_journal_send("MESSAGE=%s", "Manufacturing mode - Entered", "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s", @@ -201,32 +206,41 @@ void SpecialModeMgr::addSpecialModeProperty() // Add path to server object iface = server.add_interface(specialModePath, specialModeIntf); iface->register_property( - strSpecialMode, specialMode, + strSpecialMode, secCtrl::convertForMessage(specialMode), // Ignore set - [this](const uint8_t& req, uint8_t& propertyValue) { + [this](const std::string& req, std::string& propertyValue) { + secCtrl::SpecialMode::Modes mode = + secCtrl::SpecialMode::convertModesFromString(req); #ifdef BMC_VALIDATION_UNSECURE_FEATURE - if ((req == validationUnsecure) && (specialMode != req)) + if ((mode == secCtrl::SpecialMode::Modes::ValidationUnsecure) && + (specialMode != mode)) { std::ofstream output(validationModeFile); output.close(); - specialMode = req; + specialMode = mode; propertyValue = req; return 1; } #endif - if (req == manufacturingExpired && specialMode != req) + if (mode == secCtrl::SpecialMode::Modes::None && + specialMode != mode) { - specialMode = req; +#ifdef BMC_VALIDATION_UNSECURE_FEATURE + std::remove(validationModeFile.c_str()); +#endif + specialMode = mode; propertyValue = req; return 1; } return 0; }, // Override get - [this](const uint8_t& mode) { return specialMode; }); + [this](const std::string& mode) { + return secCtrl::convertForMessage(specialMode); + }); iface->register_method("ResetTimer", [this]() { - if (specialMode == manufacturingMode) + if (specialMode == secCtrl::SpecialMode::Modes::Manufacturing) { updateTimer(mtmAllowedTime); } @@ -250,16 +264,20 @@ void SpecialModeMgr::updateTimer(int countInSeconds) "Error in special mode timer"); return; } - iface->set_property(strSpecialMode, - static_cast<uint8_t>(manufacturingExpired)); + iface->set_property( + strSpecialMode, + secCtrl::convertForMessage(secCtrl::SpecialMode::Modes::None)); sd_journal_send("MESSAGE=%s", "Manufacturing mode - Exited", "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.ManufacturingModeExited", NULL); }); } +} // namespace specialMode + int main() { + using namespace specialMode; boost::asio::io_service io; auto conn = std::make_shared<sdbusplus::asio::connection>(io); conn->request_name(specialModeMgrService); |