xref: /openbmc/bmcweb/features/redfish/lib/network_protocol.hpp (revision d24bfc7a855e9d209ada9452077f190971dae9cf)
170141561SBorawski.Lukasz /*
270141561SBorawski.Lukasz // Copyright (c) 2018 Intel Corporation
370141561SBorawski.Lukasz //
470141561SBorawski.Lukasz // Licensed under the Apache License, Version 2.0 (the "License");
570141561SBorawski.Lukasz // you may not use this file except in compliance with the License.
670141561SBorawski.Lukasz // You may obtain a copy of the License at
770141561SBorawski.Lukasz //
870141561SBorawski.Lukasz //      http://www.apache.org/licenses/LICENSE-2.0
970141561SBorawski.Lukasz //
1070141561SBorawski.Lukasz // Unless required by applicable law or agreed to in writing, software
1170141561SBorawski.Lukasz // distributed under the License is distributed on an "AS IS" BASIS,
1270141561SBorawski.Lukasz // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370141561SBorawski.Lukasz // See the License for the specific language governing permissions and
1470141561SBorawski.Lukasz // limitations under the License.
1570141561SBorawski.Lukasz */
1670141561SBorawski.Lukasz #pragma once
1770141561SBorawski.Lukasz 
183a8a0088SKowalski, Kamil #include "error_messages.hpp"
1970141561SBorawski.Lukasz #include "node.hpp"
2070141561SBorawski.Lukasz 
2120e6ea5dSraviteja-b #include <optional>
2220e6ea5dSraviteja-b #include <utils/json_utils.hpp>
23abf2add6SEd Tanous #include <variant>
241abe55efSEd Tanous namespace redfish
251abe55efSEd Tanous {
2670141561SBorawski.Lukasz 
271abe55efSEd Tanous enum NetworkProtocolUnitStructFields
281abe55efSEd Tanous {
293a8a0088SKowalski, Kamil     NET_PROTO_UNIT_NAME,
303a8a0088SKowalski, Kamil     NET_PROTO_UNIT_DESC,
313a8a0088SKowalski, Kamil     NET_PROTO_UNIT_LOAD_STATE,
323a8a0088SKowalski, Kamil     NET_PROTO_UNIT_ACTIVE_STATE,
333a8a0088SKowalski, Kamil     NET_PROTO_UNIT_SUB_STATE,
343a8a0088SKowalski, Kamil     NET_PROTO_UNIT_DEVICE,
353a8a0088SKowalski, Kamil     NET_PROTO_UNIT_OBJ_PATH,
363a8a0088SKowalski, Kamil     NET_PROTO_UNIT_ALWAYS_0,
373a8a0088SKowalski, Kamil     NET_PROTO_UNIT_ALWAYS_EMPTY,
383a8a0088SKowalski, Kamil     NET_PROTO_UNIT_ALWAYS_ROOT_PATH
393a8a0088SKowalski, Kamil };
403a8a0088SKowalski, Kamil 
411abe55efSEd Tanous enum NetworkProtocolListenResponseElements
421abe55efSEd Tanous {
433a8a0088SKowalski, Kamil     NET_PROTO_LISTEN_TYPE,
443a8a0088SKowalski, Kamil     NET_PROTO_LISTEN_STREAM
453a8a0088SKowalski, Kamil };
463a8a0088SKowalski, Kamil 
473a8a0088SKowalski, Kamil /**
483a8a0088SKowalski, Kamil  * @brief D-Bus Unit structure returned in array from ListUnits Method
493a8a0088SKowalski, Kamil  */
503a8a0088SKowalski, Kamil using UnitStruct =
513a8a0088SKowalski, Kamil     std::tuple<std::string, std::string, std::string, std::string, std::string,
523a8a0088SKowalski, Kamil                std::string, sdbusplus::message::object_path, uint32_t,
533a8a0088SKowalski, Kamil                std::string, sdbusplus::message::object_path>;
543a8a0088SKowalski, Kamil 
551abe55efSEd Tanous struct ServiceConfiguration
561abe55efSEd Tanous {
57865fbb75SEd Tanous     const char* serviceName;
58865fbb75SEd Tanous     const char* socketPath;
593a8a0088SKowalski, Kamil };
603a8a0088SKowalski, Kamil 
61865fbb75SEd Tanous const static boost::container::flat_map<const char*, ServiceConfiguration>
62865fbb75SEd Tanous     protocolToDBus{
63865fbb75SEd Tanous         {"SSH",
645ded8c79SJennifer Lee          {"dropbear.socket",
65865fbb75SEd Tanous           "/org/freedesktop/systemd1/unit/dropbear_2esocket"}},
66865fbb75SEd Tanous         {"HTTPS",
675ded8c79SJennifer Lee          {"bmcweb.service",
685ded8c79SJennifer Lee           "/org/freedesktop/systemd1/unit/"
695ded8c79SJennifer Lee           "bmcweb_2esocket"}}, //"/org/freedesktop/systemd1/unit/phosphor_2dgevent_2esocket"}},
70865fbb75SEd Tanous         {"IPMI",
715ded8c79SJennifer Lee          {"phosphor-ipmi-net.socket", "/org/freedesktop/systemd1/unit/"
725ded8c79SJennifer Lee                                       "phosphor_2dipmi_2dnet_2esocket"}}};
733a8a0088SKowalski, Kamil 
74*d24bfc7aSJennifer Lee inline void
75*d24bfc7aSJennifer Lee     extractNTPServersAndDomainNamesData(const GetManagedObjects& dbus_data,
76*d24bfc7aSJennifer Lee                                         std::vector<std::string>& ntpData,
77*d24bfc7aSJennifer Lee                                         std::vector<std::string>& dnData)
7820e6ea5dSraviteja-b {
7920e6ea5dSraviteja-b     for (const auto& obj : dbus_data)
8020e6ea5dSraviteja-b     {
8120e6ea5dSraviteja-b         for (const auto& ifacePair : obj.second)
8220e6ea5dSraviteja-b         {
8320e6ea5dSraviteja-b             if (obj.first == "/xyz/openbmc_project/network/eth0")
8420e6ea5dSraviteja-b             {
8520e6ea5dSraviteja-b                 if (ifacePair.first ==
8620e6ea5dSraviteja-b                     "xyz.openbmc_project.Network.EthernetInterface")
8720e6ea5dSraviteja-b                 {
8820e6ea5dSraviteja-b                     for (const auto& propertyPair : ifacePair.second)
8920e6ea5dSraviteja-b                     {
9020e6ea5dSraviteja-b                         if (propertyPair.first == "NTPServers")
9120e6ea5dSraviteja-b                         {
9220e6ea5dSraviteja-b                             const std::vector<std::string>* ntpServers =
9320e6ea5dSraviteja-b                                 sdbusplus::message::variant_ns::get_if<
9420e6ea5dSraviteja-b                                     std::vector<std::string>>(
9520e6ea5dSraviteja-b                                     &propertyPair.second);
9620e6ea5dSraviteja-b                             if (ntpServers != nullptr)
9720e6ea5dSraviteja-b                             {
9820e6ea5dSraviteja-b                                 ntpData = std::move(*ntpServers);
9920e6ea5dSraviteja-b                             }
10020e6ea5dSraviteja-b                         }
101*d24bfc7aSJennifer Lee                         else if (propertyPair.first == "DomainName")
102*d24bfc7aSJennifer Lee                         {
103*d24bfc7aSJennifer Lee                             const std::vector<std::string>* domainNames =
104*d24bfc7aSJennifer Lee                                 sdbusplus::message::variant_ns::get_if<
105*d24bfc7aSJennifer Lee                                     std::vector<std::string>>(
106*d24bfc7aSJennifer Lee                                     &propertyPair.second);
107*d24bfc7aSJennifer Lee                             if (domainNames != nullptr)
108*d24bfc7aSJennifer Lee                             {
109*d24bfc7aSJennifer Lee                                 dnData = std::move(*domainNames);
110*d24bfc7aSJennifer Lee                             }
111*d24bfc7aSJennifer Lee                         }
11220e6ea5dSraviteja-b                     }
11320e6ea5dSraviteja-b                 }
11420e6ea5dSraviteja-b             }
11520e6ea5dSraviteja-b         }
11620e6ea5dSraviteja-b     }
11720e6ea5dSraviteja-b }
11820e6ea5dSraviteja-b 
11920e6ea5dSraviteja-b template <typename CallbackFunc>
12020e6ea5dSraviteja-b void getEthernetIfaceData(CallbackFunc&& callback)
12120e6ea5dSraviteja-b {
12220e6ea5dSraviteja-b     crow::connections::systemBus->async_method_call(
12320e6ea5dSraviteja-b         [callback{std::move(callback)}](
12420e6ea5dSraviteja-b             const boost::system::error_code error_code,
12520e6ea5dSraviteja-b             const GetManagedObjects& dbus_data) {
12620e6ea5dSraviteja-b             std::vector<std::string> ntpServers;
127*d24bfc7aSJennifer Lee             std::vector<std::string> domainNames;
12820e6ea5dSraviteja-b 
12920e6ea5dSraviteja-b             if (error_code)
13020e6ea5dSraviteja-b             {
131*d24bfc7aSJennifer Lee                 callback(false, ntpServers, domainNames);
13220e6ea5dSraviteja-b                 return;
13320e6ea5dSraviteja-b             }
13420e6ea5dSraviteja-b 
135*d24bfc7aSJennifer Lee             extractNTPServersAndDomainNamesData(dbus_data, ntpServers,
136*d24bfc7aSJennifer Lee                                                 domainNames);
13720e6ea5dSraviteja-b 
138*d24bfc7aSJennifer Lee             callback(true, ntpServers, domainNames);
13920e6ea5dSraviteja-b         },
14020e6ea5dSraviteja-b         "xyz.openbmc_project.Network", "/xyz/openbmc_project/network",
14120e6ea5dSraviteja-b         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
14220e6ea5dSraviteja-b };
14320e6ea5dSraviteja-b 
1441abe55efSEd Tanous class NetworkProtocol : public Node
1451abe55efSEd Tanous {
14670141561SBorawski.Lukasz   public:
1471abe55efSEd Tanous     NetworkProtocol(CrowApp& app) :
14897b7ccf3SEd Tanous         Node(app, "/redfish/v1/Managers/bmc/NetworkProtocol")
1491abe55efSEd Tanous     {
1504b1b8683SBorawski.Lukasz         entityPrivileges = {
1514b1b8683SBorawski.Lukasz             {boost::beast::http::verb::get, {{"Login"}}},
152e0d918bcSEd Tanous             {boost::beast::http::verb::head, {{"Login"}}},
153e0d918bcSEd Tanous             {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
154e0d918bcSEd Tanous             {boost::beast::http::verb::put, {{"ConfigureManager"}}},
155e0d918bcSEd Tanous             {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
156e0d918bcSEd Tanous             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
15770141561SBorawski.Lukasz     }
15870141561SBorawski.Lukasz 
15970141561SBorawski.Lukasz   private:
16055c7b7a2SEd Tanous     void doGet(crow::Response& res, const crow::Request& req,
1611abe55efSEd Tanous                const std::vector<std::string>& params) override
1621abe55efSEd Tanous     {
1633a8a0088SKowalski, Kamil         std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res);
1643a8a0088SKowalski, Kamil 
1653a8a0088SKowalski, Kamil         getData(asyncResp);
16670141561SBorawski.Lukasz     }
16770141561SBorawski.Lukasz 
1681abe55efSEd Tanous     std::string getHostName() const
1691abe55efSEd Tanous     {
17070141561SBorawski.Lukasz         std::string hostName;
17170141561SBorawski.Lukasz 
17270141561SBorawski.Lukasz         std::array<char, HOST_NAME_MAX> hostNameCStr;
1731abe55efSEd Tanous         if (gethostname(hostNameCStr.data(), hostNameCStr.size()) == 0)
1741abe55efSEd Tanous         {
17570141561SBorawski.Lukasz             hostName = hostNameCStr.data();
17670141561SBorawski.Lukasz         }
17770141561SBorawski.Lukasz         return hostName;
17870141561SBorawski.Lukasz     }
17970141561SBorawski.Lukasz 
18020e6ea5dSraviteja-b     void getNTPProtocolEnabled(const std::shared_ptr<AsyncResp>& asyncResp)
18120e6ea5dSraviteja-b     {
18220e6ea5dSraviteja-b         crow::connections::systemBus->async_method_call(
18320e6ea5dSraviteja-b             [asyncResp](const boost::system::error_code error_code,
18420e6ea5dSraviteja-b                         const std::variant<std::string>& timeSyncMethod) {
18520e6ea5dSraviteja-b                 const std::string* s =
18620e6ea5dSraviteja-b                     std::get_if<std::string>(&timeSyncMethod);
18720e6ea5dSraviteja-b 
18820e6ea5dSraviteja-b                 if (*s == "xyz.openbmc_project.Time.Synchronization.Method.NTP")
18920e6ea5dSraviteja-b                 {
19020e6ea5dSraviteja-b                     asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = true;
19120e6ea5dSraviteja-b                 }
19220e6ea5dSraviteja-b                 else if (*s == "xyz.openbmc_project.Time.Synchronization."
19320e6ea5dSraviteja-b                                "Method.Manual")
19420e6ea5dSraviteja-b                 {
19520e6ea5dSraviteja-b                     asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = false;
19620e6ea5dSraviteja-b                 }
19720e6ea5dSraviteja-b             },
19820e6ea5dSraviteja-b             "xyz.openbmc_project.Settings",
19920e6ea5dSraviteja-b             "/xyz/openbmc_project/time/sync_method",
20020e6ea5dSraviteja-b             "org.freedesktop.DBus.Properties", "Get",
20120e6ea5dSraviteja-b             "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod");
20220e6ea5dSraviteja-b     }
20320e6ea5dSraviteja-b 
2041abe55efSEd Tanous     void getData(const std::shared_ptr<AsyncResp>& asyncResp)
2051abe55efSEd Tanous     {
2060f74e643SEd Tanous         asyncResp->res.jsonValue["@odata.type"] =
2074ed69245SGunnar Mills             "#ManagerNetworkProtocol.v1_4_0.ManagerNetworkProtocol";
2080f74e643SEd Tanous         asyncResp->res.jsonValue["@odata.id"] =
2090f74e643SEd Tanous             "/redfish/v1/Managers/bmc/NetworkProtocol";
2100f74e643SEd Tanous         asyncResp->res.jsonValue["@odata.context"] =
2110f74e643SEd Tanous             "/redfish/v1/"
2120f74e643SEd Tanous             "$metadata#ManagerNetworkProtocol.ManagerNetworkProtocol";
2130f74e643SEd Tanous         asyncResp->res.jsonValue["Id"] = "NetworkProtocol";
2140f74e643SEd Tanous         asyncResp->res.jsonValue["Name"] = "Manager Network Protocol";
2150f74e643SEd Tanous         asyncResp->res.jsonValue["Description"] = "Manager Network Service";
2160f74e643SEd Tanous         asyncResp->res.jsonValue["Status"]["Health"] = "OK";
2170f74e643SEd Tanous         asyncResp->res.jsonValue["Status"]["HealthRollup"] = "OK";
2180f74e643SEd Tanous         asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
2190f74e643SEd Tanous 
2200f74e643SEd Tanous         for (auto& protocol : protocolToDBus)
2210f74e643SEd Tanous         {
2220f74e643SEd Tanous             asyncResp->res.jsonValue[protocol.first]["ProtocolEnabled"] = false;
2230f74e643SEd Tanous         }
2240f74e643SEd Tanous 
225*d24bfc7aSJennifer Lee         std::string hostName = getHostName();
226*d24bfc7aSJennifer Lee 
227*d24bfc7aSJennifer Lee         asyncResp->res.jsonValue["HostName"] = hostName;
2283a8a0088SKowalski, Kamil 
22920e6ea5dSraviteja-b         getNTPProtocolEnabled(asyncResp);
23020e6ea5dSraviteja-b 
23120e6ea5dSraviteja-b         // TODO Get eth0 interface data, and call the below callback for JSON
23220e6ea5dSraviteja-b         // preparation
233*d24bfc7aSJennifer Lee         getEthernetIfaceData([this, hostName, asyncResp](
234*d24bfc7aSJennifer Lee                                  const bool& success,
235*d24bfc7aSJennifer Lee                                  const std::vector<std::string>& ntpServers,
236*d24bfc7aSJennifer Lee                                  const std::vector<std::string>& domainNames) {
23720e6ea5dSraviteja-b             if (!success)
23820e6ea5dSraviteja-b             {
239*d24bfc7aSJennifer Lee                 messages::resourceNotFound(asyncResp->res, "EthernetInterface",
240*d24bfc7aSJennifer Lee                                            "eth0");
24120e6ea5dSraviteja-b                 return;
24220e6ea5dSraviteja-b             }
24320e6ea5dSraviteja-b             asyncResp->res.jsonValue["NTP"]["NTPServers"] = ntpServers;
244*d24bfc7aSJennifer Lee             if (hostName.empty() == false)
245*d24bfc7aSJennifer Lee             {
246*d24bfc7aSJennifer Lee                 asyncResp->res.jsonValue["FQDN"] = hostName;
247*d24bfc7aSJennifer Lee                 if (domainNames.empty() == false)
248*d24bfc7aSJennifer Lee                 {
249*d24bfc7aSJennifer Lee                     asyncResp->res.jsonValue["FQDN"] += "." + domainNames[0];
250*d24bfc7aSJennifer Lee                 }
251*d24bfc7aSJennifer Lee             }
25220e6ea5dSraviteja-b         });
25320e6ea5dSraviteja-b 
254865fbb75SEd Tanous         crow::connections::systemBus->async_method_call(
255865fbb75SEd Tanous             [asyncResp](const boost::system::error_code ec,
2563a8a0088SKowalski, Kamil                         const std::vector<UnitStruct>& resp) {
2571abe55efSEd Tanous                 if (ec)
2581abe55efSEd Tanous                 {
2593a8a0088SKowalski, Kamil                     asyncResp->res.jsonValue = nlohmann::json::object();
260f12894f8SJason M. Bills                     messages::internalError(asyncResp->res);
261865fbb75SEd Tanous                     return;
2623a8a0088SKowalski, Kamil                 }
2635968caeeSMarri Devender Rao                 asyncResp->res.jsonValue["HTTPS"]["Certificates"] = {
2645968caeeSMarri Devender Rao                     {"@odata.id", "/redfish/v1/Managers/bmc/NetworkProtocol/"
2655968caeeSMarri Devender Rao                                   "HTTPS/Certificates/"}};
2663a8a0088SKowalski, Kamil 
2671abe55efSEd Tanous                 for (auto& unit : resp)
2681abe55efSEd Tanous                 {
2691abe55efSEd Tanous                     for (auto& kv : protocolToDBus)
2701abe55efSEd Tanous                     {
2715ded8c79SJennifer Lee                         if (kv.second.serviceName !=
2721abe55efSEd Tanous                             std::get<NET_PROTO_UNIT_NAME>(unit))
2731abe55efSEd Tanous                         {
274865fbb75SEd Tanous                             continue;
27570141561SBorawski.Lukasz                         }
276865fbb75SEd Tanous                         const char* service = kv.first;
277865fbb75SEd Tanous                         const char* socketPath = kv.second.socketPath;
27870141561SBorawski.Lukasz 
279865fbb75SEd Tanous                         asyncResp->res.jsonValue[service]["ProtocolEnabled"] =
2805ded8c79SJennifer Lee                             (std::get<NET_PROTO_UNIT_SUB_STATE>(unit) ==
2815ded8c79SJennifer Lee                              "running") ||
2825ded8c79SJennifer Lee                             (std::get<NET_PROTO_UNIT_SUB_STATE>(unit) ==
2835ded8c79SJennifer Lee                              "listening");
284865fbb75SEd Tanous                         crow::connections::systemBus->async_method_call(
28543b761d0SEd Tanous                             [asyncResp, service{std::string(service)}](
286865fbb75SEd Tanous                                 const boost::system::error_code ec,
287abf2add6SEd Tanous                                 const std::variant<std::vector<std::tuple<
288abf2add6SEd Tanous                                     std::string, std::string>>>& resp) {
2891abe55efSEd Tanous                                 if (ec)
2901abe55efSEd Tanous                                 {
291a08b46ccSJason M. Bills                                     messages::internalError(asyncResp->res);
292865fbb75SEd Tanous                                     return;
2933a8a0088SKowalski, Kamil                                 }
294abf2add6SEd Tanous                                 const std::vector<
295abf2add6SEd Tanous                                     std::tuple<std::string, std::string>>*
296abf2add6SEd Tanous                                     responsePtr = std::get_if<std::vector<
297abf2add6SEd Tanous                                         std::tuple<std::string, std::string>>>(
2981b6b96c5SEd Tanous                                         &resp);
2991abe55efSEd Tanous                                 if (responsePtr == nullptr ||
3001abe55efSEd Tanous                                     responsePtr->size() < 1)
3011abe55efSEd Tanous                                 {
302865fbb75SEd Tanous                                     return;
30370141561SBorawski.Lukasz                                 }
30470141561SBorawski.Lukasz 
305865fbb75SEd Tanous                                 const std::string& listenStream =
3061abe55efSEd Tanous                                     std::get<NET_PROTO_LISTEN_STREAM>(
3071abe55efSEd Tanous                                         (*responsePtr)[0]);
3081abe55efSEd Tanous                                 std::size_t lastColonPos =
3091abe55efSEd Tanous                                     listenStream.rfind(":");
3101abe55efSEd Tanous                                 if (lastColonPos == std::string::npos)
3111abe55efSEd Tanous                                 {
312865fbb75SEd Tanous                                     // Not a port
313865fbb75SEd Tanous                                     return;
314865fbb75SEd Tanous                                 }
3151abe55efSEd Tanous                                 std::string portStr =
3161abe55efSEd Tanous                                     listenStream.substr(lastColonPos + 1);
317865fbb75SEd Tanous                                 char* endPtr = nullptr;
3181abe55efSEd Tanous                                 // Use strtol instead of stroi to avoid
3191abe55efSEd Tanous                                 // exceptions
3201abe55efSEd Tanous                                 long port =
3211abe55efSEd Tanous                                     std::strtol(portStr.c_str(), &endPtr, 10);
3221abe55efSEd Tanous                                 if (*endPtr != '\0' || portStr.empty())
3231abe55efSEd Tanous                                 {
324865fbb75SEd Tanous                                     // Invalid value
3251abe55efSEd Tanous                                     asyncResp->res.jsonValue[service]["Port"] =
3261abe55efSEd Tanous                                         nullptr;
3271abe55efSEd Tanous                                 }
3281abe55efSEd Tanous                                 else
3291abe55efSEd Tanous                                 {
330865fbb75SEd Tanous                                     // Everything OK
3311abe55efSEd Tanous                                     asyncResp->res.jsonValue[service]["Port"] =
3321abe55efSEd Tanous                                         port;
333865fbb75SEd Tanous                                 }
334865fbb75SEd Tanous                             },
335865fbb75SEd Tanous                             "org.freedesktop.systemd1", socketPath,
336865fbb75SEd Tanous                             "org.freedesktop.DBus.Properties", "Get",
337865fbb75SEd Tanous                             "org.freedesktop.systemd1.Socket", "Listen");
338865fbb75SEd Tanous                     }
339865fbb75SEd Tanous                 }
340865fbb75SEd Tanous             },
341865fbb75SEd Tanous             "org.freedesktop.systemd1", "/org/freedesktop/systemd1",
342865fbb75SEd Tanous             "org.freedesktop.systemd1.Manager", "ListUnits");
343865fbb75SEd Tanous     }
344501be32bSraviteja-b 
345501be32bSraviteja-b     void handleHostnamePatch(const std::string& hostName,
346501be32bSraviteja-b                              const std::shared_ptr<AsyncResp>& asyncResp)
347501be32bSraviteja-b     {
348501be32bSraviteja-b         crow::connections::systemBus->async_method_call(
349501be32bSraviteja-b             [asyncResp](const boost::system::error_code ec) {
350501be32bSraviteja-b                 if (ec)
351501be32bSraviteja-b                 {
352501be32bSraviteja-b                     messages::internalError(asyncResp->res);
353501be32bSraviteja-b                     return;
354501be32bSraviteja-b                 }
355501be32bSraviteja-b                 messages::success(asyncResp->res);
356501be32bSraviteja-b             },
357501be32bSraviteja-b             "xyz.openbmc_project.Network",
358501be32bSraviteja-b             "/xyz/openbmc_project/network/config",
359501be32bSraviteja-b             "org.freedesktop.DBus.Properties", "Set",
360501be32bSraviteja-b             "xyz.openbmc_project.Network.SystemConfiguration", "HostName",
361501be32bSraviteja-b             std::variant<std::string>(hostName));
362501be32bSraviteja-b     }
363501be32bSraviteja-b 
36420e6ea5dSraviteja-b     void handleNTPProtocolEnabled(const bool& ntpEnabled,
36520e6ea5dSraviteja-b                                   const std::shared_ptr<AsyncResp>& asyncResp)
36620e6ea5dSraviteja-b     {
36720e6ea5dSraviteja-b         std::string timeSyncMethod;
36820e6ea5dSraviteja-b         if (ntpEnabled)
36920e6ea5dSraviteja-b         {
37020e6ea5dSraviteja-b             timeSyncMethod =
37120e6ea5dSraviteja-b                 "xyz.openbmc_project.Time.Synchronization.Method.NTP";
37220e6ea5dSraviteja-b         }
37320e6ea5dSraviteja-b         else
37420e6ea5dSraviteja-b         {
37520e6ea5dSraviteja-b             timeSyncMethod =
37620e6ea5dSraviteja-b                 "xyz.openbmc_project.Time.Synchronization.Method.Manual";
37720e6ea5dSraviteja-b         }
37820e6ea5dSraviteja-b 
37920e6ea5dSraviteja-b         crow::connections::systemBus->async_method_call(
38020e6ea5dSraviteja-b             [asyncResp,
38120e6ea5dSraviteja-b              ntpEnabled](const boost::system::error_code error_code) {
38220e6ea5dSraviteja-b                 asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = ntpEnabled;
38320e6ea5dSraviteja-b             },
38420e6ea5dSraviteja-b             "xyz.openbmc_project.Settings",
38520e6ea5dSraviteja-b             "/xyz/openbmc_project/time/sync_method",
38620e6ea5dSraviteja-b             "org.freedesktop.DBus.Properties", "Set",
38720e6ea5dSraviteja-b             "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod",
38820e6ea5dSraviteja-b             std::variant<std::string>{timeSyncMethod});
38920e6ea5dSraviteja-b     }
39020e6ea5dSraviteja-b 
39120e6ea5dSraviteja-b     void handleNTPServersPatch(const std::vector<std::string>& ntpServers,
39220e6ea5dSraviteja-b                                const std::shared_ptr<AsyncResp>& asyncResp)
39320e6ea5dSraviteja-b     {
39420e6ea5dSraviteja-b         crow::connections::systemBus->async_method_call(
39520e6ea5dSraviteja-b             [asyncResp, ntpServers](const boost::system::error_code ec) {
39620e6ea5dSraviteja-b                 if (ec)
39720e6ea5dSraviteja-b                 {
39820e6ea5dSraviteja-b                     messages::internalError(asyncResp->res);
39920e6ea5dSraviteja-b                     return;
40020e6ea5dSraviteja-b                 }
40120e6ea5dSraviteja-b                 asyncResp->res.jsonValue["NTP"]["NTPServers"] =
40220e6ea5dSraviteja-b                     std::move(ntpServers);
40320e6ea5dSraviteja-b             },
40420e6ea5dSraviteja-b             "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/eth0",
40520e6ea5dSraviteja-b             "org.freedesktop.DBus.Properties", "Set",
40620e6ea5dSraviteja-b             "xyz.openbmc_project.Network.EthernetInterface", "NTPServers",
40720e6ea5dSraviteja-b             std::variant<std::vector<std::string>>{ntpServers});
40820e6ea5dSraviteja-b     }
40920e6ea5dSraviteja-b 
410501be32bSraviteja-b     void doPatch(crow::Response& res, const crow::Request& req,
411501be32bSraviteja-b                  const std::vector<std::string>& params) override
412501be32bSraviteja-b     {
413501be32bSraviteja-b         std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res);
414501be32bSraviteja-b         std::optional<std::string> newHostName;
41520e6ea5dSraviteja-b         std::optional<std::vector<std::string>> ntpServers;
41620e6ea5dSraviteja-b         std::optional<bool> ntpEnabled;
417501be32bSraviteja-b 
41820e6ea5dSraviteja-b         if (!json_util::readJson(req, res, "HostName", newHostName,
41920e6ea5dSraviteja-b                                  "NTPServers", ntpServers, "NTPEnabled",
42020e6ea5dSraviteja-b                                  ntpEnabled))
421501be32bSraviteja-b         {
422501be32bSraviteja-b             return;
423501be32bSraviteja-b         }
424501be32bSraviteja-b         if (newHostName)
425501be32bSraviteja-b         {
426501be32bSraviteja-b             handleHostnamePatch(*newHostName, asyncResp);
427501be32bSraviteja-b             return;
428501be32bSraviteja-b         }
42920e6ea5dSraviteja-b         if (ntpEnabled)
43020e6ea5dSraviteja-b         {
43120e6ea5dSraviteja-b             handleNTPProtocolEnabled(*ntpEnabled, asyncResp);
43220e6ea5dSraviteja-b         }
43320e6ea5dSraviteja-b         if (ntpServers)
43420e6ea5dSraviteja-b         {
43520e6ea5dSraviteja-b             handleNTPServersPatch(*ntpServers, asyncResp);
43620e6ea5dSraviteja-b         }
437501be32bSraviteja-b     }
43870141561SBorawski.Lukasz };
43970141561SBorawski.Lukasz 
44070141561SBorawski.Lukasz } // namespace redfish
441