]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[540-recommend-moving-hostname-char-set-and-hostname-char-replacement-out-of-dhcp...
authorFrancis Dupont <fdupont@isc.org>
Tue, 11 Jun 2019 00:33:36 +0000 (02:33 +0200)
committerFrancis Dupont <fdupont@isc.org>
Thu, 13 Jun 2019 13:21:07 +0000 (15:21 +0200)
doc/examples/kea4/all-keys-current.json
doc/examples/kea6/all-keys-current.json
doc/guide/dhcp4-srv.xml
doc/guide/dhcp6-srv.xml
src/bin/dhcp4/tests/get_config_unittest.cc
src/bin/dhcp6/tests/get_config_unittest.cc

index 15c7a3ef1eed445685c220721998c9060c02595b..f55eb0b0d97b5fcd18f8c2eb151aa422638ba0ad 100644 (file)
         // T2 = valid lifetime * .75.
         "t2-percent": .75,
 
+        // String of zero or more characters with which to replace each
+        // invalid character in the hostname or Client FQDN. The default
+        // value is an empty string which will cause invalid characters
+        // to be omitted rather than replaced.
+       "hostname-char-replacement": "x",
+
+        // Regular expression describing the invalid character set in
+        // the hostname or Client FQDN.
+        "hostname-char-set": "[^A-Za-z0-9.-]",
+
         // List of loggers used by the servers using this configuration file.
         "loggers": [
             {
index d074dfd433fbb2318fe758859a6af17197d20749..c93957b16be05f0aa9e3ae90dc608c5b35008d4a 100644 (file)
         // T2 = valid lifetime * .75.
         "t2-percent": .75,
 
+        // String of zero or more characters with which to replace each
+        // invalid character in the hostname or Client FQDN. The default
+        // value is an empty string which will cause invalid characters
+        // to be omitted rather than replaced.
+        "hostname-char-replacement": "x",
+
+        // Regular expression describing the invalid character set in
+        // the hostname or Client FQDN.
+        "hostname-char-set": "[^A-Za-z0-9.-]",
+
         // List of loggers used by the servers using this configuration file.
         "loggers": [
             {
index 173b2988a5fbdaff6146c309f4bbeec5aac517ba..9ec5d368ab725a4e74b99515c9834ecf47c41684 100644 (file)
@@ -3219,6 +3219,13 @@ It is merely echoed by the server.
         invalid characters.
         </para>
         </note>
+        <note>
+        Since the 1.6.0 Kea release it is possible to specify hostname-char-set
+        and/or hostname-char-replacement at the global scope. This allows
+        to sanitize host names without requiring a dhcp-ddns entry. When
+        a hostname-char parameter is defined at the global scope and
+        in a dhcp-ddns entry the second (local) value is used.
+        </note>
       </section>
 
     </section>
index 19dae2990c79149fc8d2772fe9f29e74460665d7..64489f21217dc1ae6437e07257c5fdf5f72682fc 100644 (file)
@@ -3039,6 +3039,13 @@ should include options from the new option space:
         invalid characters.
         </para>
         </note>
+        <note>
+        Since the 1.6.0 Kea release it is possible to specify hostname-char-set
+        and/or hostname-char-replacement at the global scope. This allows
+        to sanitize host names without requiring a dhcp-ddns entry. When
+        a hostname-char parameter is defined at the global scope and
+        in a dhcp-ddns entry the second (local) value is used.
+        </note>
       </section>
     </section>
 
index 0b62c8d3efe0a9f4f87c6119198b2295ba5bfd5a..8cc5079252db8fa42d1b572b0398afbf0deaf9a2 100644 (file)
@@ -1223,6 +1223,82 @@ const char* EXTRACTED_CONFIGS[] = {
 "    }\n",
     // CONFIGURATION 42
 "{\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"192.168.2.2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"192.168.2.1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"hostname-char-replacement\": \"x\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"192.0.2.0/24\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 43
+"{\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"hostname-char-replacement\": \"x\",\n"
+"            \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"192.168.2.2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"192.168.2.1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"hostname-char-replacement\": \"z\",\n"
+"        \"hostname-char-set\": \"[^A-Z]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"pool\": \"192.0.2.1 - 192.0.2.100\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"192.0.2.0/24\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 44
+"{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
@@ -1247,7 +1323,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 43
+    // CONFIGURATION 45
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1273,7 +1349,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 44
+    // CONFIGURATION 46
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1320,7 +1396,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 45
+    // CONFIGURATION 47
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1352,7 +1428,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 46
+    // CONFIGURATION 48
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1451,7 +1527,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 47
+    // CONFIGURATION 49
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1493,7 +1569,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 48
+    // CONFIGURATION 50
 "{\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
@@ -1536,7 +1612,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 49
+    // CONFIGURATION 51
 "{\n"
 "        \"rebind-timer\": 2000,\n"
 "        \"renew-timer\": 1000,\n"
@@ -1562,7 +1638,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
+    // CONFIGURATION 52
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1570,7 +1646,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet4\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 53
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1578,7 +1654,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet4\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 52
+    // CONFIGURATION 54
 "{\n"
 "        \"decline-probation-period\": 12345,\n"
 "        \"interfaces-config\": {\n"
@@ -1587,7 +1663,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet4\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 55
 "{\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 35,\n"
@@ -1603,7 +1679,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet4\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 56
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1623,7 +1699,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 55
+    // CONFIGURATION 57
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1644,7 +1720,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 56
+    // CONFIGURATION 58
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1665,7 +1741,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 59
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1687,7 +1763,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 58
+    // CONFIGURATION 60
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1708,7 +1784,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 59
+    // CONFIGURATION 61
 "{\n"
 "        \"client-classes\": [\n"
 "            {\n"
@@ -1739,7 +1815,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 60
+    // CONFIGURATION 62
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1759,7 +1835,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 61
+    // CONFIGURATION 63
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1780,7 +1856,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 62
+    // CONFIGURATION 64
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1805,7 +1881,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 63
+    // CONFIGURATION 65
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1830,7 +1906,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 64
+    // CONFIGURATION 66
 "{\n"
 "        \"hosts-databases\": [\n"
 "            {\n"
@@ -1854,7 +1930,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 65
+    // CONFIGURATION 67
 "{\n"
 "        \"comment\": \"A DHCPv4 server\",\n"
 "        \"client-classes\": [\n"
@@ -1939,7 +2015,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 66
+    // CONFIGURATION 68
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -2001,7 +2077,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 67
+    // CONFIGURATION 69
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -6355,6 +6431,196 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"calculate-tee-times\": false,\n"
 "        \"decline-probation-period\": 86400,\n"
 "        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"192.168.2.2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"192.168.2.1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 500,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring4\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"echo-client-id\": true,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"hostname-char-replacement\": \"x\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"match-client-id\": true,\n"
+"        \"next-server\": \"0.0.0.0\",\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservation-mode\": \"all\",\n"
+"        \"sanity-checks\": {\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-hostname\": \"\",\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"4o6-interface\": \"\",\n"
+"                \"4o6-interface-id\": \"\",\n"
+"                \"4o6-subnet\": \"\",\n"
+"                \"authoritative\": false,\n"
+"                \"calculate-tee-times\": false,\n"
+"                \"id\": 1,\n"
+"                \"match-client-id\": true,\n"
+"                \"next-server\": \"0.0.0.0\",\n"
+"                \"option-data\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                    }\n"
+"                ],\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservation-mode\": \"all\",\n"
+"                \"reservations\": [ ],\n"
+"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.875,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.875,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 43
+"{\n"
+"        \"authoritative\": false,\n"
+"        \"boot-file-name\": \"\",\n"
+"        \"calculate-tee-times\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"hostname-char-replacement\": \"x\",\n"
+"            \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"192.168.2.2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"192.168.2.1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 500,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring4\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"echo-client-id\": true,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"hostname-char-replacement\": \"z\",\n"
+"        \"hostname-char-set\": \"[^A-Z]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"match-client-id\": true,\n"
+"        \"next-server\": \"0.0.0.0\",\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservation-mode\": \"all\",\n"
+"        \"sanity-checks\": {\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-hostname\": \"\",\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"4o6-interface\": \"\",\n"
+"                \"4o6-interface-id\": \"\",\n"
+"                \"4o6-subnet\": \"\",\n"
+"                \"authoritative\": false,\n"
+"                \"calculate-tee-times\": false,\n"
+"                \"id\": 1,\n"
+"                \"match-client-id\": true,\n"
+"                \"next-server\": \"0.0.0.0\",\n"
+"                \"option-data\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                    }\n"
+"                ],\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservation-mode\": \"all\",\n"
+"                \"reservations\": [ ],\n"
+"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.875,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.875,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 44
+"{\n"
+"        \"authoritative\": false,\n"
+"        \"boot-file-name\": \"\",\n"
+"        \"calculate-tee-times\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
 "            \"enable-updates\": false,\n"
 "            \"generated-prefix\": \"myhost\",\n"
 "            \"max-queue-size\": 1024,\n"
@@ -6440,7 +6706,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 43
+    // CONFIGURATION 45
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -6532,7 +6798,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 44
+    // CONFIGURATION 46
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -6711,7 +6977,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 45
+    // CONFIGURATION 47
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -6818,7 +7084,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 46
+    // CONFIGURATION 48
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7069,7 +7335,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 47
+    // CONFIGURATION 49
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7191,7 +7457,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 48
+    // CONFIGURATION 50
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7367,7 +7633,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 49
+    // CONFIGURATION 51
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7487,7 +7753,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
+    // CONFIGURATION 52
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7548,7 +7814,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 53
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7609,7 +7875,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 52
+    // CONFIGURATION 54
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7670,7 +7936,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 55
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7731,7 +7997,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 56
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7823,7 +8089,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 55
+    // CONFIGURATION 57
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -7915,7 +8181,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 56
+    // CONFIGURATION 58
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8007,7 +8273,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 59
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8099,7 +8365,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 58
+    // CONFIGURATION 60
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8191,7 +8457,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 59
+    // CONFIGURATION 61
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8309,7 +8575,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 60
+    // CONFIGURATION 62
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8401,7 +8667,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 61
+    // CONFIGURATION 63
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8494,7 +8760,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 62
+    // CONFIGURATION 64
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8591,7 +8857,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 63
+    // CONFIGURATION 65
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8688,7 +8954,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 64
+    // CONFIGURATION 66
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -8765,7 +9031,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 65
+    // CONFIGURATION 67
 "{\n"
 "        \"comment\": \"A DHCPv4 server\",\n"
 "        \"authoritative\": false,\n"
@@ -8956,7 +9222,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 66
+    // CONFIGURATION 68
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
@@ -9131,7 +9397,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 67
+    // CONFIGURATION 69
 "{\n"
 "        \"authoritative\": false,\n"
 "        \"boot-file-name\": \"\",\n"
index 55fbfc0807c19b4f8eed85b00aaded16df19e9d0..042a5256214c32f5f6c705d014d8e415b05d7902 100644 (file)
@@ -1153,6 +1153,84 @@ const char* EXTRACTED_CONFIGS[] = {
 "    }\n",
     // CONFIGURATION 36
 "{\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"hostname-char-replacement\": \"x\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 37
+"{\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"hostname-char-replacement\": \"x\",\n"
+"            \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"hostname-char-replacement\": \"z\",\n"
+"        \"hostname-char-set\": \"[^A-Z]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"renew-timer\": 1000,\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"2001:db8:1::/64\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 38
+"{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
 "            \"re-detect\": false\n"
@@ -1238,7 +1316,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 37
+    // CONFIGURATION 39
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1278,7 +1356,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 38
+    // CONFIGURATION 40
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1291,7 +1369,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        \"subnet6\": [ ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 39
+    // CONFIGURATION 41
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1304,7 +1382,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        \"subnet6\": [ ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 40
+    // CONFIGURATION 42
 "{\n"
 "        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
@@ -1357,7 +1435,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 41
+    // CONFIGURATION 43
 "{\n"
 "        \"preferred-lifetime\": 3000,\n"
 "        \"rebind-timer\": 2000,\n"
@@ -1384,7 +1462,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 42
+    // CONFIGURATION 44
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1397,7 +1475,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        \"subnet6\": [ ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 43
+    // CONFIGURATION 45
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1405,7 +1483,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 44
+    // CONFIGURATION 46
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1413,7 +1491,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 45
+    // CONFIGURATION 47
 "{\n"
 "        \"decline-probation-period\": 12345,\n"
 "        \"interfaces-config\": {\n"
@@ -1422,7 +1500,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 46
+    // CONFIGURATION 48
 "{\n"
 "        \"expired-leases-processing\": {\n"
 "            \"flush-reclaimed-timer-wait-time\": 35,\n"
@@ -1438,7 +1516,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        },\n"
 "        \"subnet6\": [ ]\n"
 "    }\n",
-    // CONFIGURATION 47
+    // CONFIGURATION 49
 "{\n"
 "        \"client-classes\": [\n"
 "            {\n"
@@ -1470,7 +1548,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 48
+    // CONFIGURATION 50
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1491,7 +1569,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 49
+    // CONFIGURATION 51
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1513,7 +1591,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
+    // CONFIGURATION 52
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1540,7 +1618,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 53
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1567,7 +1645,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 52
+    // CONFIGURATION 54
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1590,7 +1668,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 55
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1614,7 +1692,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 56
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -1643,7 +1721,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 55
+    // CONFIGURATION 57
 "{\n"
 "        \"hosts-databases\": [\n"
 "            {\n"
@@ -1668,7 +1746,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "        \"renew-timer\": 1000,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 56
+    // CONFIGURATION 58
 "{\n"
 "        \"comment\": \"A DHCPv6 server\",\n"
 "        \"client-classes\": [\n"
@@ -1765,7 +1843,7 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ]\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 59
 "{\n"
 "        \"interfaces-config\": {\n"
 "            \"interfaces\": [ \"*\" ],\n"
@@ -5723,6 +5801,200 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
 "        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 500,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring6\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+"        \"hostname-char-replacement\": \"x\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservation-mode\": \"all\",\n"
+"        \"sanity-checks\": {\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservation-mode\": \"all\",\n"
+"                \"reservations\": [ ],\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 37
+"{\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": true,\n"
+"            \"generated-prefix\": \"test.prefix\",\n"
+"            \"hostname-char-replacement\": \"x\",\n"
+"            \"hostname-char-set\": \"[^A-Za-z0-9_-]\",\n"
+"            \"max-queue-size\": 2048,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"override-client-update\": true,\n"
+"            \"override-no-update\": true,\n"
+"            \"qualifying-suffix\": \"test.suffix.\",\n"
+"            \"replace-client-name\": \"when-present\",\n"
+"            \"sender-ip\": \"3001::2\",\n"
+"            \"sender-port\": 778,\n"
+"            \"server-ip\": \"3001::1\",\n"
+"            \"server-port\": 777\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 500,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring6\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
+"        \"hostname-char-replacement\": \"z\",\n"
+"        \"hostname-char-set\": \"[^A-Z]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ \"*\" ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"mac-sources\": [ \"any\" ],\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
+"        \"preferred-lifetime\": 3000,\n"
+"        \"rebind-timer\": 2000,\n"
+"        \"relay-supplied-options\": [ \"65\" ],\n"
+"        \"renew-timer\": 1000,\n"
+"        \"reservation-mode\": \"all\",\n"
+"        \"sanity-checks\": {\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-id\": {\n"
+"            \"enterprise-id\": 0,\n"
+"            \"htype\": 0,\n"
+"            \"identifier\": \"\",\n"
+"            \"persist\": true,\n"
+"            \"time\": 0,\n"
+"            \"type\": \"LLT\"\n"
+"        },\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"subnet6\": [\n"
+"            {\n"
+"                \"calculate-tee-times\": true,\n"
+"                \"id\": 1,\n"
+"                \"option-data\": [ ],\n"
+"                \"pd-pools\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                    }\n"
+"                ],\n"
+"                \"preferred-lifetime\": 3000,\n"
+"                \"rapid-commit\": false,\n"
+"                \"rebind-timer\": 2000,\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"renew-timer\": 1000,\n"
+"                \"reservation-mode\": \"all\",\n"
+"                \"reservations\": [ ],\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.8,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.8,\n"
+"        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 38
+"{\n"
+"        \"calculate-tee-times\": true,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
 "            \"enable-updates\": false,\n"
 "            \"generated-prefix\": \"myhost\",\n"
 "            \"max-queue-size\": 1024,\n"
@@ -5937,7 +6209,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 37
+    // CONFIGURATION 39
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6054,7 +6326,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 38
+    // CONFIGURATION 40
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6122,7 +6394,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 39
+    // CONFIGURATION 41
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6190,7 +6462,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 40
+    // CONFIGURATION 42
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6384,7 +6656,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 41
+    // CONFIGURATION 43
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6503,7 +6775,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 42
+    // CONFIGURATION 44
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6571,7 +6843,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 43
+    // CONFIGURATION 45
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6637,7 +6909,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 44
+    // CONFIGURATION 46
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6703,7 +6975,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 45
+    // CONFIGURATION 47
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 12345,\n"
@@ -6769,7 +7041,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 46
+    // CONFIGURATION 48
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -6835,7 +7107,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 47
+    // CONFIGURATION 49
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"client-classes\": [\n"
@@ -6943,7 +7215,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 48
+    // CONFIGURATION 50
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7037,7 +7309,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 49
+    // CONFIGURATION 51
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7132,7 +7404,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 50
+    // CONFIGURATION 52
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7232,7 +7504,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 51
+    // CONFIGURATION 53
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7332,7 +7604,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 52
+    // CONFIGURATION 54
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7428,7 +7700,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 53
+    // CONFIGURATION 55
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7525,7 +7797,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 54
+    // CONFIGURATION 56
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7627,7 +7899,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 55
+    // CONFIGURATION 57
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"
@@ -7709,7 +7981,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 4000\n"
 "    }\n",
-    // CONFIGURATION 56
+    // CONFIGURATION 58
 "{\n"
 "        \"comment\": \"A DHCPv6 server\",\n"
 "        \"calculate-tee-times\": true,\n"
@@ -7897,7 +8169,7 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t2-percent\": 0.8,\n"
 "        \"valid-lifetime\": 7200\n"
 "    }\n",
-    // CONFIGURATION 57
+    // CONFIGURATION 59
 "{\n"
 "        \"calculate-tee-times\": true,\n"
 "        \"decline-probation-period\": 86400,\n"