]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[630-cb-can-be-used-to-remove-mandatory-global-parameters] (checkpoint) Added applyDe...
authorFrancis Dupont <fdupont@isc.org>
Wed, 5 Jun 2019 20:49:06 +0000 (22:49 +0200)
committerFrancis Dupont <fdupont@isc.org>
Mon, 8 Jul 2019 18:00:51 +0000 (20:00 +0200)
src/lib/dhcpsrv/cb_ctl_dhcp4.cc
src/lib/dhcpsrv/cb_ctl_dhcp6.cc
src/lib/dhcpsrv/srv_config.cc
src/lib/dhcpsrv/srv_config.h

index dccdc22cfd1e562413d8d5870ff42f7e53971bc1..b08a9dd0acf82f78ab7b3e2ae41ade918369bb24 100644 (file)
@@ -8,6 +8,7 @@
 #include <dhcpsrv/cb_ctl_dhcp4.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/parsers/simple_parser4.h>
 
 using namespace isc::db;
 using namespace isc::data;
@@ -51,6 +52,9 @@ CBControlDHCPv4::databaseConfigApply(const BackendSelector& backend_selector,
             globals = getMgr().getPool()->getAllGlobalParameters4(backend_selector, server_selector);
             addGlobalsToConfig(external_cfg, globals);
 
+            // Add defaults.
+            external_cfg->applyDefaultsConfiguredGlobals(SimpleParser4::GLOBAL4_DEFAULTS);
+
             // Now that we successfully fetched the new global parameters, let's
             // remove existing ones and merge them into the current configuration.
             cfg->clearConfiguredGlobals();
index 01c9383a3ea23c7977d27ef826073a9f3cd357b5..3e58da9c823be21842350300ffd9bb98fab64963 100644 (file)
@@ -8,6 +8,7 @@
 #include <dhcpsrv/cb_ctl_dhcp6.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/dhcpsrv_log.h>
+#include <dhcpsrv/parsers/simple_parser6.h>
 
 using namespace isc::db;
 using namespace isc::data;
@@ -50,6 +51,9 @@ CBControlDHCPv6::databaseConfigApply(const db::BackendSelector& backend_selector
             globals = getMgr().getPool()->getAllGlobalParameters6(backend_selector, server_selector);
             addGlobalsToConfig(external_cfg, globals);
 
+            // Add defaults.
+            external_cfg->applyDefaultsConfiguredGlobals(SimpleParser6::GLOBAL6_DEFAULTS);
+
             // Now that we successfully fetched the new global parameters, let's
             // remove existing ones and merge them into the current configuration.
             cfg->clearConfiguredGlobals();
index 5914918f244fdc83e9d1b1f42ef40d2a9753a12b..02b5fbbfa0d27237500ca626e44c68a2b6a127db 100644 (file)
@@ -277,6 +277,75 @@ SrvConfig::clearConfiguredGlobals() {
     configured_globals_ = isc::data::Element::createMap();
 }
 
+void
+SrvConfig::applyDefaultsConfiguredGlobals(const SimpleDefaults& defaults) {
+    // Code from SimpleParser::setDefaults
+    // This is the position representing a default value. As the values
+    // we're inserting here are not present in whatever the config file
+    // came from, we need to make sure it's clearly labeled as default.
+    const Element::Position pos("<default-value>", 0, 0);
+    ConstElementPtr globals = getConfiguredGlobals();
+
+    // Let's go over all parameters we have defaults for.
+    for (auto def_value : defaults) {
+
+        // Try if such a parameter is there. If it is, let's
+        // skip it, because user knows best *cough*.
+        ConstElementPtr x = globals->get(def_value.name_);
+        if (x) {
+            // There is such a value already, skip it.
+            continue;
+        }
+
+        // There isn't such a value defined, let's create the default
+        // value...
+        switch (def_value.type_) {
+        case Element::string: {
+            x.reset(new StringElement(def_value.value_, pos));
+            break;
+        }
+        case Element::integer: {
+            try {
+                int int_value = boost::lexical_cast<int>(def_value.value_);
+                x.reset(new IntElement(int_value, pos));
+            }
+            catch (const std::exception& ex) {
+                isc_throw(BadValue,
+                          "Internal error. Integer value expected for: "
+                          << def_value.name_ << ", value is: "
+                          << def_value.value_ );
+            }
+
+            break;
+        }
+        case Element::boolean: {
+            bool bool_value;
+            if (def_value.value_ == std::string("true")) {
+                bool_value = true;
+            } else if (def_value.value_ == std::string("false")) {
+                bool_value = false;
+            } else {
+                isc_throw(BadValue,
+                          "Internal error. Boolean value specified as "
+                          << def_value.value_ << ", expected true or false");
+            }
+            x.reset(new BoolElement(bool_value, pos));
+            break;
+        }
+        case Element::real: {
+            double dbl_value = boost::lexical_cast<double>(def_value.value_);
+            x.reset(new DoubleElement(dbl_value, pos));
+            break;
+        }
+        default:
+            // No default values for null, list or map
+            isc_throw(BadValue,
+                      "Internal error. Incorrect default value type.");
+        }
+        addConfiguredGlobal(def_value.name_, x);
+    }
+}
+
 void
 SrvConfig::extractConfiguredGlobals(isc::data::ConstElementPtr config) {
     if (config->getType() != Element::map) {
index 3d957ea723e3891ace1fa21f964ee7ece0fd9e7c..ba320d18fb94e06a72a020410ec3d87f23ae0e93 100644 (file)
@@ -28,6 +28,7 @@
 #include <hooks/hooks_config.h>
 #include <cc/data.h>
 #include <cc/user_context.h>
+#include <cc/simple_parser.h>
 #include <boost/shared_ptr.hpp>
 #include <vector>
 #include <stdint.h>
@@ -610,8 +611,16 @@ public:
     }
 
     /// @brief Removes all configured global parameters.
+    /// @note This removes the default values too so either
+    /// @c applyDefaultsConfiguredGlobals and @c mergeGlobals,
+    /// or @c isc::data::SimpleParser::setDefaults and
+    /// @c extractConfiguredGlobals should be called after.
     void clearConfiguredGlobals();
 
+    /// @brief Applies defaults to global parameters.
+    /// @param defaults vector of (name, type, value) defaults to apply.
+    void applyDefaultsConfiguredGlobals(const isc::data::SimpleDefaults& defaults);
+
     /// @brief Saves scalar elements from the global scope of a configuration
     void extractConfiguredGlobals(isc::data::ConstElementPtr config);