summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Geissler <andrewg@us.ibm.com>2017-03-28 15:23:27 -0500
committerPatrick Williams <patrick@stwcx.xyz>2017-05-03 21:36:16 +0000
commiteeaccf844f50e6e666a981b0cd390017511c6c23 (patch)
tree36fb771f268ac61d17969690f94d57a37300ef89
parent0971deae3350e7473ce97ddae2d7f5caa9e83209 (diff)
downloadphosphor-state-manager-eeaccf844f50e6e666a981b0cd390017511c6c23.tar.gz
phosphor-state-manager-eeaccf844f50e6e666a981b0cd390017511c6c23.zip
Send heartbeat command to host
Change-Id: I450b447382bf86d75e713287e21159eb99e4373a Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
-rw-r--r--host_check_main.cpp65
1 files changed, 59 insertions, 6 deletions
diff --git a/host_check_main.cpp b/host_check_main.cpp
index f4e895c..3eab1e3 100644
--- a/host_check_main.cpp
+++ b/host_check_main.cpp
@@ -1,13 +1,19 @@
#include <cstdlib>
#include <unistd.h>
#include <sdbusplus/bus.hpp>
-#include <sdbusplus/bus/match.hpp>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/Control/Host/server.hpp>
+using namespace std::literals;
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Control::server;
+// Required strings for sending the msg to check on host
+constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
+constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
+constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
+constexpr auto CONTROL_HOST_PATH = "/xyz/openbmc_project/control/host0";
+constexpr auto CONTROL_HOST_INTERFACE = "xyz.openbmc_project.Control.Host";
bool cmdDone = false;
bool hostRunning = false;
@@ -41,22 +47,69 @@ static int hostControlSignal(sd_bus_message* msg,
return 0;
}
+// Send hearbeat to host to determine if it's running
+void sendHeartbeat(sdbusplus::bus::bus& bus)
+{
+ auto mapper = bus.new_method_call(MAPPER_BUSNAME,
+ MAPPER_PATH,
+ MAPPER_INTERFACE,
+ "GetObject");
+
+ mapper.append(CONTROL_HOST_PATH,
+ std::vector<std::string>({CONTROL_HOST_INTERFACE}));
+ auto mapperResponseMsg = bus.call(mapper);
+
+ if (mapperResponseMsg.is_method_error())
+ {
+ log<level::ERR>("Error in mapper call for control host");
+ // TODO openbmc/openbmc#851 - Once available, throw returned error
+ throw std::runtime_error("Error in mapper call for control host");
+ }
+
+ std::map<std::string, std::vector<std::string>> mapperResponse;
+ mapperResponseMsg.read(mapperResponse);
+ if (mapperResponse.empty())
+ {
+ log<level::ERR>("Error reading mapper resp for control host");
+ // TODO openbmc/openbmc#851 - Once available, throw returned error
+ throw std::runtime_error("Error reading mapper resp for control host");
+ }
+
+ const auto& host = mapperResponse.begin()->first;
+
+ auto method = bus.new_method_call(host.c_str(),
+ CONTROL_HOST_PATH,
+ CONTROL_HOST_INTERFACE,
+ "Execute");
+ method.append(convertForMessage(Host::Command::Heartbeat).c_str());
+
+ auto reply = bus.call(method);
+ if (reply.is_method_error())
+ {
+ log<level::ERR>("Error in call to control host Execute");
+ throw std::runtime_error("Error in call to control host Execute");
+ }
+
+ return;
+}
+
int main(int argc, char *argv[])
{
log<level::INFO>("Check if host is running");
auto bus = sdbusplus::bus::new_default();
+ auto s = "type='signal',member='CommandComplete',path='"s +
+ CONTROL_HOST_PATH + "',interface='" +
+ CONTROL_HOST_INTERFACE + "'";
+
// Setup Signal Handler
sdbusplus::bus::match::match hostControlSignals(bus,
- "type='signal',"
- "member='CommandComplete',"
- "path='/xyz/openbmc_project/control/host0',"
- "interface='xyz.openbmc_project.Control.Host'",
+ s.c_str(),
hostControlSignal,
nullptr);
- // TODO Initiate heartbeat command
+ sendHeartbeat(bus);
// Wait for signal
while(!cmdDone)
OpenPOWER on IntegriCloud