summaryrefslogtreecommitdiffstats
path: root/host_state_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host_state_manager.cpp')
-rw-r--r--host_state_manager.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/host_state_manager.cpp b/host_state_manager.cpp
index 497908a..7925b87 100644
--- a/host_state_manager.cpp
+++ b/host_state_manager.cpp
@@ -2,6 +2,7 @@
#include <map>
#include <string>
#include <systemd/sd-bus.h>
+#include <sdbusplus/server.hpp>
#include <log.hpp>
#include "host_state_manager.hpp"
@@ -19,6 +20,7 @@ using namespace phosphor::logging;
constexpr auto HOST_STATE_POWEROFF_TGT = "obmc-chassis-stop@0.target";
constexpr auto HOST_STATE_POWERON_TGT = "obmc-chassis-start@0.target";
+constexpr auto HOST_STATE_QUIESCE_TGT = "obmc-quiesce-host@0.target";
/* Map a transition to it's systemd target */
const std::map<server::Host::Transition,std::string> SYSTEMD_TARGET_TABLE =
@@ -35,6 +37,10 @@ constexpr auto SYSTEM_SERVICE = "org.openbmc.managers.System";
constexpr auto SYSTEM_OBJ_PATH = "/org/openbmc/managers/System";
constexpr auto SYSTEM_INTERFACE = SYSTEM_SERVICE;
+constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
+constexpr auto MAPPER_PATH = "/xyz/openbmc_project/ObjectMapper";
+constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
+
/* Map a system state to the HostState */
const std::map<std::string, server::Host::HostState> SYS_HOST_STATE_TABLE = {
{"HOST_BOOTING", server::Host::HostState::Running},
@@ -108,6 +114,70 @@ void Host::executeTransition(Transition tranReq)
return;
}
+bool Host::isAutoReboot()
+{
+ sdbusplus::message::variant<std::string> autoRebootParam;
+ std::string strParam;
+
+ std::string HOST_PATH("/org/openbmc/settings/host0");
+ std::string HOST_INTERFACE("org.openbmc.settings.Host");
+
+ auto mapper = this->bus.new_method_call(MAPPER_BUSNAME,
+ MAPPER_PATH,
+ MAPPER_INTERFACE,
+ "GetObject");
+
+ mapper.append(HOST_PATH, std::vector<std::string>({HOST_INTERFACE}));
+ auto mapperResponseMsg = this->bus.call(mapper);
+
+ if (mapperResponseMsg.is_method_error())
+ {
+ log<level::ERR>("Error in mapper call");
+ return false;
+ }
+
+ std::map<std::string, std::vector<std::string>> mapperResponse;
+ mapperResponseMsg.read(mapperResponse);
+ if (mapperResponse.empty())
+ {
+ log<level::ERR>("Error reading mapper response");
+ return false;
+ }
+
+ const auto& host = mapperResponse.begin()->first;
+
+ auto method = this->bus.new_method_call(host.c_str(),
+ HOST_PATH.c_str(),
+ "org.freedesktop.DBus.Properties",
+ "Get");
+
+ method.append(HOST_INTERFACE.c_str(), "auto_reboot");
+ auto reply = this->bus.call(method);
+
+ if (reply.is_method_error())
+ {
+ log<level::ERR>("Error in auto_reboot Get");
+ return false;
+ }
+
+ reply.read(autoRebootParam);
+ strParam =
+ sdbusplus::message::variant_ns::get<std::string>(autoRebootParam);
+
+ if (strParam.empty())
+ {
+ log<level::ERR>("Error reading auto_reboot response");
+ return false;
+ }
+
+ if (strParam == "yes")
+ {
+ return true;
+ }
+
+ return false;
+}
+
int Host::sysStateChangeSignal(sd_bus_message *msg, void *userData,
sd_bus_error *retError)
{
@@ -146,6 +216,20 @@ int Host::sysStateChange(sd_bus_message* msg,
log<level::INFO>("Recieved signal that host is running");
this->currentHostState(server::Host::HostState::Running);
}
+ else if((newStateUnit == HOST_STATE_QUIESCE_TGT) &&
+ (newStateResult == "done"))
+ {
+ if (Host::isAutoReboot())
+ {
+ log<level::INFO>("Auto reboot enabled. Beginning reboot...");
+ Host::requestedHostTransition(server::Host::Transition::Reboot);
+ }
+ else
+ {
+ log<level::INFO>("Auto reboot disabled. Maintaining quiesce.");
+ }
+
+ }
return 0;
}
OpenPOWER on IntegriCloud