| #pragma once | 
 |  | 
 | #include "xyz/openbmc_project/Network/Client/server.hpp" | 
 |  | 
 | #include <phosphor-logging/log.hpp> | 
 | #include <sdbusplus/bus.hpp> | 
 | #include <sdbusplus/server/object.hpp> | 
 | #include <string> | 
 |  | 
 | namespace phosphor | 
 | { | 
 | namespace rsyslog_config | 
 | { | 
 |  | 
 | using namespace phosphor::logging; | 
 | using NetworkClient = sdbusplus::xyz::openbmc_project::Network::server::Client; | 
 | using Iface = sdbusplus::server::object::object<NetworkClient>; | 
 | namespace sdbusRule = sdbusplus::bus::match::rules; | 
 |  | 
 | /** @class Server | 
 |  *  @brief Configuration for rsyslog server | 
 |  *  @details A concrete implementation of the | 
 |  *  xyz.openbmc_project.Network.Client API, in order to | 
 |  *  provide remote rsyslog server's address and port. | 
 |  */ | 
 | class Server : public Iface | 
 | { | 
 |   public: | 
 |     Server() = delete; | 
 |     Server(const Server&) = delete; | 
 |     Server& operator=(const Server&) = delete; | 
 |     Server(Server&&) = delete; | 
 |     Server& operator=(Server&&) = delete; | 
 |     virtual ~Server() = default; | 
 |  | 
 |     /** @brief Constructor to put object onto bus at a dbus path. | 
 |      *  @param[in] bus - Bus to attach to. | 
 |      *  @param[in] path - Path to attach at. | 
 |      *  @param[in] filePath - rsyslog remote logging config file | 
 |      */ | 
 |     Server(sdbusplus::bus::bus& bus, const std::string& path, | 
 |            const char* filePath) : | 
 |         Iface(bus, path.c_str(), true), | 
 |         configFilePath(filePath), | 
 |         hostnameChange( | 
 |             bus, | 
 |             sdbusRule::propertiesChanged("/org/freedesktop/hostname1", | 
 |                                          "org.freedesktop.hostname1"), | 
 |             std::bind(std::mem_fn(&Server::hostnameChanged), this, | 
 |                       std::placeholders::_1)) | 
 |     { | 
 |         try | 
 |         { | 
 |             restore(configFilePath.c_str()); | 
 |         } | 
 |         catch (const std::exception& e) | 
 |         { | 
 |             log<level::ERR>(e.what()); | 
 |         } | 
 |  | 
 |         emit_object_added(); | 
 |     } | 
 |  | 
 |     using NetworkClient::address; | 
 |     using NetworkClient::port; | 
 |  | 
 |     /** @brief Override that updates rsyslog config file as well | 
 |      *  @param[in] value - remote server address | 
 |      *  @returns value of changed address | 
 |      */ | 
 |     virtual std::string address(std::string value) override; | 
 |  | 
 |     /** @brief Override that updates rsyslog config file as well | 
 |      *  @param[in] value - remote server port | 
 |      *  @returns value of changed port | 
 |      */ | 
 |     virtual uint16_t port(uint16_t value) override; | 
 |  | 
 |     /** @brief Restart rsyslog's systemd unit | 
 |      */ | 
 |     virtual void restart(); | 
 |  | 
 |   private: | 
 |     /** @brief Update remote server address and port in | 
 |      *         rsyslog config file. | 
 |      *  @param[in] serverAddress - remote server address | 
 |      *  @param[in] serverPort - remote server port | 
 |      *  @param[in] filePath - rsyslog config file path | 
 |      */ | 
 |     void writeConfig(const std::string& serverAddress, uint16_t serverPort, | 
 |                      const char* filePath); | 
 |  | 
 |     /** @brief Checks if input IP address is valid (uses getaddrinfo) | 
 |      *  @param[in] address - server address | 
 |      *  @returns true if valid, false otherwise | 
 |      */ | 
 |     bool addressValid(const std::string& address); | 
 |  | 
 |     /** @brief Populate existing config into D-Bus properties | 
 |      *  @param[in] filePath - rsyslog config file path | 
 |      */ | 
 |     void restore(const char* filePath); | 
 |  | 
 |     std::string configFilePath{}; | 
 |  | 
 |     /** @brief React to hostname change | 
 |      *  @param[in] msg - sdbusplus message | 
 |      */ | 
 |     void hostnameChanged(sdbusplus::message::message& /*msg*/) | 
 |     { | 
 |         restart(); | 
 |     } | 
 |  | 
 |     sdbusplus::bus::match_t hostnameChange; | 
 | }; | 
 |  | 
 | } // namespace rsyslog_config | 
 | } // namespace phosphor |