xref: /openbmc/openpower-proc-control/util.cpp (revision ed7fb7aee34661d65dc0455316e68d90a36d75fb)
1 #include "util.hpp"
2 
3 #include <fmt/format.h>
4 
5 #include <phosphor-logging/elog.hpp>
6 
7 #include <sstream>
8 #include <variant>
9 #include <vector>
10 
11 namespace openpower
12 {
13 namespace util
14 {
15 using namespace phosphor::logging;
16 
17 std::string getService(sdbusplus::bus_t& bus, const std::string& objectPath,
18                        const std::string& interface)
19 {
20     constexpr auto mapperBusBame = "xyz.openbmc_project.ObjectMapper";
21     constexpr auto mapperObjectPath = "/xyz/openbmc_project/object_mapper";
22     constexpr auto mapperInterface = "xyz.openbmc_project.ObjectMapper";
23     std::vector<std::pair<std::string, std::vector<std::string>>> response;
24     auto method = bus.new_method_call(mapperBusBame, mapperObjectPath,
25                                       mapperInterface, "GetObject");
26     method.append(objectPath, std::vector<std::string>({interface}));
27     try
28     {
29         auto reply = bus.call(method);
30         reply.read(response);
31     }
32     catch (const sdbusplus::exception_t& e)
33     {
34         log<level::ERR>(fmt::format("D-Bus call exception OBJPATH={}"
35                                     "INTERFACE={}  EXCEPTION={}",
36                                     objectPath, interface, e.what())
37                             .c_str());
38 
39         throw std::runtime_error("Service name is not found");
40     }
41 
42     if (response.empty())
43     {
44         throw std::runtime_error("Service name response is empty");
45     }
46     return response.begin()->first;
47 }
48 
49 bool isHostPoweringOff()
50 {
51     try
52     {
53         constexpr auto object = "/xyz/openbmc_project/state/host0";
54         constexpr auto service = "xyz.openbmc_project.State.Host";
55         constexpr auto interface = "xyz.openbmc_project.State.Host";
56         constexpr auto property = "CurrentHostState";
57         auto bus = sdbusplus::bus::new_default();
58 
59         std::variant<std::string> retval;
60         auto properties = bus.new_method_call(
61             service, object, "org.freedesktop.DBus.Properties", "Get");
62         properties.append(interface);
63         properties.append(property);
64         auto result = bus.call(properties);
65         result.read(retval);
66 
67         const std::string* state = std::get_if<std::string>(&retval);
68         if (state == nullptr)
69         {
70             std::string err = fmt::format(
71                 "CurrentHostState property is not set ({})", object);
72             log<level::ERR>(err.c_str());
73             return false;
74         }
75         if ((*state == "xyz.openbmc_project.State.Host.HostState."
76                        "TransitioningToOff") ||
77             (*state == "xyz.openbmc_project.State.Host.HostState."
78                        "Off") ||
79             (*state == "xyz.openbmc_project.State.Host.HostState."
80                        "Quiesced"))
81         {
82             return true;
83         }
84     }
85     catch (const std::exception& ex)
86     {
87         log<level::ERR>(
88             fmt::format("Failed to read CurrentHostState property ({})",
89                         ex.what())
90                 .c_str());
91     }
92     return false;
93 }
94 
95 std::string getChassisPowerState()
96 {
97     std::string powerState{};
98     try
99     {
100         auto bus = sdbusplus::bus::new_default();
101         auto properties =
102             bus.new_method_call("xyz.openbmc_project.State.Chassis",
103                                 "/xyz/openbmc_project/state/chassis0",
104                                 "org.freedesktop.DBus.Properties", "Get");
105         properties.append("xyz.openbmc_project.State.Chassis");
106         properties.append("CurrentPowerState");
107         auto result = bus.call(properties);
108         std::variant<std::string> val;
109         result.read(val);
110         if (auto pVal = std::get_if<std::string>(&val))
111         {
112             powerState = *pVal;
113         }
114     }
115 
116     catch (const std::exception& ex)
117     {
118         log<level::ERR>(
119             fmt::format("Failed to read CurrentPowerState property ({})",
120                         ex.what())
121                 .c_str());
122     }
123 
124     log<level::DEBUG>(fmt::format("Power state is: {} ", powerState).c_str());
125 
126     return powerState;
127 }
128 
129 } // namespace util
130 } // namespace openpower
131