summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bmc_state_manager.cpp38
-rw-r--r--bmc_state_manager.hpp13
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
OpenPOWER on IntegriCloud