///
/// \param server The \c AuthSrv object on which the command is executed.
/// \param args Command specific argument.
- /// \return command result data in JSON format.
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr args) = 0;
+ /// \return command result using createAnswer().
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr args) = 0;
};
// Handle the "shutdown" command.
class ShutdownCommand : public AuthCommand {
public:
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr args) {
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr args) {
// Is the pid argument provided?
if (args && args->contains("pid")) {
// If it is, we check it is the same as our PID
// Handle the "getstats" command. The argument is a list.
class GetStatsCommand : public AuthCommand {
public:
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr) {
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr) {
LOG_DEBUG(auth_logger, DBG_AUTH_OPS, AUTH_RECEIVED_GETSTATS);
return (createAnswer(0, server.getStatistics()));
}
class StartDDNSForwarderCommand : public AuthCommand {
public:
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr) {
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr) {
server.createDDNSForwarder();
return (createAnswer());
}
class StopDDNSForwarderCommand : public AuthCommand {
public:
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr) {
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr) {
server.destroyDDNSForwarder();
return (createAnswer());
}
// Handle the "loadzone" command.
class LoadZoneCommand : public AuthCommand {
public:
- virtual ConstElementPtr exec(AuthSrv& server, isc::data::ConstElementPtr args) {
+ virtual ConstElementPtr exec(AuthSrv& server,
+ isc::data::ConstElementPtr args) {
if (args == NULL) {
isc_throw(AuthCommandError, "Null argument");
}
execAuthServerCommand(AuthSrv& server, const string& command_id,
ConstElementPtr args)
{
- ConstElementPtr value;
-
LOG_DEBUG(auth_logger, DBG_AUTH_OPS, AUTH_RECEIVED_COMMAND).arg(command_id);
try {
- value = scoped_ptr<AuthCommand>(createAuthCommand(command_id))->exec(server,
- args);
+ return (scoped_ptr<AuthCommand>(
+ createAuthCommand(command_id))->exec(server, args));
} catch (const isc::Exception& ex) {
LOG_ERROR(auth_logger, AUTH_COMMAND_FAILED).arg(command_id)
.arg(ex.what());
return (createAnswer(1, ex.what()));
}
-
- return (value);
}
isc::data::ElementPtr
AuthCountersImpl::getStatistics() const {
std::stringstream statistics_string;
- statistics_string
- << "{ \"queries.udp\": "
- << server_counter_.get(AuthCounters::SERVER_UDP_QUERY)
- << ", \"queries.tcp\": "
- << server_counter_.get(
- AuthCounters::SERVER_TCP_QUERY);
+ statistics_string << "{ \"queries.udp\": "
+ << server_counter_.get(AuthCounters::SERVER_UDP_QUERY)
+ << ", \"queries.tcp\": "
+ << server_counter_.get(AuthCounters::SERVER_TCP_QUERY);
// Insert non 0 Opcode counters.
for (int i = 0; i < NUM_OPCODES; ++i) {
const Counter::Type counter = opcode_counter_.get(i);
isc::data::Element::fromJSON(statistics_string);
// validate the statistics data before send
if (validator_) {
- if (!validator_(statistics_element)) {
+ if (!validator_(
+ static_cast<isc::data::ConstElementPtr>(statistics_element)))
+ {
LOG_ERROR(auth_logger, AUTH_INVALID_STATISTICS_DATA);
return (isc::data::ElementPtr());
}
Element::fromJSON("{\"version\": 0}")));
}
+TEST_F(AuthConfigTest, exceptionGuarantee) {
+ using namespace isc::server_common::portconfig;
+ AddressList a, b, c;
+ a.push_back(AddressPair("127.0.0.1", 53210));
+ server.setListenAddresses(a);
+ b = server.getListenAddresses();
+ EXPECT_EQ(a.size(), b.size());
+ EXPECT_EQ(a.at(0).first, b.at(0).first);
+ EXPECT_EQ(a.at(0).second, b.at(0).second);
+ // This configuration contains an invalid item, which will trigger
+ // an exception.
+ EXPECT_THROW(configureAuthServer(
+ server,
+ Element::fromJSON(
+ "{ \"no_such_config_var\": 1}")),
+ AuthConfigError);
+ // The server state shouldn't change
+ c = server.getListenAddresses();
+ EXPECT_EQ(a.size(), c.size());
+ EXPECT_EQ(a.at(0).first, c.at(0).first);
+ EXPECT_EQ(a.at(0).second, c.at(0).second);
+}
+
TEST_F(AuthConfigTest, badConfig) {
// These should normally not happen, but should be handled to avoid
// an unexpected crash due to a bug of the caller.