1e426b589SAndrew Geissler #include "settings.hpp"
2e426b589SAndrew Geissler
3e426b589SAndrew Geissler #include "xyz/openbmc_project/Common/error.hpp"
4e426b589SAndrew Geissler
5a646edd4SDeepak Kodihalli #include <phosphor-logging/elog-errors.hpp>
68ffdb269SAndrew Geissler #include <phosphor-logging/lg2.hpp>
732c532eaSAnthony Wilson #include <sdbusplus/exception.hpp>
89a286db2SPatrick Williams #include <xyz/openbmc_project/ObjectMapper/client.hpp>
9a646edd4SDeepak Kodihalli
10a646edd4SDeepak Kodihalli namespace settings
11a646edd4SDeepak Kodihalli {
12a646edd4SDeepak Kodihalli
138ffdb269SAndrew Geissler PHOSPHOR_LOG2_USING;
148ffdb269SAndrew Geissler
15a646edd4SDeepak Kodihalli using namespace phosphor::logging;
16a646edd4SDeepak Kodihalli using namespace sdbusplus::xyz::openbmc_project::Common::Error;
17a646edd4SDeepak Kodihalli
189a286db2SPatrick Williams using ObjectMapper = sdbusplus::client::xyz::openbmc_project::ObjectMapper<>;
19a646edd4SDeepak Kodihalli
Objects(sdbusplus::bus_t & bus,const Path & root)20f053e6feSPatrick Williams Objects::Objects(sdbusplus::bus_t& bus, const Path& root) : bus(bus)
21a646edd4SDeepak Kodihalli {
2258a18013SAndrew Geissler std::vector<std::string> settingsIntfs = {autoRebootIntf, powerRestoreIntf};
23a646edd4SDeepak Kodihalli auto depth = 0;
24a646edd4SDeepak Kodihalli
259a286db2SPatrick Williams auto mapperCall = bus.new_method_call(
269a286db2SPatrick Williams ObjectMapper::default_service, ObjectMapper::instance_path,
279a286db2SPatrick Williams ObjectMapper::interface, "GetSubTree");
28a646edd4SDeepak Kodihalli mapperCall.append(root);
29a646edd4SDeepak Kodihalli mapperCall.append(depth);
30a646edd4SDeepak Kodihalli mapperCall.append(settingsIntfs);
31a646edd4SDeepak Kodihalli
32a646edd4SDeepak Kodihalli using Interfaces = std::vector<Interface>;
33a646edd4SDeepak Kodihalli using MapperResponse = std::map<Path, std::map<Service, Interfaces>>;
34a646edd4SDeepak Kodihalli MapperResponse result;
3532c532eaSAnthony Wilson
3632c532eaSAnthony Wilson try
3732c532eaSAnthony Wilson {
3832c532eaSAnthony Wilson auto response = bus.call(mapperCall);
3932c532eaSAnthony Wilson
40a646edd4SDeepak Kodihalli response.read(result);
41a646edd4SDeepak Kodihalli if (result.empty())
42a646edd4SDeepak Kodihalli {
438ffdb269SAndrew Geissler error("Invalid response from mapper");
44a646edd4SDeepak Kodihalli elog<InternalFailure>();
45a646edd4SDeepak Kodihalli }
4632c532eaSAnthony Wilson }
47f053e6feSPatrick Williams catch (const sdbusplus::exception_t& e)
4832c532eaSAnthony Wilson {
498ffdb269SAndrew Geissler error("Error in mapper GetSubTree: {ERROR}", "ERROR", e);
5032c532eaSAnthony Wilson elog<InternalFailure>();
5132c532eaSAnthony Wilson }
52a646edd4SDeepak Kodihalli
53a646edd4SDeepak Kodihalli for (const auto& iter : result)
54a646edd4SDeepak Kodihalli {
55a646edd4SDeepak Kodihalli const Path& path = iter.first;
56a646edd4SDeepak Kodihalli
5714e14cddSMatt Spinler for (const auto& serviceIter : iter.second)
5814e14cddSMatt Spinler {
5914e14cddSMatt Spinler for (const auto& interface : serviceIter.second)
6014e14cddSMatt Spinler {
61a646edd4SDeepak Kodihalli if (autoRebootIntf == interface)
62a646edd4SDeepak Kodihalli {
63e87db709SAndrew Geissler /* There are two implementations of the AutoReboot
64e87db709SAndrew Geissler * Interface. A persistent user setting and a one-time
65e87db709SAndrew Geissler * setting which is only valid for one boot of the system.
66e87db709SAndrew Geissler * The one-time setting will have "one_time" in its
67e87db709SAndrew Geissler * object path.
68e87db709SAndrew Geissler */
69e87db709SAndrew Geissler if (path.find("one_time") != std::string::npos)
70e87db709SAndrew Geissler {
71e87db709SAndrew Geissler autoRebootOneTime = path;
72e87db709SAndrew Geissler }
73e87db709SAndrew Geissler else
74e87db709SAndrew Geissler {
75a646edd4SDeepak Kodihalli autoReboot = path;
76a646edd4SDeepak Kodihalli }
77e87db709SAndrew Geissler }
78a646edd4SDeepak Kodihalli else if (powerRestoreIntf == interface)
79a646edd4SDeepak Kodihalli {
8035ca2e34SAndrew Geissler /* There are two implementations of the PowerRestorePolicy
8135ca2e34SAndrew Geissler * Interface. A persistent user setting and a one-time
8235ca2e34SAndrew Geissler * setting which is only valid for one boot of the system.
8335ca2e34SAndrew Geissler * The one-time setting will have "one_time" in its
8435ca2e34SAndrew Geissler * object path.
8535ca2e34SAndrew Geissler */
8635ca2e34SAndrew Geissler if (path.find("one_time") != std::string::npos)
8735ca2e34SAndrew Geissler {
8835ca2e34SAndrew Geissler powerRestorePolicyOneTime = path;
8935ca2e34SAndrew Geissler }
9035ca2e34SAndrew Geissler else
9135ca2e34SAndrew Geissler {
92a646edd4SDeepak Kodihalli powerRestorePolicy = path;
93a646edd4SDeepak Kodihalli }
94a646edd4SDeepak Kodihalli }
95a646edd4SDeepak Kodihalli }
9614e14cddSMatt Spinler }
9714e14cddSMatt Spinler }
9835ca2e34SAndrew Geissler }
99a646edd4SDeepak Kodihalli
service(const Path & path,const Interface & interface) const100a646edd4SDeepak Kodihalli Service Objects::service(const Path& path, const Interface& interface) const
101a646edd4SDeepak Kodihalli {
102a646edd4SDeepak Kodihalli using Interfaces = std::vector<Interface>;
103*1b2c3c03SPatrick Williams auto mapperCall = bus.new_method_call(
104*1b2c3c03SPatrick Williams ObjectMapper::default_service, ObjectMapper::instance_path,
1059a286db2SPatrick Williams ObjectMapper::interface, "GetObject");
106a646edd4SDeepak Kodihalli mapperCall.append(path);
107a646edd4SDeepak Kodihalli mapperCall.append(Interfaces({interface}));
108a646edd4SDeepak Kodihalli
10932c532eaSAnthony Wilson std::map<Service, Interfaces> result;
11032c532eaSAnthony Wilson
11132c532eaSAnthony Wilson try
112a646edd4SDeepak Kodihalli {
11332c532eaSAnthony Wilson auto response = bus.call(mapperCall);
11432c532eaSAnthony Wilson response.read(result);
11532c532eaSAnthony Wilson }
116f053e6feSPatrick Williams catch (const sdbusplus::exception_t& e)
11732c532eaSAnthony Wilson {
1188ffdb269SAndrew Geissler error("Error in mapper GetObject: {ERROR}", "ERROR", e);
119a646edd4SDeepak Kodihalli elog<InternalFailure>();
120a646edd4SDeepak Kodihalli }
121a646edd4SDeepak Kodihalli
122a646edd4SDeepak Kodihalli if (result.empty())
123a646edd4SDeepak Kodihalli {
1248ffdb269SAndrew Geissler error("Invalid response from mapper");
125a646edd4SDeepak Kodihalli elog<InternalFailure>();
126a646edd4SDeepak Kodihalli }
127a646edd4SDeepak Kodihalli
128a646edd4SDeepak Kodihalli return result.begin()->first;
129a646edd4SDeepak Kodihalli }
130a646edd4SDeepak Kodihalli
HostObjects(sdbusplus::bus_t & bus,size_t id)131f053e6feSPatrick Williams HostObjects::HostObjects(sdbusplus::bus_t& bus, size_t id) :
132c328a4cfSPotin Lai Objects(bus, Path("/xyz/openbmc_project/control/host") + std::to_string(id))
133c328a4cfSPotin Lai {}
134c328a4cfSPotin Lai
135a646edd4SDeepak Kodihalli } // namespace settings
136