Commit 4d816136 authored by Michal 'vorner' Vaner's avatar Michal 'vorner' Vaner
Browse files

Merge branch 'work/log/servercommon'

Conflicts:
	src/lib/server_common/Makefile.am
parents 1eb10de8 af1dbc50
......@@ -163,6 +163,8 @@ public:
}
/// \brief String version of arg.
///
/// \param arg The text to place into the placeholder.
Formatter& arg(const std::string& arg) {
if (logger_) {
// Note that this method does a replacement and returns the
......@@ -180,6 +182,18 @@ public:
return (*this);
}
/// \brief Exception version of arg.
///
/// \param e An exception which the "what()" is extracted an put into the
/// message.
Formatter& arg(const std::exception& e) {
if (logger_) {
return (arg(e.what()));
} else {
return (*this);
}
}
};
}
......
......@@ -123,4 +123,19 @@ TEST_F(FormatterTest, noRecurse) {
EXPECT_EQ("%1 %1", outputs[0].second);
}
// Test it can accept exceptions (which don't have a default conversion
// to string by themself)
TEST_F(FormatterTest, exception) {
class Ex : public std::exception {
public:
virtual const char* what() const throw() {
return "Exception test";
}
};
Formatter(isc::log::INFO, s("%1"), this).arg(Ex());
ASSERT_EQ(1, outputs.size());
EXPECT_EQ(isc::log::INFO, outputs[0].first);
EXPECT_EQ("Exception test", outputs[0].second);
}
}
......@@ -20,6 +20,9 @@ lib_LTLIBRARIES = libserver_common.la
libserver_common_la_SOURCES = client.h client.cc
libserver_common_la_SOURCES += keyring.h keyring.cc
libserver_common_la_SOURCES += portconfig.h portconfig.cc
libserver_common_la_SOURCES += logger.h logger.cc
nodist_libserver_common_la_SOURCES = server_common_messages.h
nodist_libserver_common_la_SOURCES += server_common_messages.cc
libserver_common_la_LIBADD = $(top_builddir)/src/lib/exceptions/libexceptions.la
libserver_common_la_LIBADD += $(top_builddir)/src/lib/asiolink/libasiolink.la
libserver_common_la_LIBADD += $(top_builddir)/src/lib/cc/libcc.la
......@@ -27,5 +30,10 @@ libserver_common_la_LIBADD += $(top_builddir)/src/lib/config/libcfgclient.la
libserver_common_la_LIBADD += $(top_builddir)/src/lib/log/liblog.la
libserver_common_la_LIBADD += $(top_builddir)/src/lib/acl/libacl.la
libserver_common_la_LIBADD += $(top_builddir)/src/lib/dns/libdns++.la
BUILT_SOURCES = server_common_messages.h server_common_messages.cc
server_common_messages.h server_common_messages.cc: server_common_messages.mes
$(top_builddir)/src/lib/log/compiler/message $(top_srcdir)/src/lib/server_common/server_common_messages.mes
CLEANFILES = *.gcno *.gcda
EXTRA_DIST = server_common_messages.mes
CLEANFILES = *.gcno *.gcda server_common_messages.h server_common_messages.cc
......@@ -13,6 +13,7 @@
// PERFORMANCE OF THIS SOFTWARE.
#include <server_common/keyring.h>
#include <server_common/logger.h>
using namespace isc::dns;
using namespace isc::data;
......@@ -31,6 +32,7 @@ updateKeyring(const std::string&, ConstElementPtr data,
const isc::config::ConfigData&) {
ConstElementPtr list(data->get("keys"));
KeyringPtr load(new TSIGKeyRing);
LOG_DEBUG(logger, DBG_TRACE_BASIC, SRVCOMM_KEYS_UPDATE);
// Note that 'data' only contains explicitly configured config parameters.
// So if we use the default list is NULL, rather than an empty list, and
......@@ -50,6 +52,7 @@ initKeyring(config::ModuleCCSession& session) {
// We are already initialized
return;
}
LOG_DEBUG(logger, DBG_TRACE_BASIC, SRVCOMM_KEYS_INIT);
session.addRemoteConfig("tsig_keys", updateKeyring, false);
}
......@@ -59,6 +62,7 @@ deinitKeyring(config::ModuleCCSession& session) {
// Not initialized, ignore it
return;
}
LOG_DEBUG(logger, DBG_TRACE_BASIC, SRVCOMM_KEYS_DEINIT);
keyring.reset();
session.removeRemoteConfig("tsig_keys");
}
......
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <server_common/logger.h>
namespace isc {
namespace server_common {
isc::log::Logger logger("server_common");
}
}
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#ifndef __SERVER_COMMON_LOGGER_H
#define __SERVER_COMMON_LOGGER_H
#include <log/macros.h>
#include <server_common/server_common_messages.h>
/// \file logger.h
/// \brief Server Common library global logger
///
/// This holds the logger for the server common library. It is a private header
/// and should not be included in any publicly used header, only in local
/// cc files.
namespace isc {
namespace server_common {
/// \brief The logger for this library
extern isc::log::Logger logger;
enum {
/// \brief Trace basic operations
DBG_TRACE_BASIC = 10,
/// \brief Print also values used
DBG_TRACE_VALUES = 40
};
}
}
#endif
......@@ -13,10 +13,10 @@
// PERFORMANCE OF THIS SOFTWARE.
#include <server_common/portconfig.h>
#include <server_common/logger.h>
#include <asiolink/io_address.h>
#include <asiodns/dns_service.h>
#include <log/dummylog.h>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
......@@ -25,7 +25,6 @@ using namespace std;
using namespace isc::data;
using namespace isc::asiolink;
using namespace isc::asiodns;
using isc::log::dlog;
namespace isc {
namespace server_common {
......@@ -43,6 +42,8 @@ parseAddresses(isc::data::ConstElementPtr addresses,
ConstElementPtr addr(addrPair->get("address"));
ConstElementPtr port(addrPair->get("port"));
if (!addr || ! port) {
LOG_ERROR(logger, SRVCOMM_ADDRESS_MISSING).
arg(addrPair->str());
isc_throw(BadValue, "Address must contain both the IP"
"address and port");
}
......@@ -50,6 +51,8 @@ parseAddresses(isc::data::ConstElementPtr addresses,
IOAddress(addr->stringValue());
if (port->intValue() < 0 ||
port->intValue() > 0xffff) {
LOG_ERROR(logger, SRVCOMM_PORT_RANGE).
arg(port->intValue()).arg(addrPair->str());
isc_throw(BadValue, "Bad port value (" <<
port->intValue() << ")");
}
......@@ -57,11 +60,14 @@ parseAddresses(isc::data::ConstElementPtr addresses,
port->intValue()));
}
catch (const TypeError &e) { // Better error message
LOG_ERROR(logger, SRVCOMM_ADDRESS_TYPE).
arg(addrPair->str());
isc_throw(TypeError,
"Address must be a string and port an integer");
}
}
} else if (addresses->getType() != Element::null) {
LOG_ERROR(logger, SRVCOMM_ADDRESSES_NOT_LIST).arg(elemName);
isc_throw(TypeError, elemName + " config element must be a list");
}
}
......@@ -86,10 +92,10 @@ installListenAddresses(const AddressList& newAddresses,
isc::asiodns::DNSService& service)
{
try {
dlog("Setting listen addresses:");
LOG_DEBUG(logger, DBG_TRACE_BASIC, SRVCOMM_SET_LISTEN);
BOOST_FOREACH(const AddressPair& addr, newAddresses) {
dlog(" " + addr.first + ":" +
boost::lexical_cast<string>(addr.second));
LOG_DEBUG(logger, DBG_TRACE_VALUES, SRVCOMM_ADDRESS_VALUE).
arg(addr.first).arg(addr.second);
}
setAddresses(service, newAddresses);
addressStore = newAddresses;
......@@ -108,13 +114,12 @@ installListenAddresses(const AddressList& newAddresses,
* user will get error info, command control can be used to set new
* address. So we just catch the exception without propagating outside
*/
dlog(string("Unable to set new address: ") + e.what(), true);
LOG_ERROR(logger, SRVCOMM_ADDRESS_FAIL).arg(e);
try {
setAddresses(service, addressStore);
}
catch (const exception& e2) {
dlog("Unable to recover from error;", true);
dlog(string("Rollback failed with: ") + e2.what(), true);
LOG_FATAL(logger, SRVCOMM_ADDRESS_UNRECOVERABLE).arg(e2);
}
//Anyway the new configure has problem, we need to notify configure
//manager the new configure doesn't work
......
# Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
$NAMESPACE isc::server_common
# \brief Messages for the server_common library
% SRVCOMM_ADDRESSES_NOT_LIST the address and port specification is not a list in %1
This points to an error in configuration. What was supposed to be a list of
IP address - port pairs isn't a list at all but something else.
% SRVCOMM_ADDRESS_FAIL failed to listen on addresses (%1)
The server failed to bind to one of the address/port pair it should according
to configuration, for reason listed in the message (usually because that pair
is already used by other service or missing privileges). The server will try
to recover and bind the address/port pairs it was listening to before (if any).
% SRVCOMM_ADDRESS_MISSING address specification is missing "address" or "port" element in %1
This points to an error in configuration. An address specification in the
configuration is missing either an address or port and so cannot be used. The
specification causing the error is given in the message.
% SRVCOMM_ADDRESS_TYPE address specification type is invalid in %1
This points to an error in configuration. An address specification in the
configuration malformed. The specification causing the error is given in the
message. A valid specification contains an address part (which must be a string
and must represent a valid IPv4 or IPv6 address) and port (which must be an
integer in the range valid for TCP/UDP ports on your system).
% SRVCOMM_ADDRESS_UNRECOVERABLE failed to recover original addresses also (%2)
The recovery of old addresses after SRVCOMM_ADDRESS_FAIL also failed for
the reason listed.
The condition indicates problems with the server and/or the system on
which it is running. The server will continue running to allow
reconfiguration, but will not be listening on any address or port until
an administrator does so.
% SRVCOMM_ADDRESS_VALUE address to set: %1#%2
Debug message. This lists one address and port value of the set of
addresses we are going to listen on (eg. there will be one log message
per pair). This appears only after SRVCOMM_SET_LISTEN, but might
be hidden, as it has higher debug level.
% SRVCOMM_KEYS_DEINIT deinitializing TSIG keyring
Debug message indicating that the server is deinitializing the TSIG keyring.
% SRVCOMM_KEYS_INIT initializing TSIG keyring
Debug message indicating that the server is initializing the global TSIG
keyring. This should be seen only at server start.
% SRVCOMM_KEYS_UPDATE updating TSIG keyring
Debug message indicating new keyring is being loaded from configuration (either
on startup or as a result of configuration update).
% SRVCOMM_PORT_RANGE port out of valid range (%1 in %2)
This points to an error in configuration. The port in an address
specification is outside the valid range of 0 to 65535.
% SRVCOMM_SET_LISTEN setting addresses to listen to
Debug message, noting that the server is about to start listening on a
different set of IP addresses and ports than before.
......@@ -16,6 +16,7 @@
#include <gtest/gtest.h>
#include <util/unittests/run_all.h>
#include <log/logger_support.h>
#include <dns/tests/unittest_util.h>
......@@ -23,5 +24,7 @@ int
main(int argc, char* argv[]) {
::testing::InitGoogleTest(&argc, argv);
isc::log::initLogger();
return (isc::util::unittests::run_all());
}
Markdown is supported
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