1c4966192SDeepak Kodihalli #pragma once 2c4966192SDeepak Kodihalli 3f18bf836SPatrick Venture #include "xyz/openbmc_project/Network/Client/server.hpp" 4f18bf836SPatrick Venture 5f18bf836SPatrick Venture #include <phosphor-logging/log.hpp> 6c4966192SDeepak Kodihalli #include <sdbusplus/bus.hpp> 7c4966192SDeepak Kodihalli #include <sdbusplus/server/object.hpp> 82544b419SPatrick Williams 9c4966192SDeepak Kodihalli #include <string> 10c4966192SDeepak Kodihalli 11c4966192SDeepak Kodihalli namespace phosphor 12c4966192SDeepak Kodihalli { 13c4966192SDeepak Kodihalli namespace rsyslog_config 14c4966192SDeepak Kodihalli { 15c4966192SDeepak Kodihalli 169fab279fSDeepak Kodihalli using namespace phosphor::logging; 17c4966192SDeepak Kodihalli using NetworkClient = sdbusplus::xyz::openbmc_project::Network::server::Client; 1845e83521SPatrick Williams using Iface = sdbusplus::server::object_t<NetworkClient>; 19aabb92efSDeepak Kodihalli namespace sdbusRule = sdbusplus::bus::match::rules; 20c4966192SDeepak Kodihalli 21c4966192SDeepak Kodihalli /** @class Server 22c4966192SDeepak Kodihalli * @brief Configuration for rsyslog server 23c4966192SDeepak Kodihalli * @details A concrete implementation of the 24c4966192SDeepak Kodihalli * xyz.openbmc_project.Network.Client API, in order to 25c4966192SDeepak Kodihalli * provide remote rsyslog server's address and port. 26c4966192SDeepak Kodihalli */ 27c4966192SDeepak Kodihalli class Server : public Iface 28c4966192SDeepak Kodihalli { 29c4966192SDeepak Kodihalli public: 30c4966192SDeepak Kodihalli Server() = delete; 31c4966192SDeepak Kodihalli Server(const Server&) = delete; 32c4966192SDeepak Kodihalli Server& operator=(const Server&) = delete; 33c4966192SDeepak Kodihalli Server(Server&&) = delete; 34c4966192SDeepak Kodihalli Server& operator=(Server&&) = delete; 35c4966192SDeepak Kodihalli virtual ~Server() = default; 36c4966192SDeepak Kodihalli 37c4966192SDeepak Kodihalli /** @brief Constructor to put object onto bus at a dbus path. 38c4966192SDeepak Kodihalli * @param[in] bus - Bus to attach to. 39c4966192SDeepak Kodihalli * @param[in] path - Path to attach at. 40c4966192SDeepak Kodihalli * @param[in] filePath - rsyslog remote logging config file 41c4966192SDeepak Kodihalli */ Server(sdbusplus::bus_t & bus,const std::string & path,const char * filePath)4245e83521SPatrick Williams Server(sdbusplus::bus_t& bus, const std::string& path, 43c4966192SDeepak Kodihalli const char* filePath) : 446ef6b25eSPatrick Williams Iface(bus, path.c_str(), Iface::action::defer_emit), 45aabb92efSDeepak Kodihalli configFilePath(filePath), 46aabb92efSDeepak Kodihalli hostnameChange( 47aabb92efSDeepak Kodihalli bus, 48f18bf836SPatrick Venture sdbusRule::propertiesChanged("/org/freedesktop/hostname1", 49f18bf836SPatrick Venture "org.freedesktop.hostname1"), 50f18bf836SPatrick Venture std::bind(std::mem_fn(&Server::hostnameChanged), this, 51f18bf836SPatrick Venture std::placeholders::_1)) 52c4966192SDeepak Kodihalli { 539fab279fSDeepak Kodihalli try 549fab279fSDeepak Kodihalli { 559fab279fSDeepak Kodihalli restore(configFilePath.c_str()); 569fab279fSDeepak Kodihalli } 579fab279fSDeepak Kodihalli catch (const std::exception& e) 589fab279fSDeepak Kodihalli { 599fab279fSDeepak Kodihalli log<level::ERR>(e.what()); 609fab279fSDeepak Kodihalli } 619fab279fSDeepak Kodihalli 629fab279fSDeepak Kodihalli emit_object_added(); 63c4966192SDeepak Kodihalli } 64c4966192SDeepak Kodihalli 65c4966192SDeepak Kodihalli using NetworkClient::address; 66c4966192SDeepak Kodihalli using NetworkClient::port; 6722e8695fSIvan Mikhaylov using NetworkClient::transportProtocol; 68c4966192SDeepak Kodihalli 69c4966192SDeepak Kodihalli /** @brief Override that updates rsyslog config file as well 70c4966192SDeepak Kodihalli * @param[in] value - remote server address 71c4966192SDeepak Kodihalli * @returns value of changed address 72c4966192SDeepak Kodihalli */ 73c4966192SDeepak Kodihalli virtual std::string address(std::string value) override; 74c4966192SDeepak Kodihalli 75c4966192SDeepak Kodihalli /** @brief Override that updates rsyslog config file as well 76c4966192SDeepak Kodihalli * @param[in] value - remote server port 77c4966192SDeepak Kodihalli * @returns value of changed port 78c4966192SDeepak Kodihalli */ 79c4966192SDeepak Kodihalli virtual uint16_t port(uint16_t value) override; 80c4966192SDeepak Kodihalli 812ce7b2c3SDeepak Kodihalli /** @brief Restart rsyslog's systemd unit 822ce7b2c3SDeepak Kodihalli */ 832ce7b2c3SDeepak Kodihalli virtual void restart(); 842ce7b2c3SDeepak Kodihalli 8522e8695fSIvan Mikhaylov /** @brief Set protocol for rsyslog TCP or UDP. 8622e8695fSIvan Mikhaylov * @param[in] value - UDP/TCP. 8722e8695fSIvan Mikhaylov * @returns protocol value 8822e8695fSIvan Mikhaylov */ 89*25291157SPatrick Williams virtual TransportProtocol transportProtocol( 90*25291157SPatrick Williams TransportProtocol protocol) override; 9122e8695fSIvan Mikhaylov 92c4966192SDeepak Kodihalli private: 93c4966192SDeepak Kodihalli /** @brief Update remote server address and port in 94c4966192SDeepak Kodihalli * rsyslog config file. 95c4966192SDeepak Kodihalli * @param[in] serverAddress - remote server address 96c4966192SDeepak Kodihalli * @param[in] serverPort - remote server port 9722e8695fSIvan Mikhaylov * @param[in] serverTransportProtocol - remote server protocol TCP/UDP 98c4966192SDeepak Kodihalli * @param[in] filePath - rsyslog config file path 99c4966192SDeepak Kodihalli */ 100f18bf836SPatrick Venture void writeConfig(const std::string& serverAddress, uint16_t serverPort, 10122e8695fSIvan Mikhaylov TransportProtocol protocol, const char* filePath); 102c4966192SDeepak Kodihalli 1034db8146dSDeepak Kodihalli /** @brief Checks if input IP address is valid (uses getaddrinfo) 1044db8146dSDeepak Kodihalli * @param[in] address - server address 1054db8146dSDeepak Kodihalli * @returns true if valid, false otherwise 1064db8146dSDeepak Kodihalli */ 1074db8146dSDeepak Kodihalli bool addressValid(const std::string& address); 1084db8146dSDeepak Kodihalli 1099fab279fSDeepak Kodihalli /** @brief Populate existing config into D-Bus properties 1109fab279fSDeepak Kodihalli * @param[in] filePath - rsyslog config file path 1119fab279fSDeepak Kodihalli */ 1129fab279fSDeepak Kodihalli void restore(const char* filePath); 1139fab279fSDeepak Kodihalli 114c4966192SDeepak Kodihalli std::string configFilePath{}; 115aabb92efSDeepak Kodihalli 116aabb92efSDeepak Kodihalli /** @brief React to hostname change 117aabb92efSDeepak Kodihalli * @param[in] msg - sdbusplus message 118aabb92efSDeepak Kodihalli */ hostnameChanged(sdbusplus::message_t &)11945e83521SPatrick Williams void hostnameChanged(sdbusplus::message_t& /*msg*/) 120aabb92efSDeepak Kodihalli { 121aabb92efSDeepak Kodihalli restart(); 122aabb92efSDeepak Kodihalli } 123aabb92efSDeepak Kodihalli 124aabb92efSDeepak Kodihalli sdbusplus::bus::match_t hostnameChange; 125c4966192SDeepak Kodihalli }; 126c4966192SDeepak Kodihalli 127c4966192SDeepak Kodihalli } // namespace rsyslog_config 128c4966192SDeepak Kodihalli } // namespace phosphor 129