blob: 33e92aab29b63879cccae6c5ce27b858d1a19efd [file] [log] [blame]
Deepak Kodihallic4966192018-08-23 02:19:58 -05001#pragma once
2
Patrick Venturef18bf832018-10-26 18:14:00 -07003#include "xyz/openbmc_project/Network/Client/server.hpp"
4
5#include <phosphor-logging/log.hpp>
Deepak Kodihallic4966192018-08-23 02:19:58 -05006#include <sdbusplus/bus.hpp>
7#include <sdbusplus/server/object.hpp>
Patrick Williams2544b412022-10-04 08:41:06 -05008
Deepak Kodihallic4966192018-08-23 02:19:58 -05009#include <string>
Deepak Kodihallic4966192018-08-23 02:19:58 -050010
11namespace phosphor
12{
13namespace rsyslog_config
14{
15
Deepak Kodihalli9fab2792018-08-28 07:47:11 -050016using namespace phosphor::logging;
Deepak Kodihallic4966192018-08-23 02:19:58 -050017using NetworkClient = sdbusplus::xyz::openbmc_project::Network::server::Client;
Patrick Williams45e83522022-07-22 19:26:52 -050018using Iface = sdbusplus::server::object_t<NetworkClient>;
Deepak Kodihalliaabb92e2018-10-17 05:03:20 -050019namespace sdbusRule = sdbusplus::bus::match::rules;
Deepak Kodihallic4966192018-08-23 02:19:58 -050020
21/** @class Server
22 * @brief Configuration for rsyslog server
23 * @details A concrete implementation of the
24 * xyz.openbmc_project.Network.Client API, in order to
25 * provide remote rsyslog server's address and port.
26 */
27class Server : public Iface
28{
Patrick Venturef18bf832018-10-26 18:14:00 -070029 public:
30 Server() = delete;
31 Server(const Server&) = delete;
32 Server& operator=(const Server&) = delete;
33 Server(Server&&) = delete;
34 Server& operator=(Server&&) = delete;
35 virtual ~Server() = default;
Deepak Kodihallic4966192018-08-23 02:19:58 -050036
Patrick Venturef18bf832018-10-26 18:14:00 -070037 /** @brief Constructor to put object onto bus at a dbus path.
38 * @param[in] bus - Bus to attach to.
39 * @param[in] path - Path to attach at.
40 * @param[in] filePath - rsyslog remote logging config file
41 */
Patrick Williams45e83522022-07-22 19:26:52 -050042 Server(sdbusplus::bus_t& bus, const std::string& path,
Patrick Venturef18bf832018-10-26 18:14:00 -070043 const char* filePath) :
Patrick Williams6ef6b252022-03-30 14:28:27 -050044 Iface(bus, path.c_str(), Iface::action::defer_emit),
Patrick Venturef18bf832018-10-26 18:14:00 -070045 configFilePath(filePath),
46 hostnameChange(
47 bus,
48 sdbusRule::propertiesChanged("/org/freedesktop/hostname1",
49 "org.freedesktop.hostname1"),
50 std::bind(std::mem_fn(&Server::hostnameChanged), this,
51 std::placeholders::_1))
52 {
53 try
Deepak Kodihallic4966192018-08-23 02:19:58 -050054 {
Patrick Venturef18bf832018-10-26 18:14:00 -070055 restore(configFilePath.c_str());
56 }
57 catch (const std::exception& e)
58 {
59 log<level::ERR>(e.what());
Deepak Kodihallic4966192018-08-23 02:19:58 -050060 }
61
Patrick Venturef18bf832018-10-26 18:14:00 -070062 emit_object_added();
63 }
Deepak Kodihallic4966192018-08-23 02:19:58 -050064
Patrick Venturef18bf832018-10-26 18:14:00 -070065 using NetworkClient::address;
66 using NetworkClient::port;
Ivan Mikhaylov22e86952023-06-09 17:54:03 +030067 using NetworkClient::transportProtocol;
Deepak Kodihallic4966192018-08-23 02:19:58 -050068
Patrick Venturef18bf832018-10-26 18:14:00 -070069 /** @brief Override that updates rsyslog config file as well
70 * @param[in] value - remote server address
71 * @returns value of changed address
72 */
73 virtual std::string address(std::string value) override;
Deepak Kodihallic4966192018-08-23 02:19:58 -050074
Patrick Venturef18bf832018-10-26 18:14:00 -070075 /** @brief Override that updates rsyslog config file as well
76 * @param[in] value - remote server port
77 * @returns value of changed port
78 */
79 virtual uint16_t port(uint16_t value) override;
Deepak Kodihalli2ce7b2c2018-08-31 04:22:55 -050080
Patrick Venturef18bf832018-10-26 18:14:00 -070081 /** @brief Restart rsyslog's systemd unit
82 */
83 virtual void restart();
Deepak Kodihallic4966192018-08-23 02:19:58 -050084
Ivan Mikhaylov22e86952023-06-09 17:54:03 +030085 /** @brief Set protocol for rsyslog TCP or UDP.
86 * @param[in] value - UDP/TCP.
87 * @returns protocol value
88 */
89 virtual TransportProtocol
90 transportProtocol(TransportProtocol protocol) override;
91
Patrick Venturef18bf832018-10-26 18:14:00 -070092 private:
93 /** @brief Update remote server address and port in
94 * rsyslog config file.
95 * @param[in] serverAddress - remote server address
96 * @param[in] serverPort - remote server port
Ivan Mikhaylov22e86952023-06-09 17:54:03 +030097 * @param[in] serverTransportProtocol - remote server protocol TCP/UDP
Patrick Venturef18bf832018-10-26 18:14:00 -070098 * @param[in] filePath - rsyslog config file path
99 */
100 void writeConfig(const std::string& serverAddress, uint16_t serverPort,
Ivan Mikhaylov22e86952023-06-09 17:54:03 +0300101 TransportProtocol protocol, const char* filePath);
Deepak Kodihalli4db81462018-08-27 06:01:46 -0500102
Patrick Venturef18bf832018-10-26 18:14:00 -0700103 /** @brief Checks if input IP address is valid (uses getaddrinfo)
104 * @param[in] address - server address
105 * @returns true if valid, false otherwise
106 */
107 bool addressValid(const std::string& address);
Deepak Kodihalli9fab2792018-08-28 07:47:11 -0500108
Patrick Venturef18bf832018-10-26 18:14:00 -0700109 /** @brief Populate existing config into D-Bus properties
110 * @param[in] filePath - rsyslog config file path
111 */
112 void restore(const char* filePath);
Deepak Kodihalliaabb92e2018-10-17 05:03:20 -0500113
Patrick Venturef18bf832018-10-26 18:14:00 -0700114 std::string configFilePath{};
Deepak Kodihalliaabb92e2018-10-17 05:03:20 -0500115
Patrick Venturef18bf832018-10-26 18:14:00 -0700116 /** @brief React to hostname change
117 * @param[in] msg - sdbusplus message
118 */
Patrick Williams45e83522022-07-22 19:26:52 -0500119 void hostnameChanged(sdbusplus::message_t& /*msg*/)
Patrick Venturef18bf832018-10-26 18:14:00 -0700120 {
121 restart();
122 }
123
124 sdbusplus::bus::match_t hostnameChange;
Deepak Kodihallic4966192018-08-23 02:19:58 -0500125};
126
127} // namespace rsyslog_config
128} // namespace phosphor