if (rcode == 0) {
CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
+ // Update the fetch globals callback.
+ auto cfg = CfgMgr::instance().getStagingCfg()->getD2ClientConfig();
+ cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
+ });
+
// Use new configuration.
CfgMgr::instance().commit();
} else {
// early.
Dhcp4ConfigParser global_parser;
+ // D2 client configuration.
+ D2ClientConfigPtr d2_client_cfg;
+
// Make parsers grouping.
const std::map<std::string, ConstElementPtr>& values_map =
mutable_cfg->mapValue();
// Apply defaults
D2ClientConfigParser::setAllDefaults(config_pair.second);
D2ClientConfigParser parser;
- D2ClientConfigPtr cfg = parser.parse(config_pair.second);
- srv_cfg->setD2ClientConfig(cfg);
+ d2_client_cfg = parser.parse(config_pair.second);
continue;
}
(config_pair.first == "calculate-tee-times") ||
(config_pair.first == "t1-percent") ||
(config_pair.first == "t2-percent") ||
- (config_pair.first == "loggers")) {
+ (config_pair.first == "loggers") ||
+ (config_pair.first == "hostname-char-set") ||
+ (config_pair.first == "hostname-char-replacement")) {
CfgMgr::instance().getStagingCfg()->addConfiguredGlobal(config_pair.first,
config_pair.second);
// defined as part of shared networks.
global_parser.sanityChecks(srv_cfg, mutable_cfg);
+ // Validate D2 client confuguration.
+ if (!d2_client_cfg) {
+ d2_client_cfg.reset(new D2ClientConfig());
+ d2_client_cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getStagingCfg()->getConfiguredGlobals());
+ });
+ }
+ d2_client_cfg->validateContents();
+ srv_cfg->setD2ClientConfig(d2_client_cfg);
+
} catch (const isc::Exception& ex) {
LOG_ERROR(dhcp4_logger, DHCP4_PARSER_FAIL)
.arg(config_pair.first).arg(ex.what());
EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+}
+
+// This test checks the ability of the server to parse a configuration
+// containing a full, valid dhcp-ddns (D2ClientConfig) entry with
+// hostname-char-* at the global scope.
+TEST_F(Dhcp4ParserTest, d2ClientConfigGlobal) {
+ ConstElementPtr status;
+
+ // Verify that the D2 configuration can be fetched and is set to disabled.
+ D2ClientConfigPtr d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+
+ // Verify that the convenience method agrees.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ string config_str = "{ " + genIfaceConfig() + "," +
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ { "
+ " \"pools\": [ { \"pool\": \"192.0.2.1 - 192.0.2.100\" } ],"
+ " \"subnet\": \"192.0.2.0/24\" } ],"
+ " \"dhcp-ddns\" : {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"192.168.2.1\", "
+ " \"server-port\" : 777, "
+ " \"sender-ip\" : \"192.168.2.2\", "
+ " \"sender-port\" : 778, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\" },"
+ "\"hostname-char-set\" : \"[^A-Za-z0-9_-]\", "
+ "\"hostname-char-replacement\" : \"x\", "
+ "\"valid-lifetime\": 4000 }";
+
+ // Convert the JSON string to configuration elements.
+ ConstElementPtr config;
+ ASSERT_NO_THROW(config = parseDHCP4(config_str, true));
+ extractConfig(config_str);
+
+ // Pass the configuration in for parsing.
+ EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, config));
+
+ // check if returned status is OK
+ checkResult(status, 0);
+
+ // Verify that DHCP-DDNS updating is enabled.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+
+ // Verify that the D2 configuration can be retrieved.
+ d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are correct.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("192.168.2.1", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(777, d2_client_config->getServerPort());
+ EXPECT_EQ("192.168.2.2", d2_client_config->getSenderIp().toText());
+ EXPECT_EQ(778, d2_client_config->getSenderPort());
+ EXPECT_EQ(2048, d2_client_config->getMaxQueueSize());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+}
+
+// This test checks the ability of the server to parse a configuration
+// containing a full, valid dhcp-ddns (D2ClientConfig) entry with
+// hostname-char-* at the local and global scopes (local has the priority).
+TEST_F(Dhcp4ParserTest, d2ClientConfigBoth) {
+ ConstElementPtr status;
+
+ // Verify that the D2 configuration can be fetched and is set to disabled.
+ D2ClientConfigPtr d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+
+ // Verify that the convenience method agrees.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ string config_str = "{ " + genIfaceConfig() + "," +
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ { "
+ " \"pools\": [ { \"pool\": \"192.0.2.1 - 192.0.2.100\" } ],"
+ " \"subnet\": \"192.0.2.0/24\" } ],"
+ " \"dhcp-ddns\" : {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"192.168.2.1\", "
+ " \"server-port\" : 777, "
+ " \"sender-ip\" : \"192.168.2.2\", "
+ " \"sender-port\" : 778, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\", "
+ " \"hostname-char-set\" : \"[^A-Za-z0-9_-]\", "
+ " \"hostname-char-replacement\" : \"x\" }, "
+ "\"hostname-char-set\" : \"[^A-Z]\", "
+ "\"hostname-char-replacement\" : \"z\", "
+ "\"valid-lifetime\": 4000 }";
+
+ // Convert the JSON string to configuration elements.
+ ConstElementPtr config;
+ ASSERT_NO_THROW(config = parseDHCP4(config_str, true));
+ extractConfig(config_str);
+
+ // Pass the configuration in for parsing.
+ EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, config));
+
+ // check if returned status is OK
+ checkResult(status, 0);
+
+ // Verify that DHCP-DDNS updating is enabled.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+
+ // Verify that the D2 configuration can be retrieved.
+ d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are correct.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("192.168.2.1", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(777, d2_client_config->getServerPort());
+ EXPECT_EQ("192.168.2.2", d2_client_config->getSenderIp().toText());
+ EXPECT_EQ(778, d2_client_config->getSenderPort());
+ EXPECT_EQ(2048, d2_client_config->getMaxQueueSize());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
}
// This test checks the ability of the server to handle a configuration
} );
if (commit) {
+ auto cfg = CfgMgr::instance().getStagingCfg()->getD2ClientConfig();
+ cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
+ });
CfgMgr::instance().commit();
}
}
cfg_db->createManagers();
} );
if (commit) {
+ auto cfg = CfgMgr::instance().getStagingCfg()->getD2ClientConfig();
+ cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
+ });
CfgMgr::instance().commit();
}
}
"\"qualifying-suffix\": \"example.org\""
"}"
"}",
+ // 7
+ // Configuration which enables DNS updates and hostname sanitization.
+ // the second at the global scope.
+ "{ \"interfaces-config\": {"
+ " \"interfaces\": [ \"*\" ]"
+ "},"
+ "\"valid-lifetime\": 3000,"
+ "\"subnet4\": [ { "
+ " \"subnet\": \"10.0.0.0/24\", "
+ " \"id\": 1,"
+ " \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ],"
+ " \"option-data\": [ {"
+ " \"name\": \"routers\","
+ " \"data\": \"10.0.0.200,10.0.0.201\""
+ " } ],"
+ " \"reservations\": ["
+ " {"
+ " \"hw-address\": \"aa:bb:cc:dd:ee:ff\","
+ " \"hostname\": \"unique-xxx-host.example.org\""
+ " }"
+ " ]"
+ " }],"
+ "\"hostname-char-set\" : \"[^A-Za-z0-9.-]\","
+ "\"hostname-char-replacement\" : \"x\""
+ "}"
};
class NameDhcpv4SrvTest : public Dhcpv4SrvTest {
" \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.10\" } ]"
" }],"
"\"dhcp-ddns\": {"
- "\"enable-updates\": true,"
- "\"qualifying-suffix\": \"fake-suffix.isc.org.\","
- "\"hostname-char-set\": \"[^A-Za-z0-9.-]\","
- "\"hostname-char-replacement\": \"x\","
- "\"replace-client-name\": \"%s\""
+ " \"enable-updates\": true,"
+ " \"qualifying-suffix\": \"fake-suffix.isc.org.\","
+ " \"hostname-char-set\": \"[^A-Za-z0-9.-]\","
+ " \"hostname-char-replacement\": \"x\","
+ " \"replace-client-name\": \"%s\""
"}}";
// Create the configuration and configure the server
}
}
+// Verifies that setting global hostname-char-set sanitizes Hostname option
+// values received from clients.
+TEST_F(NameDhcpv4SrvTest, sanitizeHostGlobal) {
+ Dhcp4Client client(Dhcp4Client::SELECTING);
+
+ // Configure DHCP server.
+ configure(CONFIGS[7], *client.getServer());
+
+ // Make sure that DDNS is not enabled.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ struct Scenario {
+ std::string description_;
+ std::string original_;
+ std::string sanitized_;
+ };
+
+ std::vector<Scenario> scenarios = {
+ {
+ "unqualified host name with invalid characters",
+ "one-&$_-host",
+ "one-xxx-host"
+ },
+ {
+ "qualified host name with invalid characters",
+ "two-&$_-host.other.org",
+ "two-xxx-host.other.org"
+ },
+ {
+ "unqualified host name with all valid characters",
+ "three-ok-host",
+ "three-ok-host"
+ },
+ {
+ "qualified host name with valid characters",
+ "four-ok-host.other.org",
+ "four-ok-host.other.org"
+ }
+ };
+
+ Pkt4Ptr resp;
+ OptionStringPtr hostname;
+ for (auto scenario : scenarios) {
+ SCOPED_TRACE((scenario).description_);
+ {
+ // Set the hostname option.
+ ASSERT_NO_THROW(client.includeHostname((scenario).original_));
+
+ // Send the DHCPDISCOVER and make sure that the server responded.
+ ASSERT_NO_THROW(client.doDiscover());
+ resp = client.getContext().response_;
+ ASSERT_TRUE(resp);
+ ASSERT_EQ(DHCPOFFER, static_cast<int>(resp->getType()));
+
+ // Make sure the response hostname is what we expect.
+ hostname = boost::dynamic_pointer_cast<OptionString>(resp->getOption(DHO_HOST_NAME));
+ ASSERT_TRUE(hostname);
+ EXPECT_EQ((scenario).sanitized_, hostname->getValue());
+ }
+ }
+}
+
// Verifies that setting hostname-char-set sanitizes FQDN option
// values received from clients.
TEST_F(NameDhcpv4SrvTest, sanitizeFqdn) {
}
}
+// Verifies that setting global hostname-char-set sanitizes FQDN option
+// values received from clients.
+TEST_F(NameDhcpv4SrvTest, sanitizeFqdnGlobal) {
+ Dhcp4Client client(Dhcp4Client::SELECTING);
+
+ // Configure DHCP server.
+ configure(CONFIGS[7], *client.getServer());
+
+ // Make sure that DDNS is not enabled.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ struct Scenario {
+ std::string description_;
+ std::string original_;
+ Option4ClientFqdn::DomainNameType name_type_;
+ std::string sanitized_;
+ };
+
+ std::vector<Scenario> scenarios = {
+ {
+ "unqualified FQDN with invalid characters",
+ "one-&*_-host",
+ Option4ClientFqdn::PARTIAL,
+ "one-xxx-host."
+ },
+ {
+ "qualified FQDN with invalid characters",
+ "two-&*_-host.other.org",
+ Option4ClientFqdn::FULL,
+ "two-xxx-host.other.org."
+ },
+ {
+ "unqualified FQDN name with all valid characters",
+ "three-ok-host",
+ Option4ClientFqdn::PARTIAL,
+ "three-ok-host."
+ },
+ {
+ "qualified FQDN name with valid characters",
+ "four-ok-host.other.org",
+ Option4ClientFqdn::FULL,
+ "four-ok-host.other.org."
+ }
+ };
+
+ Pkt4Ptr resp;
+ Option4ClientFqdnPtr fqdn;
+ for (auto scenario = scenarios.begin(); scenario != scenarios.end(); ++scenario) {
+ SCOPED_TRACE((*scenario).description_);
+ {
+ // Set the hostname option.
+ ASSERT_NO_THROW(client.includeHostname((*scenario).original_));
+ ASSERT_NO_THROW(client.includeFQDN(0, (*scenario).original_, (*scenario).name_type_));
+
+ // Send the DHCPDISCOVER and make sure that the server responded.
+ ASSERT_NO_THROW(client.doDiscover());
+ resp = client.getContext().response_;
+ ASSERT_TRUE(resp);
+ ASSERT_EQ(DHCPOFFER, static_cast<int>(resp->getType()));
+
+ // Make sure the response fqdn is what we expect.
+ fqdn = boost::dynamic_pointer_cast<Option4ClientFqdn>(resp->getOption(DHO_FQDN));
+ ASSERT_TRUE(fqdn);
+ EXPECT_EQ((*scenario).sanitized_, fqdn->getDomainName());
+ }
+ }
+}
} // end of anonymous namespace
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"comment\": \"No dynamic DNS\",\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
if (rcode == CONTROL_RESULT_SUCCESS) {
CfgMgr::instance().getStagingCfg()->applyLoggingCfg();
+ // Update the fetch globals callback.
+ auto cfg = CfgMgr::instance().getStagingCfg()->getD2ClientConfig();
+ cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
+ });
+
// Use new configuration.
CfgMgr::instance().commit();
} else {
// early.
Dhcp6ConfigParser global_parser;
+ // D2 client configuration.
+ D2ClientConfigPtr d2_client_cfg;
+
BOOST_FOREACH(config_pair, values_map) {
// In principle we could have the following code structured as a series
// of long if else if clauses. That would give a marginal performance
// Apply defaults
D2ClientConfigParser::setAllDefaults(config_pair.second);
D2ClientConfigParser parser;
- D2ClientConfigPtr cfg = parser.parse(config_pair.second);
- srv_config->setD2ClientConfig(cfg);
+ d2_client_cfg = parser.parse(config_pair.second);
continue;
}
(config_pair.first == "calculate-tee-times") ||
(config_pair.first == "t1-percent") ||
(config_pair.first == "t2-percent") ||
- (config_pair.first == "loggers")) {
+ (config_pair.first == "loggers") ||
+ (config_pair.first == "hostname-char-set") ||
+ (config_pair.first == "hostname-char-replacement")) {
CfgMgr::instance().getStagingCfg()->addConfiguredGlobal(config_pair.first,
config_pair.second);
// defined as part of shared networks.
global_parser.sanityChecks(srv_config, mutable_cfg);
+ // Validate D2 client confuguration.
+ if (!d2_client_cfg) {
+ d2_client_cfg.reset(new D2ClientConfig());
+ d2_client_cfg->setFetchGlobalsFn([]() -> ConstElementPtr {
+ return (CfgMgr::instance().getStagingCfg()->getConfiguredGlobals());
+ });
+ }
+ d2_client_cfg->validateContents();
+ srv_config->setD2ClientConfig(d2_client_cfg);
+
} catch (const isc::Exception& ex) {
LOG_ERROR(dhcp6_logger, DHCP6_PARSER_FAIL)
.arg(config_pair.first).arg(ex.what());
EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+}
+
+// This test checks the ability of the server to parse a configuration
+// containing a full, valid dhcp-ddns (D2ClientConfig) entry with
+// hostname-char-* at the global scope.
+TEST_F(Dhcp6ParserTest, d2ClientConfigGlobal) {
+ // Verify that the D2 configuration can be fetched and is set to disabled.
+ D2ClientConfigPtr d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+
+ // Verify that the convenience method agrees.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ string config_str = "{ " + genIfaceConfig() + ","
+ "\"preferred-lifetime\": 3000,"
+ "\"valid-lifetime\": 4000,"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet6\": [ { "
+ " \"pools\": [ { \"pool\": \"2001:db8:1::/80\" } ],"
+ " \"subnet\": \"2001:db8:1::/64\" } ], "
+ " \"dhcp-ddns\" : {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"3001::1\", "
+ " \"server-port\" : 777, "
+ " \"sender-ip\" : \"3001::2\", "
+ " \"sender-port\" : 778, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\" }, "
+ "\"hostname-char-set\" : \"[^A-Za-z0-9_-]\", "
+ "\"hostname-char-replacement\" : \"x\", "
+ "\"valid-lifetime\": 4000 }";
+
+ // Convert the JSON string to configuration elements.
+ ConstElementPtr config;
+ ASSERT_NO_THROW(config = parseDHCP6(config_str));
+ extractConfig(config_str);
+
+ // Pass the configuration in for parsing.
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp6Server(srv_, config));
+
+ // check if returned status is OK
+ checkResult(status, 0);
+
+ // Verify that DHCP-DDNS updating is enabled.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+
+ // Verify that the D2 configuration can be retrieved.
+ d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are correct.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("3001::1", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(777, d2_client_config->getServerPort());
+ EXPECT_EQ("3001::2", d2_client_config->getSenderIp().toText());
+ EXPECT_EQ(778, d2_client_config->getSenderPort());
+ EXPECT_EQ(2048, d2_client_config->getMaxQueueSize());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+}
+
+// This test checks the ability of the server to parse a configuration
+// containing a full, valid dhcp-ddns (D2ClientConfig) entry with
+// hostname-char-* at the local and global scopes (local has the priority).
+TEST_F(Dhcp6ParserTest, d2ClientConfigBoth) {
+ // Verify that the D2 configuration can be fetched and is set to disabled.
+ D2ClientConfigPtr d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+
+ // Verify that the convenience method agrees.
+ ASSERT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ string config_str = "{ " + genIfaceConfig() + ","
+ "\"preferred-lifetime\": 3000,"
+ "\"valid-lifetime\": 4000,"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet6\": [ { "
+ " \"pools\": [ { \"pool\": \"2001:db8:1::/80\" } ],"
+ " \"subnet\": \"2001:db8:1::/64\" } ], "
+ " \"dhcp-ddns\" : {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"3001::1\", "
+ " \"server-port\" : 777, "
+ " \"sender-ip\" : \"3001::2\", "
+ " \"sender-port\" : 778, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\", "
+ " \"hostname-char-set\" : \"[^A-Za-z0-9_-]\", "
+ " \"hostname-char-replacement\" : \"x\" }, "
+ "\"hostname-char-set\" : \"[^A-Z]\", "
+ "\"hostname-char-replacement\" : \"z\", "
+ "\"valid-lifetime\": 4000 }";
+
+ // Convert the JSON string to configuration elements.
+ ConstElementPtr config;
+ ASSERT_NO_THROW(config = parseDHCP6(config_str));
+ extractConfig(config_str);
+
+ // Pass the configuration in for parsing.
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp6Server(srv_, config));
+
+ // check if returned status is OK
+ checkResult(status, 0);
+
+ // Verify that DHCP-DDNS updating is enabled.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+
+ // Verify that the D2 configuration can be retrieved.
+ d2_client_config = CfgMgr::instance().getD2ClientConfig();
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are correct.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("3001::1", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(777, d2_client_config->getServerPort());
+ EXPECT_EQ("3001::2", d2_client_config->getSenderIp().toText());
+ EXPECT_EQ(778, d2_client_config->getSenderPort());
+ EXPECT_EQ(2048, d2_client_config->getMaxQueueSize());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Za-z0-9_-]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("x", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
}
// This test checks the ability of the server to handle a configuration
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"comment\": \"No dynamic DNS\",\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
" \"dhcp-ddns\": {\n"
" \"enable-updates\": false,\n"
" \"generated-prefix\": \"myhost\",\n"
-" \"hostname-char-replacement\": \"\",\n"
-" \"hostname-char-set\": \"\",\n"
" \"max-queue-size\": 1024,\n"
" \"ncr-format\": \"JSON\",\n"
" \"ncr-protocol\": \"UDP\",\n"
#include <dhcp_ddns/ncr_udp.h>
#include <dhcpsrv/d2_client_cfg.h>
+#include <dhcpsrv/cfgmgr.h>
#include <dhcpsrv/dhcpsrv_log.h>
#include <boost/algorithm/string/predicate.hpp>
/// @return a pointer to unparsed configuration
virtual isc::data::ElementPtr toElement() const;
-protected:
/// @brief Validates member values.
///
/// Method is used by the constructor to validate member contents.
+ /// Should be called when parsing is complete to (re)compute
+ /// the hostname sanitizer.
///
/// @throw D2ClientError if given an invalid protocol or format.
virtual void validateContents();
// parameters to a subnet we need to set a callback function for
// the d2 client config to allow for fetching global parameters.
new_config->setFetchGlobalsFn([]() -> ConstElementPtr {
- return (CfgMgr::instance().getCurrentCfg()->getConfiguredGlobals());
+ return (CfgMgr::instance().getStagingCfg()->getConfiguredGlobals());
});
return(new_config);
{ "calculate-tee-times", Element::boolean },
{ "t1-percent", Element::real },
{ "t2-percent", Element::real },
- { "loggers", Element::list }
+ { "loggers", Element::list },
+ { "hostname-char-set", Element::string },
+ { "hostname-char-replacement", Element::string }
};
/// @brief This table defines default values for option definitions in DHCPv6.
-// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2019 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
EXPECT_EQ(d2_client_config->getGeneratedPrefix(), generated_prefix);
EXPECT_EQ(d2_client_config->getQualifyingSuffix(), qualifying_suffix);
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
EXPECT_EQ(d2_client_config->getHostnameCharSet(), hostname_char_set);
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
EXPECT_EQ(d2_client_config->getHostnameCharReplacement(), hostname_char_replacement);
EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
hostname_char_replacement)),
D2ClientError);
+ Optional<std::string> opt_hostname_char_set("", true);
+ Optional<std::string> opt_hostname_char_replacement("", true);
+
+ // Veeify that constructor handles optional hostname char stuff.
+ ASSERT_NO_THROW(d2_client_config.reset(new
+ D2ClientConfig(enable_updates,
+ server_ip,
+ server_port,
+ sender_ip,
+ sender_port,
+ max_queue_size,
+ ncr_protocol,
+ ncr_format,
+ override_no_update,
+ override_client_update,
+ replace_client_name_mode,
+ generated_prefix,
+ qualifying_suffix,
+ opt_hostname_char_set,
+ opt_hostname_char_replacement)));
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the accessors return the expected values.
+ EXPECT_TRUE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ(d2_client_config->getHostnameCharSet(), opt_hostname_char_set);
+ EXPECT_TRUE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ(d2_client_config->getHostnameCharReplacement(), opt_hostname_char_replacement);
+ EXPECT_FALSE(d2_client_config->getHostnameSanitizer());
+
+ // Verify what toElement returns.
+ expected = "{\n"
+ "\"enable-updates\": true,\n"
+ "\"server-ip\": \"127.0.0.1\",\n"
+ "\"server-port\": 477,\n"
+ "\"sender-ip\": \"127.0.0.1\",\n"
+ "\"sender-port\": 478,\n"
+ "\"max-queue-size\": 2048,\n"
+ "\"ncr-protocol\": \"UDP\",\n"
+ "\"ncr-format\": \"JSON\",\n"
+ "\"override-no-update\": true,\n"
+ "\"override-client-update\": true,\n"
+ "\"replace-client-name\": \"when-present\",\n"
+ "\"generated-prefix\": \"the_prefix\",\n"
+ "\"qualifying-suffix\": \"the.suffix.\"\n"
+ "}\n";
+ runToElementTest<D2ClientConfig>(expected, *d2_client_config);
+
/// @todo if additional validation is added to ctor, this test needs to
/// expand accordingly.
}
continue;
}
+ // Save global hostname-char-*.
+ if ((config_pair.first == "hostname-char-set") ||
+ (config_pair.first == "hostname-char-replacement")) {
+ CfgMgr::instance().getStagingCfg()->addConfiguredGlobal(config_pair.first,
+ config_pair.second);
+ continue;
+ }
+
if (config_pair.first == "hooks-libraries") {
HooksLibrariesParser hook_parser;
HooksConfig& libraries =
// Used to be done by parser commit
D2ClientConfigParser parser;
D2ClientConfigPtr cfg = parser.parse(d2_client_config->second);
+ cfg->validateContents();
CfgMgr::instance().setD2ClientConfig(cfg);
}
"0C:00:03:01:C0:00:03:02", // colons
"0x0C000301C0000302", // 0x
"C 0 3 1 C0 0 3 02", // one or two digit octets
- "0x0c000301C0000302" // upper or lower case digits
+ "0x0c000301C0000302" // upper or lower case digits
};
for (auto hex_str : valid_hexes) {
- ostringstream os;
+ ostringstream os;
os <<
- "{ \n"
+ "{ \n"
" \"option-data\": [ { \n"
" \"name\": \"domain-name-servers\", \n"
" \"code \": 6, \n"
EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
ASSERT_TRUE(d2_client_config->getContext());
EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
// Verify that the configuration object unparses.
ConstElementPtr expected;
EXPECT_EQ("", d2_client_config->getQualifyingSuffix());
ASSERT_TRUE(d2_client_config->getContext());
EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+
+ ASSERT_NO_THROW(expected = Element::fromJSON(config_str2)->get("dhcp-ddns"));
+ ASSERT_TRUE(expected);
+ runToElementTest<D2ClientConfig>(expected, *d2_client_config);
+}
+
+/// @brief Checks that a valid, enabled D2 client configuration works correctly
+/// with hostname-char stuff moved to global.
+TEST_F(ParseConfigTest, validD2ConfigGlobal) {
+
+ // Configuration string containing valid values.
+ std::string config_str =
+ "{ \"dhcp-ddns\" :"
+ " {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"192.0.2.0\", "
+ " \"server-port\" : 3432, "
+ " \"sender-ip\" : \"192.0.2.1\", "
+ " \"sender-port\" : 3433, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\", "
+ " \"user-context\": { \"foo\": \"bar\" } "
+ " },"
+ " \"hostname-char-set\" : \"[^A-Z]\", "
+ " \"hostname-char-replacement\" : \"*\" "
+ "}";
+
+ // Verify that the configuration string parses.
+ int rcode = parseConfiguration(config_str);
+ ASSERT_TRUE(rcode == 0) << error_text_;
+
+ // Verify that DHCP-DDNS is enabled and we can fetch the configuration.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+ D2ClientConfigPtr d2_client_config;
+ ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are as expected.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("192.0.2.0", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(3432, d2_client_config->getServerPort());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ ASSERT_TRUE(d2_client_config->getContext());
+ EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+
+ // Verify that the configuration object unparses.
+ ConstElementPtr expected;
+ ASSERT_NO_THROW(expected = Element::fromJSON(config_str)->get("dhcp-ddns"));
+ ASSERT_TRUE(expected);
+ runToElementTest<D2ClientConfig>(expected, *d2_client_config);
+
+ // Another valid Configuration string.
+ // This one is disabled, has IPV6 server ip, control flags false,
+ // empty prefix/suffix
+ std::string config_str2 =
+ "{ \"dhcp-ddns\" :"
+ " {"
+ " \"enable-updates\" : false, "
+ " \"server-ip\" : \"2001:db8::\", "
+ " \"server-port\" : 43567, "
+ " \"sender-ip\" : \"2001:db8::1\", "
+ " \"sender-port\" : 3433, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : false, "
+ " \"override-client-update\" : false, "
+ " \"replace-client-name\" : \"never\", "
+ " \"generated-prefix\" : \"\", "
+ " \"qualifying-suffix\" : \"\", "
+ " \"user-context\": { \"foo\": \"bar\" } "
+ " },"
+ " \"hostname-char-set\" : \"[^A-Z]\", "
+ " \"hostname-char-replacement\" : \"*\" "
+ "}";
+
+ // Verify that the configuration string parses.
+ rcode = parseConfiguration(config_str2);
+ ASSERT_TRUE(rcode == 0) << error_text_;
+
+ // Verify that DHCP-DDNS is disabled and we can fetch the configuration.
+ EXPECT_FALSE(CfgMgr::instance().ddnsEnabled());
+ ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are as expected.
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("2001:db8::", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(43567, d2_client_config->getServerPort());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_FALSE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_FALSE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_NEVER, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("", d2_client_config->getQualifyingSuffix());
+ ASSERT_TRUE(d2_client_config->getContext());
+ EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+
+ ASSERT_NO_THROW(expected = Element::fromJSON(config_str2)->get("dhcp-ddns"));
+ ASSERT_TRUE(expected);
+ runToElementTest<D2ClientConfig>(expected, *d2_client_config);
+}
+
+/// @brief Checks that a valid, enabled D2 client configuration works correctly
+/// with hostname-char stuff in both local and global (local has the priority).
+TEST_F(ParseConfigTest, validD2ConfigBoth) {
+
+ // Configuration string containing valid values.
+ std::string config_str =
+ "{ \"dhcp-ddns\" :"
+ " {"
+ " \"enable-updates\" : true, "
+ " \"server-ip\" : \"192.0.2.0\", "
+ " \"server-port\" : 3432, "
+ " \"sender-ip\" : \"192.0.2.1\", "
+ " \"sender-port\" : 3433, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : true, "
+ " \"override-client-update\" : true, "
+ " \"replace-client-name\" : \"when-present\", "
+ " \"generated-prefix\" : \"test.prefix\", "
+ " \"qualifying-suffix\" : \"test.suffix.\", "
+ " \"user-context\": { \"foo\": \"bar\" } "
+ " },"
+ " \"hostname-char-set\" : \"[^A-Z]\", "
+ " \"hostname-char-replacement\" : \"*\" "
+ "}";
+
+ // Verify that the configuration string parses.
+ int rcode = parseConfiguration(config_str);
+ ASSERT_TRUE(rcode == 0) << error_text_;
+
+ // Verify that DHCP-DDNS is enabled and we can fetch the configuration.
+ EXPECT_TRUE(CfgMgr::instance().ddnsEnabled());
+ D2ClientConfigPtr d2_client_config;
+ ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are as expected.
+ EXPECT_TRUE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("192.0.2.0", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(3432, d2_client_config->getServerPort());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_TRUE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_TRUE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_WHEN_PRESENT, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("test.prefix", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("test.suffix.", d2_client_config->getQualifyingSuffix());
+ ASSERT_TRUE(d2_client_config->getContext());
+ EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
+
+ // Verify that the configuration object unparses.
+ ConstElementPtr expected;
+ ASSERT_NO_THROW(expected = Element::fromJSON(config_str)->get("dhcp-ddns"));
+ ASSERT_TRUE(expected);
+ runToElementTest<D2ClientConfig>(expected, *d2_client_config);
+
+ // Another valid Configuration string.
+ // This one is disabled, has IPV6 server ip, control flags false,
+ // empty prefix/suffix
+ std::string config_str2 =
+ "{ \"dhcp-ddns\" :"
+ " {"
+ " \"enable-updates\" : false, "
+ " \"server-ip\" : \"2001:db8::\", "
+ " \"server-port\" : 43567, "
+ " \"sender-ip\" : \"2001:db8::1\", "
+ " \"sender-port\" : 3433, "
+ " \"max-queue-size\" : 2048, "
+ " \"ncr-protocol\" : \"UDP\", "
+ " \"ncr-format\" : \"JSON\", "
+ " \"override-no-update\" : false, "
+ " \"override-client-update\" : false, "
+ " \"replace-client-name\" : \"never\", "
+ " \"generated-prefix\" : \"\", "
+ " \"qualifying-suffix\" : \"\", "
+ " \"user-context\": { \"foo\": \"bar\" } "
+ " },"
+ " \"hostname-char-set\" : \"[^A-Z]\", "
+ " \"hostname-char-replacement\" : \"*\" "
+ "}";
+
+ // Verify that the configuration string parses.
+ rcode = parseConfiguration(config_str2);
+ ASSERT_TRUE(rcode == 0) << error_text_;
+
+ // Verify that DHCP-DDNS is disabled and we can fetch the configuration.
+ EXPECT_FALSE(CfgMgr::instance().ddnsEnabled());
+ ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
+ ASSERT_TRUE(d2_client_config);
+
+ // Verify that the configuration values are as expected.
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+ EXPECT_EQ("2001:db8::", d2_client_config->getServerIp().toText());
+ EXPECT_EQ(43567, d2_client_config->getServerPort());
+ EXPECT_EQ(dhcp_ddns::NCR_UDP, d2_client_config->getNcrProtocol());
+ EXPECT_EQ(dhcp_ddns::FMT_JSON, d2_client_config->getNcrFormat());
+ EXPECT_FALSE(d2_client_config->getOverrideNoUpdate());
+ EXPECT_FALSE(d2_client_config->getOverrideClientUpdate());
+ EXPECT_EQ(D2ClientConfig::RCM_NEVER, d2_client_config->getReplaceClientNameMode());
+ EXPECT_EQ("", d2_client_config->getGeneratedPrefix());
+ EXPECT_EQ("", d2_client_config->getQualifyingSuffix());
+ ASSERT_TRUE(d2_client_config->getContext());
+ EXPECT_EQ("{ \"foo\": \"bar\" }", d2_client_config->getContext()->str());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
ASSERT_NO_THROW(expected = Element::fromJSON(config_str2)->get("dhcp-ddns"));
ASSERT_TRUE(expected);
ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
EXPECT_TRUE(d2_client_config);
EXPECT_FALSE(d2_client_config->getEnableUpdates());
+ EXPECT_TRUE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_TRUE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_FALSE(d2_client_config->getHostnameSanitizer());
+
+ // Retry with hostname-char-* globals.
+ std::string config_str2 =
+ "{ \"dhcp-ddns\" :"
+ " {"
+ " \"enable-updates\" : false"
+ " },"
+ " \"hostname-char-set\" : \"[^A-Z]\", "
+ " \"hostname-char-replacement\" : \"*\" "
+ "}";
+
+ // Verify that the configuration string parses.
+ rcode = parseConfiguration(config_str2);
+ ASSERT_TRUE(rcode == 0) << error_text_;
+
+ // Verify that DHCP-DDNS is disabled.
+ EXPECT_FALSE(CfgMgr::instance().ddnsEnabled());
+
+ // Make sure fetched config agrees.
+ ASSERT_NO_THROW(d2_client_config = CfgMgr::instance().getD2ClientConfig());
+ EXPECT_TRUE(d2_client_config);
+ EXPECT_FALSE(d2_client_config->getEnableUpdates());
+ EXPECT_FALSE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_EQ("[^A-Z]", d2_client_config->getHostnameCharSet().get());
+ EXPECT_FALSE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_EQ("*", d2_client_config->getHostnameCharReplacement().get());
+ EXPECT_TRUE(d2_client_config->getHostnameSanitizer());
}
/// @brief Checks that given a partial configuration, parser supplies
d2_client_config->getGeneratedPrefix());
EXPECT_EQ("test.suffix.",
d2_client_config->getQualifyingSuffix());
+ EXPECT_TRUE(d2_client_config->getHostnameCharSet().unspecified());
+ EXPECT_TRUE(d2_client_config->getHostnameCharSet().empty());
+ EXPECT_TRUE(d2_client_config->getHostnameCharReplacement().unspecified());
+ EXPECT_TRUE(d2_client_config->getHostnameCharReplacement().empty());
+ EXPECT_FALSE(d2_client_config->getHostnameSanitizer());
}