]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#25,!14] ConfigBase class added.
authorTomek Mrugalski <tomasz@isc.org>
Fri, 31 Aug 2018 19:06:21 +0000 (21:06 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Fri, 7 Sep 2018 14:40:06 +0000 (16:40 +0200)
src/lib/process/Makefile.am
src/lib/process/config_base.cc [new file with mode: 0644]
src/lib/process/config_base.h [new file with mode: 0644]

index b65b05c962b9e44ae9346f6e6d8266bd1ca9c50c..5842c373564e4b9e804dbdf1ef71627313520b05 100644 (file)
@@ -38,12 +38,15 @@ CLEANFILES = *.gcno *.gcda process_messages.h process_messages.cc s-messages
 DISTCLEANFILES = spec_config.h.pre
 
 lib_LTLIBRARIES = libkea-process.la
-libkea_process_la_SOURCES  = d_cfg_mgr.cc d_cfg_mgr.h
+libkea_process_la_SOURCES  = config_base.cc config_base.h
+libkea_process_la_SOURCES += d_cfg_mgr.cc d_cfg_mgr.h
 libkea_process_la_SOURCES += d_controller.cc d_controller.h
 libkea_process_la_SOURCES += d_log.cc d_log.h
 libkea_process_la_SOURCES += d_process.h
 libkea_process_la_SOURCES += daemon.cc daemon.h
 libkea_process_la_SOURCES += io_service_signal.cc io_service_signal.h
+libkea_process_la_SOURCES += log_parser.cc log_parser.h
+libkea_process_la_SOURCES += logging_info.cc logging_info.h
 
 nodist_libkea_process_la_SOURCES = process_messages.cc process_messages.h
 
diff --git a/src/lib/process/config_base.cc b/src/lib/process/config_base.cc
new file mode 100644 (file)
index 0000000..e032155
--- /dev/null
@@ -0,0 +1,86 @@
+#include <process/config_base.h>
+#include <log/logger_manager.h>
+#include <log/logger_specification.h>
+#include <list>
+
+using namespace isc::log;
+using namespace isc::data;
+
+namespace isc {
+namespace process {
+
+void
+ConfigBase::applyLoggingCfg() const {
+
+    std::list<LoggerSpecification> specs;
+    for (LoggingInfoStorage::const_iterator it = logging_info_.begin();
+         it != logging_info_.end(); ++it) {
+        specs.push_back(it->toSpec());
+    }
+    LoggerManager manager;
+    manager.process(specs.begin(), specs.end());
+}
+
+bool
+ConfigBase::equals(const ConfigBase& other) const {
+    // If number of loggers is different, then configurations aren't equal.
+    if (logging_info_.size() != other.logging_info_.size()) {
+        return (false);
+    }
+    // Pass through all loggers and try to find the match for each of them
+    // with the loggers from the other configuration. The order doesn't
+    // matter so we can't simply compare the vectors.
+    for (LoggingInfoStorage::const_iterator this_it =
+             logging_info_.begin(); this_it != logging_info_.end();
+         ++this_it) {
+        bool match = false;
+        for (LoggingInfoStorage::const_iterator other_it =
+                 other.logging_info_.begin();
+             other_it != other.logging_info_.end(); ++other_it) {
+            if (this_it->equals(*other_it)) {
+                match = true;
+                break;
+            }
+        }
+        // No match found for the particular logger so return false.
+        if (!match) {
+            return (false);
+        }
+    }
+
+    return (true);
+}
+
+void
+ConfigBase::copy(ConfigBase& other) const {
+    // We will entirely replace loggers in the new configuration.
+    other.logging_info_.clear();
+    for (LoggingInfoStorage::const_iterator it = logging_info_.begin();
+         it != logging_info_.end(); ++it) {
+        other.addLoggingInfo(*it);
+    }
+}
+
+ElementPtr
+ConfigBase::toElement() const {
+    ElementPtr result = Element::createMap();
+
+    // Logging global map (skip if empty)
+    if (!logging_info_.empty()) {
+        ElementPtr logging = Element::createMap();
+        // Set loggers list
+        ElementPtr loggers = Element::createList();
+        for (LoggingInfoStorage::const_iterator logger =
+                 logging_info_.cbegin();
+             logger != logging_info_.cend(); ++logger) {
+            loggers->add(logger->toElement());
+        }
+        logging->set("loggers", loggers);
+        result->set("Logging", logging);
+    }
+
+    return (result);
+}
+
+};
+};
diff --git a/src/lib/process/config_base.h b/src/lib/process/config_base.h
new file mode 100644 (file)
index 0000000..71ba215
--- /dev/null
@@ -0,0 +1,88 @@
+// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef CONFIG_BASE_H
+#define CONFIG_BASE_H
+
+#include <cc/cfg_to_element.h>
+#include <cc/user_context.h>
+#include <process/logging_info.h>
+
+namespace isc {
+namespace process {
+
+/// @brief Base class for all configurations
+///
+/// This is a common base class that represents configurations.
+/// SrvConfig, D2CfgContext, CtrlAgentCfgContext and possibly other
+/// classes holding configurations are derived from this.
+///
+/// It should contain only those elements that are applicable to really
+/// every daemon we may have. Before adding anything here, please consider
+/// whether it would be usable by all of the following: DHCP servers,
+/// DDNS update daemon, Control Agent, Netconf daemon, DHCP relay,
+/// DHCP client.
+///
+/// This class currently holds information about logging configuration.
+class ConfigBase : public isc::data::UserContext, public isc::data::CfgToElement {
+public:
+    /// @name Modifiers and accesors for the configuration objects.
+    ///
+    /// @warning References to the objects returned by accessors are only
+    /// valid during the lifetime of the @c SrvConfig object which
+    /// returned them.
+    ///
+    //@{
+    /// @brief Returns logging specific configuration.
+    const process::LoggingInfoStorage& getLoggingInfo() const {
+        return (logging_info_);
+    }
+
+    /// @brief Sets logging specific configuration.
+    ///
+    /// @param logging_info New logging configuration.
+    void addLoggingInfo(const process::LoggingInfo& logging_info) {
+        logging_info_.push_back(logging_info);
+    }
+
+    /// @brief Apply logging configuration to log4cplus.
+    void applyLoggingCfg() const;
+
+    /// @brief Compares two configuration.
+    ///
+    /// @param other the other configuration to compare to
+    virtual bool equals(const ConfigBase& other) const;
+
+    /// @brief Converts to Element representation
+    ///
+    /// @return Element representation.
+    virtual isc::data::ElementPtr toElement() const;
+
+protected:
+    /// @brief Copies the current configuration to a new configuration.
+    ///
+    /// This method copies only the parameters defined in this class.
+    /// Since derived classes are expected to provide their own
+    /// copy methods, this one is protected and can be used only
+    /// by descendant classes.
+    ///
+    /// @param new_config this configuration will be copied to new_config
+    virtual void copy(ConfigBase& new_config) const;
+
+private:
+    /// @brief Logging specific information.
+    process::LoggingInfoStorage logging_info_;
+
+};
+
+/// @brief Non-const pointer to the @c SrvConfig.
+typedef boost::shared_ptr<ConfigBase> ConfigPtr;
+
+};
+};
+
+
+#endif /* CONFIG_BASE_H */