xref: /openbmc/bmcweb/features/redfish/lib/network_protocol.hpp (revision b4bec66b24755cf87e924d56219c60e9506f196b)
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"
1967a78d87STom Joseph #include "openbmc_dbus_rest.hpp"
20*b4bec66bSAbhishek Patel #include "redfish_util.hpp"
2170141561SBorawski.Lukasz 
227e860f15SJohn Edward Broadbent #include <app.hpp>
23ed398213SEd Tanous #include <registries/privilege_registry.hpp>
2420e6ea5dSraviteja-b #include <utils/json_utils.hpp>
251214b7e7SGunnar Mills 
261214b7e7SGunnar Mills #include <optional>
27abf2add6SEd Tanous #include <variant>
281abe55efSEd Tanous namespace redfish
291abe55efSEd Tanous {
3070141561SBorawski.Lukasz 
317e860f15SJohn Edward Broadbent void getNTPProtocolEnabled(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp);
327e860f15SJohn Edward Broadbent std::string getHostName();
337e860f15SJohn Edward Broadbent 
34*b4bec66bSAbhishek Patel const static std::array<std::pair<std::string, std::string>, 3> protocolToDBus{
35b0972a63SEd Tanous     {{"SSH", "dropbear"}, {"HTTPS", "bmcweb"}, {"IPMI", "phosphor-ipmi-net"}}};
363a8a0088SKowalski, Kamil 
37d24bfc7aSJennifer Lee inline void
3881ce609eSEd Tanous     extractNTPServersAndDomainNamesData(const GetManagedObjects& dbusData,
39d24bfc7aSJennifer Lee                                         std::vector<std::string>& ntpData,
40d24bfc7aSJennifer Lee                                         std::vector<std::string>& dnData)
4120e6ea5dSraviteja-b {
4281ce609eSEd Tanous     for (const auto& obj : dbusData)
4320e6ea5dSraviteja-b     {
4420e6ea5dSraviteja-b         for (const auto& ifacePair : obj.second)
4520e6ea5dSraviteja-b         {
4620e6ea5dSraviteja-b             if (obj.first == "/xyz/openbmc_project/network/eth0")
4720e6ea5dSraviteja-b             {
4820e6ea5dSraviteja-b                 if (ifacePair.first ==
4920e6ea5dSraviteja-b                     "xyz.openbmc_project.Network.EthernetInterface")
5020e6ea5dSraviteja-b                 {
5120e6ea5dSraviteja-b                     for (const auto& propertyPair : ifacePair.second)
5220e6ea5dSraviteja-b                     {
5320e6ea5dSraviteja-b                         if (propertyPair.first == "NTPServers")
5420e6ea5dSraviteja-b                         {
5520e6ea5dSraviteja-b                             const std::vector<std::string>* ntpServers =
568d78b7a9SPatrick Williams                                 std::get_if<std::vector<std::string>>(
5720e6ea5dSraviteja-b                                     &propertyPair.second);
5820e6ea5dSraviteja-b                             if (ntpServers != nullptr)
5920e6ea5dSraviteja-b                             {
60f23b7296SEd Tanous                                 ntpData = *ntpServers;
6120e6ea5dSraviteja-b                             }
6220e6ea5dSraviteja-b                         }
63d24bfc7aSJennifer Lee                         else if (propertyPair.first == "DomainName")
64d24bfc7aSJennifer Lee                         {
65d24bfc7aSJennifer Lee                             const std::vector<std::string>* domainNames =
668d78b7a9SPatrick Williams                                 std::get_if<std::vector<std::string>>(
67d24bfc7aSJennifer Lee                                     &propertyPair.second);
68d24bfc7aSJennifer Lee                             if (domainNames != nullptr)
69d24bfc7aSJennifer Lee                             {
70f23b7296SEd Tanous                                 dnData = *domainNames;
71d24bfc7aSJennifer Lee                             }
72d24bfc7aSJennifer Lee                         }
7320e6ea5dSraviteja-b                     }
7420e6ea5dSraviteja-b                 }
7520e6ea5dSraviteja-b             }
7620e6ea5dSraviteja-b         }
7720e6ea5dSraviteja-b     }
7820e6ea5dSraviteja-b }
7920e6ea5dSraviteja-b 
8020e6ea5dSraviteja-b template <typename CallbackFunc>
8120e6ea5dSraviteja-b void getEthernetIfaceData(CallbackFunc&& callback)
8220e6ea5dSraviteja-b {
8320e6ea5dSraviteja-b     crow::connections::systemBus->async_method_call(
8420e6ea5dSraviteja-b         [callback{std::move(callback)}](
8581ce609eSEd Tanous             const boost::system::error_code errorCode,
8681ce609eSEd Tanous             const GetManagedObjects& dbusData) {
8720e6ea5dSraviteja-b             std::vector<std::string> ntpServers;
88d24bfc7aSJennifer Lee             std::vector<std::string> domainNames;
8920e6ea5dSraviteja-b 
9081ce609eSEd Tanous             if (errorCode)
9120e6ea5dSraviteja-b             {
92d24bfc7aSJennifer Lee                 callback(false, ntpServers, domainNames);
9320e6ea5dSraviteja-b                 return;
9420e6ea5dSraviteja-b             }
9520e6ea5dSraviteja-b 
9681ce609eSEd Tanous             extractNTPServersAndDomainNamesData(dbusData, ntpServers,
97d24bfc7aSJennifer Lee                                                 domainNames);
9820e6ea5dSraviteja-b 
99d24bfc7aSJennifer Lee             callback(true, ntpServers, domainNames);
10020e6ea5dSraviteja-b         },
10120e6ea5dSraviteja-b         "xyz.openbmc_project.Network", "/xyz/openbmc_project/network",
10220e6ea5dSraviteja-b         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
103271584abSEd Tanous }
10420e6ea5dSraviteja-b 
1054f48d5f6SEd Tanous inline void getNetworkData(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
10672048780SAbhishek Patel                            const crow::Request& req)
1071abe55efSEd Tanous {
1080f74e643SEd Tanous     asyncResp->res.jsonValue["@odata.type"] =
10961932318SXiaochao Ma         "#ManagerNetworkProtocol.v1_5_0.ManagerNetworkProtocol";
1100f74e643SEd Tanous     asyncResp->res.jsonValue["@odata.id"] =
1110f74e643SEd Tanous         "/redfish/v1/Managers/bmc/NetworkProtocol";
1120f74e643SEd Tanous     asyncResp->res.jsonValue["Id"] = "NetworkProtocol";
1130f74e643SEd Tanous     asyncResp->res.jsonValue["Name"] = "Manager Network Protocol";
1140f74e643SEd Tanous     asyncResp->res.jsonValue["Description"] = "Manager Network Service";
1150f74e643SEd Tanous     asyncResp->res.jsonValue["Status"]["Health"] = "OK";
1160f74e643SEd Tanous     asyncResp->res.jsonValue["Status"]["HealthRollup"] = "OK";
1170f74e643SEd Tanous     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
1180f74e643SEd Tanous 
11961932318SXiaochao Ma     // HTTP is Mandatory attribute as per OCP Baseline Profile - v1.0.0,
120818ea7b8SJoshi-Mansi     // but from security perspective it is not recommended to use.
121818ea7b8SJoshi-Mansi     // Hence using protocolEnabled as false to make it OCP and security-wise
122818ea7b8SJoshi-Mansi     // compliant
123818ea7b8SJoshi-Mansi     asyncResp->res.jsonValue["HTTP"]["Port"] = 0;
124818ea7b8SJoshi-Mansi     asyncResp->res.jsonValue["HTTP"]["ProtocolEnabled"] = false;
125818ea7b8SJoshi-Mansi 
1260f74e643SEd Tanous     for (auto& protocol : protocolToDBus)
1270f74e643SEd Tanous     {
1280870f8c7SJayaprakash Mutyala         asyncResp->res.jsonValue[protocol.first]["Port"] =
1290870f8c7SJayaprakash Mutyala             nlohmann::detail::value_t::null;
1300f74e643SEd Tanous         asyncResp->res.jsonValue[protocol.first]["ProtocolEnabled"] = false;
1310f74e643SEd Tanous     }
1320f74e643SEd Tanous 
133d24bfc7aSJennifer Lee     std::string hostName = getHostName();
134d24bfc7aSJennifer Lee 
135d24bfc7aSJennifer Lee     asyncResp->res.jsonValue["HostName"] = hostName;
1363a8a0088SKowalski, Kamil 
13720e6ea5dSraviteja-b     getNTPProtocolEnabled(asyncResp);
13820e6ea5dSraviteja-b 
13920e6ea5dSraviteja-b     // TODO Get eth0 interface data, and call the below callback for JSON
14020e6ea5dSraviteja-b     // preparation
141271584abSEd Tanous     getEthernetIfaceData(
142271584abSEd Tanous         [hostName, asyncResp](const bool& success,
143d24bfc7aSJennifer Lee                               const std::vector<std::string>& ntpServers,
144d24bfc7aSJennifer Lee                               const std::vector<std::string>& domainNames) {
14520e6ea5dSraviteja-b             if (!success)
14620e6ea5dSraviteja-b             {
1477e860f15SJohn Edward Broadbent                 messages::resourceNotFound(asyncResp->res, "EthernetInterface",
1487e860f15SJohn Edward Broadbent                                            "eth0");
14920e6ea5dSraviteja-b                 return;
15020e6ea5dSraviteja-b             }
15120e6ea5dSraviteja-b             asyncResp->res.jsonValue["NTP"]["NTPServers"] = ntpServers;
152d24bfc7aSJennifer Lee             if (hostName.empty() == false)
153d24bfc7aSJennifer Lee             {
154f23b7296SEd Tanous                 std::string fqdn = hostName;
155d24bfc7aSJennifer Lee                 if (domainNames.empty() == false)
156d24bfc7aSJennifer Lee                 {
157f23b7296SEd Tanous                     fqdn += ".";
158f23b7296SEd Tanous                     fqdn += domainNames[0];
159d24bfc7aSJennifer Lee                 }
1602c70f800SEd Tanous                 asyncResp->res.jsonValue["FQDN"] = std::move(fqdn);
161d24bfc7aSJennifer Lee             }
16220e6ea5dSraviteja-b         });
16320e6ea5dSraviteja-b 
16472048780SAbhishek Patel     Privileges effectiveUserPrivileges =
16572048780SAbhishek Patel         redfish::getUserPrivileges(req.userRole);
16672048780SAbhishek Patel 
16772048780SAbhishek Patel     // /redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates is
16872048780SAbhishek Patel     // something only ConfigureManager can access then only display when
16972048780SAbhishek Patel     // the user has permissions ConfigureManager
17072048780SAbhishek Patel     if (isOperationAllowedWithPrivileges({{"ConfigureManager"}},
17172048780SAbhishek Patel                                          effectiveUserPrivileges))
17272048780SAbhishek Patel     {
1735968caeeSMarri Devender Rao         asyncResp->res.jsonValue["HTTPS"]["Certificates"] = {
174*b4bec66bSAbhishek Patel             {"@odata.id",
175*b4bec66bSAbhishek Patel              "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates"}};
17670141561SBorawski.Lukasz     }
17770141561SBorawski.Lukasz 
178*b4bec66bSAbhishek Patel     for (const auto& protocol : protocolToDBus)
179ec4974ddSAppaRao Puli     {
180*b4bec66bSAbhishek Patel         const std::string& protocolName = protocol.first;
181*b4bec66bSAbhishek Patel         const std::string& serviceName = protocol.second;
182*b4bec66bSAbhishek Patel         getPortStatusAndPath(
183*b4bec66bSAbhishek Patel             serviceName,
184*b4bec66bSAbhishek Patel             [asyncResp, protocolName](const boost::system::error_code ec,
185*b4bec66bSAbhishek Patel                                       const std::string& socketPath,
186*b4bec66bSAbhishek Patel                                       bool isProtocolEnabled) {
1871abe55efSEd Tanous                 if (ec)
1881abe55efSEd Tanous                 {
189a08b46ccSJason M. Bills                     messages::internalError(asyncResp->res);
190865fbb75SEd Tanous                     return;
1913a8a0088SKowalski, Kamil                 }
192*b4bec66bSAbhishek Patel                 asyncResp->res.jsonValue[protocolName]["ProtocolEnabled"] =
193*b4bec66bSAbhishek Patel                     isProtocolEnabled;
194*b4bec66bSAbhishek Patel                 getPortNumber(
195*b4bec66bSAbhishek Patel                     socketPath,
196*b4bec66bSAbhishek Patel                     [asyncResp, protocolName](
197*b4bec66bSAbhishek Patel                         const boost::system::error_code ec, int portNumber) {
198*b4bec66bSAbhishek Patel                         if (ec)
1991abe55efSEd Tanous                         {
200*b4bec66bSAbhishek Patel                             messages::internalError(asyncResp->res);
201865fbb75SEd Tanous                             return;
20270141561SBorawski.Lukasz                         }
203*b4bec66bSAbhishek Patel                         asyncResp->res.jsonValue[protocolName]["Port"] =
204*b4bec66bSAbhishek Patel                             portNumber;
205*b4bec66bSAbhishek Patel                     });
206*b4bec66bSAbhishek Patel             });
207865fbb75SEd Tanous     }
208*b4bec66bSAbhishek Patel } // namespace redfish
209501be32bSraviteja-b 
2102db77d34SJohnathan Mantey #ifdef BMCWEB_ALLOW_DEPRECATED_HOSTNAME_PATCH
2114f48d5f6SEd Tanous inline void
2124f48d5f6SEd Tanous     handleHostnamePatch(const std::string& hostName,
2138d1b46d7Szhanghch05                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
214501be32bSraviteja-b {
215501be32bSraviteja-b     crow::connections::systemBus->async_method_call(
216501be32bSraviteja-b         [asyncResp](const boost::system::error_code ec) {
217501be32bSraviteja-b             if (ec)
218501be32bSraviteja-b             {
219501be32bSraviteja-b                 messages::internalError(asyncResp->res);
220501be32bSraviteja-b                 return;
221501be32bSraviteja-b             }
222501be32bSraviteja-b         },
2237e860f15SJohn Edward Broadbent         "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/config",
224501be32bSraviteja-b         "org.freedesktop.DBus.Properties", "Set",
225501be32bSraviteja-b         "xyz.openbmc_project.Network.SystemConfiguration", "HostName",
226501be32bSraviteja-b         std::variant<std::string>(hostName));
227501be32bSraviteja-b }
2282db77d34SJohnathan Mantey #endif
229501be32bSraviteja-b 
2304f48d5f6SEd Tanous inline void handleNTPProtocolEnabled(
2317e860f15SJohn Edward Broadbent     const bool& ntpEnabled, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
23220e6ea5dSraviteja-b {
23320e6ea5dSraviteja-b     std::string timeSyncMethod;
23420e6ea5dSraviteja-b     if (ntpEnabled)
23520e6ea5dSraviteja-b     {
2367e860f15SJohn Edward Broadbent         timeSyncMethod = "xyz.openbmc_project.Time.Synchronization.Method.NTP";
23720e6ea5dSraviteja-b     }
23820e6ea5dSraviteja-b     else
23920e6ea5dSraviteja-b     {
24020e6ea5dSraviteja-b         timeSyncMethod =
24120e6ea5dSraviteja-b             "xyz.openbmc_project.Time.Synchronization.Method.Manual";
24220e6ea5dSraviteja-b     }
24320e6ea5dSraviteja-b 
24420e6ea5dSraviteja-b     crow::connections::systemBus->async_method_call(
24581ce609eSEd Tanous         [asyncResp](const boost::system::error_code errorCode) {
24681ce609eSEd Tanous             if (errorCode)
247cb13a392SEd Tanous             {
248cb13a392SEd Tanous                 messages::internalError(asyncResp->res);
249cb13a392SEd Tanous             }
250cb13a392SEd Tanous         },
2517e860f15SJohn Edward Broadbent         "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method",
25220e6ea5dSraviteja-b         "org.freedesktop.DBus.Properties", "Set",
25320e6ea5dSraviteja-b         "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod",
25420e6ea5dSraviteja-b         std::variant<std::string>{timeSyncMethod});
25520e6ea5dSraviteja-b }
25620e6ea5dSraviteja-b 
2574f48d5f6SEd Tanous inline void
2584f48d5f6SEd Tanous     handleNTPServersPatch(const std::vector<std::string>& ntpServers,
2598d1b46d7Szhanghch05                           const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
26020e6ea5dSraviteja-b {
26120e6ea5dSraviteja-b     crow::connections::systemBus->async_method_call(
262cf05f9dcSJohnathan Mantey         [asyncResp](const boost::system::error_code ec) {
26320e6ea5dSraviteja-b             if (ec)
26420e6ea5dSraviteja-b             {
26520e6ea5dSraviteja-b                 messages::internalError(asyncResp->res);
26620e6ea5dSraviteja-b                 return;
26720e6ea5dSraviteja-b             }
26820e6ea5dSraviteja-b         },
26920e6ea5dSraviteja-b         "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/eth0",
27020e6ea5dSraviteja-b         "org.freedesktop.DBus.Properties", "Set",
27120e6ea5dSraviteja-b         "xyz.openbmc_project.Network.EthernetInterface", "NTPServers",
27220e6ea5dSraviteja-b         std::variant<std::vector<std::string>>{ntpServers});
27320e6ea5dSraviteja-b }
27420e6ea5dSraviteja-b 
2754f48d5f6SEd Tanous inline void
2764f48d5f6SEd Tanous     handleProtocolEnabled(const bool protocolEnabled,
277e5a99777SAlbert Zhang                           const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
278e5a99777SAlbert Zhang                           const std::string_view netBasePath)
27967a78d87STom Joseph {
28067a78d87STom Joseph     crow::connections::systemBus->async_method_call(
281e5a99777SAlbert Zhang         [protocolEnabled, asyncResp,
282e5a99777SAlbert Zhang          netBasePath](const boost::system::error_code ec,
28367a78d87STom Joseph                       const crow::openbmc_mapper::GetSubTreeType& subtree) {
28467a78d87STom Joseph             if (ec)
28567a78d87STom Joseph             {
28667a78d87STom Joseph                 messages::internalError(asyncResp->res);
28767a78d87STom Joseph                 return;
28867a78d87STom Joseph             }
28967a78d87STom Joseph 
29067a78d87STom Joseph             for (const auto& entry : subtree)
29167a78d87STom Joseph             {
292e5a99777SAlbert Zhang                 if (boost::algorithm::starts_with(entry.first, netBasePath))
29367a78d87STom Joseph                 {
29467a78d87STom Joseph                     crow::connections::systemBus->async_method_call(
29523a21a1cSEd Tanous                         [asyncResp](const boost::system::error_code ec2) {
29623a21a1cSEd Tanous                             if (ec2)
29767a78d87STom Joseph                             {
29867a78d87STom Joseph                                 messages::internalError(asyncResp->res);
29967a78d87STom Joseph                                 return;
30067a78d87STom Joseph                             }
30167a78d87STom Joseph                         },
30267a78d87STom Joseph                         entry.second.begin()->first, entry.first,
30367a78d87STom Joseph                         "org.freedesktop.DBus.Properties", "Set",
30467a78d87STom Joseph                         "xyz.openbmc_project.Control.Service.Attributes",
305e5a99777SAlbert Zhang                         "Running", std::variant<bool>{protocolEnabled});
30667a78d87STom Joseph 
30767a78d87STom Joseph                     crow::connections::systemBus->async_method_call(
30823a21a1cSEd Tanous                         [asyncResp](const boost::system::error_code ec2) {
30923a21a1cSEd Tanous                             if (ec2)
31067a78d87STom Joseph                             {
31167a78d87STom Joseph                                 messages::internalError(asyncResp->res);
31267a78d87STom Joseph                                 return;
31367a78d87STom Joseph                             }
31467a78d87STom Joseph                         },
31567a78d87STom Joseph                         entry.second.begin()->first, entry.first,
31667a78d87STom Joseph                         "org.freedesktop.DBus.Properties", "Set",
31767a78d87STom Joseph                         "xyz.openbmc_project.Control.Service.Attributes",
318e5a99777SAlbert Zhang                         "Enabled", std::variant<bool>{protocolEnabled});
31967a78d87STom Joseph                 }
32067a78d87STom Joseph             }
32167a78d87STom Joseph         },
32267a78d87STom Joseph         "xyz.openbmc_project.ObjectMapper",
32367a78d87STom Joseph         "/xyz/openbmc_project/object_mapper",
32467a78d87STom Joseph         "xyz.openbmc_project.ObjectMapper", "GetSubTree",
32567a78d87STom Joseph         "/xyz/openbmc_project/control/service", 0,
32667a78d87STom Joseph         std::array<const char*, 1>{
32767a78d87STom Joseph             "xyz.openbmc_project.Control.Service.Attributes"});
32867a78d87STom Joseph }
32967a78d87STom Joseph 
3304f48d5f6SEd Tanous inline std::string getHostName()
331501be32bSraviteja-b {
3327e860f15SJohn Edward Broadbent     std::string hostName;
3338d1b46d7Szhanghch05 
3347e860f15SJohn Edward Broadbent     std::array<char, HOST_NAME_MAX> hostNameCStr;
3357e860f15SJohn Edward Broadbent     if (gethostname(hostNameCStr.data(), hostNameCStr.size()) == 0)
3367e860f15SJohn Edward Broadbent     {
3377e860f15SJohn Edward Broadbent         hostName = hostNameCStr.data();
3387e860f15SJohn Edward Broadbent     }
3397e860f15SJohn Edward Broadbent     return hostName;
3407e860f15SJohn Edward Broadbent }
3417e860f15SJohn Edward Broadbent 
3424f48d5f6SEd Tanous inline void
3434f48d5f6SEd Tanous     getNTPProtocolEnabled(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
3447e860f15SJohn Edward Broadbent {
3457e860f15SJohn Edward Broadbent     crow::connections::systemBus->async_method_call(
3467e860f15SJohn Edward Broadbent         [asyncResp](const boost::system::error_code errorCode,
3477e860f15SJohn Edward Broadbent                     const std::variant<std::string>& timeSyncMethod) {
3487e860f15SJohn Edward Broadbent             if (errorCode)
3497e860f15SJohn Edward Broadbent             {
3507e860f15SJohn Edward Broadbent                 return;
3517e860f15SJohn Edward Broadbent             }
3527e860f15SJohn Edward Broadbent 
3537e860f15SJohn Edward Broadbent             const std::string* s = std::get_if<std::string>(&timeSyncMethod);
3547e860f15SJohn Edward Broadbent 
3557e860f15SJohn Edward Broadbent             if (*s == "xyz.openbmc_project.Time.Synchronization.Method.NTP")
3567e860f15SJohn Edward Broadbent             {
3577e860f15SJohn Edward Broadbent                 asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = true;
3587e860f15SJohn Edward Broadbent             }
3597e860f15SJohn Edward Broadbent             else if (*s == "xyz.openbmc_project.Time.Synchronization."
3607e860f15SJohn Edward Broadbent                            "Method.Manual")
3617e860f15SJohn Edward Broadbent             {
3627e860f15SJohn Edward Broadbent                 asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = false;
3637e860f15SJohn Edward Broadbent             }
3647e860f15SJohn Edward Broadbent         },
3657e860f15SJohn Edward Broadbent         "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method",
3667e860f15SJohn Edward Broadbent         "org.freedesktop.DBus.Properties", "Get",
3677e860f15SJohn Edward Broadbent         "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod");
3687e860f15SJohn Edward Broadbent }
3697e860f15SJohn Edward Broadbent 
3707e860f15SJohn Edward Broadbent inline void requestRoutesNetworkProtocol(App& app)
3717e860f15SJohn Edward Broadbent {
3727e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/")
373ed398213SEd Tanous         .privileges(redfish::privileges::patchManagerNetworkProtocol)
3747e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::patch)(
3757e860f15SJohn Edward Broadbent             [](const crow::Request& req,
3767e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
377501be32bSraviteja-b                 std::optional<std::string> newHostName;
378cf05f9dcSJohnathan Mantey                 std::optional<nlohmann::json> ntp;
37967a78d87STom Joseph                 std::optional<nlohmann::json> ipmi;
380e5a99777SAlbert Zhang                 std::optional<nlohmann::json> ssh;
381501be32bSraviteja-b 
3827e860f15SJohn Edward Broadbent                 if (!json_util::readJson(req, asyncResp->res, "NTP", ntp,
383e5a99777SAlbert Zhang                                          "HostName", newHostName, "IPMI", ipmi,
384e5a99777SAlbert Zhang                                          "SSH", ssh))
385501be32bSraviteja-b                 {
386501be32bSraviteja-b                     return;
387501be32bSraviteja-b                 }
388cf05f9dcSJohnathan Mantey 
3898d1b46d7Szhanghch05                 asyncResp->res.result(boost::beast::http::status::no_content);
390501be32bSraviteja-b                 if (newHostName)
391501be32bSraviteja-b                 {
3922db77d34SJohnathan Mantey #ifdef BMCWEB_ALLOW_DEPRECATED_HOSTNAME_PATCH
393501be32bSraviteja-b                     handleHostnamePatch(*newHostName, asyncResp);
3942db77d34SJohnathan Mantey #else
3952db77d34SJohnathan Mantey                     messages::propertyNotWritable(asyncResp->res, "HostName");
3962db77d34SJohnathan Mantey #endif
397cf05f9dcSJohnathan Mantey                 }
398cf05f9dcSJohnathan Mantey 
399cf05f9dcSJohnathan Mantey                 if (ntp)
400cf05f9dcSJohnathan Mantey                 {
401cf05f9dcSJohnathan Mantey                     std::optional<std::vector<std::string>> ntpServers;
402cf05f9dcSJohnathan Mantey                     std::optional<bool> ntpEnabled;
4038d1b46d7Szhanghch05                     if (!json_util::readJson(*ntp, asyncResp->res, "NTPServers",
4047e860f15SJohn Edward Broadbent                                              ntpServers, "ProtocolEnabled",
4057e860f15SJohn Edward Broadbent                                              ntpEnabled))
406cf05f9dcSJohnathan Mantey                     {
407501be32bSraviteja-b                         return;
408501be32bSraviteja-b                     }
409cf05f9dcSJohnathan Mantey 
41020e6ea5dSraviteja-b                     if (ntpEnabled)
41120e6ea5dSraviteja-b                     {
41220e6ea5dSraviteja-b                         handleNTPProtocolEnabled(*ntpEnabled, asyncResp);
41320e6ea5dSraviteja-b                     }
414cf05f9dcSJohnathan Mantey 
41520e6ea5dSraviteja-b                     if (ntpServers)
41620e6ea5dSraviteja-b                     {
417dc3fbbd0STony Lee                         std::sort((*ntpServers).begin(), (*ntpServers).end());
418dc3fbbd0STony Lee                         (*ntpServers)
4197e860f15SJohn Edward Broadbent                             .erase(std::unique((*ntpServers).begin(),
4207e860f15SJohn Edward Broadbent                                                (*ntpServers).end()),
421dc3fbbd0STony Lee                                    (*ntpServers).end());
42220e6ea5dSraviteja-b                         handleNTPServersPatch(*ntpServers, asyncResp);
42320e6ea5dSraviteja-b                     }
424501be32bSraviteja-b                 }
42567a78d87STom Joseph 
42667a78d87STom Joseph                 if (ipmi)
42767a78d87STom Joseph                 {
42867a78d87STom Joseph                     std::optional<bool> ipmiProtocolEnabled;
4297e860f15SJohn Edward Broadbent                     if (!json_util::readJson(*ipmi, asyncResp->res,
4307e860f15SJohn Edward Broadbent                                              "ProtocolEnabled",
43167a78d87STom Joseph                                              ipmiProtocolEnabled))
43267a78d87STom Joseph                     {
43367a78d87STom Joseph                         return;
43467a78d87STom Joseph                     }
43567a78d87STom Joseph 
43667a78d87STom Joseph                     if (ipmiProtocolEnabled)
43767a78d87STom Joseph                     {
438e5a99777SAlbert Zhang                         handleProtocolEnabled(
439e5a99777SAlbert Zhang                             *ipmiProtocolEnabled, asyncResp,
440e5a99777SAlbert Zhang                             "/xyz/openbmc_project/control/service/"
441e5a99777SAlbert Zhang                             "phosphor_2dipmi_2dnet_40");
442e5a99777SAlbert Zhang                     }
443e5a99777SAlbert Zhang                 }
444e5a99777SAlbert Zhang 
445e5a99777SAlbert Zhang                 if (ssh)
446e5a99777SAlbert Zhang                 {
447e5a99777SAlbert Zhang                     std::optional<bool> sshProtocolEnabled;
448e5a99777SAlbert Zhang                     if (!json_util::readJson(*ssh, asyncResp->res,
449e5a99777SAlbert Zhang                                              "ProtocolEnabled",
450e5a99777SAlbert Zhang                                              sshProtocolEnabled))
451e5a99777SAlbert Zhang                     {
452e5a99777SAlbert Zhang                         return;
453e5a99777SAlbert Zhang                     }
454e5a99777SAlbert Zhang 
455e5a99777SAlbert Zhang                     if (sshProtocolEnabled)
456e5a99777SAlbert Zhang                     {
457e5a99777SAlbert Zhang                         handleProtocolEnabled(
458e5a99777SAlbert Zhang                             *sshProtocolEnabled, asyncResp,
459e5a99777SAlbert Zhang                             "/xyz/openbmc_project/control/service/dropbear");
46067a78d87STom Joseph                     }
46167a78d87STom Joseph                 }
4627e860f15SJohn Edward Broadbent             });
4637e860f15SJohn Edward Broadbent 
4647e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/")
465ed398213SEd Tanous         .privileges(redfish::privileges::getManagerNetworkProtocol)
4667e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
46772048780SAbhishek Patel             [](const crow::Request& req,
4687e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
46972048780SAbhishek Patel                 getNetworkData(asyncResp, req);
4707e860f15SJohn Edward Broadbent             });
471cf05f9dcSJohnathan Mantey }
47270141561SBorawski.Lukasz 
47370141561SBorawski.Lukasz } // namespace redfish
474