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 74d24bfc7aSJennifer Lee inline void 75d24bfc7aSJennifer Lee extractNTPServersAndDomainNamesData(const GetManagedObjects& dbus_data, 76d24bfc7aSJennifer Lee std::vector<std::string>& ntpData, 77d24bfc7aSJennifer 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 } 101d24bfc7aSJennifer Lee else if (propertyPair.first == "DomainName") 102d24bfc7aSJennifer Lee { 103d24bfc7aSJennifer Lee const std::vector<std::string>* domainNames = 104d24bfc7aSJennifer Lee sdbusplus::message::variant_ns::get_if< 105d24bfc7aSJennifer Lee std::vector<std::string>>( 106d24bfc7aSJennifer Lee &propertyPair.second); 107d24bfc7aSJennifer Lee if (domainNames != nullptr) 108d24bfc7aSJennifer Lee { 109d24bfc7aSJennifer Lee dnData = std::move(*domainNames); 110d24bfc7aSJennifer Lee } 111d24bfc7aSJennifer 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; 127d24bfc7aSJennifer Lee std::vector<std::string> domainNames; 12820e6ea5dSraviteja-b 12920e6ea5dSraviteja-b if (error_code) 13020e6ea5dSraviteja-b { 131d24bfc7aSJennifer Lee callback(false, ntpServers, domainNames); 13220e6ea5dSraviteja-b return; 13320e6ea5dSraviteja-b } 13420e6ea5dSraviteja-b 135d24bfc7aSJennifer Lee extractNTPServersAndDomainNamesData(dbus_data, ntpServers, 136d24bfc7aSJennifer Lee domainNames); 13720e6ea5dSraviteja-b 138d24bfc7aSJennifer Lee callback(true, ntpServers, domainNames); 13920e6ea5dSraviteja-b }, 14020e6ea5dSraviteja-b "xyz.openbmc_project.Network", "/xyz/openbmc_project/network", 14120e6ea5dSraviteja-b "org.freedesktop.DBus.ObjectManager", "GetManagedObjects"); 142*271584abSEd Tanous } 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 225d24bfc7aSJennifer Lee std::string hostName = getHostName(); 226d24bfc7aSJennifer Lee 227d24bfc7aSJennifer 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*271584abSEd Tanous getEthernetIfaceData( 234*271584abSEd Tanous [hostName, asyncResp](const bool& success, 235d24bfc7aSJennifer Lee const std::vector<std::string>& ntpServers, 236d24bfc7aSJennifer Lee const std::vector<std::string>& domainNames) { 23720e6ea5dSraviteja-b if (!success) 23820e6ea5dSraviteja-b { 239*271584abSEd Tanous messages::resourceNotFound(asyncResp->res, 240*271584abSEd Tanous "EthernetInterface", "eth0"); 24120e6ea5dSraviteja-b return; 24220e6ea5dSraviteja-b } 24320e6ea5dSraviteja-b asyncResp->res.jsonValue["NTP"]["NTPServers"] = ntpServers; 244d24bfc7aSJennifer Lee if (hostName.empty() == false) 245d24bfc7aSJennifer Lee { 246749dad7dSRatan Gupta std::string FQDN = std::move(hostName); 247d24bfc7aSJennifer Lee if (domainNames.empty() == false) 248d24bfc7aSJennifer Lee { 249749dad7dSRatan Gupta FQDN += "." + domainNames[0]; 250d24bfc7aSJennifer Lee } 251749dad7dSRatan Gupta asyncResp->res.jsonValue["FQDN"] = std::move(FQDN); 252d24bfc7aSJennifer Lee } 25320e6ea5dSraviteja-b }); 25420e6ea5dSraviteja-b 255865fbb75SEd Tanous crow::connections::systemBus->async_method_call( 256*271584abSEd Tanous [asyncResp](const boost::system::error_code e, 257*271584abSEd Tanous const std::vector<UnitStruct>& r) { 258*271584abSEd Tanous if (e) 2591abe55efSEd Tanous { 2603a8a0088SKowalski, Kamil asyncResp->res.jsonValue = nlohmann::json::object(); 261f12894f8SJason M. Bills messages::internalError(asyncResp->res); 262865fbb75SEd Tanous return; 2633a8a0088SKowalski, Kamil } 2645968caeeSMarri Devender Rao asyncResp->res.jsonValue["HTTPS"]["Certificates"] = { 2655968caeeSMarri Devender Rao {"@odata.id", "/redfish/v1/Managers/bmc/NetworkProtocol/" 2665968caeeSMarri Devender Rao "HTTPS/Certificates/"}}; 2673a8a0088SKowalski, Kamil 268*271584abSEd Tanous for (auto& unit : r) 2691abe55efSEd Tanous { 2701abe55efSEd Tanous for (auto& kv : protocolToDBus) 2711abe55efSEd Tanous { 2725ded8c79SJennifer Lee if (kv.second.serviceName != 2731abe55efSEd Tanous std::get<NET_PROTO_UNIT_NAME>(unit)) 2741abe55efSEd Tanous { 275865fbb75SEd Tanous continue; 27670141561SBorawski.Lukasz } 277865fbb75SEd Tanous const char* service = kv.first; 278865fbb75SEd Tanous const char* socketPath = kv.second.socketPath; 27970141561SBorawski.Lukasz 280865fbb75SEd Tanous asyncResp->res.jsonValue[service]["ProtocolEnabled"] = 2815ded8c79SJennifer Lee (std::get<NET_PROTO_UNIT_SUB_STATE>(unit) == 2825ded8c79SJennifer Lee "running") || 2835ded8c79SJennifer Lee (std::get<NET_PROTO_UNIT_SUB_STATE>(unit) == 2845ded8c79SJennifer Lee "listening"); 285865fbb75SEd Tanous crow::connections::systemBus->async_method_call( 28643b761d0SEd Tanous [asyncResp, service{std::string(service)}]( 287865fbb75SEd Tanous const boost::system::error_code ec, 288abf2add6SEd Tanous const std::variant<std::vector<std::tuple< 289abf2add6SEd Tanous std::string, std::string>>>& resp) { 2901abe55efSEd Tanous if (ec) 2911abe55efSEd Tanous { 292a08b46ccSJason M. Bills messages::internalError(asyncResp->res); 293865fbb75SEd Tanous return; 2943a8a0088SKowalski, Kamil } 295abf2add6SEd Tanous const std::vector< 296abf2add6SEd Tanous std::tuple<std::string, std::string>>* 297abf2add6SEd Tanous responsePtr = std::get_if<std::vector< 298abf2add6SEd Tanous std::tuple<std::string, std::string>>>( 2991b6b96c5SEd Tanous &resp); 3001abe55efSEd Tanous if (responsePtr == nullptr || 3011abe55efSEd Tanous responsePtr->size() < 1) 3021abe55efSEd Tanous { 303865fbb75SEd Tanous return; 30470141561SBorawski.Lukasz } 30570141561SBorawski.Lukasz 306865fbb75SEd Tanous const std::string& listenStream = 3071abe55efSEd Tanous std::get<NET_PROTO_LISTEN_STREAM>( 3081abe55efSEd Tanous (*responsePtr)[0]); 3091abe55efSEd Tanous std::size_t lastColonPos = 3101abe55efSEd Tanous listenStream.rfind(":"); 3111abe55efSEd Tanous if (lastColonPos == std::string::npos) 3121abe55efSEd Tanous { 313865fbb75SEd Tanous // Not a port 314865fbb75SEd Tanous return; 315865fbb75SEd Tanous } 3161abe55efSEd Tanous std::string portStr = 3171abe55efSEd Tanous listenStream.substr(lastColonPos + 1); 318865fbb75SEd Tanous char* endPtr = nullptr; 3191abe55efSEd Tanous // Use strtol instead of stroi to avoid 3201abe55efSEd Tanous // exceptions 3211abe55efSEd Tanous long port = 3221abe55efSEd Tanous std::strtol(portStr.c_str(), &endPtr, 10); 3231abe55efSEd Tanous if (*endPtr != '\0' || portStr.empty()) 3241abe55efSEd Tanous { 325865fbb75SEd Tanous // Invalid value 3261abe55efSEd Tanous asyncResp->res.jsonValue[service]["Port"] = 3271abe55efSEd Tanous nullptr; 3281abe55efSEd Tanous } 3291abe55efSEd Tanous else 3301abe55efSEd Tanous { 331865fbb75SEd Tanous // Everything OK 3321abe55efSEd Tanous asyncResp->res.jsonValue[service]["Port"] = 3331abe55efSEd Tanous port; 334865fbb75SEd Tanous } 335865fbb75SEd Tanous }, 336865fbb75SEd Tanous "org.freedesktop.systemd1", socketPath, 337865fbb75SEd Tanous "org.freedesktop.DBus.Properties", "Get", 338865fbb75SEd Tanous "org.freedesktop.systemd1.Socket", "Listen"); 339865fbb75SEd Tanous } 340865fbb75SEd Tanous } 341865fbb75SEd Tanous }, 342865fbb75SEd Tanous "org.freedesktop.systemd1", "/org/freedesktop/systemd1", 343865fbb75SEd Tanous "org.freedesktop.systemd1.Manager", "ListUnits"); 344865fbb75SEd Tanous } 345501be32bSraviteja-b 346501be32bSraviteja-b void handleHostnamePatch(const std::string& hostName, 347501be32bSraviteja-b const std::shared_ptr<AsyncResp>& asyncResp) 348501be32bSraviteja-b { 349501be32bSraviteja-b crow::connections::systemBus->async_method_call( 350501be32bSraviteja-b [asyncResp](const boost::system::error_code ec) { 351501be32bSraviteja-b if (ec) 352501be32bSraviteja-b { 353501be32bSraviteja-b messages::internalError(asyncResp->res); 354501be32bSraviteja-b return; 355501be32bSraviteja-b } 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( 380cf05f9dcSJohnathan Mantey [asyncResp](const boost::system::error_code error_code) {}, 38120e6ea5dSraviteja-b "xyz.openbmc_project.Settings", 38220e6ea5dSraviteja-b "/xyz/openbmc_project/time/sync_method", 38320e6ea5dSraviteja-b "org.freedesktop.DBus.Properties", "Set", 38420e6ea5dSraviteja-b "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod", 38520e6ea5dSraviteja-b std::variant<std::string>{timeSyncMethod}); 38620e6ea5dSraviteja-b } 38720e6ea5dSraviteja-b 38820e6ea5dSraviteja-b void handleNTPServersPatch(const std::vector<std::string>& ntpServers, 38920e6ea5dSraviteja-b const std::shared_ptr<AsyncResp>& asyncResp) 39020e6ea5dSraviteja-b { 39120e6ea5dSraviteja-b crow::connections::systemBus->async_method_call( 392cf05f9dcSJohnathan Mantey [asyncResp](const boost::system::error_code ec) { 39320e6ea5dSraviteja-b if (ec) 39420e6ea5dSraviteja-b { 39520e6ea5dSraviteja-b messages::internalError(asyncResp->res); 39620e6ea5dSraviteja-b return; 39720e6ea5dSraviteja-b } 39820e6ea5dSraviteja-b }, 39920e6ea5dSraviteja-b "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/eth0", 40020e6ea5dSraviteja-b "org.freedesktop.DBus.Properties", "Set", 40120e6ea5dSraviteja-b "xyz.openbmc_project.Network.EthernetInterface", "NTPServers", 40220e6ea5dSraviteja-b std::variant<std::vector<std::string>>{ntpServers}); 40320e6ea5dSraviteja-b } 40420e6ea5dSraviteja-b 405501be32bSraviteja-b void doPatch(crow::Response& res, const crow::Request& req, 406501be32bSraviteja-b const std::vector<std::string>& params) override 407501be32bSraviteja-b { 408501be32bSraviteja-b std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res); 409501be32bSraviteja-b std::optional<std::string> newHostName; 410cf05f9dcSJohnathan Mantey std::optional<nlohmann::json> ntp; 411501be32bSraviteja-b 412cf05f9dcSJohnathan Mantey if (!json_util::readJson(req, res, "HostName", newHostName, "NTP", ntp)) 413501be32bSraviteja-b { 414501be32bSraviteja-b return; 415501be32bSraviteja-b } 416cf05f9dcSJohnathan Mantey 417cf05f9dcSJohnathan Mantey res.result(boost::beast::http::status::no_content); 418501be32bSraviteja-b if (newHostName) 419501be32bSraviteja-b { 420501be32bSraviteja-b handleHostnamePatch(*newHostName, asyncResp); 421cf05f9dcSJohnathan Mantey } 422cf05f9dcSJohnathan Mantey 423cf05f9dcSJohnathan Mantey if (ntp) 424cf05f9dcSJohnathan Mantey { 425cf05f9dcSJohnathan Mantey std::optional<std::vector<std::string>> ntpServers; 426cf05f9dcSJohnathan Mantey std::optional<bool> ntpEnabled; 427cf05f9dcSJohnathan Mantey if (!json_util::readJson(*ntp, res, "NTPServers", ntpServers, 428cf05f9dcSJohnathan Mantey "ProtocolEnabled", ntpEnabled)) 429cf05f9dcSJohnathan Mantey { 430501be32bSraviteja-b return; 431501be32bSraviteja-b } 432cf05f9dcSJohnathan Mantey 43320e6ea5dSraviteja-b if (ntpEnabled) 43420e6ea5dSraviteja-b { 43520e6ea5dSraviteja-b handleNTPProtocolEnabled(*ntpEnabled, asyncResp); 43620e6ea5dSraviteja-b } 437cf05f9dcSJohnathan Mantey 43820e6ea5dSraviteja-b if (ntpServers) 43920e6ea5dSraviteja-b { 44020e6ea5dSraviteja-b handleNTPServersPatch(*ntpServers, asyncResp); 44120e6ea5dSraviteja-b } 442501be32bSraviteja-b } 443cf05f9dcSJohnathan Mantey } 44470141561SBorawski.Lukasz }; 44570141561SBorawski.Lukasz 44670141561SBorawski.Lukasz } // namespace redfish 447