|
@@ -39,6 +39,7 @@
|
|
|
#include <dns/rrttl.h>
|
|
|
#include <dns/message.h>
|
|
|
#include <dns/messagerenderer.h>
|
|
|
+#include <server_common/portconfig.h>
|
|
|
|
|
|
#include <log/dummylog.h>
|
|
|
|
|
@@ -52,8 +53,7 @@ using namespace isc::data;
|
|
|
using namespace isc::config;
|
|
|
using isc::log::dlog;
|
|
|
using namespace asiolink;
|
|
|
-
|
|
|
-typedef pair<string, uint16_t> addr_t;
|
|
|
+using namespace isc::server_common::portconfig;
|
|
|
|
|
|
class ResolverImpl {
|
|
|
private:
|
|
@@ -96,14 +96,14 @@ public:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void setForwardAddresses(const vector<addr_t>& upstream,
|
|
|
+ void setForwardAddresses(const vector<AddressPair>& upstream,
|
|
|
DNSService *dnss)
|
|
|
{
|
|
|
upstream_ = upstream;
|
|
|
if (dnss) {
|
|
|
if (!upstream_.empty()) {
|
|
|
dlog("Setting forward addresses:");
|
|
|
- BOOST_FOREACH(const addr_t& address, upstream) {
|
|
|
+ BOOST_FOREACH(const AddressPair& address, upstream) {
|
|
|
dlog(" " + address.first + ":" +
|
|
|
boost::lexical_cast<string>(address.second));
|
|
|
}
|
|
@@ -113,14 +113,14 @@ public:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void setRootAddresses(const vector<addr_t>& upstream_root,
|
|
|
+ void setRootAddresses(const vector<AddressPair>& upstream_root,
|
|
|
DNSService *dnss)
|
|
|
{
|
|
|
upstream_root_ = upstream_root;
|
|
|
if (dnss) {
|
|
|
if (!upstream_root_.empty()) {
|
|
|
dlog("Setting root addresses:");
|
|
|
- BOOST_FOREACH(const addr_t& address, upstream_root) {
|
|
|
+ BOOST_FOREACH(const AddressPair& address, upstream_root) {
|
|
|
dlog(" " + address.first + ":" +
|
|
|
boost::lexical_cast<string>(address.second));
|
|
|
}
|
|
@@ -144,11 +144,11 @@ public:
|
|
|
/// These members are public because Resolver accesses them directly.
|
|
|
ModuleCCSession* config_session_;
|
|
|
/// Addresses of the root nameserver(s)
|
|
|
- vector<addr_t> upstream_root_;
|
|
|
+ vector<AddressPair> upstream_root_;
|
|
|
/// Addresses of the forward nameserver
|
|
|
- vector<addr_t> upstream_;
|
|
|
+ vector<AddressPair> upstream_;
|
|
|
/// Addresses we listen on
|
|
|
- vector<addr_t> listen_;
|
|
|
+ vector<AddressPair> listen_;
|
|
|
|
|
|
/// Timeout for outgoing queries in milliseconds
|
|
|
int query_timeout_;
|
|
@@ -460,46 +460,6 @@ ResolverImpl::processNormalQuery(const Question& question,
|
|
|
rec_query_->resolve(question, answer_message, buffer, server);
|
|
|
}
|
|
|
|
|
|
-namespace {
|
|
|
-
|
|
|
-vector<addr_t>
|
|
|
-parseAddresses(ConstElementPtr addresses) {
|
|
|
- vector<addr_t> result;
|
|
|
- if (addresses) {
|
|
|
- if (addresses->getType() == Element::list) {
|
|
|
- for (size_t i(0); i < addresses->size(); ++ i) {
|
|
|
- ConstElementPtr addrPair(addresses->get(i));
|
|
|
- ConstElementPtr addr(addrPair->get("address"));
|
|
|
- ConstElementPtr port(addrPair->get("port"));
|
|
|
- if (!addr || ! port) {
|
|
|
- isc_throw(BadValue, "Address must contain both the IP"
|
|
|
- "address and port");
|
|
|
- }
|
|
|
- try {
|
|
|
- IOAddress(addr->stringValue());
|
|
|
- if (port->intValue() < 0 ||
|
|
|
- port->intValue() > 0xffff) {
|
|
|
- isc_throw(BadValue, "Bad port value (" <<
|
|
|
- port->intValue() << ")");
|
|
|
- }
|
|
|
- result.push_back(addr_t(addr->stringValue(),
|
|
|
- port->intValue()));
|
|
|
- }
|
|
|
- catch (const TypeError &e) { // Better error message
|
|
|
- isc_throw(TypeError,
|
|
|
- "Address must be a string and port an integer");
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (addresses->getType() != Element::null) {
|
|
|
- isc_throw(TypeError,
|
|
|
- "root_addresses, forward_addresses, and listen_on config element must be a list");
|
|
|
- }
|
|
|
- }
|
|
|
- return (result);
|
|
|
-}
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
ConstElementPtr
|
|
|
Resolver::updateConfig(ConstElementPtr config) {
|
|
|
dlog("New config comes: " + config->toWire());
|
|
@@ -507,11 +467,14 @@ Resolver::updateConfig(ConstElementPtr config) {
|
|
|
try {
|
|
|
// Parse forward_addresses
|
|
|
ConstElementPtr rootAddressesE(config->get("root_addresses"));
|
|
|
- vector<addr_t> rootAddresses(parseAddresses(rootAddressesE));
|
|
|
+ vector<AddressPair> rootAddresses(parseAddresses(rootAddressesE,
|
|
|
+ "root_addresses"));
|
|
|
ConstElementPtr forwardAddressesE(config->get("forward_addresses"));
|
|
|
- vector<addr_t> forwardAddresses(parseAddresses(forwardAddressesE));
|
|
|
+ vector<AddressPair> forwardAddresses(parseAddresses(forwardAddressesE,
|
|
|
+ "forward_addresse"));
|
|
|
ConstElementPtr listenAddressesE(config->get("listen_on"));
|
|
|
- vector<addr_t> listenAddresses(parseAddresses(listenAddressesE));
|
|
|
+ vector<AddressPair> listenAddresses(parseAddresses(listenAddressesE,
|
|
|
+ "listen_on"));
|
|
|
bool set_timeouts(false);
|
|
|
int qtimeout = impl_->query_timeout_;
|
|
|
int ctimeout = impl_->client_timeout_;
|
|
@@ -584,13 +547,13 @@ Resolver::updateConfig(ConstElementPtr config) {
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-Resolver::setForwardAddresses(const vector<addr_t>& addresses)
|
|
|
+Resolver::setForwardAddresses(const vector<AddressPair>& addresses)
|
|
|
{
|
|
|
impl_->setForwardAddresses(addresses, dnss_);
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-Resolver::setRootAddresses(const vector<addr_t>& addresses)
|
|
|
+Resolver::setRootAddresses(const vector<AddressPair>& addresses)
|
|
|
{
|
|
|
impl_->setRootAddresses(addresses, dnss_);
|
|
|
}
|
|
@@ -600,12 +563,12 @@ Resolver::isForwarding() const {
|
|
|
return (!impl_->upstream_.empty());
|
|
|
}
|
|
|
|
|
|
-vector<addr_t>
|
|
|
+vector<AddressPair>
|
|
|
Resolver::getForwardAddresses() const {
|
|
|
return (impl_->upstream_);
|
|
|
}
|
|
|
|
|
|
-vector<addr_t>
|
|
|
+vector<AddressPair>
|
|
|
Resolver::getRootAddresses() const {
|
|
|
return (impl_->upstream_root_);
|
|
|
}
|
|
@@ -613,9 +576,9 @@ Resolver::getRootAddresses() const {
|
|
|
namespace {
|
|
|
|
|
|
void
|
|
|
-setAddresses(DNSService *service, const vector<addr_t>& addresses) {
|
|
|
+setAddresses(DNSService *service, const vector<AddressPair>& addresses) {
|
|
|
service->clearServers();
|
|
|
- BOOST_FOREACH(const addr_t &address, addresses) {
|
|
|
+ BOOST_FOREACH(const AddressPair &address, addresses) {
|
|
|
service->addServer(address.second, address.first);
|
|
|
}
|
|
|
}
|
|
@@ -623,10 +586,10 @@ setAddresses(DNSService *service, const vector<addr_t>& addresses) {
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-Resolver::setListenAddresses(const vector<addr_t>& addresses) {
|
|
|
+Resolver::setListenAddresses(const vector<AddressPair>& addresses) {
|
|
|
try {
|
|
|
dlog("Setting listen addresses:");
|
|
|
- BOOST_FOREACH(const addr_t& addr, addresses) {
|
|
|
+ BOOST_FOREACH(const AddressPair& addr, addresses) {
|
|
|
dlog(" " + addr.first + ":" +
|
|
|
boost::lexical_cast<string>(addr.second));
|
|
|
}
|
|
@@ -687,7 +650,7 @@ Resolver::getRetries() const {
|
|
|
return impl_->retries_;
|
|
|
}
|
|
|
|
|
|
-vector<addr_t>
|
|
|
+vector<AddressPair>
|
|
|
Resolver::getListenAddresses() const {
|
|
|
return (impl_->listen_);
|
|
|
}
|