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> 23168e20c1SEd Tanous #include <dbus_utility.hpp> 24ed398213SEd Tanous #include <registries/privilege_registry.hpp> 251e1e598dSJonathan Doman #include <sdbusplus/asio/property.hpp> 2620e6ea5dSraviteja-b #include <utils/json_utils.hpp> 27287ece64SGeorge Liu #include <utils/stl_utils.hpp> 281214b7e7SGunnar Mills 291214b7e7SGunnar Mills #include <optional> 30abf2add6SEd Tanous #include <variant> 311abe55efSEd Tanous namespace redfish 321abe55efSEd Tanous { 3370141561SBorawski.Lukasz 347e860f15SJohn Edward Broadbent void getNTPProtocolEnabled(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp); 357e860f15SJohn Edward Broadbent std::string getHostName(); 367e860f15SJohn Edward Broadbent 37b4bec66bSAbhishek Patel const static std::array<std::pair<std::string, std::string>, 3> protocolToDBus{ 38b0972a63SEd Tanous {{"SSH", "dropbear"}, {"HTTPS", "bmcweb"}, {"IPMI", "phosphor-ipmi-net"}}}; 393a8a0088SKowalski, Kamil 40*711ac7a9SEd Tanous inline void extractNTPServersAndDomainNamesData( 41*711ac7a9SEd Tanous const dbus::utility::ManagedObjectType& dbusData, 42*711ac7a9SEd Tanous std::vector<std::string>& ntpData, std::vector<std::string>& dnData) 4320e6ea5dSraviteja-b { 4481ce609eSEd Tanous for (const auto& obj : dbusData) 4520e6ea5dSraviteja-b { 4620e6ea5dSraviteja-b for (const auto& ifacePair : obj.second) 4720e6ea5dSraviteja-b { 480a052baaSGeorge Liu if (ifacePair.first != 4920e6ea5dSraviteja-b "xyz.openbmc_project.Network.EthernetInterface") 5020e6ea5dSraviteja-b { 510a052baaSGeorge Liu continue; 520a052baaSGeorge Liu } 530a052baaSGeorge Liu 5420e6ea5dSraviteja-b for (const auto& propertyPair : ifacePair.second) 5520e6ea5dSraviteja-b { 5620e6ea5dSraviteja-b if (propertyPair.first == "NTPServers") 5720e6ea5dSraviteja-b { 5820e6ea5dSraviteja-b const std::vector<std::string>* ntpServers = 598d78b7a9SPatrick Williams std::get_if<std::vector<std::string>>( 6020e6ea5dSraviteja-b &propertyPair.second); 6120e6ea5dSraviteja-b if (ntpServers != nullptr) 6220e6ea5dSraviteja-b { 63f23b7296SEd Tanous ntpData = *ntpServers; 6420e6ea5dSraviteja-b } 6520e6ea5dSraviteja-b } 66d24bfc7aSJennifer Lee else if (propertyPair.first == "DomainName") 67d24bfc7aSJennifer Lee { 68d24bfc7aSJennifer Lee const std::vector<std::string>* domainNames = 698d78b7a9SPatrick Williams std::get_if<std::vector<std::string>>( 70d24bfc7aSJennifer Lee &propertyPair.second); 71d24bfc7aSJennifer Lee if (domainNames != nullptr) 72d24bfc7aSJennifer Lee { 73f23b7296SEd Tanous dnData = *domainNames; 74d24bfc7aSJennifer Lee } 75d24bfc7aSJennifer Lee } 7620e6ea5dSraviteja-b } 7720e6ea5dSraviteja-b } 7820e6ea5dSraviteja-b } 7920e6ea5dSraviteja-b } 8020e6ea5dSraviteja-b 8120e6ea5dSraviteja-b template <typename CallbackFunc> 8220e6ea5dSraviteja-b void getEthernetIfaceData(CallbackFunc&& callback) 8320e6ea5dSraviteja-b { 8420e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 8520e6ea5dSraviteja-b [callback{std::move(callback)}]( 8681ce609eSEd Tanous const boost::system::error_code errorCode, 87*711ac7a9SEd Tanous const dbus::utility::ManagedObjectType& dbusData) { 8820e6ea5dSraviteja-b std::vector<std::string> ntpServers; 89d24bfc7aSJennifer Lee std::vector<std::string> domainNames; 9020e6ea5dSraviteja-b 9181ce609eSEd Tanous if (errorCode) 9220e6ea5dSraviteja-b { 93d24bfc7aSJennifer Lee callback(false, ntpServers, domainNames); 9420e6ea5dSraviteja-b return; 9520e6ea5dSraviteja-b } 9620e6ea5dSraviteja-b 9781ce609eSEd Tanous extractNTPServersAndDomainNamesData(dbusData, ntpServers, 98d24bfc7aSJennifer Lee domainNames); 9920e6ea5dSraviteja-b 100d24bfc7aSJennifer Lee callback(true, ntpServers, domainNames); 10120e6ea5dSraviteja-b }, 10220e6ea5dSraviteja-b "xyz.openbmc_project.Network", "/xyz/openbmc_project/network", 10320e6ea5dSraviteja-b "org.freedesktop.DBus.ObjectManager", "GetManagedObjects"); 104271584abSEd Tanous } 10520e6ea5dSraviteja-b 1064f48d5f6SEd Tanous inline void getNetworkData(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 10772048780SAbhishek Patel const crow::Request& req) 1081abe55efSEd Tanous { 1090f74e643SEd Tanous asyncResp->res.jsonValue["@odata.type"] = 11061932318SXiaochao Ma "#ManagerNetworkProtocol.v1_5_0.ManagerNetworkProtocol"; 1110f74e643SEd Tanous asyncResp->res.jsonValue["@odata.id"] = 1120f74e643SEd Tanous "/redfish/v1/Managers/bmc/NetworkProtocol"; 1130f74e643SEd Tanous asyncResp->res.jsonValue["Id"] = "NetworkProtocol"; 1140f74e643SEd Tanous asyncResp->res.jsonValue["Name"] = "Manager Network Protocol"; 1150f74e643SEd Tanous asyncResp->res.jsonValue["Description"] = "Manager Network Service"; 1160f74e643SEd Tanous asyncResp->res.jsonValue["Status"]["Health"] = "OK"; 1170f74e643SEd Tanous asyncResp->res.jsonValue["Status"]["HealthRollup"] = "OK"; 1180f74e643SEd Tanous asyncResp->res.jsonValue["Status"]["State"] = "Enabled"; 1190f74e643SEd Tanous 12061932318SXiaochao Ma // HTTP is Mandatory attribute as per OCP Baseline Profile - v1.0.0, 121818ea7b8SJoshi-Mansi // but from security perspective it is not recommended to use. 122818ea7b8SJoshi-Mansi // Hence using protocolEnabled as false to make it OCP and security-wise 123818ea7b8SJoshi-Mansi // compliant 124818ea7b8SJoshi-Mansi asyncResp->res.jsonValue["HTTP"]["Port"] = 0; 125818ea7b8SJoshi-Mansi asyncResp->res.jsonValue["HTTP"]["ProtocolEnabled"] = false; 126818ea7b8SJoshi-Mansi 127d24bfc7aSJennifer Lee std::string hostName = getHostName(); 128d24bfc7aSJennifer Lee 129d24bfc7aSJennifer Lee asyncResp->res.jsonValue["HostName"] = hostName; 1303a8a0088SKowalski, Kamil 13120e6ea5dSraviteja-b getNTPProtocolEnabled(asyncResp); 13220e6ea5dSraviteja-b 1330a052baaSGeorge Liu getEthernetIfaceData([hostName, asyncResp]( 1340a052baaSGeorge Liu const bool& success, 135d24bfc7aSJennifer Lee const std::vector<std::string>& ntpServers, 136d24bfc7aSJennifer Lee const std::vector<std::string>& domainNames) { 13720e6ea5dSraviteja-b if (!success) 13820e6ea5dSraviteja-b { 1390a052baaSGeorge Liu messages::resourceNotFound(asyncResp->res, "ManagerNetworkProtocol", 1400a052baaSGeorge Liu "NetworkProtocol"); 14120e6ea5dSraviteja-b return; 14220e6ea5dSraviteja-b } 14320e6ea5dSraviteja-b asyncResp->res.jsonValue["NTP"]["NTPServers"] = ntpServers; 144d24bfc7aSJennifer Lee if (hostName.empty() == false) 145d24bfc7aSJennifer Lee { 146f23b7296SEd Tanous std::string fqdn = hostName; 147d24bfc7aSJennifer Lee if (domainNames.empty() == false) 148d24bfc7aSJennifer Lee { 149f23b7296SEd Tanous fqdn += "."; 150f23b7296SEd Tanous fqdn += domainNames[0]; 151d24bfc7aSJennifer Lee } 1522c70f800SEd Tanous asyncResp->res.jsonValue["FQDN"] = std::move(fqdn); 153d24bfc7aSJennifer Lee } 15420e6ea5dSraviteja-b }); 15520e6ea5dSraviteja-b 15672048780SAbhishek Patel Privileges effectiveUserPrivileges = 15772048780SAbhishek Patel redfish::getUserPrivileges(req.userRole); 15872048780SAbhishek Patel 15972048780SAbhishek Patel // /redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates is 16072048780SAbhishek Patel // something only ConfigureManager can access then only display when 16172048780SAbhishek Patel // the user has permissions ConfigureManager 16272048780SAbhishek Patel if (isOperationAllowedWithPrivileges({{"ConfigureManager"}}, 16372048780SAbhishek Patel effectiveUserPrivileges)) 16472048780SAbhishek Patel { 1655968caeeSMarri Devender Rao asyncResp->res.jsonValue["HTTPS"]["Certificates"] = { 166b4bec66bSAbhishek Patel {"@odata.id", 167b4bec66bSAbhishek Patel "/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates"}}; 16870141561SBorawski.Lukasz } 16970141561SBorawski.Lukasz 170b4bec66bSAbhishek Patel for (const auto& protocol : protocolToDBus) 171ec4974ddSAppaRao Puli { 172b4bec66bSAbhishek Patel const std::string& protocolName = protocol.first; 173b4bec66bSAbhishek Patel const std::string& serviceName = protocol.second; 174b4bec66bSAbhishek Patel getPortStatusAndPath( 175b4bec66bSAbhishek Patel serviceName, 176b4bec66bSAbhishek Patel [asyncResp, protocolName](const boost::system::error_code ec, 177b4bec66bSAbhishek Patel const std::string& socketPath, 178b4bec66bSAbhishek Patel bool isProtocolEnabled) { 1794d875bd8SEd Tanous // If the service is not installed, that is not an error 1804d875bd8SEd Tanous if (ec == boost::system::errc::no_such_process) 1814d875bd8SEd Tanous { 1824d875bd8SEd Tanous asyncResp->res.jsonValue[protocolName]["Port"] = 1834d875bd8SEd Tanous nlohmann::detail::value_t::null; 1844d875bd8SEd Tanous asyncResp->res.jsonValue[protocolName]["ProtocolEnabled"] = 1854d875bd8SEd Tanous false; 1864d875bd8SEd Tanous return; 1874d875bd8SEd Tanous } 1881abe55efSEd Tanous if (ec) 1891abe55efSEd Tanous { 190a08b46ccSJason M. Bills messages::internalError(asyncResp->res); 191865fbb75SEd Tanous return; 1923a8a0088SKowalski, Kamil } 193b4bec66bSAbhishek Patel asyncResp->res.jsonValue[protocolName]["ProtocolEnabled"] = 194b4bec66bSAbhishek Patel isProtocolEnabled; 195b4bec66bSAbhishek Patel getPortNumber( 196b4bec66bSAbhishek Patel socketPath, 197b4bec66bSAbhishek Patel [asyncResp, protocolName]( 198b4bec66bSAbhishek Patel const boost::system::error_code ec, int portNumber) { 199b4bec66bSAbhishek Patel if (ec) 2001abe55efSEd Tanous { 201b4bec66bSAbhishek Patel messages::internalError(asyncResp->res); 202865fbb75SEd Tanous return; 20370141561SBorawski.Lukasz } 204b4bec66bSAbhishek Patel asyncResp->res.jsonValue[protocolName]["Port"] = 205b4bec66bSAbhishek Patel portNumber; 206b4bec66bSAbhishek Patel }); 207b4bec66bSAbhishek Patel }); 208865fbb75SEd Tanous } 209b4bec66bSAbhishek Patel } // namespace redfish 210501be32bSraviteja-b 2114f48d5f6SEd Tanous inline void handleNTPProtocolEnabled( 2127e860f15SJohn Edward Broadbent const bool& ntpEnabled, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 21320e6ea5dSraviteja-b { 21420e6ea5dSraviteja-b std::string timeSyncMethod; 21520e6ea5dSraviteja-b if (ntpEnabled) 21620e6ea5dSraviteja-b { 2177e860f15SJohn Edward Broadbent timeSyncMethod = "xyz.openbmc_project.Time.Synchronization.Method.NTP"; 21820e6ea5dSraviteja-b } 21920e6ea5dSraviteja-b else 22020e6ea5dSraviteja-b { 22120e6ea5dSraviteja-b timeSyncMethod = 22220e6ea5dSraviteja-b "xyz.openbmc_project.Time.Synchronization.Method.Manual"; 22320e6ea5dSraviteja-b } 22420e6ea5dSraviteja-b 22520e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 22681ce609eSEd Tanous [asyncResp](const boost::system::error_code errorCode) { 22781ce609eSEd Tanous if (errorCode) 228cb13a392SEd Tanous { 229cb13a392SEd Tanous messages::internalError(asyncResp->res); 230cb13a392SEd Tanous } 231cb13a392SEd Tanous }, 2327e860f15SJohn Edward Broadbent "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method", 23320e6ea5dSraviteja-b "org.freedesktop.DBus.Properties", "Set", 23420e6ea5dSraviteja-b "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod", 235168e20c1SEd Tanous dbus::utility::DbusVariantType{timeSyncMethod}); 23620e6ea5dSraviteja-b } 23720e6ea5dSraviteja-b 2384f48d5f6SEd Tanous inline void 239287ece64SGeorge Liu handleNTPServersPatch(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 240287ece64SGeorge Liu std::vector<std::string>& ntpServers) 24120e6ea5dSraviteja-b { 242287ece64SGeorge Liu auto iter = stl_utils::firstDuplicate(ntpServers.begin(), ntpServers.end()); 243287ece64SGeorge Liu if (iter != ntpServers.end()) 244287ece64SGeorge Liu { 245287ece64SGeorge Liu std::string pointer = 246287ece64SGeorge Liu "NTPServers/" + 247287ece64SGeorge Liu std::to_string(std::distance(ntpServers.begin(), iter)); 248287ece64SGeorge Liu messages::propertyValueIncorrect(asyncResp->res, pointer, *iter); 249287ece64SGeorge Liu return; 250287ece64SGeorge Liu } 251287ece64SGeorge Liu 25220e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 2530a052baaSGeorge Liu [asyncResp, 2540a052baaSGeorge Liu ntpServers](boost::system::error_code ec, 2550a052baaSGeorge Liu const crow::openbmc_mapper::GetSubTreeType& subtree) { 2560a052baaSGeorge Liu if (ec) 2570a052baaSGeorge Liu { 2580a052baaSGeorge Liu BMCWEB_LOG_WARNING << "D-Bus error: " << ec << ", " 2590a052baaSGeorge Liu << ec.message(); 2600a052baaSGeorge Liu messages::internalError(asyncResp->res); 2610a052baaSGeorge Liu return; 2620a052baaSGeorge Liu } 2630a052baaSGeorge Liu 2640a052baaSGeorge Liu for (const auto& [objectPath, serviceMap] : subtree) 2650a052baaSGeorge Liu { 2660a052baaSGeorge Liu for (const auto& [service, interfaces] : serviceMap) 2670a052baaSGeorge Liu { 2680a052baaSGeorge Liu for (const auto& interface : interfaces) 2690a052baaSGeorge Liu { 2700a052baaSGeorge Liu if (interface != 2710a052baaSGeorge Liu "xyz.openbmc_project.Network.EthernetInterface") 2720a052baaSGeorge Liu { 2730a052baaSGeorge Liu continue; 2740a052baaSGeorge Liu } 2750a052baaSGeorge Liu 2760a052baaSGeorge Liu crow::connections::systemBus->async_method_call( 277cf05f9dcSJohnathan Mantey [asyncResp](const boost::system::error_code ec) { 27820e6ea5dSraviteja-b if (ec) 27920e6ea5dSraviteja-b { 28020e6ea5dSraviteja-b messages::internalError(asyncResp->res); 28120e6ea5dSraviteja-b return; 28220e6ea5dSraviteja-b } 28320e6ea5dSraviteja-b }, 2840a052baaSGeorge Liu service, objectPath, 2850a052baaSGeorge Liu "org.freedesktop.DBus.Properties", "Set", interface, 2860a052baaSGeorge Liu "NTPServers", 287168e20c1SEd Tanous dbus::utility::DbusVariantType{ntpServers}); 28820e6ea5dSraviteja-b } 2890a052baaSGeorge Liu } 2900a052baaSGeorge Liu } 2910a052baaSGeorge Liu }, 2920a052baaSGeorge Liu "xyz.openbmc_project.ObjectMapper", 2930a052baaSGeorge Liu "/xyz/openbmc_project/object_mapper", 2940a052baaSGeorge Liu "xyz.openbmc_project.ObjectMapper", "GetSubTree", 2950a052baaSGeorge Liu "/xyz/openbmc_project", 0, 2960a052baaSGeorge Liu std::array<const char*, 1>{ 2970a052baaSGeorge Liu "xyz.openbmc_project.Network.EthernetInterface"}); 2980a052baaSGeorge Liu } 29920e6ea5dSraviteja-b 3004f48d5f6SEd Tanous inline void 3014f48d5f6SEd Tanous handleProtocolEnabled(const bool protocolEnabled, 302e5a99777SAlbert Zhang const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 303e5a99777SAlbert Zhang const std::string_view netBasePath) 30467a78d87STom Joseph { 30567a78d87STom Joseph crow::connections::systemBus->async_method_call( 306e5a99777SAlbert Zhang [protocolEnabled, asyncResp, 307e5a99777SAlbert Zhang netBasePath](const boost::system::error_code ec, 30867a78d87STom Joseph const crow::openbmc_mapper::GetSubTreeType& subtree) { 30967a78d87STom Joseph if (ec) 31067a78d87STom Joseph { 31167a78d87STom Joseph messages::internalError(asyncResp->res); 31267a78d87STom Joseph return; 31367a78d87STom Joseph } 31467a78d87STom Joseph 31567a78d87STom Joseph for (const auto& entry : subtree) 31667a78d87STom Joseph { 317e5a99777SAlbert Zhang if (boost::algorithm::starts_with(entry.first, netBasePath)) 31867a78d87STom Joseph { 31967a78d87STom Joseph crow::connections::systemBus->async_method_call( 32023a21a1cSEd Tanous [asyncResp](const boost::system::error_code ec2) { 32123a21a1cSEd Tanous if (ec2) 32267a78d87STom Joseph { 32367a78d87STom Joseph messages::internalError(asyncResp->res); 32467a78d87STom Joseph return; 32567a78d87STom Joseph } 32667a78d87STom Joseph }, 32767a78d87STom Joseph entry.second.begin()->first, entry.first, 32867a78d87STom Joseph "org.freedesktop.DBus.Properties", "Set", 32967a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes", 330168e20c1SEd Tanous "Running", 331168e20c1SEd Tanous dbus::utility::DbusVariantType{protocolEnabled}); 33267a78d87STom Joseph 33367a78d87STom Joseph crow::connections::systemBus->async_method_call( 33423a21a1cSEd Tanous [asyncResp](const boost::system::error_code ec2) { 33523a21a1cSEd Tanous if (ec2) 33667a78d87STom Joseph { 33767a78d87STom Joseph messages::internalError(asyncResp->res); 33867a78d87STom Joseph return; 33967a78d87STom Joseph } 34067a78d87STom Joseph }, 34167a78d87STom Joseph entry.second.begin()->first, entry.first, 34267a78d87STom Joseph "org.freedesktop.DBus.Properties", "Set", 34367a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes", 344168e20c1SEd Tanous "Enabled", 345168e20c1SEd Tanous dbus::utility::DbusVariantType{protocolEnabled}); 34667a78d87STom Joseph } 34767a78d87STom Joseph } 34867a78d87STom Joseph }, 34967a78d87STom Joseph "xyz.openbmc_project.ObjectMapper", 35067a78d87STom Joseph "/xyz/openbmc_project/object_mapper", 35167a78d87STom Joseph "xyz.openbmc_project.ObjectMapper", "GetSubTree", 35267a78d87STom Joseph "/xyz/openbmc_project/control/service", 0, 35367a78d87STom Joseph std::array<const char*, 1>{ 35467a78d87STom Joseph "xyz.openbmc_project.Control.Service.Attributes"}); 35567a78d87STom Joseph } 35667a78d87STom Joseph 3574f48d5f6SEd Tanous inline std::string getHostName() 358501be32bSraviteja-b { 3597e860f15SJohn Edward Broadbent std::string hostName; 3608d1b46d7Szhanghch05 3617e860f15SJohn Edward Broadbent std::array<char, HOST_NAME_MAX> hostNameCStr; 3627e860f15SJohn Edward Broadbent if (gethostname(hostNameCStr.data(), hostNameCStr.size()) == 0) 3637e860f15SJohn Edward Broadbent { 3647e860f15SJohn Edward Broadbent hostName = hostNameCStr.data(); 3657e860f15SJohn Edward Broadbent } 3667e860f15SJohn Edward Broadbent return hostName; 3677e860f15SJohn Edward Broadbent } 3687e860f15SJohn Edward Broadbent 3694f48d5f6SEd Tanous inline void 3704f48d5f6SEd Tanous getNTPProtocolEnabled(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3717e860f15SJohn Edward Broadbent { 3721e1e598dSJonathan Doman sdbusplus::asio::getProperty<std::string>( 3731e1e598dSJonathan Doman *crow::connections::systemBus, "xyz.openbmc_project.Settings", 3741e1e598dSJonathan Doman "/xyz/openbmc_project/time/sync_method", 3751e1e598dSJonathan Doman "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod", 3767e860f15SJohn Edward Broadbent [asyncResp](const boost::system::error_code errorCode, 3771e1e598dSJonathan Doman const std::string& timeSyncMethod) { 3787e860f15SJohn Edward Broadbent if (errorCode) 3797e860f15SJohn Edward Broadbent { 3807e860f15SJohn Edward Broadbent return; 3817e860f15SJohn Edward Broadbent } 3827e860f15SJohn Edward Broadbent 3831e1e598dSJonathan Doman if (timeSyncMethod == 3841e1e598dSJonathan Doman "xyz.openbmc_project.Time.Synchronization.Method.NTP") 3857e860f15SJohn Edward Broadbent { 3867e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = true; 3877e860f15SJohn Edward Broadbent } 3881e1e598dSJonathan Doman else if (timeSyncMethod == 3891e1e598dSJonathan Doman "xyz.openbmc_project.Time.Synchronization." 3901e1e598dSJonathan Doman "Method.Manual") 3917e860f15SJohn Edward Broadbent { 3927e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["NTP"]["ProtocolEnabled"] = false; 3937e860f15SJohn Edward Broadbent } 3941e1e598dSJonathan Doman }); 3957e860f15SJohn Edward Broadbent } 3967e860f15SJohn Edward Broadbent 3977e860f15SJohn Edward Broadbent inline void requestRoutesNetworkProtocol(App& app) 3987e860f15SJohn Edward Broadbent { 3997e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/") 400ed398213SEd Tanous .privileges(redfish::privileges::patchManagerNetworkProtocol) 4010fda0f12SGeorge Liu .methods( 4020fda0f12SGeorge Liu boost::beast::http::verb:: 4030fda0f12SGeorge Liu patch)([](const crow::Request& req, 4047e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 405501be32bSraviteja-b std::optional<std::string> newHostName; 406cf05f9dcSJohnathan Mantey std::optional<nlohmann::json> ntp; 40767a78d87STom Joseph std::optional<nlohmann::json> ipmi; 408e5a99777SAlbert Zhang std::optional<nlohmann::json> ssh; 409501be32bSraviteja-b 4107e860f15SJohn Edward Broadbent if (!json_util::readJson(req, asyncResp->res, "NTP", ntp, 411e5a99777SAlbert Zhang "HostName", newHostName, "IPMI", ipmi, 412e5a99777SAlbert Zhang "SSH", ssh)) 413501be32bSraviteja-b { 414501be32bSraviteja-b return; 415501be32bSraviteja-b } 416cf05f9dcSJohnathan Mantey 4178d1b46d7Szhanghch05 asyncResp->res.result(boost::beast::http::status::no_content); 418501be32bSraviteja-b if (newHostName) 419501be32bSraviteja-b { 4202db77d34SJohnathan Mantey messages::propertyNotWritable(asyncResp->res, "HostName"); 42144fad2aaSEd Tanous return; 422cf05f9dcSJohnathan Mantey } 423cf05f9dcSJohnathan Mantey 424cf05f9dcSJohnathan Mantey if (ntp) 425cf05f9dcSJohnathan Mantey { 426cf05f9dcSJohnathan Mantey std::optional<std::vector<std::string>> ntpServers; 427cf05f9dcSJohnathan Mantey std::optional<bool> ntpEnabled; 4288d1b46d7Szhanghch05 if (!json_util::readJson(*ntp, asyncResp->res, "NTPServers", 4297e860f15SJohn Edward Broadbent ntpServers, "ProtocolEnabled", 4307e860f15SJohn Edward Broadbent ntpEnabled)) 431cf05f9dcSJohnathan Mantey { 432501be32bSraviteja-b return; 433501be32bSraviteja-b } 434cf05f9dcSJohnathan Mantey 43520e6ea5dSraviteja-b if (ntpEnabled) 43620e6ea5dSraviteja-b { 43720e6ea5dSraviteja-b handleNTPProtocolEnabled(*ntpEnabled, asyncResp); 43820e6ea5dSraviteja-b } 439cf05f9dcSJohnathan Mantey 44020e6ea5dSraviteja-b if (ntpServers) 44120e6ea5dSraviteja-b { 442287ece64SGeorge Liu stl_utils::removeDuplicate(*ntpServers); 443287ece64SGeorge Liu handleNTPServersPatch(asyncResp, *ntpServers); 44420e6ea5dSraviteja-b } 445501be32bSraviteja-b } 44667a78d87STom Joseph 44767a78d87STom Joseph if (ipmi) 44867a78d87STom Joseph { 44967a78d87STom Joseph std::optional<bool> ipmiProtocolEnabled; 4507e860f15SJohn Edward Broadbent if (!json_util::readJson(*ipmi, asyncResp->res, 4517e860f15SJohn Edward Broadbent "ProtocolEnabled", 45267a78d87STom Joseph ipmiProtocolEnabled)) 45367a78d87STom Joseph { 45467a78d87STom Joseph return; 45567a78d87STom Joseph } 45667a78d87STom Joseph 45767a78d87STom Joseph if (ipmiProtocolEnabled) 45867a78d87STom Joseph { 459e5a99777SAlbert Zhang handleProtocolEnabled( 460e5a99777SAlbert Zhang *ipmiProtocolEnabled, asyncResp, 4610fda0f12SGeorge Liu "/xyz/openbmc_project/control/service/phosphor_2dipmi_2dnet_40"); 462e5a99777SAlbert Zhang } 463e5a99777SAlbert Zhang } 464e5a99777SAlbert Zhang 465e5a99777SAlbert Zhang if (ssh) 466e5a99777SAlbert Zhang { 467e5a99777SAlbert Zhang std::optional<bool> sshProtocolEnabled; 468e5a99777SAlbert Zhang if (!json_util::readJson(*ssh, asyncResp->res, 4690fda0f12SGeorge Liu "ProtocolEnabled", sshProtocolEnabled)) 470e5a99777SAlbert Zhang { 471e5a99777SAlbert Zhang return; 472e5a99777SAlbert Zhang } 473e5a99777SAlbert Zhang 474e5a99777SAlbert Zhang if (sshProtocolEnabled) 475e5a99777SAlbert Zhang { 476e5a99777SAlbert Zhang handleProtocolEnabled( 477e5a99777SAlbert Zhang *sshProtocolEnabled, asyncResp, 478e5a99777SAlbert Zhang "/xyz/openbmc_project/control/service/dropbear"); 47967a78d87STom Joseph } 48067a78d87STom Joseph } 4817e860f15SJohn Edward Broadbent }); 4827e860f15SJohn Edward Broadbent 4837e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Managers/bmc/NetworkProtocol/") 484ed398213SEd Tanous .privileges(redfish::privileges::getManagerNetworkProtocol) 4857e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 48672048780SAbhishek Patel [](const crow::Request& req, 4877e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 48872048780SAbhishek Patel getNetworkData(asyncResp, req); 4897e860f15SJohn Edward Broadbent }); 490cf05f9dcSJohnathan Mantey } 49170141561SBorawski.Lukasz 49270141561SBorawski.Lukasz } // namespace redfish 493