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" 20b4bec66bSAbhishek 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 34b4bec66bSAbhishek 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 126d24bfc7aSJennifer Lee std::string hostName = getHostName(); 127d24bfc7aSJennifer Lee 128d24bfc7aSJennifer Lee asyncResp->res.jsonValue["HostName"] = hostName; 1293a8a0088SKowalski, Kamil 13020e6ea5dSraviteja-b getNTPProtocolEnabled(asyncResp); 13120e6ea5dSraviteja-b 13220e6ea5dSraviteja-b // TODO Get eth0 interface data, and call the below callback for JSON 13320e6ea5dSraviteja-b // preparation 134271584abSEd Tanous getEthernetIfaceData( 135271584abSEd Tanous [hostName, asyncResp](const bool& success, 136d24bfc7aSJennifer Lee const std::vector<std::string>& ntpServers, 137d24bfc7aSJennifer Lee const std::vector<std::string>& domainNames) { 13820e6ea5dSraviteja-b if (!success) 13920e6ea5dSraviteja-b { 1407e860f15SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, "EthernetInterface", 1417e860f15SJohn Edward Broadbent "eth0"); 14220e6ea5dSraviteja-b return; 14320e6ea5dSraviteja-b } 14420e6ea5dSraviteja-b asyncResp->res.jsonValue["NTP"]["NTPServers"] = ntpServers; 145d24bfc7aSJennifer Lee if (hostName.empty() == false) 146d24bfc7aSJennifer Lee { 147f23b7296SEd Tanous std::string fqdn = hostName; 148d24bfc7aSJennifer Lee if (domainNames.empty() == false) 149d24bfc7aSJennifer Lee { 150f23b7296SEd Tanous fqdn += "."; 151f23b7296SEd Tanous fqdn += domainNames[0]; 152d24bfc7aSJennifer Lee } 1532c70f800SEd Tanous asyncResp->res.jsonValue["FQDN"] = std::move(fqdn); 154d24bfc7aSJennifer Lee } 15520e6ea5dSraviteja-b }); 15620e6ea5dSraviteja-b 15772048780SAbhishek Patel Privileges effectiveUserPrivileges = 15872048780SAbhishek Patel redfish::getUserPrivileges(req.userRole); 15972048780SAbhishek Patel 16072048780SAbhishek Patel // /redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates is 16172048780SAbhishek Patel // something only ConfigureManager can access then only display when 16272048780SAbhishek Patel // the user has permissions ConfigureManager 16372048780SAbhishek Patel if (isOperationAllowedWithPrivileges({{"ConfigureManager"}}, 16472048780SAbhishek Patel effectiveUserPrivileges)) 16572048780SAbhishek Patel { 1665968caeeSMarri Devender Rao asyncResp->res.jsonValue["HTTPS"]["Certificates"] = { 167b4bec66bSAbhishek Patel {"@odata.id", 168b4bec66bSAbhishek Patel "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates"}}; 16970141561SBorawski.Lukasz } 17070141561SBorawski.Lukasz 171b4bec66bSAbhishek Patel for (const auto& protocol : protocolToDBus) 172ec4974ddSAppaRao Puli { 173b4bec66bSAbhishek Patel const std::string& protocolName = protocol.first; 174b4bec66bSAbhishek Patel const std::string& serviceName = protocol.second; 175b4bec66bSAbhishek Patel getPortStatusAndPath( 176b4bec66bSAbhishek Patel serviceName, 177b4bec66bSAbhishek Patel [asyncResp, protocolName](const boost::system::error_code ec, 178b4bec66bSAbhishek Patel const std::string& socketPath, 179b4bec66bSAbhishek Patel bool isProtocolEnabled) { 180*4d875bd8SEd Tanous // If the service is not installed, that is not an error 181*4d875bd8SEd Tanous if (ec == boost::system::errc::no_such_process) 182*4d875bd8SEd Tanous { 183*4d875bd8SEd Tanous asyncResp->res.jsonValue[protocolName]["Port"] = 184*4d875bd8SEd Tanous nlohmann::detail::value_t::null; 185*4d875bd8SEd Tanous asyncResp->res.jsonValue[protocolName]["ProtocolEnabled"] = 186*4d875bd8SEd Tanous false; 187*4d875bd8SEd Tanous return; 188*4d875bd8SEd Tanous } 1891abe55efSEd Tanous if (ec) 1901abe55efSEd Tanous { 191a08b46ccSJason M. Bills messages::internalError(asyncResp->res); 192865fbb75SEd Tanous return; 1933a8a0088SKowalski, Kamil } 194b4bec66bSAbhishek Patel asyncResp->res.jsonValue[protocolName]["ProtocolEnabled"] = 195b4bec66bSAbhishek Patel isProtocolEnabled; 196b4bec66bSAbhishek Patel getPortNumber( 197b4bec66bSAbhishek Patel socketPath, 198b4bec66bSAbhishek Patel [asyncResp, protocolName]( 199b4bec66bSAbhishek Patel const boost::system::error_code ec, int portNumber) { 200b4bec66bSAbhishek Patel if (ec) 2011abe55efSEd Tanous { 202b4bec66bSAbhishek Patel messages::internalError(asyncResp->res); 203865fbb75SEd Tanous return; 20470141561SBorawski.Lukasz } 205b4bec66bSAbhishek Patel asyncResp->res.jsonValue[protocolName]["Port"] = 206b4bec66bSAbhishek Patel portNumber; 207b4bec66bSAbhishek Patel }); 208b4bec66bSAbhishek Patel }); 209865fbb75SEd Tanous } 210b4bec66bSAbhishek Patel } // namespace redfish 211501be32bSraviteja-b 2122db77d34SJohnathan Mantey #ifdef BMCWEB_ALLOW_DEPRECATED_HOSTNAME_PATCH 2134f48d5f6SEd Tanous inline void 2144f48d5f6SEd Tanous handleHostnamePatch(const std::string& hostName, 2158d1b46d7Szhanghch05 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 216501be32bSraviteja-b { 217501be32bSraviteja-b crow::connections::systemBus->async_method_call( 218501be32bSraviteja-b [asyncResp](const boost::system::error_code ec) { 219501be32bSraviteja-b if (ec) 220501be32bSraviteja-b { 221501be32bSraviteja-b messages::internalError(asyncResp->res); 222501be32bSraviteja-b return; 223501be32bSraviteja-b } 224501be32bSraviteja-b }, 2257e860f15SJohn Edward Broadbent "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/config", 226501be32bSraviteja-b "org.freedesktop.DBus.Properties", "Set", 227501be32bSraviteja-b "xyz.openbmc_project.Network.SystemConfiguration", "HostName", 228501be32bSraviteja-b std::variant<std::string>(hostName)); 229501be32bSraviteja-b } 2302db77d34SJohnathan Mantey #endif 231501be32bSraviteja-b 2324f48d5f6SEd Tanous inline void handleNTPProtocolEnabled( 2337e860f15SJohn Edward Broadbent const bool& ntpEnabled, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 23420e6ea5dSraviteja-b { 23520e6ea5dSraviteja-b std::string timeSyncMethod; 23620e6ea5dSraviteja-b if (ntpEnabled) 23720e6ea5dSraviteja-b { 2387e860f15SJohn Edward Broadbent timeSyncMethod = "xyz.openbmc_project.Time.Synchronization.Method.NTP"; 23920e6ea5dSraviteja-b } 24020e6ea5dSraviteja-b else 24120e6ea5dSraviteja-b { 24220e6ea5dSraviteja-b timeSyncMethod = 24320e6ea5dSraviteja-b "xyz.openbmc_project.Time.Synchronization.Method.Manual"; 24420e6ea5dSraviteja-b } 24520e6ea5dSraviteja-b 24620e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 24781ce609eSEd Tanous [asyncResp](const boost::system::error_code errorCode) { 24881ce609eSEd Tanous if (errorCode) 249cb13a392SEd Tanous { 250cb13a392SEd Tanous messages::internalError(asyncResp->res); 251cb13a392SEd Tanous } 252cb13a392SEd Tanous }, 2537e860f15SJohn Edward Broadbent "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method", 25420e6ea5dSraviteja-b "org.freedesktop.DBus.Properties", "Set", 25520e6ea5dSraviteja-b "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod", 25620e6ea5dSraviteja-b std::variant<std::string>{timeSyncMethod}); 25720e6ea5dSraviteja-b } 25820e6ea5dSraviteja-b 2594f48d5f6SEd Tanous inline void 2604f48d5f6SEd Tanous handleNTPServersPatch(const std::vector<std::string>& ntpServers, 2618d1b46d7Szhanghch05 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 26220e6ea5dSraviteja-b { 26320e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 264cf05f9dcSJohnathan Mantey [asyncResp](const boost::system::error_code ec) { 26520e6ea5dSraviteja-b if (ec) 26620e6ea5dSraviteja-b { 26720e6ea5dSraviteja-b messages::internalError(asyncResp->res); 26820e6ea5dSraviteja-b return; 26920e6ea5dSraviteja-b } 27020e6ea5dSraviteja-b }, 27120e6ea5dSraviteja-b "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/eth0", 27220e6ea5dSraviteja-b "org.freedesktop.DBus.Properties", "Set", 27320e6ea5dSraviteja-b "xyz.openbmc_project.Network.EthernetInterface", "NTPServers", 27420e6ea5dSraviteja-b std::variant<std::vector<std::string>>{ntpServers}); 27520e6ea5dSraviteja-b } 27620e6ea5dSraviteja-b 2774f48d5f6SEd Tanous inline void 2784f48d5f6SEd Tanous handleProtocolEnabled(const bool protocolEnabled, 279e5a99777SAlbert Zhang const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 280e5a99777SAlbert Zhang const std::string_view netBasePath) 28167a78d87STom Joseph { 28267a78d87STom Joseph crow::connections::systemBus->async_method_call( 283e5a99777SAlbert Zhang [protocolEnabled, asyncResp, 284e5a99777SAlbert Zhang netBasePath](const boost::system::error_code ec, 28567a78d87STom Joseph const crow::openbmc_mapper::GetSubTreeType& subtree) { 28667a78d87STom Joseph if (ec) 28767a78d87STom Joseph { 28867a78d87STom Joseph messages::internalError(asyncResp->res); 28967a78d87STom Joseph return; 29067a78d87STom Joseph } 29167a78d87STom Joseph 29267a78d87STom Joseph for (const auto& entry : subtree) 29367a78d87STom Joseph { 294e5a99777SAlbert Zhang if (boost::algorithm::starts_with(entry.first, netBasePath)) 29567a78d87STom Joseph { 29667a78d87STom Joseph crow::connections::systemBus->async_method_call( 29723a21a1cSEd Tanous [asyncResp](const boost::system::error_code ec2) { 29823a21a1cSEd Tanous if (ec2) 29967a78d87STom Joseph { 30067a78d87STom Joseph messages::internalError(asyncResp->res); 30167a78d87STom Joseph return; 30267a78d87STom Joseph } 30367a78d87STom Joseph }, 30467a78d87STom Joseph entry.second.begin()->first, entry.first, 30567a78d87STom Joseph "org.freedesktop.DBus.Properties", "Set", 30667a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes", 307e5a99777SAlbert Zhang "Running", std::variant<bool>{protocolEnabled}); 30867a78d87STom Joseph 30967a78d87STom Joseph crow::connections::systemBus->async_method_call( 31023a21a1cSEd Tanous [asyncResp](const boost::system::error_code ec2) { 31123a21a1cSEd Tanous if (ec2) 31267a78d87STom Joseph { 31367a78d87STom Joseph messages::internalError(asyncResp->res); 31467a78d87STom Joseph return; 31567a78d87STom Joseph } 31667a78d87STom Joseph }, 31767a78d87STom Joseph entry.second.begin()->first, entry.first, 31867a78d87STom Joseph "org.freedesktop.DBus.Properties", "Set", 31967a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes", 320e5a99777SAlbert Zhang "Enabled", std::variant<bool>{protocolEnabled}); 32167a78d87STom Joseph } 32267a78d87STom Joseph } 32367a78d87STom Joseph }, 32467a78d87STom Joseph "xyz.openbmc_project.ObjectMapper", 32567a78d87STom Joseph "/xyz/openbmc_project/object_mapper", 32667a78d87STom Joseph "xyz.openbmc_project.ObjectMapper", "GetSubTree", 32767a78d87STom Joseph "/xyz/openbmc_project/control/service", 0, 32867a78d87STom Joseph std::array<const char*, 1>{ 32967a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes"}); 33067a78d87STom Joseph } 33167a78d87STom Joseph 3324f48d5f6SEd Tanous inline std::string getHostName() 333501be32bSraviteja-b { 3347e860f15SJohn Edward Broadbent std::string hostName; 3358d1b46d7Szhanghch05 3367e860f15SJohn Edward Broadbent std::array<char, HOST_NAME_MAX> hostNameCStr; 3377e860f15SJohn Edward Broadbent if (gethostname(hostNameCStr.data(), hostNameCStr.size()) == 0) 3387e860f15SJohn Edward Broadbent { 3397e860f15SJohn Edward Broadbent hostName = hostNameCStr.data(); 3407e860f15SJohn Edward Broadbent } 3417e860f15SJohn Edward Broadbent return hostName; 3427e860f15SJohn Edward Broadbent } 3437e860f15SJohn Edward Broadbent 3444f48d5f6SEd Tanous inline void 3454f48d5f6SEd Tanous getNTPProtocolEnabled(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3467e860f15SJohn Edward Broadbent { 3477e860f15SJohn Edward Broadbent crow::connections::systemBus->async_method_call( 3487e860f15SJohn Edward Broadbent [asyncResp](const boost::system::error_code errorCode, 3497e860f15SJohn Edward Broadbent const std::variant<std::string>& timeSyncMethod) { 3507e860f15SJohn Edward Broadbent if (errorCode) 3517e860f15SJohn Edward Broadbent { 3527e860f15SJohn Edward Broadbent return; 3537e860f15SJohn Edward Broadbent } 3547e860f15SJohn Edward Broadbent 3557e860f15SJohn Edward Broadbent const std::string* s = std::get_if<std::string>(&timeSyncMethod); 3567e860f15SJohn Edward Broadbent 3577e860f15SJohn Edward Broadbent if (*s == "xyz.openbmc_project.Time.Synchronization.Method.NTP") 3587e860f15SJohn Edward Broadbent { 3597e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = true; 3607e860f15SJohn Edward Broadbent } 3617e860f15SJohn Edward Broadbent else if (*s == "xyz.openbmc_project.Time.Synchronization." 3627e860f15SJohn Edward Broadbent "Method.Manual") 3637e860f15SJohn Edward Broadbent { 3647e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = false; 3657e860f15SJohn Edward Broadbent } 3667e860f15SJohn Edward Broadbent }, 3677e860f15SJohn Edward Broadbent "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method", 3687e860f15SJohn Edward Broadbent "org.freedesktop.DBus.Properties", "Get", 3697e860f15SJohn Edward Broadbent "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod"); 3707e860f15SJohn Edward Broadbent } 3717e860f15SJohn Edward Broadbent 3727e860f15SJohn Edward Broadbent inline void requestRoutesNetworkProtocol(App& app) 3737e860f15SJohn Edward Broadbent { 3747e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/") 375ed398213SEd Tanous .privileges(redfish::privileges::patchManagerNetworkProtocol) 3767e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::patch)( 3777e860f15SJohn Edward Broadbent [](const crow::Request& req, 3787e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 379501be32bSraviteja-b std::optional<std::string> newHostName; 380cf05f9dcSJohnathan Mantey std::optional<nlohmann::json> ntp; 38167a78d87STom Joseph std::optional<nlohmann::json> ipmi; 382e5a99777SAlbert Zhang std::optional<nlohmann::json> ssh; 383501be32bSraviteja-b 3847e860f15SJohn Edward Broadbent if (!json_util::readJson(req, asyncResp->res, "NTP", ntp, 385e5a99777SAlbert Zhang "HostName", newHostName, "IPMI", ipmi, 386e5a99777SAlbert Zhang "SSH", ssh)) 387501be32bSraviteja-b { 388501be32bSraviteja-b return; 389501be32bSraviteja-b } 390cf05f9dcSJohnathan Mantey 3918d1b46d7Szhanghch05 asyncResp->res.result(boost::beast::http::status::no_content); 392501be32bSraviteja-b if (newHostName) 393501be32bSraviteja-b { 3942db77d34SJohnathan Mantey #ifdef BMCWEB_ALLOW_DEPRECATED_HOSTNAME_PATCH 395501be32bSraviteja-b handleHostnamePatch(*newHostName, asyncResp); 3962db77d34SJohnathan Mantey #else 3972db77d34SJohnathan Mantey messages::propertyNotWritable(asyncResp->res, "HostName"); 3982db77d34SJohnathan Mantey #endif 399cf05f9dcSJohnathan Mantey } 400cf05f9dcSJohnathan Mantey 401cf05f9dcSJohnathan Mantey if (ntp) 402cf05f9dcSJohnathan Mantey { 403cf05f9dcSJohnathan Mantey std::optional<std::vector<std::string>> ntpServers; 404cf05f9dcSJohnathan Mantey std::optional<bool> ntpEnabled; 4058d1b46d7Szhanghch05 if (!json_util::readJson(*ntp, asyncResp->res, "NTPServers", 4067e860f15SJohn Edward Broadbent ntpServers, "ProtocolEnabled", 4077e860f15SJohn Edward Broadbent ntpEnabled)) 408cf05f9dcSJohnathan Mantey { 409501be32bSraviteja-b return; 410501be32bSraviteja-b } 411cf05f9dcSJohnathan Mantey 41220e6ea5dSraviteja-b if (ntpEnabled) 41320e6ea5dSraviteja-b { 41420e6ea5dSraviteja-b handleNTPProtocolEnabled(*ntpEnabled, asyncResp); 41520e6ea5dSraviteja-b } 416cf05f9dcSJohnathan Mantey 41720e6ea5dSraviteja-b if (ntpServers) 41820e6ea5dSraviteja-b { 419dc3fbbd0STony Lee std::sort((*ntpServers).begin(), (*ntpServers).end()); 420dc3fbbd0STony Lee (*ntpServers) 4217e860f15SJohn Edward Broadbent .erase(std::unique((*ntpServers).begin(), 4227e860f15SJohn Edward Broadbent (*ntpServers).end()), 423dc3fbbd0STony Lee (*ntpServers).end()); 42420e6ea5dSraviteja-b handleNTPServersPatch(*ntpServers, asyncResp); 42520e6ea5dSraviteja-b } 426501be32bSraviteja-b } 42767a78d87STom Joseph 42867a78d87STom Joseph if (ipmi) 42967a78d87STom Joseph { 43067a78d87STom Joseph std::optional<bool> ipmiProtocolEnabled; 4317e860f15SJohn Edward Broadbent if (!json_util::readJson(*ipmi, asyncResp->res, 4327e860f15SJohn Edward Broadbent "ProtocolEnabled", 43367a78d87STom Joseph ipmiProtocolEnabled)) 43467a78d87STom Joseph { 43567a78d87STom Joseph return; 43667a78d87STom Joseph } 43767a78d87STom Joseph 43867a78d87STom Joseph if (ipmiProtocolEnabled) 43967a78d87STom Joseph { 440e5a99777SAlbert Zhang handleProtocolEnabled( 441e5a99777SAlbert Zhang *ipmiProtocolEnabled, asyncResp, 442e5a99777SAlbert Zhang "/xyz/openbmc_project/control/service/" 443e5a99777SAlbert Zhang "phosphor_2dipmi_2dnet_40"); 444e5a99777SAlbert Zhang } 445e5a99777SAlbert Zhang } 446e5a99777SAlbert Zhang 447e5a99777SAlbert Zhang if (ssh) 448e5a99777SAlbert Zhang { 449e5a99777SAlbert Zhang std::optional<bool> sshProtocolEnabled; 450e5a99777SAlbert Zhang if (!json_util::readJson(*ssh, asyncResp->res, 451e5a99777SAlbert Zhang "ProtocolEnabled", 452e5a99777SAlbert Zhang sshProtocolEnabled)) 453e5a99777SAlbert Zhang { 454e5a99777SAlbert Zhang return; 455e5a99777SAlbert Zhang } 456e5a99777SAlbert Zhang 457e5a99777SAlbert Zhang if (sshProtocolEnabled) 458e5a99777SAlbert Zhang { 459e5a99777SAlbert Zhang handleProtocolEnabled( 460e5a99777SAlbert Zhang *sshProtocolEnabled, asyncResp, 461e5a99777SAlbert Zhang "/xyz/openbmc_project/control/service/dropbear"); 46267a78d87STom Joseph } 46367a78d87STom Joseph } 4647e860f15SJohn Edward Broadbent }); 4657e860f15SJohn Edward Broadbent 4667e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/") 467ed398213SEd Tanous .privileges(redfish::privileges::getManagerNetworkProtocol) 4687e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 46972048780SAbhishek Patel [](const crow::Request& req, 4707e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 47172048780SAbhishek Patel getNetworkData(asyncResp, req); 4727e860f15SJohn Edward Broadbent }); 473cf05f9dcSJohnathan Mantey } 47470141561SBorawski.Lukasz 47570141561SBorawski.Lukasz } // namespace redfish 476