xref: /openbmc/phosphor-logging/phosphor-rsyslog-config/server-conf.hpp (revision 25291157927273a4ac459c6479c1d3090ddc6a16)
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