diff options
-rw-r--r-- | bmc_state_manager.cpp | 38 | ||||
-rw-r--r-- | bmc_state_manager.hpp | 13 |
2 files changed, 39 insertions, 12 deletions
diff --git a/bmc_state_manager.cpp b/bmc_state_manager.cpp index c739ae0..12a04a4 100644 --- a/bmc_state_manager.cpp +++ b/bmc_state_manager.cpp @@ -1,4 +1,5 @@ #include <iostream> +#include <string> #include <log.hpp> #include "bmc_state_manager.hpp" @@ -14,6 +15,12 @@ namespace server = sdbusplus::xyz::openbmc_project::State::server; using namespace phosphor::logging; +/* Map a transition to it's systemd target */ +const std::map<server::BMC::Transition, const char*> SYSTEMD_TABLE = +{ + {server::BMC::Transition::Reboot, "reboot.target"} +}; + constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager"; @@ -29,22 +36,35 @@ void BMC::subscribeToSystemdSignals() return; } +void BMC::executeTransition(const Transition tranReq) +{ + //Check to make sure it can be found + auto iter = SYSTEMD_TABLE.find(tranReq); + if (iter == SYSTEMD_TABLE.end()) return; + + const auto& sysdUnit = iter->second; + + auto method = this->bus.new_method_call(SYSTEMD_SERVICE, + SYSTEMD_OBJ_PATH, + SYSTEMD_INTERFACE, + "StartUnit"); + + method.append(sysdUnit, "replace"); + + this->bus.call(method); + + return; +} + BMC::Transition BMC::requestedBMCTransition(Transition value) { log<level::INFO>( "Setting the RequestedBMCTransition field", entry("REQUESTED_BMC_TRANSITION=0x%s", convertForMessage(value).c_str())); - return server::BMC::requestedBMCTransition(value); -} -BMC::BMCState BMC::currentBMCState(BMCState value) -{ - log<level::INFO>( - "Setting the BMCState field", - entry("CURRENT_BMC_STATE=0x%s", - convertForMessage(value).c_str())); - return server::BMC::currentBMCState(value); + executeTransition(value); + return server::BMC::requestedBMCTransition(value); } diff --git a/bmc_state_manager.hpp b/bmc_state_manager.hpp index be88ba8..1ddef53 100644 --- a/bmc_state_manager.hpp +++ b/bmc_state_manager.hpp @@ -21,6 +21,10 @@ class BMC : public sdbusplus::server::object::object< public: /** @brief Constructs BMC State Manager * + * @note This constructor passes 'true' to the base class in order to + * defer dbus object registration until we can run + * subscribeToSystemdSignals() and set our properties + * * @param[in] bus - The Dbus bus object * @param[in] busName - The Dbus name to own * @param[in] objPath - The Dbus object path @@ -38,8 +42,6 @@ class BMC : public sdbusplus::server::object::object< /** @brief Set value of BMCTransition **/ Transition requestedBMCTransition(Transition value) override; - /** @breif Set value of CurrentBMCState **/ - BMCState currentBMCState(BMCState value) override; private: /** @@ -47,10 +49,15 @@ class BMC : public sdbusplus::server::object::object< **/ void subscribeToSystemdSignals(); + /** @brief Execute the transition request + * + * @param[in] tranReq - Transition requested + */ + void executeTransition(Transition tranReq); + /** @brief Persistent sdbusplus DBus bus connection. **/ sdbusplus::bus::bus& bus; - }; } // namespace manager |