Commit b2c8aa2a authored by Jelte Jansen's avatar Jelte Jansen
Browse files

[1986] add command to start/stop ddns forwarder

parent b6fb7dee
......@@ -339,7 +339,7 @@ AuthSrvImpl::AuthSrvImpl(const bool use_cache,
cache_.setEnabled(use_cache);
// TODO: REMOVE and create 'on demand'
createDDNSForwarder();
//createDDNSForwarder();
}
AuthSrvImpl::~AuthSrvImpl() {
......@@ -663,7 +663,12 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
send_answer = impl_->processNotify(io_message, message, buffer,
tsig_context);
} else if (opcode == Opcode::UPDATE()) {
send_answer = impl_->processUpdate(io_message);
if (impl_->hasDDNSForwarder()) {
send_answer = impl_->processUpdate(io_message);
} else {
makeErrorMessage(impl_->renderer_, message, buffer,
Rcode::NOTIMP(), tsig_context);
}
} else if (opcode != Opcode::QUERY()) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_UNSUPPORTED_OPCODE)
.arg(message.getOpcode().toText());
......@@ -1056,3 +1061,15 @@ void
AuthSrv::setTSIGKeyRing(const boost::shared_ptr<TSIGKeyRing>* keyring) {
impl_->keyring_ = keyring;
}
void
AuthSrv::createDDNSForwarder() {
impl_->createDDNSForwarder();
}
void
AuthSrv::destroyDDNSForwarder() {
impl_->destroyDDNSForwarder();
}
......@@ -111,7 +111,7 @@ public:
/// This method should never throw an exception.
void stop();
/// \brief Process an incoming DNS message, then signal 'server' to resume
/// \brief Process an incoming DNS message, then signal 'server' to resume
///
/// A DNS query (or other message) has been received by a \c DNSServer
/// object. Find an answer, then post the \c DNSServer object on the
......@@ -355,13 +355,13 @@ public:
bool submitStatistics() const;
/// \brief Get the value of counter in the AuthCounters.
///
///
/// This function calls AuthCounters::getCounter() and
/// returns its return value.
///
/// This function never throws an exception as far as
/// AuthCounters::getCounter() doesn't throw.
///
///
/// Note: Currently this function is for testing purpose only.
///
/// \param type Type of a counter to get the value of
......@@ -418,6 +418,11 @@ public:
void setTSIGKeyRing(const boost::shared_ptr<isc::dns::TSIGKeyRing>*
keyring);
/// \brief Tells the server DDNS update packets can be forwarded internally
///
void createDDNSForwarder();
void destroyDDNSForwarder();
private:
AuthSrvImpl* impl_;
isc::asiolink::SimpleCallback* checkin_;
......@@ -428,6 +433,6 @@ private:
#endif // __AUTH_SRV_H
// Local Variables:
// Local Variables:
// mode: c++
// End:
// End:
......@@ -141,6 +141,20 @@ public:
}
};
class StartDDNSForwarderCommand : public AuthCommand {
public:
virtual void exec(AuthSrv& server, isc::data::ConstElementPtr) {
server.createDDNSForwarder();
}
};
class StopDDNSForwarderCommand : public AuthCommand {
public:
virtual void exec(AuthSrv& server, isc::data::ConstElementPtr) {
server.destroyDDNSForwarder();
}
};
// Handle the "loadzone" command.
class LoadZoneCommand : public AuthCommand {
public:
......@@ -309,6 +323,10 @@ createAuthCommand(const string& command_id) {
return (new SendStatsCommand());
} else if (command_id == "loadzone") {
return (new LoadZoneCommand());
} else if (command_id == "start_ddns_forwarder") {
return (new StartDDNSForwarderCommand());
} else if (command_id == "stop_ddns_forwarder") {
return (new StopDDNSForwarderCommand());
} else if (false && command_id == "_throw_exception") {
// This is for testing purpose only and should not appear in the
// actual configuration syntax.
......
......@@ -99,6 +99,7 @@ protected:
server.setDNSService(dnss_);
server.setXfrinSession(&notify_session);
server.setStatisticsSession(&statistics_session);
server.createDDNSForwarder();
}
~AuthSrvTest() {
......@@ -106,6 +107,7 @@ protected:
// type information may be lost if the message is cleared
// automatically later, so as a precaution we do it now.
parse_message->clear(Message::PARSE);
server.destroyDDNSForwarder();
}
virtual void processMessage() {
......@@ -1625,6 +1627,7 @@ TEST_F(AuthSrvTest, DDNSForwardPushFail) {
TEST_F(AuthSrvTest, DDNSForwardClose) {
scoped_ptr<AuthSrv> tmp_server(new AuthSrv(true, xfrout, ddns_forwarder));
tmp_server->createDDNSForwarder();
UnitTestUtil::createRequestMessage(request_message, Opcode::UPDATE(),
default_qid, Name("example.com"),
RRClass::IN(), RRType::SOA());
......
......@@ -13,9 +13,8 @@ Feature: DDNS System
# Test 1
When I use DDNS to set the SOA serial to 1235
# Note: test spec says refused here, system returns SERVFAIL
#The DDNS response should be REFUSED
The DDNS response should be SERVFAIL
# Note: test spec says refused here, system returns NOTIMP
The DDNS response should be NOTIMP
And the SOA serial for example.org should be 1234
# Test 2
......@@ -84,7 +83,7 @@ Feature: DDNS System
# Test 12
When I use DDNS to set the SOA serial to 1240
# should this be REFUSED again?
The DDNS response should be SERVFAIL
The DDNS response should be NOTIMP
And the SOA serial for example.org should be 1239
Scenario: ACL
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment