diff options
Diffstat (limited to 'discover_system_state.cpp')
-rw-r--r-- | discover_system_state.cpp | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/discover_system_state.cpp b/discover_system_state.cpp index c055f9f..303b4a4 100644 --- a/discover_system_state.cpp +++ b/discover_system_state.cpp @@ -6,7 +6,6 @@ #include <sdbusplus/server.hpp> #include <phosphor-logging/log.hpp> #include <phosphor-logging/elog-errors.hpp> -#include "chassis_state_manager.hpp" #include "host_state_manager.hpp" #include "settings.hpp" #include "xyz/openbmc_project/Common/error.hpp" @@ -31,8 +30,6 @@ constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties"; constexpr auto HOST_PATH = "/xyz/openbmc_project/state/host0"; -constexpr auto CHASSIS_PATH = "/xyz/openbmc_project/state/chassis0"; - std::string getService(sdbusplus::bus::bus& bus, std::string path, std::string interface) { @@ -131,43 +128,50 @@ int main() using namespace phosphor::state::manager; namespace server = sdbusplus::xyz::openbmc_project::State::server; - std::string currentPowerState = getProperty(bus, CHASSIS_PATH, - CHASSIS_BUSNAME, - "CurrentPowerState"); + // This application is only run if chassis power is off - if(currentPowerState == convertForMessage(server::Chassis::PowerState::Off)) + auto method = + bus.new_method_call( + settings.service(settings.powerRestorePolicy, + powerRestoreIntf).c_str(), + settings.powerRestorePolicy.c_str(), + "org.freedesktop.DBus.Properties", + "Get"); + method.append(powerRestoreIntf, "PowerRestorePolicy"); + auto reply = bus.call(method); + if (reply.is_method_error()) { - auto method = - bus.new_method_call( - settings.service(settings.powerRestorePolicy, - powerRestoreIntf).c_str(), - settings.powerRestorePolicy.c_str(), - "org.freedesktop.DBus.Properties", - "Get"); - method.append(powerRestoreIntf, "PowerRestorePolicy"); - auto reply = bus.call(method); - if (reply.is_method_error()) - { - log<level::ERR>("Error in PowerRestorePolicy Get"); - elog<InternalFailure>(); - } - - sdbusplus::message::variant<std::string> result; - reply.read(result); - auto powerPolicy = result.get<std::string>(); - - log<level::INFO>("Host power is off, checking power policy", - entry("POWER_POLICY=%s", powerPolicy.c_str())); - - if (RestorePolicy::Policy::AlwaysOn == - RestorePolicy::convertPolicyFromString(powerPolicy)) - { - log<level::INFO>("power_policy=ALWAYS_POWER_ON, powering host on"); - setProperty(bus, HOST_PATH, HOST_BUSNAME, - "RequestedHostTransition", - convertForMessage(server::Host::Transition::On)); - } + log<level::ERR>("Error in PowerRestorePolicy Get"); + elog<InternalFailure>(); + } + + sdbusplus::message::variant<std::string> result; + reply.read(result); + auto powerPolicy = result.get<std::string>(); + log<level::INFO>("Host power is off, checking power policy", + entry("POWER_POLICY=%s", powerPolicy.c_str())); + + if (RestorePolicy::Policy::AlwaysOn == + RestorePolicy::convertPolicyFromString(powerPolicy)) + { + log<level::INFO>("power_policy=ALWAYS_POWER_ON, powering host on"); + setProperty(bus, HOST_PATH, HOST_BUSNAME, + "RequestedHostTransition", + convertForMessage(server::Host::Transition::On)); + } + else if(RestorePolicy::Policy::Restore == + RestorePolicy::convertPolicyFromString(powerPolicy)) + { + log<level::INFO>("power_policy=RESTORE, restoring last state"); + + // Read last requested state and re-request it to execute it + auto hostReqState = getProperty(bus, HOST_PATH, + HOST_BUSNAME, + "RequestedHostTransition"); + setProperty(bus, HOST_PATH, HOST_BUSNAME, + "RequestedHostTransition", + hostReqState); } return 0; |