[svn] commit: r3730 - in /branches/trac405: ./ src/bin/ src/bin/auth/ src/bin/auth/tests/ src/bin/bind10/ src/bin/bind10/tests/ src/bin/bindctl/ src/bin/host/ src/bin/msgq/ src/bin/recurse/ src/bin/xfrin/ src/bin/xfrout/ src/bin/xfrout/tests/ src/bin/zonemgr/ src/lib/bench/ src/lib/cc/ src/lib/cc/tests/ src/lib/config/ src/lib/config/tests/ src/lib/datasrc/ src/lib/datasrc/tests/ src/lib/dns/ src/lib/dns/python/ src/lib/dns/python/tests/ src/lib/dns/rdata/any_255/ src/lib/dns/rdata/ch_3/ src/lib/dns/rdata/generic/ src/lib/dns/rdata/hs_4/ src/lib/dns/tests/ src/lib/dns/tests/testdata/ src/lib/exceptions/ src/lib/python/isc/cc/ src/lib/python/isc/cc/tests/ src/lib/python/isc/config/ src/lib/python/isc/config/tests/ src/lib/python/isc/datasrc/ src/lib/python/isc/datasrc/tests/ src/lib/python/isc/notify/ src/lib/python/isc/notify/tests/ src/lib/python/isc/utils/ src/lib/xfr/
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Dec 6 14:50:36 UTC 2010
Author: jelte
Date: Mon Dec 6 14:50:36 2010
New Revision: 3730
Log:
sync with trunk for merge
Added:
branches/trac405/src/bin/recurse/
- copied from r3729, trunk/src/bin/recurse/
branches/trac405/src/lib/dns/rdata/any_255/
- copied from r3729, trunk/src/lib/dns/rdata/any_255/
branches/trac405/src/lib/python/isc/datasrc/tests/
- copied from r3729, trunk/src/lib/python/isc/datasrc/tests/
branches/trac405/src/lib/python/isc/utils/
- copied from r3729, trunk/src/lib/python/isc/utils/
Removed:
branches/trac405/src/lib/dns/tests/tsig_unittest.cc
branches/trac405/src/lib/dns/tsig.cc
branches/trac405/src/lib/dns/tsig.h
Modified:
branches/trac405/ (props changed)
branches/trac405/ChangeLog
branches/trac405/README
branches/trac405/configure.ac
branches/trac405/src/bin/Makefile.am
branches/trac405/src/bin/auth/Makefile.am
branches/trac405/src/bin/auth/asio_link.cc
branches/trac405/src/bin/auth/asio_link.h
branches/trac405/src/bin/auth/auth_srv.cc
branches/trac405/src/bin/auth/auth_srv.h
branches/trac405/src/bin/auth/tests/Makefile.am
branches/trac405/src/bin/auth/tests/auth_srv_unittest.cc
branches/trac405/src/bin/bind10/bind10.py.in (contents, props changed)
branches/trac405/src/bin/bind10/bob.spec
branches/trac405/src/bin/bind10/run_bind10.sh.in
branches/trac405/src/bin/bind10/tests/bind10_test.py
branches/trac405/src/bin/bindctl/bindcmd.py
branches/trac405/src/bin/bindctl/bindctl-source.py.in
branches/trac405/src/bin/host/host.cc
branches/trac405/src/bin/msgq/msgq.py.in
branches/trac405/src/bin/xfrin/b10-xfrin.xml
branches/trac405/src/bin/xfrout/b10-xfrout.8
branches/trac405/src/bin/xfrout/b10-xfrout.xml
branches/trac405/src/bin/xfrout/tests/xfrout_test.py
branches/trac405/src/bin/xfrout/xfrout.py.in
branches/trac405/src/bin/xfrout/xfrout.spec.pre.in
branches/trac405/src/bin/zonemgr/zonemgr.py.in
branches/trac405/src/lib/bench/benchmark.h
branches/trac405/src/lib/cc/data.cc
branches/trac405/src/lib/cc/tests/session_unittests.cc
branches/trac405/src/lib/config/config_data.cc
branches/trac405/src/lib/config/tests/Makefile.am
branches/trac405/src/lib/config/tests/ccsession_unittests.cc
branches/trac405/src/lib/config/tests/config_data_unittests.cc
branches/trac405/src/lib/config/tests/fake_session.cc
branches/trac405/src/lib/config/tests/fake_session.h
branches/trac405/src/lib/datasrc/Makefile.am
branches/trac405/src/lib/datasrc/cache.h
branches/trac405/src/lib/datasrc/data_source.cc
branches/trac405/src/lib/datasrc/static_datasrc.cc
branches/trac405/src/lib/datasrc/tests/Makefile.am
branches/trac405/src/lib/datasrc/tests/datasrc_unittest.cc
branches/trac405/src/lib/datasrc/tests/sqlite3_unittest.cc
branches/trac405/src/lib/datasrc/tests/static_unittest.cc
branches/trac405/src/lib/datasrc/tests/test_datasrc.cc
branches/trac405/src/lib/dns/Makefile.am
branches/trac405/src/lib/dns/edns.cc
branches/trac405/src/lib/dns/python/Makefile.am
branches/trac405/src/lib/dns/python/name_python.cc
branches/trac405/src/lib/dns/python/opcode_python.cc
branches/trac405/src/lib/dns/python/pydnspp.cc
branches/trac405/src/lib/dns/python/rcode_python.cc
branches/trac405/src/lib/dns/python/rrclass_python.cc
branches/trac405/src/lib/dns/python/rrset_python.cc
branches/trac405/src/lib/dns/python/rrtype_python.cc
branches/trac405/src/lib/dns/python/tests/Makefile.am
branches/trac405/src/lib/dns/rdata/ch_3/a_1.cc
branches/trac405/src/lib/dns/rdata/generic/cname_5.cc
branches/trac405/src/lib/dns/rdata/generic/dname_39.cc
branches/trac405/src/lib/dns/rdata/generic/mx_15.cc
branches/trac405/src/lib/dns/rdata/generic/ns_2.cc
branches/trac405/src/lib/dns/rdata/generic/opt_41.cc
branches/trac405/src/lib/dns/rdata/generic/ptr_12.cc
branches/trac405/src/lib/dns/rdata/generic/soa_6.cc
branches/trac405/src/lib/dns/rdata/hs_4/a_1.cc
branches/trac405/src/lib/dns/rrclass-placeholder.h
branches/trac405/src/lib/dns/rrset.cc
branches/trac405/src/lib/dns/rrset.h
branches/trac405/src/lib/dns/tests/Makefile.am
branches/trac405/src/lib/dns/tests/message_unittest.cc
branches/trac405/src/lib/dns/tests/rrset_unittest.cc
branches/trac405/src/lib/dns/tests/rrsetlist_unittest.cc
branches/trac405/src/lib/dns/tests/testdata/Makefile.am
branches/trac405/src/lib/dns/tests/testdata/gen-wiredata.py.in
branches/trac405/src/lib/dns/tests/unittest_util.cc
branches/trac405/src/lib/exceptions/exceptions.h
branches/trac405/src/lib/python/isc/cc/data.py
branches/trac405/src/lib/python/isc/cc/session.py
branches/trac405/src/lib/python/isc/cc/tests/session_test.py
branches/trac405/src/lib/python/isc/config/config_data.py
branches/trac405/src/lib/python/isc/config/tests/config_data_test.py
branches/trac405/src/lib/python/isc/datasrc/Makefile.am
branches/trac405/src/lib/python/isc/datasrc/master.py
branches/trac405/src/lib/python/isc/notify/notify_out.py
branches/trac405/src/lib/python/isc/notify/tests/notify_out_test.py
branches/trac405/src/lib/xfr/fd_share.cc
branches/trac405/src/lib/xfr/fd_share.h
branches/trac405/src/lib/xfr/fdshare_python.cc
branches/trac405/src/lib/xfr/xfrout_client.cc
Modified: branches/trac405/ChangeLog
==============================================================================
--- branches/trac405/ChangeLog (original)
+++ branches/trac405/ChangeLog Mon Dec 6 14:50:36 2010
@@ -1,3 +1,58 @@
+bind10-devel-20101201 released on December 01, 2010
+
+ 124. [bug] jreed
+ Fix some wrong version reporting. Now also show the version
+ for the component and BIND 10 suite. (Trac #302, svn r3696)
+
+ 123. [bug] jelte
+ src/bin/bindctl printed values had the form of python literals
+ (e.g. 'True'), while the input requires valid JSON (e.g. 'true').
+ Output changed to JSON format for consistency. (svn r3694)
+
+ 122. [func] stephen
+ src/bin/bind10: Added configuration options to Boss to determine
+ whether to start the authoritative server, recursive server (or
+ both). A dummy recursor has been provided for test purposes.
+ (Trac #412, svn r3676)
+
+ 121. [func] jinmei
+ src/lib/dns: Added support for TSIG RDATA. At this moment this is
+ not much of real use, however, because no protocol support was
+ added yet. It will soon be added. (Trac #372, svn r3649)
+
+ 120. [func] jinmei
+ src/lib/dns: introduced two new classes, TSIGKey and TSIGKeyRing,
+ to manage TSIG keys. (Trac #381, svn r3622)
+
+ 119. [bug] jinmei
+ The master file parser of the python datasrc module incorrectly
+ regarded a domain name beginning with a decimal number as a TTL
+ specification. This confused b10-loadzone and had it reject to
+ load a zone file that contains such a name.
+ Note: this fix is incomplete and the loadzone would still be
+ confused if the owner name is a syntactically indistinguishable
+ from a TTL specification. This is part of a more general issue
+ and will be addressed in Trac #413. (Trac #411, svn r3599)
+
+ 118. [func] jinmei
+ src/lib/dns: changed the interface of
+ AbstractRRset::getRdataIterator() so that the internal
+ cursor would point to the first RDATA automatically. This
+ will be a more intuitive and less error prone behavior.
+ This is a backward compatible change. (Trac #410, r3595)
+
+ 117. [func] jinmei
+ src/lib/datasrc: added new zone and zone table classes for the
+ support of in memory data source. This is an intermediate step to
+ the bigger feature, and is not yet actually usable in practice.
+ (Trac #399, svn r3590)
+
+ 116. [bug] jerry
+ src/bin/xfrout: Xfrout and Auth will communicate by long tcp
+ connection, Auth needs to make a new connection only on the first
+ time or if an error occurred.
+ (Trac #299, svn r3482)
+
115. [func]* jinmei
src/lib/dns: Changed DNS message flags and section names from
separate classes to simpler enums, considering the balance between
@@ -10,7 +65,7 @@
(Trac #365, svn r3383)
113. [func]* zhanglikun
- Folder name 'utils'(the folder in /src/lib/python/isc/) has been
+ Folder name 'utils'(the folder in /src/lib/python/isc/) has been
renamed to 'util'. Programs that used 'import isc.utils.process'
now need to use 'import isc.util.process'. The folder
/src/lib/python/isc/Util is removed since it isn't used by any
@@ -20,15 +75,13 @@
Add one mixin class to override the naive serve_forever() provided
in python library socketserver. Instead of polling for shutdwon
every poll_interval seconds, one socketpair is used to wake up
- the waiting server.(Trac #352, svn r3366)
+ the waiting server. (Trac #352, svn r3366)
111. [bug]* zhanglikun, Michal Vaner
- Make sure process xfrin/xfrout/zonemgr/cmdctl can be stoped
+ Make sure process xfrin/xfrout/zonemgr/cmdctl can be stopped
properly when user enter "ctrl+c" or 'Boss shutdown' command
- through bindctl.
-
- The ZonemgrRefresh.run_timer and NotifyOut.dispatcher spawn
- a thread themselves.
+ through bindctl. The ZonemgrRefresh.run_timer and
+ NotifyOut.dispatcher spawn a thread themselves.
(Trac #335, svn r3273)
110. [func] Michal Vaner
@@ -40,7 +93,7 @@
109. [func] naokikambe
Added the initial version of the stats module for the statistics
feature of BIND 10, which supports the restricted features and
- items and reports via bindctl command (Trac #191, r3218)
+ items and reports via bindctl command. (Trac #191, r3218)
Added the document of the stats module, which is about how stats
module collects the data (Trac #170, [wiki:StatsModule])
@@ -67,11 +120,11 @@
104. [bug] jerry
bin/zonemgr: zonemgr should be attempting to refresh expired zones.
(Trac #336, r3139)
-
+
103. [bug] jerry
lib/python/isc/log: Fixed an issue with python logging,
- python log shouldn't die with OSError.(Trac #267, r3137)
-
+ python log shouldn't die with OSError. (Trac #267, r3137)
+
102. [build] jinmei
Disable threads in ASIO to minimize build time dependency.
(Trac #345, r3100)
@@ -124,7 +177,7 @@
93. [bug] jinmei
lib/datasrc: A DS query could crash the library (and therefore,
e.g. the authoritative server) if some RR of the same apex name
- is stored in the hot spot cache. (Trac #307, svn r2923)
+ is stored in the hot spot cache. (Trac #307, svn r2923)
92. [func]* jelte
libdns_python (the python wrappers for libdns++) has been renamed
@@ -304,7 +357,7 @@
66. [bug] each
Check for duplicate RRsets before inserting data into a message
section; this, among other things, will prevent multiple copies
- of the same CNAME from showing up when there's a loop. (Trac #69,
+ of the same CNAME from showing up when there's a loop. (Trac #69,
svn r2350)
65. [func] shentingting
@@ -426,7 +479,7 @@
#205, svn r1957)
44. [build] jreed
- Install headers for libdns and libexception. (Trac #68,
+ Install headers for libdns and libexception. (Trac #68,
svn r1941)
43. [func] jelte
@@ -434,7 +487,7 @@
42. [func] jelte
lib/python/isc/config: Make temporary file with python
- tempfile module instead of manual with fixed name. (Trac
+ tempfile module instead of manual with fixed name. (Trac
#184, svn r1859)
41. [func] jelte
@@ -442,7 +495,7 @@
40. [build] jreed
Report detected features and configure settings at end of
- configure output. (svn r1836)
+ configure output. (svn r1836)
39. [func]* each
Renamed libauth to libdatasrc.
@@ -455,7 +508,7 @@
(Trac #135, #151, #134, svn r1797)
37. [build] jinmei
- Check for the availability of python-config. (Trac #159,
+ Check for the availability of python-config. (Trac #159,
svn r1794)
36. [func] shane
@@ -500,7 +553,7 @@
27. [build]
Add missing copyright license statements to various source
- files. (svn r1750)
+ files. (svn r1750)
26. [func]
Use PACKAGE_STRING (name + version) from config.h instead
Modified: branches/trac405/README
==============================================================================
--- branches/trac405/README (original)
+++ branches/trac405/README Mon Dec 6 14:50:36 2010
@@ -17,8 +17,9 @@
bus, b10-auth authoritative DNS server (with SQLite3 backend),
b10-cmdctl remote control daemon, b10-cfgmgr configuration manager,
b10-xfrin AXFR inbound service, b10-xfrout outgoing AXFR service,
-b10-zonemgr secondary manager, and a new libdns++ library for C++
-with a python wrapper.
+b10-zonemgr secondary manager, b10-stats statistics collection and
+reporting daemon, and a new libdns++ library for C++ with a python
+wrapper.
Documentation is included and also available via the BIND 10
website at http://bind10.isc.org/
Modified: branches/trac405/configure.ac
==============================================================================
--- branches/trac405/configure.ac (original)
+++ branches/trac405/configure.ac Mon Dec 6 14:50:36 2010
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.59])
-AC_INIT(bind10-devel, 20101013, bind10-dev at isc.org)
+AC_INIT(bind10-devel, 20101201, bind10-dev at isc.org)
AC_CONFIG_SRCDIR(README)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
@@ -206,7 +206,6 @@
# gcc specific settings:
if test "X$GXX" = "Xyes"; then
B10_CXXFLAGS="-Wall -Wextra -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
-UNUSED_PARAM_ATTRIBUTE='__attribute__((unused))'
# Certain versions of gcc (g++) have a bug that incorrectly warns about
# the use of anonymous name spaces even if they're closed in a single
@@ -225,7 +224,6 @@
fi dnl GXX = yes
AM_CONDITIONAL(GCC_WERROR_OK, test $werror_ok = 1)
-AC_DEFINE_UNQUOTED(UNUSED_PARAM, $UNUSED_PARAM_ATTRIBUTE, Define to compiler keyword indicating a function argument is intentionally unused)
# produce PIC unless we disable shared libraries. need this for python bindings.
if test $enable_shared != "no" -a "X$GXX" = "Xyes"; then
@@ -469,6 +467,7 @@
src/bin/auth/tests/Makefile
src/bin/auth/tests/testdata/Makefile
src/bin/auth/benchmarks/Makefile
+ src/bin/recurse/Makefile
src/bin/xfrin/Makefile
src/bin/xfrin/tests/Makefile
src/bin/xfrout/Makefile
@@ -495,6 +494,7 @@
src/lib/python/isc/util/Makefile
src/lib/python/isc/util/tests/Makefile
src/lib/python/isc/datasrc/Makefile
+ src/lib/python/isc/datasrc/tests/Makefile
src/lib/python/isc/cc/Makefile
src/lib/python/isc/cc/tests/Makefile
src/lib/python/isc/config/Makefile
@@ -532,6 +532,9 @@
src/bin/xfrout/xfrout.spec.pre
src/bin/xfrout/tests/xfrout_test
src/bin/xfrout/run_b10-xfrout.sh
+ src/bin/recurse/recurse.py
+ src/bin/recurse/recurse.spec.pre
+ src/bin/recurse/run_b10-recurse.sh
src/bin/zonemgr/zonemgr.py
src/bin/zonemgr/zonemgr.spec.pre
src/bin/zonemgr/tests/zonemgr_test
@@ -574,6 +577,7 @@
chmod +x src/bin/cmdctl/run_b10-cmdctl.sh
chmod +x src/bin/xfrin/run_b10-xfrin.sh
chmod +x src/bin/xfrout/run_b10-xfrout.sh
+ chmod +x src/bin/recurse/run_b10-recurse.sh
chmod +x src/bin/zonemgr/run_b10-zonemgr.sh
chmod +x src/bin/stats/tests/stats_test
chmod +x src/bin/stats/run_b10-stats.sh
Modified: branches/trac405/src/bin/Makefile.am
==============================================================================
--- branches/trac405/src/bin/Makefile.am (original)
+++ branches/trac405/src/bin/Makefile.am Mon Dec 6 14:50:36 2010
@@ -1,4 +1,4 @@
SUBDIRS = bind10 bindctl cfgmgr loadzone msgq host cmdctl auth xfrin xfrout \
- usermgr zonemgr stats tests
+ usermgr zonemgr stats tests recurse
check-recursive: all-recursive
Modified: branches/trac405/src/bin/auth/Makefile.am
==============================================================================
--- branches/trac405/src/bin/auth/Makefile.am (original)
+++ branches/trac405/src/bin/auth/Makefile.am Mon Dec 6 14:50:36 2010
@@ -56,6 +56,7 @@
BUILT_SOURCES = spec_config.h
pkglibexec_PROGRAMS = b10-auth
b10_auth_SOURCES = auth_srv.cc auth_srv.h
+b10_auth_SOURCES += query.cc query.h
b10_auth_SOURCES += change_user.cc change_user.h
b10_auth_SOURCES += common.h
b10_auth_SOURCES += main.cc
Modified: branches/trac405/src/bin/auth/asio_link.cc
==============================================================================
--- branches/trac405/src/bin/auth/asio_link.cc (original)
+++ branches/trac405/src/bin/auth/asio_link.cc Mon Dec 6 14:50:36 2010
@@ -505,9 +505,7 @@
}
}
- void sendCompleted(const asio::error_code& error UNUSED_PARAM,
- size_t bytes_sent UNUSED_PARAM)
- {
+ void sendCompleted(const asio::error_code&, size_t) {
// Even if error occurred there's nothing to do. Simply handle
// the next request.
startReceive();
Modified: branches/trac405/src/bin/auth/asio_link.h
==============================================================================
--- branches/trac405/src/bin/auth/asio_link.h (original)
+++ branches/trac405/src/bin/auth/asio_link.h Mon Dec 6 14:50:36 2010
@@ -132,7 +132,7 @@
/// This constructor never throws an exception.
///
/// \param asio_address The ASIO \c ip::address to be converted.
- IOAddress(const asio::ip::address& asio_adress);
+ IOAddress(const asio::ip::address& asio_address);
//@}
/// \brief Convert the address to a string.
Modified: branches/trac405/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/trac405/src/bin/auth/auth_srv.cc (original)
+++ branches/trac405/src/bin/auth/auth_srv.cc Mon Dec 6 14:50:36 2010
@@ -77,7 +77,7 @@
MessageRenderer& response_renderer);
bool processAxfrQuery(const IOMessage& io_message, Message& message,
MessageRenderer& response_renderer);
- bool processNotify(const IOMessage& io_message, Message& message,
+ bool processNotify(const IOMessage& io_message, Message& message,
MessageRenderer& response_renderer);
std::string db_file_;
ModuleCCSession* config_session_;
@@ -307,7 +307,7 @@
ConstEDNSPtr remote_edns = message.getEDNS();
const bool dnssec_ok = remote_edns && remote_edns->getDNSSECAwareness();
const uint16_t remote_bufsize = remote_edns ? remote_edns->getUDPSize() :
- Message::DEFAULT_MAX_UDPSIZE;
+ Message::DEFAULT_MAX_UDPSIZE;
message.makeResponse();
message.setHeaderFlag(Message::HEADERFLAG_AA);
@@ -360,8 +360,10 @@
}
try {
- xfrout_client_.connect();
- xfrout_connected_ = true;
+ if (!xfrout_connected_) {
+ xfrout_client_.connect();
+ xfrout_connected_ = true;
+ }
xfrout_client_.sendXfroutRequestInfo(
io_message.getSocket().getNative(),
io_message.getData(),
@@ -375,7 +377,7 @@
xfrout_client_.disconnect();
xfrout_connected_ = false;
}
-
+
if (verbose_mode_) {
cerr << "[b10-auth] Error in handling XFR request: " << err.what()
<< endl;
@@ -385,15 +387,12 @@
return (true);
}
- xfrout_client_.disconnect();
- xfrout_connected_ = false;
-
return (false);
}
bool
-AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
- MessageRenderer& response_renderer)
+AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
+ MessageRenderer& response_renderer)
{
// The incoming notify must contain exactly one question for SOA of the
// zone name.
@@ -435,7 +434,7 @@
}
return (false);
}
-
+
const string remote_ip_address =
io_message.getRemoteEndpoint().getAddress().toText();
static const string command_template_start =
@@ -446,7 +445,7 @@
try {
ConstElementPtr notify_command = Element::fromJSON(
- command_template_start + question->getName().toText() +
+ command_template_start + question->getName().toText() +
command_template_master + remote_ip_address +
command_template_rrclass + question->getClass().toText() +
command_template_end);
@@ -460,7 +459,7 @@
if (rcode != 0) {
if (verbose_mode_) {
cerr << "[b10-auth] failed to notify Zonemgr: "
- << parsed_answer->str() << endl;
+ << parsed_answer->str() << endl;
}
return (false);
}
Modified: branches/trac405/src/bin/auth/auth_srv.h
==============================================================================
--- branches/trac405/src/bin/auth/auth_srv.h (original)
+++ branches/trac405/src/bin/auth/auth_srv.h Mon Dec 6 14:50:36 2010
@@ -84,7 +84,7 @@
isc::xfr::AbstractXfroutClient& xfrout_client);
~AuthSrv();
//@}
- /// \return \c true if the \message contains a response to be returned;
+ /// \return \c true if the \a message contains a response to be returned;
/// otherwise \c false.
bool processMessage(const asio_link::IOMessage& io_message,
isc::dns::Message& message,
@@ -138,7 +138,7 @@
/// containing the result of the update operation.
isc::data::ConstElementPtr updateConfig(isc::data::ConstElementPtr config);
- /// \param Returns the command and configuration session for the
+ /// \brief Returns the command and configuration session for the
/// \c AuthSrv.
///
/// This method never throws an exception.
@@ -199,6 +199,7 @@
/// is shutdown.
///
void setXfrinSession(isc::cc::AbstractSession* xfrin_session);
+
private:
AuthSrvImpl* impl_;
};
Modified: branches/trac405/src/bin/auth/tests/Makefile.am
==============================================================================
--- branches/trac405/src/bin/auth/tests/Makefile.am (original)
+++ branches/trac405/src/bin/auth/tests/Makefile.am Mon Dec 6 14:50:36 2010
@@ -21,8 +21,10 @@
run_unittests_SOURCES = $(top_srcdir)/src/lib/dns/tests/unittest_util.h
run_unittests_SOURCES += $(top_srcdir)/src/lib/dns/tests/unittest_util.cc
run_unittests_SOURCES += ../auth_srv.h ../auth_srv.cc
+run_unittests_SOURCES += ../query.h ../query.cc
run_unittests_SOURCES += ../change_user.h ../change_user.cc
run_unittests_SOURCES += auth_srv_unittest.cc
+run_unittests_SOURCES += query_unittest.cc
run_unittests_SOURCES += change_user_unittest.cc
run_unittests_SOURCES += asio_link_unittest.cc
run_unittests_SOURCES += run_unittests.cc
Modified: branches/trac405/src/bin/auth/tests/auth_srv_unittest.cc
==============================================================================
--- branches/trac405/src/bin/auth/tests/auth_srv_unittest.cc (original)
+++ branches/trac405/src/bin/auth/tests/auth_srv_unittest.cc Mon Dec 6 14:50:36 2010
@@ -97,7 +97,7 @@
virtual void startRead(boost::function<void()> read_callback);
virtual int reply(ConstElementPtr envelope, ConstElementPtr newmsg);
virtual bool hasQueuedMsgs() const;
- virtual void setTimeout(size_t timeout UNUSED_PARAM) {};
+ virtual void setTimeout(size_t) {}
virtual size_t getTimeout() const { return 0; };
void setMessage(ConstElementPtr msg) { msg_ = msg; }
@@ -156,30 +156,25 @@
};
void
-AuthSrvTest::MockSession::establish(const char* socket_file UNUSED_PARAM) {}
+AuthSrvTest::MockSession::establish(const char*) {}
void
AuthSrvTest::MockSession::disconnect() {}
void
-AuthSrvTest::MockSession::subscribe(string group UNUSED_PARAM,
- string instance UNUSED_PARAM)
+AuthSrvTest::MockSession::subscribe(string, string)
{}
void
-AuthSrvTest::MockSession::unsubscribe(string group UNUSED_PARAM,
- string instance UNUSED_PARAM)
+AuthSrvTest::MockSession::unsubscribe(string, string)
{}
void
-AuthSrvTest::MockSession::startRead(
- boost::function<void()> read_callback UNUSED_PARAM)
+AuthSrvTest::MockSession::startRead(boost::function<void()>)
{}
int
-AuthSrvTest::MockSession::reply(ConstElementPtr envelope UNUSED_PARAM,
- ConstElementPtr newmsg UNUSED_PARAM)
-{
+AuthSrvTest::MockSession::reply(ConstElementPtr, ConstElementPtr) {
return (-1);
}
@@ -190,8 +185,7 @@
int
AuthSrvTest::MockSession::group_sendmsg(ConstElementPtr msg, string group,
- string instance UNUSED_PARAM,
- string to UNUSED_PARAM)
+ string, string)
{
if (!send_ok_) {
isc_throw(XfroutError, "mock session send is disabled for test");
@@ -203,10 +197,8 @@
}
bool
-AuthSrvTest::MockSession::group_recvmsg(ConstElementPtr& envelope UNUSED_PARAM,
- ConstElementPtr& msg,
- bool nonblock UNUSED_PARAM,
- int seq UNUSED_PARAM)
+AuthSrvTest::MockSession::group_recvmsg(ConstElementPtr&,
+ ConstElementPtr& msg, bool, int)
{
if (!receive_ok_) {
isc_throw(XfroutError, "mock session receive is disabled for test");
@@ -234,10 +226,9 @@
}
int
-AuthSrvTest::MockXfroutClient::sendXfroutRequestInfo(
- const int tcp_sock UNUSED_PARAM,
- const void* msg_data UNUSED_PARAM,
- const uint16_t msg_len UNUSED_PARAM)
+AuthSrvTest::MockXfroutClient::sendXfroutRequestInfo(const int,
+ const void*,
+ const uint16_t)
{
if (!send_ok_) {
isc_throw(XfroutError, "xfrout connection send is disabled for test");
@@ -489,7 +480,7 @@
// so we shouldn't have to respond.
EXPECT_FALSE(server.processMessage(*io_message, parse_message,
response_renderer));
- EXPECT_FALSE(xfrout.isConnected());
+ EXPECT_TRUE(xfrout.isConnected());
}
TEST_F(AuthSrvTest, AXFRConnectFail) {
@@ -501,8 +492,6 @@
response_renderer));
headerCheck(parse_message, default_qid, Rcode::SERVFAIL(),
opcode.getCode(), QR_FLAG, 1, 0, 0, 0);
- // For a shot term workaround with xfrout we currently close the connection
- // for each AXFR attempt
EXPECT_FALSE(xfrout.isConnected());
}
@@ -512,7 +501,7 @@
createRequestPacket(opcode, Name("example.com"), RRClass::IN(),
RRType::AXFR(), IPPROTO_TCP);
server.processMessage(*io_message, parse_message, response_renderer);
- EXPECT_FALSE(xfrout.isConnected()); // see above
+ EXPECT_TRUE(xfrout.isConnected());
xfrout.disableSend();
parse_message.clear(Message::PARSE);
Modified: branches/trac405/src/bin/bind10/bind10.py.in
==============================================================================
--- branches/trac405/src/bin/bind10/bind10.py.in (original)
+++ branches/trac405/src/bin/bind10/bind10.py.in Mon Dec 6 14:50:36 2010
@@ -15,7 +15,7 @@
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-"""\
+"""
This file implements the Boss of Bind (BoB, or bob) program.
Its purpose is to start up the BIND 10 system, and then manage the
@@ -72,7 +72,7 @@
# This is the version that gets displayed to the user.
# The VERSION string consists of the module name, the module version
# number, and the overall BIND 10 version number (set in configure.ac).
-VERSION = "bind10 20100916 (BIND 10 @PACKAGE_VERSION@)"
+VERSION = "bind10 20101129 (BIND 10 @PACKAGE_VERSION@)"
# This is for bind10.boottime of stats module
_BASETIME = time.gmtime()
@@ -189,137 +189,233 @@
def respawn(self):
self._spawn()
+class CChannelConnectError(Exception): pass
+
class BoB:
"""Boss of BIND class."""
def __init__(self, msgq_socket_file=None, auth_port=5300, address=None,
nocache=False, verbose=False, setuid=None, username=None):
- """Initialize the Boss of BIND. This is a singleton (only one
- can run).
+ """
+ Initialize the Boss of BIND. This is a singleton (only one can run).
- The msgq_socket_file specifies the UNIX domain socket file
- that the msgq process listens on.
- If verbose is True, then the boss reports what it is doing.
- """
- self.verbose = verbose
- self.msgq_socket_file = msgq_socket_file
+ The msgq_socket_file specifies the UNIX domain socket file that the
+ msgq process listens on. If verbose is True, then the boss reports
+ what it is doing.
+ """
+ self.address = address
self.auth_port = auth_port
- self.address = None
- if address:
- self.address = address
self.cc_session = None
self.ccs = None
+ self.cfg_start_auth = True
+ self.cfg_start_recurse = False
+ self.curproc = None
+ self.dead_processes = {}
+ self.msgq_socket_file = msgq_socket_file
+ self.nocache = nocache
self.processes = {}
- self.dead_processes = {}
self.runnable = False
self.uid = setuid
self.username = username
- self.nocache = nocache
+ self.verbose = verbose
def config_handler(self, new_config):
if self.verbose:
- sys.stdout.write("[bind10] handling new config:\n")
- sys.stdout.write(new_config + "\n")
+ sys.stdout.write("[bind10] Handling new configuration: " +
+ str(new_config) + "\n")
answer = isc.config.ccsession.create_answer(0)
return answer
# TODO
def command_handler(self, command, args):
if self.verbose:
- sys.stdout.write("[bind10] Boss got command:\n")
- sys.stdout.write(command + "\n")
+ sys.stdout.write("[bind10] Boss got command: " + command + "\n")
answer = isc.config.ccsession.create_answer(1, "command not implemented")
if type(command) != str:
answer = isc.config.ccsession.create_answer(1, "bad command")
else:
- cmd = command
- if cmd == "shutdown":
- sys.stdout.write("[bind10] got shutdown command\n")
+ if command == "shutdown":
self.runnable = False
answer = isc.config.ccsession.create_answer(0)
else:
answer = isc.config.ccsession.create_answer(1,
"Unknown command")
return answer
-
- def startup(self):
- """Start the BoB instance.
-
- Returns None if successful, otherwise an string describing the
- problem.
- """
- # try to connect to the c-channel daemon,
- # to see if it is already running
- c_channel_env = {}
- if self.msgq_socket_file is not None:
- c_channel_env["BIND10_MSGQ_SOCKET_FILE"] = self.msgq_socket_file
- if self.verbose:
- sys.stdout.write("[bind10] Checking for already running b10-msgq\n")
- # try to connect, and if we can't wait a short while
- try:
- self.cc_session = isc.cc.Session(self.msgq_socket_file)
- return "b10-msgq already running, or socket file not cleaned , cannot start"
- except isc.cc.session.SessionError:
- # this is the case we want, where the msgq is not running
- pass
-
- # start the c-channel daemon
- if self.verbose:
- if self.msgq_socket_file:
- sys.stdout.write("[bind10] Starting b10-msgq\n")
- try:
- c_channel = ProcessInfo("b10-msgq", ["b10-msgq"], c_channel_env,
- True, not self.verbose, uid=self.uid,
- username=self.username)
- except Exception as e:
- return "Unable to start b10-msgq; " + str(e)
+
+ def kill_started_processes(self):
+ """
+ Called as part of the exception handling when a process fails to
+ start, this runs through the list of started processes, killing
+ each one. It then clears that list.
+ """
+ if self.verbose:
+ sys.stdout.write("[bind10] killing started processes:\n")
+
+ for pid in self.processes:
+ if self.verbose:
+ sys.stdout.write("[bind10] - %s\n" % self.processes[pid].name)
+ self.processes[pid].process.kill()
+ self.processes = {}
+
+ def read_bind10_config(self):
+ """
+ Reads the parameters associated with the BoB module itself.
+
+ At present these are the components to start although arguably this
+ information should be in the configuration for the appropriate
+ module itself. (However, this would cause difficulty in the case of
+ xfrin/xfrout and zone manager as we don't need to start those if we
+ are not running the authoritative server.)
+ """
+ if self.verbose:
+ sys.stdout.write("[bind10] Reading Boss configuration:\n")
+
+ config_data = self.ccs.get_full_config()
+ self.cfg_start_auth = config_data.get("start_auth")
+ self.cfg_start_recurse = config_data.get("start_recurse")
+
+ if self.verbose:
+ sys.stdout.write("[bind10] - start_auth: %s\n" %
+ str(self.cfg_start_auth))
+ sys.stdout.write("[bind10] - start_recurse: %s\n" %
+ str(self.cfg_start_recurse))
+
+ def log_starting(self, process, port = None, address = None):
+ """
+ A convenience function to output a "Starting xxx" message if the
+ verbose option is set. Putting this into a separate method ensures
+ that the output form is consistent across all processes.
+
+ The process name (passed as the first argument) is put into
+ self.curproc, and is used to indicate which process failed to
+ start if there is an error (and is used in the "Started" message
+ on success). The optional port and address information are
+ appended to the message (if present).
+ """
+ self.curproc = process
+ if self.verbose:
+ sys.stdout.write("[bind10] Starting %s" % self.curproc)
+ if port is not None:
+ sys.stdout.write(" on port %d" % port)
+ if address is not None:
+ sys.stdout.write(" (address %s)" % str(address))
+ sys.stdout.write("\n")
+
+ def log_started(self, pid = None):
+ """
+ A convenience function to output a 'Started xxxx (PID yyyy)'
+ message. As with starting_message(), this ensures a consistent
+ format.
+ """
+ if self.verbose:
+ sys.stdout.write("[bind10] Started %s" % self.curproc)
+ if pid is not None:
+ sys.stdout.write(" (PID %d)" % pid)
+ sys.stdout.write("\n")
+
+ # The next few methods start the individual processes of BIND-10. They
+ # are called via start_all_process(). If any fail, an exception is raised
+ # which is caught by the caller of start_all_processes(); this kills
+ # processes started up to that point before terminating the program.
+
+ def start_msgq(self, c_channel_env):
+ """
+ Start the message queue and connect to the command channel.
+ """
+ self.log_starting("b10-msgq")
+ c_channel = ProcessInfo("b10-msgq", ["b10-msgq"], c_channel_env,
+ True, not self.verbose, uid=self.uid,
+ username=self.username)
self.processes[c_channel.pid] = c_channel
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-msgq (PID %d)\n" %
- c_channel.pid)
-
- # now connect to the c-channel
+ self.log_started(c_channel.pid)
+
+ # Now connect to the c-channel
cc_connect_start = time.time()
while self.cc_session is None:
# if we have been trying for "a while" give up
if (time.time() - cc_connect_start) > 5:
- c_channel.process.kill()
- return "Unable to connect to c-channel after 5 seconds"
+ raise CChannelConnectError("Unable to connect to c-channel after 5 seconds")
+
# try to connect, and if we can't wait a short while
try:
self.cc_session = isc.cc.Session(self.msgq_socket_file)
except isc.cc.session.SessionError:
time.sleep(0.1)
- # start the configuration manager
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-cfgmgr\n")
- try:
- bind_cfgd = ProcessInfo("b10-cfgmgr", ["b10-cfgmgr"],
- c_channel_env, uid=self.uid,
- username=self.username)
- except Exception as e:
- c_channel.process.kill()
- return "Unable to start b10-cfgmgr; " + str(e)
+ def start_cfgmgr(self, c_channel_env):
+ """
+ Starts the configuration manager process
+ """
+ self.log_starting("b10-cfgmgr")
+ bind_cfgd = ProcessInfo("b10-cfgmgr", ["b10-cfgmgr"],
+ c_channel_env, uid=self.uid,
+ username=self.username)
self.processes[bind_cfgd.pid] = bind_cfgd
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-cfgmgr (PID %d)\n" %
- bind_cfgd.pid)
+ self.log_started(bind_cfgd.pid)
# sleep until b10-cfgmgr is fully up and running, this is a good place
# to have a (short) timeout on synchronized groupsend/receive
# TODO: replace the sleep by a listen for ConfigManager started
# message
time.sleep(1)
- if self.verbose:
- sys.stdout.write("[bind10] starting ccsession\n")
+
+ def start_ccsession(self, c_channel_env):
+ """
+ Start the CC Session
+
+ The argument c_channel_env is unused but is supplied to keep the
+ argument list the same for all start_xxx methods.
+ """
+ self.log_starting("ccsession")
self.ccs = isc.config.ModuleCCSession(SPECFILE_LOCATION,
self.config_handler, self.command_handler)
self.ccs.start()
- if self.verbose:
- sys.stdout.write("[bind10] ccsession started\n")
-
- # start b10-auth
+ self.log_started()
+
+ # A couple of utility methods for starting processes...
+
+ def start_process(self, name, args, c_channel_env, port=None, address=None):
+ """
+ Given a set of command arguments, start the process and output
+ appropriate log messages. If the start is successful, the process
+ is added to the list of started processes.
+
+ The port and address arguments are for log messages only.
+ """
+ self.log_starting(name, port, address)
+ newproc = ProcessInfo(name, args, c_channel_env)
+ self.processes[newproc.pid] = newproc
+ self.log_started(newproc.pid)
+
+ def start_simple(self, name, c_channel_env, port=None, address=None):
+ """
+ Most of the BIND-10 processes are started with the command:
+
+ <process-name> [-v]
+
+ ... where -v is appended if verbose is enabled. This method
+ generates the arguments from the name and starts the process.
+
+ The port and address arguments are for log messages only.
+ """
+ # Set up the command arguments.
+ args = [name]
+ if self.verbose:
+ args += ['-v']
+
+ # ... and start the process
+ self.start_process(name, args, c_channel_env, port, address)
+
+ # The next few methods start up the rest of the BIND-10 processes.
+ # Although many of these methods are little more than a call to
+ # start_simple, they are retained (a) for testing reasons and (b) as a place
+ # where modifications can be made if the process start-up sequence changes
+ # for a given process.
+
+ def start_auth(self, c_channel_env):
+ """
+ Start the Authoritative server
+ """
# XXX: this must be read from the configuration manager in the future
authargs = ['b10-auth', '-p', str(self.auth_port)]
if self.address:
@@ -330,130 +426,115 @@
authargs += ['-u', str(self.uid)]
if self.verbose:
authargs += ['-v']
- sys.stdout.write("Starting b10-auth using port %d" %
- self.auth_port)
- if self.address:
- sys.stdout.write(" on %s" % str(self.address))
- sys.stdout.write("\n")
- try:
- auth = ProcessInfo("b10-auth", authargs,
- c_channel_env)
- except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- xfrout.process.kill()
- return "Unable to start b10-auth; " + str(e)
- self.processes[auth.pid] = auth
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-auth (PID %d)\n" % auth.pid)
-
- # everything after the authoritative server can run as non-root
+
+ # ... and start
+ self.start_process("b10-auth", authargs, c_channel_env,
+ self.auth_port, self.address)
+
+ def start_recurse(self, c_channel_env):
+ """
+ Start the Resolver. At present, all these arguments and switches
+ are pure speculation. As with the auth daemon, they should be
+ read from the configuration database.
+ """
+ self.curproc = "b10-recurse"
+ # XXX: this must be read from the configuration manager in the future
+ resargs = ['b10-recurse']
+ if self.uid:
+ resargs += ['-u', str(self.uid)]
+ if self.verbose:
+ resargs += ['-v']
+
+ # ... and start
+ self.start_process("b10-recurse", resargs, c_channel_env)
+
+ def start_xfrout(self, c_channel_env):
+ self.start_simple("b10-xfrout", c_channel_env)
+
+ def start_xfrin(self, c_channel_env):
+ self.start_simple("b10-xfrin", c_channel_env)
+
+ def start_zonemgr(self, c_channel_env):
+ self.start_simple("b10-zonemgr", c_channel_env)
+
+ def start_stats(self, c_channel_env):
+ self.start_simple("b10-stats", c_channel_env)
+
+ def start_cmdctl(self, c_channel_env):
+ # XXX: we hardcode port 8080
+ self.start_simple("b10-cmdctl", c_channel_env, 8080)
+
+ def start_all_processes(self, c_channel_env):
+ """
+ Starts up all the processes. Any exception generated during the
+ starting of the processes is handled by the caller.
+ """
+ self.start_msgq(c_channel_env)
+ self.start_cfgmgr(c_channel_env)
+ self.start_ccsession(c_channel_env)
+
+ # Extract the parameters associated with Bob. This can only be
+ # done after the CC Session is started.
+ self.read_bind10_config()
+
+ # Continue starting the processes. The authoritative server (if
+ # selected):
+ if self.cfg_start_auth:
+ self.start_auth(c_channel_env)
+
+ # ... and resolver (if selected):
+ if self.cfg_start_recurse:
+ self.start_recurse(c_channel_env)
+
+ # Everything after the main components can run as non-root.
+ # TODO: this is only temporary - once the privileged socket creator is
+ # fully working, nothing else will run as root.
if self.uid is not None:
posix.setuid(self.uid)
- # start the xfrout before auth-server, to make sure every xfr-query can
- # be processed properly.
- xfrout_args = ['b10-xfrout']
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-xfrout\n")
- xfrout_args += ['-v']
+ # xfrin/xfrout and the zone manager are only meaningful if the
+ # authoritative server has been started.
+ if self.cfg_start_auth:
+ self.start_xfrout(c_channel_env)
+ self.start_xfrin(c_channel_env)
+ self.start_zonemgr(c_channel_env)
+
+ # ... and finally start the remaining processes
+ self.start_stats(c_channel_env)
+ self.start_cmdctl(c_channel_env)
+
+ def startup(self):
+ """
+ Start the BoB instance.
+
+ Returns None if successful, otherwise an string describing the
+ problem.
+ """
+ # Try to connect to the c-channel daemon, to see if it is already
+ # running
+ c_channel_env = {}
+ if self.msgq_socket_file is not None:
+ c_channel_env["BIND10_MSGQ_SOCKET_FILE"] = self.msgq_socket_file
+ if self.verbose:
+ sys.stdout.write("[bind10] Checking for already running b10-msgq\n")
+ # try to connect, and if we can't wait a short while
try:
- xfrout = ProcessInfo("b10-xfrout", xfrout_args,
- c_channel_env )
+ self.cc_session = isc.cc.Session(self.msgq_socket_file)
+ return "b10-msgq already running, or socket file not cleaned , cannot start"
+ except isc.cc.session.SessionError:
+ # this is the case we want, where the msgq is not running
+ pass
+
+ # Start all processes. If any one fails to start, kill all started
+ # processes and exit with an error indication.
+ try:
+ self.start_all_processes(c_channel_env)
except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- return "Unable to start b10-xfrout; " + str(e)
- self.processes[xfrout.pid] = xfrout
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-xfrout (PID %d)\n" %
- xfrout.pid)
-
- # start b10-xfrin
- xfrin_args = ['b10-xfrin']
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-xfrin\n")
- xfrin_args += ['-v']
- try:
- xfrind = ProcessInfo("b10-xfrin", xfrin_args,
- c_channel_env)
- except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- xfrout.process.kill()
- auth.process.kill()
- return "Unable to start b10-xfrin; " + str(e)
- self.processes[xfrind.pid] = xfrind
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-xfrin (PID %d)\n" %
- xfrind.pid)
-
- # start b10-zonemgr
- zonemgr_args = ['b10-zonemgr']
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-zonemgr\n")
- zonemgr_args += ['-v']
- try:
- zonemgr = ProcessInfo("b10-zonemgr", zonemgr_args,
- c_channel_env)
- except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- xfrout.process.kill()
- auth.process.kill()
- xfrind.process.kill()
- return "Unable to start b10-zonemgr; " + str(e)
- self.processes[zonemgr.pid] = zonemgr
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-zonemgr(PID %d)\n" %
- zonemgr.pid)
-
- # start b10-stats
- stats_args = ['b10-stats']
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-stats\n")
- stats_args += ['-v']
- try:
- statsd = ProcessInfo("b10-stats", stats_args,
- c_channel_env)
- except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- xfrout.process.kill()
- auth.process.kill()
- xfrind.process.kill()
- zonemgr.process.kill()
- return "Unable to start b10-stats; " + str(e)
-
- self.processes[statsd.pid] = statsd
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-stats (PID %d)\n" % statsd.pid)
-
- # start the b10-cmdctl
- # XXX: we hardcode port 8080
- cmdctl_args = ['b10-cmdctl']
- if self.verbose:
- sys.stdout.write("[bind10] Starting b10-cmdctl on port 8080\n")
- cmdctl_args += ['-v']
- try:
- cmd_ctrld = ProcessInfo("b10-cmdctl", cmdctl_args,
- c_channel_env)
- except Exception as e:
- c_channel.process.kill()
- bind_cfgd.process.kill()
- xfrout.process.kill()
- auth.process.kill()
- xfrind.process.kill()
- zonemgr.process.kill()
- statsd.process.kill()
- return "Unable to start b10-cmdctl; " + str(e)
- self.processes[cmd_ctrld.pid] = cmd_ctrld
- if self.verbose:
- sys.stdout.write("[bind10] Started b10-cmdctl (PID %d)\n" %
- cmd_ctrld.pid)
-
+ self.kill_started_processes()
+ return "Unable to start " + self.curproc + ": " + str(e)
+
+ # Started successfully
self.runnable = True
-
return None
def stop_all_processes(self):
@@ -462,6 +543,7 @@
self.cc_session.group_sendmsg(cmd, 'Cmdctl', 'Cmdctl')
self.cc_session.group_sendmsg(cmd, "ConfigManager", "ConfigManager")
self.cc_session.group_sendmsg(cmd, "Auth", "Auth")
+ self.cc_session.group_sendmsg(cmd, "Recurse", "Recurse")
self.cc_session.group_sendmsg(cmd, "Xfrout", "Xfrout")
self.cc_session.group_sendmsg(cmd, "Xfrin", "Xfrin")
self.cc_session.group_sendmsg(cmd, "Zonemgr", "Zonemgr")
@@ -642,11 +724,10 @@
# Enforce line buffering on stdout, even when not a TTY
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), line_buffering=True)
-
# Parse any command-line options.
parser = OptionParser(version=VERSION)
parser.add_option("-a", "--address", dest="address", type="string",
- action="callback", callback=check_addr, default='',
+ action="callback", callback=check_addr, default=None,
help="address the b10-auth daemon will use (default: listen on all addresses)")
parser.add_option("-m", "--msgq-socket-file", dest="msgq_socket_file",
type="string", default=None,
@@ -781,6 +862,7 @@
# shutdown
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
boss_of_bind.shutdown()
+ sys.stdout.write("[bind10] BIND 10 exiting\n");
sys.exit(0)
if __name__ == "__main__":
Modified: branches/trac405/src/bin/bind10/bob.spec
==============================================================================
--- branches/trac405/src/bin/bind10/bob.spec (original)
+++ branches/trac405/src/bin/bind10/bob.spec Mon Dec 6 14:50:36 2010
@@ -3,6 +3,18 @@
"module_name": "Boss",
"module_description": "Master process",
"config_data": [
+ {
+ "item_name": "start_auth",
+ "item_type": "boolean",
+ "item_optional": false,
+ "item_default": true
+ },
+ {
+ "item_name": "start_recurse",
+ "item_type": "boolean",
+ "item_optional": false,
+ "item_default": false
+ }
],
"commands": [
{
Modified: branches/trac405/src/bin/bind10/run_bind10.sh.in
==============================================================================
--- branches/trac405/src/bin/bind10/run_bind10.sh.in (original)
+++ branches/trac405/src/bin/bind10/run_bind10.sh.in Mon Dec 6 14:50:36 2010
@@ -20,7 +20,7 @@
BIND10_PATH=@abs_top_builddir@/src/bin/bind10
-PATH=@abs_top_builddir@/src/bin/msgq:@abs_top_builddir@/src/bin/auth:@abs_top_builddir@/src/bin/cfgmgr:@abs_top_builddir@/src/bin/cmdctl:@abs_top_builddir@/src/bin/stats:@abs_top_builddir@/src/bin/xfrin:@abs_top_builddir@/src/bin/xfrout:@abs_top_builddir@/src/bin/zonemgr:$PATH
+PATH=@abs_top_builddir@/src/bin/msgq:@abs_top_builddir@/src/bin/auth:@abs_top_builddir@/src/bin/cfgmgr:@abs_top_builddir@/src/bin/cmdctl:@abs_top_builddir@/src/bin/stats:@abs_top_builddir@/src/bin/xfrin:@abs_top_builddir@/src/bin/xfrout:@abs_top_builddir@/src/bin/zonemgr:@abs_top_builddir@/src/bin/recurse:$PATH
export PATH
PYTHONPATH=@abs_top_builddir@/src/lib/python:@abs_top_builddir@/src/lib/dns/python/.libs:@abs_top_builddir@/src/lib/xfr/.libs
Modified: branches/trac405/src/bin/bind10/tests/bind10_test.py
==============================================================================
--- branches/trac405/src/bin/bind10/tests/bind10_test.py (original)
+++ branches/trac405/src/bin/bind10/tests/bind10_test.py Mon Dec 6 14:50:36 2010
@@ -79,43 +79,237 @@
self.assertEqual(bob.verbose, False)
self.assertEqual(bob.msgq_socket_file, None)
self.assertEqual(bob.auth_port, 5300)
+ self.assertEqual(bob.address, None)
self.assertEqual(bob.cc_session, None)
- self.assertEqual(bob.address, None)
+ self.assertEqual(bob.ccs, None)
self.assertEqual(bob.processes, {})
self.assertEqual(bob.dead_processes, {})
self.assertEqual(bob.runnable, False)
+ self.assertEqual(bob.uid, None)
+ self.assertEqual(bob.username, None)
+ self.assertEqual(bob.nocache, False)
+ self.assertEqual(bob.cfg_start_auth, True)
+ self.assertEqual(bob.cfg_start_recurse, False)
def test_init_alternate_socket(self):
bob = BoB("alt_socket_file")
self.assertEqual(bob.verbose, False)
self.assertEqual(bob.msgq_socket_file, "alt_socket_file")
+ self.assertEqual(bob.auth_port, 5300)
+ self.assertEqual(bob.address, None)
self.assertEqual(bob.cc_session, None)
+ self.assertEqual(bob.ccs, None)
self.assertEqual(bob.processes, {})
self.assertEqual(bob.dead_processes, {})
self.assertEqual(bob.runnable, False)
+ self.assertEqual(bob.uid, None)
+ self.assertEqual(bob.username, None)
+ self.assertEqual(bob.nocache, False)
+ self.assertEqual(bob.cfg_start_auth, True)
+ self.assertEqual(bob.cfg_start_recurse, False)
def test_init_alternate_auth_port(self):
bob = BoB(None, 9999)
self.assertEqual(bob.verbose, False)
self.assertEqual(bob.msgq_socket_file, None)
self.assertEqual(bob.auth_port, 9999)
+ self.assertEqual(bob.address, None)
self.assertEqual(bob.cc_session, None)
- self.assertEqual(bob.address, None)
+ self.assertEqual(bob.ccs, None)
self.assertEqual(bob.processes, {})
self.assertEqual(bob.dead_processes, {})
self.assertEqual(bob.runnable, False)
+ self.assertEqual(bob.uid, None)
+ self.assertEqual(bob.username, None)
+ self.assertEqual(bob.nocache, False)
+ self.assertEqual(bob.cfg_start_auth, True)
+ self.assertEqual(bob.cfg_start_recurse, False)
def test_init_alternate_address(self):
- bob = BoB(None, 5300, IPAddr('127.127.127.127'))
+ bob = BoB(None, 1234, IPAddr('127.127.127.127'))
self.assertEqual(bob.verbose, False)
- self.assertEqual(bob.auth_port, 5300)
self.assertEqual(bob.msgq_socket_file, None)
+ self.assertEqual(bob.auth_port, 1234)
+ self.assertEqual(bob.address.addr, socket.inet_aton('127.127.127.127'))
self.assertEqual(bob.cc_session, None)
- self.assertEqual(bob.address.addr, socket.inet_aton('127.127.127.127'))
+ self.assertEqual(bob.ccs, None)
self.assertEqual(bob.processes, {})
self.assertEqual(bob.dead_processes, {})
self.assertEqual(bob.runnable, False)
- # verbose testing...
+ self.assertEqual(bob.uid, None)
+ self.assertEqual(bob.username, None)
+ self.assertEqual(bob.nocache, False)
+ self.assertEqual(bob.cfg_start_auth, True)
+ self.assertEqual(bob.cfg_start_recurse, False)
+
+# Class for testing the Bob.start_all_processes() method call.
+#
+# Although testing that external processes start is outside the scope
+# of the unit test, by overriding the process start methods we can check
+# that the right processes are started depending on the configuration
+# options.
+class StartAllProcessesBob(BoB):
+ def __init__(self):
+ BoB.__init__(self)
+
+# Set flags as to which of the overridden methods has been run.
+ self.msgq = False
+ self.cfgmgr = False
+ self.ccsession = False
+ self.auth = False
+ self.recurse = False
+ self.xfrout = False
+ self.xfrin = False
+ self.zonemgr = False
+ self.stats = False
+ self.cmdctl = False
+
+ def read_bind10_config(self):
+ # Configuration options are set directly
+ pass
+
+ def start_msgq(self, c_channel_env):
+ self.msgq = True
+
+ def start_cfgmgr(self, c_channel_env):
+ self.cfgmgr = True
+
+ def start_ccsession(self, c_channel_env):
+ self.ccsession = True
+
+ def start_auth(self, c_channel_env):
+ self.auth = True
+
+ def start_recurse(self, c_channel_env):
+ self.recurse = True
+
+ def start_xfrout(self, c_channel_env):
+ self.xfrout = True
+
+ def start_xfrin(self, c_channel_env):
+ self.xfrin = True
+
+ def start_zonemgr(self, c_channel_env):
+ self.zonemgr = True
+
+ def start_stats(self, c_channel_env):
+ self.stats = True
+
+ def start_cmdctl(self, c_channel_env):
+ self.cmdctl = True
+
+# Check that the start_all_processes method starts the right combination
+# of processes.
+class TestStartAllProcessesBob(unittest.TestCase):
+ def check_preconditions(self, bob):
+ self.assertEqual(bob.msgq, False)
+ self.assertEqual(bob.cfgmgr, False)
+ self.assertEqual(bob.ccsession, False)
+ self.assertEqual(bob.auth, False)
+ self.assertEqual(bob.recurse, False)
+ self.assertEqual(bob.xfrout, False)
+ self.assertEqual(bob.xfrin, False)
+ self.assertEqual(bob.zonemgr, False)
+ self.assertEqual(bob.stats, False)
+ self.assertEqual(bob.cmdctl, False)
+
+ # Checks the processes started when starting neither auth nor recurse
+ # is specified.
+ def test_start_none(self):
+ # Created Bob and ensure initialization correct
+ bob = StartAllProcessesBob()
+ self.check_preconditions(bob)
+
+ # Start processes and check what was started
+ c_channel_env = {}
+ bob.cfg_start_auth = False
+ bob.cfg_start_recurse = False
+
+ bob.start_all_processes(c_channel_env)
+
+ self.assertEqual(bob.msgq, True)
+ self.assertEqual(bob.cfgmgr, True)
+ self.assertEqual(bob.ccsession, True)
+ self.assertEqual(bob.auth, False)
+ self.assertEqual(bob.recurse, False)
+ self.assertEqual(bob.xfrout, False)
+ self.assertEqual(bob.xfrin, False)
+ self.assertEqual(bob.zonemgr, False)
+ self.assertEqual(bob.stats, True)
+ self.assertEqual(bob.cmdctl, True)
+
+ # Checks the processes started when starting only the auth process
+ def test_start_auth(self):
+ # Created Bob and ensure initialization correct
+ bob = StartAllProcessesBob()
+ self.check_preconditions(bob)
+
+ # Start processes and check what was started
+ c_channel_env = {}
+ bob.cfg_start_auth = True
+ bob.cfg_start_recurse = False
+
+ bob.start_all_processes(c_channel_env)
+
+ self.assertEqual(bob.msgq, True)
+ self.assertEqual(bob.cfgmgr, True)
+ self.assertEqual(bob.ccsession, True)
+ self.assertEqual(bob.auth, True)
+ self.assertEqual(bob.recurse, False)
+ self.assertEqual(bob.xfrout, True)
+ self.assertEqual(bob.xfrin, True)
+ self.assertEqual(bob.zonemgr, True)
+ self.assertEqual(bob.stats, True)
+ self.assertEqual(bob.cmdctl, True)
+
+ # Checks the processes started when starting only the recurse process
+ def test_start_recurse(self):
+ # Created Bob and ensure initialization correct
+ bob = StartAllProcessesBob()
+ self.check_preconditions(bob)
+
+ # Start processes and check what was started
+ c_channel_env = {}
+ bob.cfg_start_auth = False
+ bob.cfg_start_recurse = True
+
+ bob.start_all_processes(c_channel_env)
+
+ self.assertEqual(bob.msgq, True)
+ self.assertEqual(bob.cfgmgr, True)
+ self.assertEqual(bob.ccsession, True)
+ self.assertEqual(bob.auth, False)
+ self.assertEqual(bob.recurse, True)
+ self.assertEqual(bob.xfrout, False)
+ self.assertEqual(bob.xfrin, False)
+ self.assertEqual(bob.zonemgr, False)
+ self.assertEqual(bob.stats, True)
+ self.assertEqual(bob.cmdctl, True)
+
+ # Checks the processes started when starting both auth and recurse process
+ def test_start_both(self):
+ # Created Bob and ensure initialization correct
+ bob = StartAllProcessesBob()
+ self.check_preconditions(bob)
+
+ # Start processes and check what was started
+ c_channel_env = {}
+ bob.cfg_start_auth = True
+ bob.cfg_start_recurse = True
+
+ bob.start_all_processes(c_channel_env)
+
+ self.assertEqual(bob.msgq, True)
+ self.assertEqual(bob.cfgmgr, True)
+ self.assertEqual(bob.ccsession, True)
+ self.assertEqual(bob.auth, True)
+ self.assertEqual(bob.recurse, True)
+ self.assertEqual(bob.xfrout, True)
+ self.assertEqual(bob.xfrin, True)
+ self.assertEqual(bob.zonemgr, True)
+ self.assertEqual(bob.stats, True)
+ self.assertEqual(bob.cmdctl, True)
+
if __name__ == '__main__':
unittest.main()
Modified: branches/trac405/src/bin/bindctl/bindcmd.py
==============================================================================
--- branches/trac405/src/bin/bindctl/bindcmd.py (original)
+++ branches/trac405/src/bin/bindctl/bindcmd.py Mon Dec 6 14:50:36 2010
@@ -558,7 +558,7 @@
if value_map['type'] in [ 'module', 'map', 'list' ]:
line += "/"
else:
- line += ":\t" + str(value_map['value'])
+ line += ":\t" + json.dumps(value_map['value'])
line += "\t" + value_map['type']
line += "\t"
if value_map['default']:
Modified: branches/trac405/src/bin/bindctl/bindctl-source.py.in
==============================================================================
--- branches/trac405/src/bin/bindctl/bindctl-source.py.in (original)
+++ branches/trac405/src/bin/bindctl/bindctl-source.py.in Mon Dec 6 14:50:36 2010
@@ -28,7 +28,10 @@
isc.util.process.rename()
-__version__ = 'Bindctl'
+# This is the version that gets displayed to the user.
+# The VERSION string consists of the module name, the module version
+# number, and the overall BIND 10 version number (set in configure.ac).
+VERSION = "bindctl 20101201 (BIND 10 @PACKAGE_VERSION@)"
def prepare_config_commands(tool):
'''Prepare fixed commands for local configuration editing'''
@@ -113,7 +116,7 @@
if __name__ == '__main__':
try:
- parser = OptionParser(version = __version__)
+ parser = OptionParser(version = VERSION)
set_bindctl_options(parser)
(options, args) = parser.parse_args()
server_addr = options.addr + ':' + str(options.port)
Modified: branches/trac405/src/bin/host/host.cc
==============================================================================
--- branches/trac405/src/bin/host/host.cc (original)
+++ branches/trac405/src/bin/host/host.cc Mon Dec 6 14:50:36 2010
@@ -131,7 +131,7 @@
}
RdataIteratorPtr rit = (*it)->getRdataIterator();
- for (rit->first(); !rit->isLast(); rit->next()) {
+ for (; !rit->isLast(); rit->next()) {
// instead of using my name, maybe use returned label?
cout << name << " has address " <<
(*rit).getCurrent().toText() << endl;
Modified: branches/trac405/src/bin/msgq/msgq.py.in
==============================================================================
--- branches/trac405/src/bin/msgq/msgq.py.in (original)
+++ branches/trac405/src/bin/msgq/msgq.py.in Mon Dec 6 14:50:36 2010
@@ -38,7 +38,9 @@
isc.util.process.rename()
# This is the version that gets displayed to the user.
-__version__ = "v20091030 (Paving the DNS Parking Lot)"
+# The VERSION string consists of the module name, the module version
+# number, and the overall BIND 10 version number (set in configure.ac).
+VERSION = "b10-msgq 20100818 (BIND 10 @PACKAGE_VERSION@)"
class MsgQReceiveError(Exception): pass
@@ -421,7 +423,7 @@
parser.values.msgq_port = intval
# Parse any command-line options.
- parser = OptionParser(version=__version__)
+ parser = OptionParser(version=VERSION)
parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
help="display more about what is going on")
parser.add_option("-s", "--socket-file", dest="msgq_socket_file",
@@ -433,7 +435,7 @@
# Announce startup.
if options.verbose:
- sys.stdout.write("[b10-msgq] MsgQ %s\n" % __version__)
+ sys.stdout.write("[b10-msgq] %s\n" % VERSION)
msgq = MsgQ(options.msgq_socket_file, options.verbose)
Modified: branches/trac405/src/bin/xfrin/b10-xfrin.xml
==============================================================================
--- branches/trac405/src/bin/xfrin/b10-xfrin.xml (original)
+++ branches/trac405/src/bin/xfrin/b10-xfrin.xml Mon Dec 6 14:50:36 2010
@@ -149,7 +149,6 @@
the authoritative server to transfer from,
and <varname>port</varname> to define the port number on the
authoritative server (defaults to 53).
-<!-- TODO: note: not documenting db_file since that will be removed. -->
</para>
<!-- TODO: later hostname for master? -->
Modified: branches/trac405/src/bin/xfrout/b10-xfrout.8
==============================================================================
--- branches/trac405/src/bin/xfrout/b10-xfrout.8 (original)
+++ branches/trac405/src/bin/xfrout/b10-xfrout.8 Mon Dec 6 14:50:36 2010
@@ -2,12 +2,12 @@
.\" Title: b10-xfrout
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
.\" Generator: DocBook XSL Stylesheets v1.75.2 <http://docbook.sf.net/>
-.\" Date: September 8, 2010
+.\" Date: December 1, 2010
.\" Manual: BIND10
.\" Source: BIND10
.\" Language: English
.\"
-.TH "B10\-XFROUT" "8" "September 8, 2010" "BIND10" "BIND10"
+.TH "B10\-XFROUT" "8" "December 1, 2010" "BIND10" "BIND10"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@@ -67,11 +67,6 @@
The configurable settings are:
.PP
-\fIdb_file\fR
-defines the path to the SQLite3 data store file\&. The default is
-/usr/local/var/bind10\-devel/zone\&.sqlite3\&.
-.PP
-
\fItransfers_out\fR
defines the maximum number of outgoing zone transfers that can run concurrently\&. The default is 10\&.
.if n \{\
Modified: branches/trac405/src/bin/xfrout/b10-xfrout.xml
==============================================================================
--- branches/trac405/src/bin/xfrout/b10-xfrout.xml (original)
+++ branches/trac405/src/bin/xfrout/b10-xfrout.xml Mon Dec 6 14:50:36 2010
@@ -21,7 +21,7 @@
<refentry>
<refentryinfo>
- <date>September 8, 2010</date>
+ <date>December 1, 2010</date>
</refentryinfo>
<refmeta>
@@ -92,13 +92,6 @@
<title>CONFIGURATION AND COMMANDS</title>
<para>
The configurable settings are:
- </para>
- <para>
- <varname>db_file</varname>
- defines the path to the SQLite3 data store file.
- The default is
- <filename>/usr/local/var/bind10-devel/zone.sqlite3</filename>.
-<!-- TODO: db_file will be removed -->
</para>
<para>
<varname>transfers_out</varname>
Modified: branches/trac405/src/bin/xfrout/tests/xfrout_test.py
==============================================================================
--- branches/trac405/src/bin/xfrout/tests/xfrout_test.py (original)
+++ branches/trac405/src/bin/xfrout/tests/xfrout_test.py Mon Dec 6 14:50:36 2010
@@ -47,22 +47,29 @@
result = self.sendqueue[:size]
self.sendqueue = self.sendqueue[size:]
return result
-
+
def read_msg(self):
sent_data = self.readsent()
get_msg = Message(Message.PARSE)
get_msg.from_wire(bytes(sent_data[2:]))
return get_msg
-
+
def clear_send(self):
del self.sendqueue[:]
# We subclass the Session class we're testing here, only
-# to override the __init__() method, which wants a socket,
+# to override the handle() and _send_data() method
class MyXfroutSession(XfroutSession):
def handle(self):
pass
-
+
+ def _send_data(self, sock, data):
+ size = len(data)
+ total_count = 0
+ while total_count < size:
+ count = sock.send(data[total_count:])
+ total_count += count
+
class Dbserver:
def __init__(self):
self._shutdown_event = threading.Event()
@@ -80,12 +87,21 @@
def setUp(self):
request = MySocket(socket.AF_INET,socket.SOCK_STREAM)
self.log = isc.log.NSLogger('xfrout', '', severity = 'critical', log_to_console = False )
- self.xfrsess = MyXfroutSession(request, None, None, self.log)
+ (self.write_sock, self.read_sock) = socket.socketpair()
+ self.xfrsess = MyXfroutSession(request, None, None, self.log, self.read_sock)
self.xfrsess.server = Dbserver()
self.mdata = bytes(b'\xd6=\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\x00\x00\xfc\x00\x01')
self.sock = MySocket(socket.AF_INET,socket.SOCK_STREAM)
self.soa_record = (4, 3, 'example.com.', 'com.example.', 3600, 'SOA', None, 'master.example.com. admin.example.com. 1234 3600 1800 2419200 7200')
+ def test_receive_query_message(self):
+ send_msg = b"\xd6=\x00\x00\x00\x01\x00"
+ msg_len = struct.pack('H', socket.htons(len(send_msg)))
+ self.write_sock.send(msg_len)
+ self.write_sock.send(send_msg)
+ recv_msg = self.xfrsess._receive_query_message(self.read_sock)
+ self.assertEqual(recv_msg, send_msg)
+
def test_parse_query_message(self):
[get_rcode, get_msg] = self.xfrsess._parse_query_message(self.mdata)
self.assertEqual(get_rcode.to_text(), "NOERROR")
@@ -93,7 +109,7 @@
def test_get_query_zone_name(self):
msg = self.getmsg()
self.assertEqual(self.xfrsess._get_query_zone_name(msg), "example.com.")
-
+
def test_send_data(self):
self.xfrsess._send_data(self.sock, self.mdata)
senddata = self.sock.readsent()
@@ -103,8 +119,8 @@
msg = self.getmsg()
self.xfrsess._reply_query_with_error_rcode(msg, self.sock, Rcode(3))
get_msg = self.sock.read_msg()
- self.assertEqual(get_msg.get_rcode().to_text(), "NXDOMAIN")
-
+ self.assertEqual(get_msg.get_rcode().to_text(), "NXDOMAIN")
+
def test_clear_message(self):
msg = self.getmsg()
qid = msg.get_qid()
@@ -118,7 +134,7 @@
self.assertTrue(msg.get_header_flag(Message.HEADERFLAG_AA))
def test_reply_query_with_format_error(self):
-
+
msg = self.getmsg()
self.xfrsess._reply_query_with_format_error(msg, self.sock)
get_msg = self.sock.read_msg()
@@ -217,7 +233,7 @@
sqlite3_ds.get_zone_soa = zone_soa
self.assertEqual(self.xfrsess._zone_exist(True), True)
self.assertEqual(self.xfrsess._zone_exist(False), False)
-
+
def test_check_xfrout_available(self):
def zone_exist(zone):
return zone
@@ -243,7 +259,7 @@
self.xfrsess.dns_xfrout_start(self.sock, b"\xd6=\x00\x00\x00\x01\x00")
sent_data = self.sock.readsent()
self.assertEqual(len(sent_data), 0)
-
+
def default(self, param):
return "example.com"
@@ -255,20 +271,20 @@
self.xfrsess.dns_xfrout_start(self.sock, self.mdata)
get_msg = self.sock.read_msg()
self.assertEqual(get_msg.get_rcode().to_text(), "NOTAUTH")
-
+
def test_dns_xfrout_start_noerror(self):
self.xfrsess._get_query_zone_name = self.default
def noerror(form):
- return Rcode.NOERROR()
+ return Rcode.NOERROR()
self.xfrsess._check_xfrout_available = noerror
-
+
def myreply(msg, sock, zonename):
self.sock.send(b"success")
-
+
self.xfrsess._reply_xfrout_query = myreply
self.xfrsess.dns_xfrout_start(self.sock, self.mdata)
self.assertEqual(self.sock.readsent(), b"success")
-
+
def test_reply_xfrout_query_noerror(self):
global sqlite3_ds
def get_zone_soa(zonename, file):
@@ -292,7 +308,7 @@
return "initdb.file", False
else:
return "unknown", False
-
+
class MyUnixSockServer(UnixSockServer):
def __init__(self):
@@ -306,7 +322,7 @@
class TestUnixSockServer(unittest.TestCase):
def setUp(self):
self.unix = MyUnixSockServer()
-
+
def test_updata_config_data(self):
self.unix.update_config_data({'transfers_out':10 })
self.assertEqual(self.unix._max_transfers_out, 10)
@@ -324,7 +340,7 @@
count = self.unix._transfers_counter
self.assertEqual(self.unix.increase_transfers_counter(), False)
self.assertEqual(count, self.unix._transfers_counter)
-
+
def test_decrease_transfers_counter(self):
count = self.unix._transfers_counter
self.unix.decrease_transfers_counter()
@@ -335,7 +351,7 @@
os.remove(sock_file)
except OSError:
pass
-
+
def test_sock_file_in_use_file_exist(self):
sock_file = 'temp.sock.file'
self._remove_file(sock_file)
Modified: branches/trac405/src/bin/xfrout/xfrout.py.in
==============================================================================
--- branches/trac405/src/bin/xfrout/xfrout.py.in (original)
+++ branches/trac405/src/bin/xfrout/xfrout.py.in Mon Dec 6 14:50:36 2010
@@ -63,6 +63,7 @@
MAX_TRANSFERS_OUT = 10
VERBOSE_MODE = False
+
XFROUT_MAX_MESSAGE_SIZE = 65535
def get_rrset_len(rrset):
@@ -73,46 +74,78 @@
class XfroutSession(BaseRequestHandler):
- def __init__(self, request, client_address, server, log):
+ def __init__(self, request, client_address, server, log, sock):
# The initializer for the superclass may call functions
# that need _log to be set, so we set it first
self._log = log
+ self._shutdown_sock = sock
BaseRequestHandler.__init__(self, request, client_address, server)
def handle(self):
- fd = recv_fd(self.request.fileno())
-
- if fd < 0:
- # This may happen when one xfrout process try to connect to
- # xfrout unix socket server, to check whether there is another
- # xfrout running.
- self._log.log_message("error", "Failed to receive the file descriptor for XFR connection")
- return
-
- data_len = self.request.recv(2)
+ '''Handle a request until shutdown or xfrout client is closed.'''
+ # check self.server._shutdown_event to ensure the real shutdown comes.
+ # Linux could trigger a spurious readable event on the _shutdown_sock
+ # due to a bug, so we need perform a double check.
+ while not self.server._shutdown_event.is_set(): # Check if xfrout is shutdown
+ try:
+ (rlist, wlist, xlist) = select.select([self._shutdown_sock, self.request], [], [])
+ except select.error as e:
+ if e.args[0] == errno.EINTR:
+ (rlist, wlist, xlist) = ([], [], [])
+ continue
+ else:
+ self._log.log_message("error", "Error with select(): %s" %e)
+ break
+ # self.server._shutdown_evnet will be set by now, if it is not a false
+ # alarm
+ if self._shutdown_sock in rlist:
+ continue
+
+ sock_fd = recv_fd(self.request.fileno())
+
+ if sock_fd < 0:
+ # This may happen when one xfrout process try to connect to
+ # xfrout unix socket server, to check whether there is another
+ # xfrout running.
+ if sock_fd == XFR_FD_RECEIVE_FAIL:
+ self._log.log_message("error", "Failed to receive the file descriptor for XFR connection")
+ break
+
+ # receive query msg
+ msgdata = self._receive_query_message(self.request)
+ if not msgdata:
+ break
+
+ try:
+ self.dns_xfrout_start(sock_fd, msgdata)
+ #TODO, avoid catching all exceptions
+ except Exception as e:
+ self._log.log_message("error", str(e))
+
+ os.close(sock_fd)
+
+ def _receive_query_message(self, sock):
+ ''' receive query message from sock'''
+ # receive data length
+ data_len = sock.recv(2)
+ if not data_len:
+ return None
msg_len = struct.unpack('!H', data_len)[0]
- msgdata = self.request.recv(msg_len)
- sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
- try:
- self.dns_xfrout_start(sock, msgdata)
- #TODO, avoid catching all exceptions
- except Exception as e:
- self._log.log_message("error", str(e))
-
- try:
- sock.shutdown(socket.SHUT_RDWR)
- except socket.error:
- # Avoid socket error caused by shutting down
- # one non-connected socket.
- pass
-
- sock.close()
- os.close(fd)
- pass
+ # receive data
+ recv_size = 0
+ msgdata = b''
+ while recv_size < msg_len:
+ data = sock.recv(msg_len - recv_size)
+ if not data:
+ return None
+ recv_size += len(data)
+ msgdata += data
+
+ return msgdata
def _parse_query_message(self, mdata):
''' parse query message to [socket,message]'''
- #TODO, need to add parseHeader() in case the message header is invalid
+ #TODO, need to add parseHeader() in case the message header is invalid
try:
msg = Message(Message.PARSE)
Message.from_wire(msg, mdata)
@@ -127,37 +160,37 @@
return question.get_name().to_text()
- def _send_data(self, sock, data):
+ def _send_data(self, sock_fd, data):
size = len(data)
total_count = 0
while total_count < size:
- count = sock.send(data[total_count:])
+ count = os.write(sock_fd, data[total_count:])
total_count += count
- def _send_message(self, sock, msg):
+ def _send_message(self, sock_fd, msg):
render = MessageRenderer()
render.set_length_limit(XFROUT_MAX_MESSAGE_SIZE)
msg.to_wire(render)
header_len = struct.pack('H', socket.htons(render.get_length()))
- self._send_data(sock, header_len)
- self._send_data(sock, render.get_data())
-
-
- def _reply_query_with_error_rcode(self, msg, sock, rcode_):
+ self._send_data(sock_fd, header_len)
+ self._send_data(sock_fd, render.get_data())
+
+
+ def _reply_query_with_error_rcode(self, msg, sock_fd, rcode_):
msg.make_response()
msg.set_rcode(rcode_)
- self._send_message(sock, msg)
-
-
- def _reply_query_with_format_error(self, msg, sock):
+ self._send_message(sock_fd, msg)
+
+
+ def _reply_query_with_format_error(self, msg, sock_fd):
'''query message format isn't legal.'''
if not msg:
- return # query message is invalid. send nothing back.
+ return # query message is invalid. send nothing back.
msg.make_response()
msg.set_rcode(Rcode.FORMERR())
- self._send_message(sock, msg)
+ self._send_message(sock_fd, msg)
def _zone_is_empty(self, zone):
@@ -167,24 +200,24 @@
return True
def _zone_exist(self, zonename):
- # Find zone in datasource, should this works? maybe should ask
+ # Find zone in datasource, should this works? maybe should ask
# config manager.
soa = sqlite3_ds.get_zone_soa(zonename, self.server.get_db_file())
if soa:
return True
return False
-
+
def _check_xfrout_available(self, zone_name):
'''Check if xfr request can be responsed.
TODO, Get zone's configuration from cfgmgr or some other place
- eg. check allow_transfer setting,
+ eg. check allow_transfer setting,
'''
if not self._zone_exist(zone_name):
return Rcode.NOTAUTH()
if self._zone_is_empty(zone_name):
- return Rcode.SERVFAIL()
+ return Rcode.SERVFAIL()
#TODO, check allow_transfer
if not self.server.increase_transfers_counter():
@@ -193,35 +226,35 @@
return Rcode.NOERROR()
- def dns_xfrout_start(self, sock, msg_query):
+ def dns_xfrout_start(self, sock_fd, msg_query):
rcode_, msg = self._parse_query_message(msg_query)
#TODO. create query message and parse header
if rcode_ != Rcode.NOERROR():
- return self._reply_query_with_format_error(msg, sock)
+ return self._reply_query_with_format_error(msg, sock_fd)
zone_name = self._get_query_zone_name(msg)
rcode_ = self._check_xfrout_available(zone_name)
if rcode_ != Rcode.NOERROR():
self._log.log_message("info", "transfer of '%s/IN' failed: %s",
zone_name, rcode_.to_text())
- return self. _reply_query_with_error_rcode(msg, sock, rcode_)
+ return self. _reply_query_with_error_rcode(msg, sock_fd, rcode_)
try:
self._log.log_message("info", "transfer of '%s/IN': AXFR started" % zone_name)
- self._reply_xfrout_query(msg, sock, zone_name)
+ self._reply_xfrout_query(msg, sock_fd, zone_name)
self._log.log_message("info", "transfer of '%s/IN': AXFR end" % zone_name)
except Exception as err:
self._log.log_message("error", str(err))
self.server.decrease_transfers_counter()
- return
+ return
def _clear_message(self, msg):
qid = msg.get_qid()
opcode = msg.get_opcode()
rcode = msg.get_rcode()
-
+
msg.clear(Message.RENDER)
msg.set_qid(qid)
msg.set_opcode(opcode)
@@ -231,7 +264,7 @@
return msg
def _create_rrset_from_db_record(self, record):
- '''Create one rrset from one record of datasource, if the schema of record is changed,
+ '''Create one rrset from one record of datasource, if the schema of record is changed,
This function should be updated first.
'''
rrtype_ = RRType(record[5])
@@ -239,8 +272,8 @@
rrset_ = RRset(Name(record[2]), RRClass("IN"), rrtype_, RRTTL( int(record[4])))
rrset_.add_rdata(rdata_)
return rrset_
-
- def _send_message_with_last_soa(self, msg, sock, rrset_soa, message_upper_len):
+
+ def _send_message_with_last_soa(self, msg, sock_fd, rrset_soa, message_upper_len):
'''Add the SOA record to the end of message. If it can't be
added, a new message should be created to send out the last soa .
'''
@@ -249,14 +282,14 @@
if message_upper_len + rrset_len < XFROUT_MAX_MESSAGE_SIZE:
msg.add_rrset(Message.SECTION_ANSWER, rrset_soa)
else:
- self._send_message(sock, msg)
+ self._send_message(sock_fd, msg)
msg = self._clear_message(msg)
msg.add_rrset(Message.SECTION_ANSWER, rrset_soa)
- self._send_message(sock, msg)
-
-
- def _reply_xfrout_query(self, msg, sock, zone_name):
+ self._send_message(sock_fd, msg)
+
+
+ def _reply_xfrout_query(self, msg, sock_fd, zone_name):
#TODO, there should be a better way to insert rrset.
msg.make_response()
msg.set_header_flag(Message.HEADERFLAG_AA)
@@ -286,12 +319,12 @@
message_upper_len += rrset_len
continue
- self._send_message(sock, msg)
+ self._send_message(sock_fd, msg)
msg = self._clear_message(msg)
msg.add_rrset(Message.SECTION_ANSWER, rrset_) # Add the rrset to the new message
message_upper_len = rrset_len
- self._send_message_with_last_soa(msg, sock, rrset_soa, message_upper_len)
+ self._send_message_with_last_soa(msg, sock_fd, rrset_soa, message_upper_len)
class UnixSockServer(socketserver_mixin.NoPollMixIn, ThreadingUnixStreamServer):
'''The unix domain socket server which accept xfr query sent from auth server.'''
@@ -304,22 +337,23 @@
self._lock = threading.Lock()
self._transfers_counter = 0
self._shutdown_event = shutdown_event
+ self._write_sock, self._read_sock = socket.socketpair()
self._log = log
self.update_config_data(config_data)
self._cc = cc
-
+
def finish_request(self, request, client_address):
'''Finish one request by instantiating RequestHandlerClass.'''
- self.RequestHandlerClass(request, client_address, self, self._log)
+ self.RequestHandlerClass(request, client_address, self, self._log, self._read_sock)
def _remove_unused_sock_file(self, sock_file):
- '''Try to remove the socket file. If the file is being used
- by one running xfrout process, exit from python.
+ '''Try to remove the socket file. If the file is being used
+ by one running xfrout process, exit from python.
If it's not a socket file or nobody is listening
, it will be removed. If it can't be removed, exit from python. '''
if self._sock_file_in_use(sock_file):
- sys.stderr.write("[b10-xfrout] Fail to start xfrout process, unix socket"
- " file '%s' is being used by another xfrout process\n" % sock_file)
+ self._log.log_message("error", "Fail to start xfrout process, unix socket file '%s'"
+ " is being used by another xfrout process\n" % sock_file)
sys.exit(0)
else:
if not os.path.exists(sock_file):
@@ -328,12 +362,12 @@
try:
os.unlink(sock_file)
except OSError as err:
- sys.stderr.write('[b10-xfrout] Fail to remove file %s: %s\n' % (sock_file, err))
+ self._log.log_message("error", '[b10-xfrout] Fail to remove file %s: %s\n' % (sock_file, err))
sys.exit(0)
-
+
def _sock_file_in_use(self, sock_file):
- '''Check whether the socket file 'sock_file' exists and
- is being used by one running xfrout process. If it is,
+ '''Check whether the socket file 'sock_file' exists and
+ is being used by one running xfrout process. If it is,
return True, or else return False. '''
try:
sock = socket.socket(socket.AF_UNIX)
@@ -341,9 +375,10 @@
except socket.error as err:
return False
else:
- return True
+ return True
def shutdown(self):
+ self._write_sock.send(b"shutdown") #terminate the xfrout session thread
super().shutdown() # call the shutdown() of class socketserver_mixin.NoPollMixIn
try:
os.unlink(self._sock_file)
@@ -390,7 +425,7 @@
def __init__(self):
self._unix_socket_server = None
self._log = None
- self._listen_sock_file = UNIX_SOCKET_FILE
+ self._listen_sock_file = UNIX_SOCKET_FILE
self._shutdown_event = threading.Event()
self._cc = isc.config.ModuleCCSession(SPECFILE_LOCATION, self.config_handler, self.command_handler)
self._config_data = self._cc.get_full_config()
@@ -404,12 +439,12 @@
def _start_xfr_query_listener(self):
'''Start a new thread to accept xfr query. '''
- self._unix_socket_server = UnixSockServer(self._listen_sock_file, XfroutSession,
+ self._unix_socket_server = UnixSockServer(self._listen_sock_file, XfroutSession,
self._shutdown_event, self._config_data,
self._cc, self._log);
listener = threading.Thread(target=self._unix_socket_server.serve_forever)
listener.start()
-
+
def _start_notifier(self):
datasrc = self._unix_socket_server.get_db_file()
self._notifier = notify_out.NotifyOut(datasrc, self._log)
@@ -472,7 +507,7 @@
else:
answer = create_answer(1, "Bad command parameter:" + str(args))
- else:
+ else:
answer = create_answer(1, "Unknown command:" + str(cmd))
return answer
@@ -514,7 +549,7 @@
sys.stderr.write("[b10-xfrout] Error creating xfrout, "
"is the command channel daemon running?\n")
except SessionTimeout as e:
- sys.stderr.write("[b10-xfrout] Error creating xfrout, "
+ sys.stderr.write("[b10-xfrout] Error creating xfrout, "
"is the configuration manager running?\n")
except ModuleCCSessionError as e:
sys.stderr.write("[b10-xfrout] exit xfrout process:%s\n" % str(e))
Modified: branches/trac405/src/bin/xfrout/xfrout.spec.pre.in
==============================================================================
--- branches/trac405/src/bin/xfrout/xfrout.spec.pre.in (original)
+++ branches/trac405/src/bin/xfrout/xfrout.spec.pre.in Mon Dec 6 14:50:36 2010
@@ -7,12 +7,6 @@
"item_type": "integer",
"item_optional": false,
"item_default": 10
- },
- {
- "item_name": "db_file",
- "item_type": "string",
- "item_optional": false,
- "item_default": "@@LOCALSTATEDIR@@/@PACKAGE@/zone.sqlite3"
},
{
"item_name": "log_name",
Modified: branches/trac405/src/bin/zonemgr/zonemgr.py.in
==============================================================================
--- branches/trac405/src/bin/zonemgr/zonemgr.py.in (original)
+++ branches/trac405/src/bin/zonemgr/zonemgr.py.in Mon Dec 6 14:50:36 2010
@@ -90,26 +90,26 @@
class ZonemgrRefresh:
"""This class will maintain and manage zone refresh info.
- It also provides methods to keep track of zone timers and
- do zone refresh.
- Zone timers can be started by calling run_timer(), and it
+ It also provides methods to keep track of zone timers and
+ do zone refresh.
+ Zone timers can be started by calling run_timer(), and it
can be stopped by calling shutdown() in another thread.
"""
def __init__(self, cc, db_file, slave_socket, config_data):
self._cc = cc
- self._check_sock = slave_socket
+ self._check_sock = slave_socket
self._db_file = db_file
self.update_config_data(config_data)
- self._zonemgr_refresh_info = {}
+ self._zonemgr_refresh_info = {}
self._build_zonemgr_refresh_info()
self._running = False
-
+
def _random_jitter(self, max, jitter):
"""Imposes some random jitters for refresh and
retry timers to avoid many zones need to do refresh
- at the same time.
+ at the same time.
The value should be between (max - jitter) and max.
"""
if 0 == jitter:
@@ -120,7 +120,7 @@
return time.time()
def _set_zone_timer(self, zone_name_class, max, jitter):
- """Set zone next refresh time.
+ """Set zone next refresh time.
jitter should not be bigger than half the original value."""
self._set_zone_next_refresh_time(zone_name_class, self._get_current_time() + \
self._random_jitter(max, jitter))
@@ -143,7 +143,7 @@
def _set_zone_notify_timer(self, zone_name_class):
"""Set zone next refresh time after receiving notify
- next_refresh_time = now
+ next_refresh_time = now
"""
self._set_zone_timer(zone_name_class, 0, 0)
@@ -199,7 +199,7 @@
raise ZonemgrException("[b10-zonemgr] zone (%s, %s) doesn't have soa." % zone_name_class)
zone_info["zone_soa_rdata"] = zone_soa[7]
zone_info["zone_state"] = ZONE_OK
- zone_info["last_refresh_time"] = self._get_current_time()
+ zone_info["last_refresh_time"] = self._get_current_time()
zone_info["next_refresh_time"] = self._get_current_time() + \
float(zone_soa[7].split(" ")[REFRESH_OFFSET])
self._zonemgr_refresh_info[zone_name_class] = zone_info
@@ -233,7 +233,7 @@
def _get_zone_notifier_master(self, zone_name_class):
if ("notify_master" in self._zonemgr_refresh_info[zone_name_class].keys()):
- return self._zonemgr_refresh_info[zone_name_class]["notify_master"]
+ return self._zonemgr_refresh_info[zone_name_class]["notify_master"]
return None
@@ -248,7 +248,7 @@
return self._zonemgr_refresh_info[zone_name_class]["zone_state"]
def _set_zone_state(self, zone_name_class, zone_state):
- self._zonemgr_refresh_info[zone_name_class]["zone_state"] = zone_state
+ self._zonemgr_refresh_info[zone_name_class]["zone_state"] = zone_state
def _get_zone_refresh_timeout(self, zone_name_class):
return self._zonemgr_refresh_info[zone_name_class]["refresh_timeout"]
@@ -268,7 +268,7 @@
try:
self._cc.group_sendmsg(msg, module_name)
except socket.error:
- sys.stderr.write("[b10-zonemgr] Failed to send to module %s, the session has been closed." % module_name)
+ sys.stderr.write("[b10-zonemgr] Failed to send to module %s, the session has been closed." % module_name)
def _find_need_do_refresh_zone(self):
"""Find the first zone need do refresh, if no zone need
@@ -281,10 +281,10 @@
if (ZONE_REFRESHING == zone_state and
(self._get_zone_refresh_timeout(zone_name_class) > self._get_current_time())):
continue
-
- # Get the zone with minimum next_refresh_time
- if ((zone_need_refresh is None) or
- (self._get_zone_next_refresh_time(zone_name_class) <
+
+ # Get the zone with minimum next_refresh_time
+ if ((zone_need_refresh is None) or
+ (self._get_zone_next_refresh_time(zone_name_class) <
self._get_zone_next_refresh_time(zone_need_refresh))):
zone_need_refresh = zone_name_class
@@ -292,14 +292,14 @@
if (self._get_zone_next_refresh_time(zone_need_refresh) < self._get_current_time()):
break
- return zone_need_refresh
-
-
+ return zone_need_refresh
+
+
def _do_refresh(self, zone_name_class):
"""Do zone refresh."""
log_msg("Do refresh for zone (%s, %s)." % zone_name_class)
self._set_zone_state(zone_name_class, ZONE_REFRESHING)
- self._set_zone_refresh_timeout(zone_name_class, self._get_current_time() + self._max_transfer_timeout)
+ self._set_zone_refresh_timeout(zone_name_class, self._get_current_time() + self._max_transfer_timeout)
notify_master = self._get_zone_notifier_master(zone_name_class)
# If the zone has notify master, send notify command to xfrin module
if notify_master:
@@ -307,7 +307,7 @@
"zone_class" : zone_name_class[1],
"master" : notify_master
}
- self._send_command(XFRIN_MODULE_NAME, ZONE_NOTIFY_COMMAND, param)
+ self._send_command(XFRIN_MODULE_NAME, ZONE_NOTIFY_COMMAND, param)
self._clear_zone_notifier_master(zone_name_class)
# Send refresh command to xfrin module
else:
@@ -324,23 +324,29 @@
return False
def _run_timer(self, start_event):
- start_event.set()
while self._running:
+ # Notify run_timer that we already started and are inside the loop.
+ # It is set only once, but when it was outside the loop, there was
+ # a race condition and _running could be set to false before we
+ # could enter it
+ if start_event:
+ start_event.set()
+ start_event = None
# If zonemgr has no zone, set timer timeout to self._lowerbound_retry.
if self._zone_mgr_is_empty():
- timeout = self._lowerbound_retry
+ timeout = self._lowerbound_retry
else:
zone_need_refresh = self._find_need_do_refresh_zone()
- # If don't get zone with minimum next refresh time, set timer timeout to self._lowerbound_retry
+ # If don't get zone with minimum next refresh time, set timer timeout to self._lowerbound_retry.
if not zone_need_refresh:
- timeout = self._lowerbound_retry
+ timeout = self._lowerbound_retry
else:
timeout = self._get_zone_next_refresh_time(zone_need_refresh) - self._get_current_time()
if (timeout < 0):
self._do_refresh(zone_need_refresh)
continue
- """ Wait for the socket notification for a maximum time of timeout
+ """ Wait for the socket notification for a maximum time of timeout
in seconds (as float)."""
try:
rlist, wlist, xlist = select.select([self._check_sock, self._read_sock], [], [], timeout)
@@ -352,9 +358,10 @@
break
for fd in rlist:
- if fd == self._read_sock: # awaken by shutdown socket
+ if fd == self._read_sock: # awaken by shutdown socket
# self._running will be False by now, if it is not a false
- # alarm
+ # alarm (linux kernel is said to trigger spurious wakeup
+ # on a filehandle that is not really readable).
continue
if fd == self._check_sock: # awaken by check socket
self._check_sock.recv(32)
@@ -416,7 +423,7 @@
self._zone_refresh = None
self._setup_session()
self._db_file = self.get_db_file()
- # Create socket pair for communicating between main thread and zonemgr timer thread
+ # Create socket pair for communicating between main thread and zonemgr timer thread
self._master_socket, self._slave_socket = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
self._zone_refresh = ZonemgrRefresh(self._cc, self._db_file, self._slave_socket, self._config_data)
self._zone_refresh.run_timer()
@@ -426,7 +433,7 @@
self.running = False
def _setup_session(self):
- """Setup two sessions for zonemgr, one(self._module_cc) is used for receiving
+ """Setup two sessions for zonemgr, one(self._module_cc) is used for receiving
commands and config data sent from other modules, another one (self._cc)
is used to send commands to proper modules."""
self._cc = isc.cc.Session()
@@ -450,7 +457,7 @@
def shutdown(self):
"""Shutdown the zonemgr process. the thread which is keeping track of zone
timers should be terminated.
- """
+ """
self._zone_refresh.shutdown()
self._slave_socket.close()
@@ -503,7 +510,7 @@
def command_handler(self, command, args):
"""Handle command receivd from command channel.
- ZONE_NOTIFY_COMMAND is issued by Auth process; ZONE_XFRIN_SUCCESS_COMMAND
+ ZONE_NOTIFY_COMMAND is issued by Auth process; ZONE_XFRIN_SUCCESS_COMMAND
and ZONE_XFRIN_FAILED_COMMAND are issued by Xfrin process; shutdown is issued
by a user or Boss process. """
answer = create_answer(0)
@@ -572,10 +579,10 @@
except KeyboardInterrupt:
sys.stderr.write("[b10-zonemgr] exit zonemgr process\n")
except isc.cc.session.SessionError as e:
- sys.stderr.write("[b10-zonemgr] Error creating zonemgr, "
+ sys.stderr.write("[b10-zonemgr] Error creating zonemgr, "
"is the command channel daemon running?\n")
except isc.cc.session.SessionTimeout as e:
- sys.stderr.write("[b10-zonemgr] Error creating zonemgr, "
+ sys.stderr.write("[b10-zonemgr] Error creating zonemgr, "
"is the configuration manager running?\n")
except isc.config.ModuleCCSessionError as e:
sys.stderr.write("[b10-zonemgr] exit zonemgr process: %s\n" % str(e))
Modified: branches/trac405/src/lib/bench/benchmark.h
==============================================================================
--- branches/trac405/src/lib/bench/benchmark.h (original)
+++ branches/trac405/src/lib/bench/benchmark.h Mon Dec 6 14:50:36 2010
@@ -200,7 +200,7 @@
BenchMark(const BenchMark& source);
BenchMark& operator=(const BenchMark& source);
public:
- /// \bench Constructor for immediate run.
+ /// \brief Constructor for immediate run.
///
/// This is the constructor that is expected to be used normally.
/// It runs the benchmark within the constructor and prints the result,
@@ -217,7 +217,7 @@
initialize(true);
}
- /// \bench Constructor for finer-grained control.
+ /// \brief Constructor for finer-grained control.
///
/// This constructor takes the third parameter, \c immediate, to control
/// whether to run the benchmark within the constructor.
Modified: branches/trac405/src/lib/cc/data.cc
==============================================================================
--- branches/trac405/src/lib/cc/data.cc (original)
+++ branches/trac405/src/lib/cc/data.cc Mon Dec 6 14:50:36 2010
@@ -62,84 +62,82 @@
// installed files we define the methods here.
//
bool
-Element::getValue(long int& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::getValue(double& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::getValue(bool& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::getValue(std::string& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::getValue(std::vector<ConstElementPtr>& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::getValue(std::map<std::string, ConstElementPtr>& t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const long int v UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const double v UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const bool t UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const std::string& v UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const std::vector<ConstElementPtr>& v UNUSED_PARAM) {
- return (false);
-}
-
-bool
-Element::setValue(const std::map<std::string,
- ConstElementPtr>& v UNUSED_PARAM)
-{
+Element::getValue(long int&) {
+ return (false);
+}
+
+bool
+Element::getValue(double&) {
+ return (false);
+}
+
+bool
+Element::getValue(bool&) {
+ return (false);
+}
+
+bool
+Element::getValue(std::string&) {
+ return (false);
+}
+
+bool
+Element::getValue(std::vector<ConstElementPtr>&) {
+ return (false);
+}
+
+bool
+Element::getValue(std::map<std::string, ConstElementPtr>&) {
+ return (false);
+}
+
+bool
+Element::setValue(const long int) {
+ return (false);
+}
+
+bool
+Element::setValue(const double) {
+ return (false);
+}
+
+bool
+Element::setValue(const bool) {
+ return (false);
+}
+
+bool
+Element::setValue(const std::string&) {
+ return (false);
+}
+
+bool
+Element::setValue(const std::vector<ConstElementPtr>&) {
+ return (false);
+}
+
+bool
+Element::setValue(const std::map<std::string, ConstElementPtr>&) {
return (false);
}
ConstElementPtr
-Element::get(const int i UNUSED_PARAM) const {
+Element::get(const int) const {
isc_throw(TypeError, "get(int) called on a non-list Element");
}
void
-Element::set(const size_t i UNUSED_PARAM, ConstElementPtr element UNUSED_PARAM) {
+Element::set(const size_t, ConstElementPtr) {
isc_throw(TypeError, "set(int, element) called on a non-list Element");
}
void
-Element::add(ConstElementPtr element UNUSED_PARAM) {
+Element::add(ConstElementPtr) {
isc_throw(TypeError, "add() called on a non-list Element");
}
void
-Element::remove(const int i UNUSED_PARAM) {
+Element::remove(const int) {
isc_throw(TypeError, "remove(int) called on a non-list Element");
}
@@ -149,36 +147,32 @@
}
ConstElementPtr
-Element::get(const std::string& name UNUSED_PARAM) const {
+Element::get(const std::string&) const {
isc_throw(TypeError, "get(string) called on a non-map Element");
}
void
-Element::set(const std::string& name UNUSED_PARAM,
- ConstElementPtr element UNUSED_PARAM)
-{
+Element::set(const std::string&, ConstElementPtr) {
isc_throw(TypeError, "set(name, element) called on a non-map Element");
}
void
-Element::remove(const std::string& name UNUSED_PARAM) {
+Element::remove(const std::string&) {
isc_throw(TypeError, "remove(string) called on a non-map Element");
}
bool
-Element::contains(const std::string& name UNUSED_PARAM) const {
+Element::contains(const std::string&) const {
isc_throw(TypeError, "contains(string) called on a non-map Element");
}
ConstElementPtr
-Element::find(const std::string& identifier UNUSED_PARAM) const {
+Element::find(const std::string&) const {
isc_throw(TypeError, "find(string) called on a non-map Element");
}
bool
-Element::find(const std::string& identifier UNUSED_PARAM,
- ConstElementPtr t UNUSED_PARAM) const
-{
+Element::find(const std::string&, ConstElementPtr) const {
return (false);
}
@@ -725,7 +719,7 @@
}
ElementPtr
-Element::fromWire(std::stringstream& in, int length) {
+Element::fromWire(std::stringstream& in, int) {
//
// Check protocol version
//
Modified: branches/trac405/src/lib/cc/tests/session_unittests.cc
==============================================================================
--- branches/trac405/src/lib/cc/tests/session_unittests.cc (original)
+++ branches/trac405/src/lib/cc/tests/session_unittests.cc Mon Dec 6 14:50:36 2010
@@ -76,7 +76,7 @@
}
void
- acceptHandler(const asio::error_code& error UNUSED_PARAM) {
+ acceptHandler(const asio::error_code&) {
}
void
Modified: branches/trac405/src/lib/config/config_data.cc
==============================================================================
--- branches/trac405/src/lib/config/config_data.cc (original)
+++ branches/trac405/src/lib/config/config_data.cc Mon Dec 6 14:50:36 2010
@@ -128,11 +128,6 @@
if (recurse && list_el->get("item_type")->stringValue() == "map") {
spec_name_list(result, list_el->get("map_item_spec"), new_prefix, recurse);
} else {
- if (list_el->get("item_type")->stringValue() == "map" ||
- list_el->get("item_type")->stringValue() == "list"
- ) {
- new_prefix += "/";
- }
result->add(Element::create(new_prefix));
}
}
Modified: branches/trac405/src/lib/config/tests/Makefile.am
==============================================================================
--- branches/trac405/src/lib/config/tests/Makefile.am (original)
+++ branches/trac405/src/lib/config/tests/Makefile.am Mon Dec 6 14:50:36 2010
@@ -4,10 +4,6 @@
AM_CPPFLAGS += $(BOOST_INCLUDES)
AM_CXXFLAGS = $(B10_CXXFLAGS)
-# see src/lib/cc/Makefile.am for -Wno-unused-parameter
-if USE_GXX
-AM_CXXFLAGS += -Wno-unused-parameter
-endif
if USE_STATIC_LINK
AM_LDFLAGS = -static
Modified: branches/trac405/src/lib/config/tests/ccsession_unittests.cc
==============================================================================
--- branches/trac405/src/lib/config/tests/ccsession_unittests.cc (original)
+++ branches/trac405/src/lib/config/tests/ccsession_unittests.cc Mon Dec 6 14:50:36 2010
@@ -188,7 +188,7 @@
}
ConstElementPtr my_command_handler(const std::string& command,
- ConstElementPtr arg UNUSED_PARAM)
+ ConstElementPtr arg)
{
if (command == "good_command") {
return (createAnswer());
Modified: branches/trac405/src/lib/config/tests/config_data_unittests.cc
==============================================================================
--- branches/trac405/src/lib/config/tests/config_data_unittests.cc (original)
+++ branches/trac405/src/lib/config/tests/config_data_unittests.cc Mon Dec 6 14:50:36 2010
@@ -120,8 +120,8 @@
ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
ConfigData cd = ConfigData(spec2);
- EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5/\", \"item6/\" ]", cd.getItemList()->str());
- EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5/\", \"item6/value1\", \"item6/value2\" ]", cd.getItemList("", true)->str());
+ EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5\", \"item6\" ]", cd.getItemList()->str());
+ EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5\", \"item6/value1\", \"item6/value2\" ]", cd.getItemList("", true)->str());
EXPECT_EQ("[ \"item6/value1\", \"item6/value2\" ]", cd.getItemList("item6")->str());
}
@@ -129,12 +129,12 @@
ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
ConfigData cd = ConfigData(spec2);
- EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5/\": [ \"a\", \"b\" ], \"item6/value1\": \"default\", \"item6/value2\": None }", cd.getFullConfig()->str());
+ EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6/value1\": \"default\", \"item6/value2\": None }", cd.getFullConfig()->str());
ElementPtr my_config = Element::fromJSON("{ \"item1\": 2 }");
cd.setLocalConfig(my_config);
- EXPECT_EQ("{ \"item1\": 2, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5/\": [ \"a\", \"b\" ], \"item6/value1\": \"default\", \"item6/value2\": None }", cd.getFullConfig()->str());
+ EXPECT_EQ("{ \"item1\": 2, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6/value1\": \"default\", \"item6/value2\": None }", cd.getFullConfig()->str());
ElementPtr my_config2 = Element::fromJSON("{ \"item6\": { \"value1\": \"a\" } }");
cd.setLocalConfig(my_config2);
- EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5/\": [ \"a\", \"b\" ], \"item6/value1\": \"a\", \"item6/value2\": None }", cd.getFullConfig()->str());
+ EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6/value1\": \"a\", \"item6/value2\": None }", cd.getFullConfig()->str());
}
Modified: branches/trac405/src/lib/config/tests/fake_session.cc
==============================================================================
--- branches/trac405/src/lib/config/tests/fake_session.cc (original)
+++ branches/trac405/src/lib/config/tests/fake_session.cc Mon Dec 6 14:50:36 2010
@@ -87,17 +87,15 @@
}
void
-FakeSession::startRead(boost::function<void()> read_callback UNUSED_PARAM) {
-}
-
-void
-FakeSession::establish(const char* socket_file) {
-}
-
-bool
-FakeSession::recvmsg(ConstElementPtr& msg, bool nonblock UNUSED_PARAM,
- int seq UNUSED_PARAM)
-{
+FakeSession::startRead(boost::function<void()>) {
+}
+
+void
+FakeSession::establish(const char*) {
+}
+
+bool
+FakeSession::recvmsg(ConstElementPtr& msg, bool, int) {
//cout << "[XX] client asks for message " << endl;
if (messages_ &&
messages_->getType() == Element::list &&
@@ -111,10 +109,7 @@
}
bool
-FakeSession::recvmsg(ConstElementPtr& env, ConstElementPtr& msg,
- bool nonblock UNUSED_PARAM,
- int seq UNUSED_PARAM)
-{
+FakeSession::recvmsg(ConstElementPtr& env, ConstElementPtr& msg, bool, int) {
//cout << "[XX] client asks for message and env" << endl;
env = ElementPtr();
if (messages_ &&
@@ -172,7 +167,7 @@
int
FakeSession::group_sendmsg(ConstElementPtr msg, std::string group,
- std::string to, std::string instance UNUSED_PARAM)
+ std::string to, std::string)
{
//cout << "[XX] client sends message: " << msg << endl;
//cout << "[XX] to: " << group << " . " << instance << "." << to << endl;
Modified: branches/trac405/src/lib/config/tests/fake_session.h
==============================================================================
--- branches/trac405/src/lib/config/tests/fake_session.h (original)
+++ branches/trac405/src/lib/config/tests/fake_session.h Mon Dec 6 14:50:36 2010
@@ -63,7 +63,7 @@
virtual int reply(isc::data::ConstElementPtr envelope,
isc::data::ConstElementPtr newmsg);
virtual bool hasQueuedMsgs() const;
- virtual void setTimeout(size_t milliseconds) {}
+ virtual void setTimeout(size_t) {}
virtual size_t getTimeout() const { return (0); }
isc::data::ConstElementPtr getFirstMessage(std::string& group,
std::string& to) const;
Modified: branches/trac405/src/lib/datasrc/Makefile.am
==============================================================================
--- branches/trac405/src/lib/datasrc/Makefile.am (original)
+++ branches/trac405/src/lib/datasrc/Makefile.am Mon Dec 6 14:50:36 2010
@@ -15,3 +15,4 @@
libdatasrc_la_SOURCES += sqlite3_datasrc.h sqlite3_datasrc.cc
libdatasrc_la_SOURCES += query.h query.cc
libdatasrc_la_SOURCES += cache.h cache.cc
+libdatasrc_la_SOURCES += zonetable.h zonetable.cc
Modified: branches/trac405/src/lib/datasrc/cache.h
==============================================================================
--- branches/trac405/src/lib/datasrc/cache.h (original)
+++ branches/trac405/src/lib/datasrc/cache.h Mon Dec 6 14:50:36 2010
@@ -170,9 +170,9 @@
/// then promoted to the head of the LRU queue. (NOTE: Because
/// of this, "retrieve" cannot be implemented as a const method.)
///
- /// \param name The query name
- /// \param rrclass The query class
- /// \param rrtype The query type
+ /// \param qname The query name
+ /// \param qclass The query class
+ /// \param qtype The query type
/// \param rrset Returns the RRset found, if any, to the caller
/// \param flags Returns the flags, if any, to the caller
///
Modified: branches/trac405/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/data_source.cc (original)
+++ branches/trac405/src/lib/datasrc/data_source.cc Mon Dec 6 14:50:36 2010
@@ -95,7 +95,7 @@
}
RdataIteratorPtr it = rrset->getRdataIterator();
- for (it->first(); !it->isLast(); it->next()) {
+ for (; !it->isLast(); it->next()) {
const Rdata& rd(it->getCurrent());
if (rrset->getType() == RRType::NS()) {
const generic::NS& ns = dynamic_cast<const generic::NS&>(rd);
@@ -123,7 +123,6 @@
// More than one DNAME RR in the RRset is illegal, so we only have
// to process the first one.
- it->first();
if (it->isLast()) {
return;
}
@@ -152,7 +151,6 @@
// More than one CNAME RR in the RRset is illegal, so we only have
// to process the first one.
- it->first();
if (it->isLast()) {
return;
}
@@ -660,7 +658,6 @@
// XXX: currently only one NSEC3 chain per zone is supported;
// we will need to revisit this.
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
if (it->isLast()) {
return (ConstNsec3ParamPtr());
}
@@ -1247,72 +1244,65 @@
return (encodeBase32Hex(vector<uint8_t>(digest, digest + SHA1_HASHSIZE)));
}
-//
-// The following methods are effectively empty, and their parameters are
-// unused. To silence compilers that warn unused function parameters,
-// we specify a (compiler dependent) special keyword when available.
-// It's defined in config.h, and to avoid including this header file from
-// installed files we define the methods here.
-//
DataSrc::Result
-DataSrc::init(isc::data::ConstElementPtr config UNUSED_PARAM) {
+DataSrc::init(isc::data::ConstElementPtr) {
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findRRset(const isc::dns::Name& qname UNUSED_PARAM,
- const isc::dns::RRClass& qclass UNUSED_PARAM,
- const isc::dns::RRType& qtype UNUSED_PARAM,
- isc::dns::RRsetList& target UNUSED_PARAM,
- uint32_t& flags UNUSED_PARAM,
- const isc::dns::Name* zonename UNUSED_PARAM) const
+MetaDataSrc::findRRset(const isc::dns::Name&,
+ const isc::dns::RRClass&,
+ const isc::dns::RRType&,
+ isc::dns::RRsetList&,
+ uint32_t&,
+ const isc::dns::Name*) const
{
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findExactRRset(const isc::dns::Name& qname UNUSED_PARAM,
- const isc::dns::RRClass& qclass UNUSED_PARAM,
- const isc::dns::RRType& qtype UNUSED_PARAM,
- isc::dns::RRsetList& target UNUSED_PARAM,
- uint32_t& flags UNUSED_PARAM,
- const isc::dns::Name* zonename UNUSED_PARAM) const
+MetaDataSrc::findExactRRset(const isc::dns::Name&,
+ const isc::dns::RRClass&,
+ const isc::dns::RRType&,
+ isc::dns::RRsetList&,
+ uint32_t&,
+ const isc::dns::Name*) const
{
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findAddrs(const isc::dns::Name& qname UNUSED_PARAM,
- const isc::dns::RRClass& qclass UNUSED_PARAM,
- isc::dns::RRsetList& target UNUSED_PARAM,
- uint32_t& flags UNUSED_PARAM,
- const isc::dns::Name* zonename UNUSED_PARAM) const
+MetaDataSrc::findAddrs(const isc::dns::Name&,
+ const isc::dns::RRClass&,
+ isc::dns::RRsetList&,
+ uint32_t&,
+ const isc::dns::Name*) const
{
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findReferral(const isc::dns::Name& qname UNUSED_PARAM,
- const isc::dns::RRClass& qclass UNUSED_PARAM,
- isc::dns::RRsetList& target UNUSED_PARAM,
- uint32_t& flags UNUSED_PARAM,
- const isc::dns::Name* zonename UNUSED_PARAM) const
+MetaDataSrc::findReferral(const isc::dns::Name&,
+ const isc::dns::RRClass&,
+ isc::dns::RRsetList&,
+ uint32_t&,
+ const isc::dns::Name*) const
{
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findPreviousName(const isc::dns::Name& qname UNUSED_PARAM,
- isc::dns::Name& target UNUSED_PARAM,
- const isc::dns::Name* zonename UNUSED_PARAM) const
+MetaDataSrc::findPreviousName(const isc::dns::Name&,
+ isc::dns::Name&,
+ const isc::dns::Name*) const
{
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-MetaDataSrc::findCoveringNSEC3(const isc::dns::Name& zonename UNUSED_PARAM,
- std::string& hash UNUSED_PARAM,
- isc::dns::RRsetList& target UNUSED_PARAM) const
+MetaDataSrc::findCoveringNSEC3(const isc::dns::Name&,
+ std::string&,
+ isc::dns::RRsetList&) const
{
return (NOT_IMPLEMENTED);
}
Modified: branches/trac405/src/lib/datasrc/static_datasrc.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/static_datasrc.cc (original)
+++ branches/trac405/src/lib/datasrc/static_datasrc.cc Mon Dec 6 14:50:36 2010
@@ -79,6 +79,7 @@
authors->addRdata(generic::TXT("JINMEI Tatuya"));
authors->addRdata(generic::TXT("Kazunori Fujiwara"));
authors->addRdata(generic::TXT("Michael Graff"));
+ authors->addRdata(generic::TXT("Michal Vaner"));
authors->addRdata(generic::TXT("Naoki Kambe"));
authors->addRdata(generic::TXT("Shane Kerr"));
authors->addRdata(generic::TXT("Shen Tingting"));
@@ -235,18 +236,12 @@
}
DataSrc::Result
-StaticDataSrc::findPreviousName(const Name& qname UNUSED_PARAM,
- Name& target UNUSED_PARAM,
- const Name* zonename UNUSED_PARAM) const
-{
+StaticDataSrc::findPreviousName(const Name&, Name&, const Name*) const {
return (NOT_IMPLEMENTED);
}
DataSrc::Result
-StaticDataSrc::findCoveringNSEC3(const Name& zonename UNUSED_PARAM,
- string& hash UNUSED_PARAM,
- RRsetList& target UNUSED_PARAM) const
-{
+StaticDataSrc::findCoveringNSEC3(const Name&, string&, RRsetList&) const {
return (NOT_IMPLEMENTED);
}
@@ -258,7 +253,7 @@
// Static data source is "configuration less", so the \c config parameter
// is intentionally ignored.
DataSrc::Result
-StaticDataSrc::init(isc::data::ConstElementPtr config UNUSED_PARAM) {
+StaticDataSrc::init(isc::data::ConstElementPtr) {
return (init());
}
Modified: branches/trac405/src/lib/datasrc/tests/Makefile.am
==============================================================================
--- branches/trac405/src/lib/datasrc/tests/Makefile.am (original)
+++ branches/trac405/src/lib/datasrc/tests/Makefile.am Mon Dec 6 14:50:36 2010
@@ -24,6 +24,7 @@
run_unittests_SOURCES += query_unittest.cc
run_unittests_SOURCES += cache_unittest.cc
run_unittests_SOURCES += test_datasrc.h test_datasrc.cc
+run_unittests_SOURCES += zonetable_unittest.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
run_unittests_LDADD = $(GTEST_LDADD)
Modified: branches/trac405/src/lib/datasrc/tests/datasrc_unittest.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/tests/datasrc_unittest.cc (original)
+++ branches/trac405/src/lib/datasrc/tests/datasrc_unittest.cc Mon Dec 6 14:50:36 2010
@@ -124,7 +124,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -138,7 +137,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -154,7 +152,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -193,7 +190,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -216,7 +212,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -237,7 +232,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -334,7 +328,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -353,7 +346,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -369,7 +361,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -406,7 +397,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -419,7 +409,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -438,7 +427,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -454,7 +442,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -474,7 +461,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -506,7 +492,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("spork.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -544,7 +529,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -556,7 +540,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -572,7 +555,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -591,7 +573,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -605,7 +586,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -621,7 +601,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -649,7 +628,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("cnametest.flame.org.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -668,7 +646,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -695,7 +672,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("www.sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -720,7 +696,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
@@ -732,7 +707,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -751,7 +725,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
@@ -763,7 +736,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -795,7 +767,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -817,7 +788,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
@@ -829,7 +799,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
@@ -854,7 +823,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
@@ -890,7 +858,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ(createRdata(RRType::NS(), RRClass::IN(),
"ns.sub.example.org.")->toText(),
it->getCurrent().toText());
@@ -904,7 +871,6 @@
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ(createRdata(RRType::A(), RRClass::IN(), "192.0.2.101")->toText(),
it->getCurrent().toText());
it->next();
Modified: branches/trac405/src/lib/datasrc/tests/sqlite3_unittest.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/tests/sqlite3_unittest.cc (original)
+++ branches/trac405/src/lib/datasrc/tests/sqlite3_unittest.cc Mon Dec 6 14:50:36 2010
@@ -244,7 +244,6 @@
EXPECT_EQ(expected_rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
- rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
Modified: branches/trac405/src/lib/datasrc/tests/static_unittest.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/tests/static_unittest.cc (original)
+++ branches/trac405/src/lib/datasrc/tests/static_unittest.cc Mon Dec 6 14:50:36 2010
@@ -63,6 +63,7 @@
authors_data.push_back("JINMEI Tatuya");
authors_data.push_back("Kazunori Fujiwara");
authors_data.push_back("Michael Graff");
+ authors_data.push_back("Michal Vaner");
authors_data.push_back("Naoki Kambe");
authors_data.push_back("Shane Kerr");
authors_data.push_back("Shen Tingting");
@@ -109,7 +110,6 @@
EXPECT_EQ(rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
- rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
Modified: branches/trac405/src/lib/datasrc/tests/test_datasrc.cc
==============================================================================
--- branches/trac405/src/lib/datasrc/tests/test_datasrc.cc (original)
+++ branches/trac405/src/lib/datasrc/tests/test_datasrc.cc Mon Dec 6 14:50:36 2010
@@ -307,7 +307,7 @@
}
DataSrc::Result
-TestDataSrc::init(isc::data::ConstElementPtr config UNUSED_PARAM) {
+TestDataSrc::init(isc::data::ConstElementPtr) {
return (init());
}
@@ -408,7 +408,7 @@
RRsetPtr rrset = RRsetPtr(new RRset(source->getName(), source->getClass(),
source->getType(), source->getTTL()));
RdataIteratorPtr it = source->getRdataIterator();
- for (it->first(); !it->isLast(); it->next()) {
+ for (; !it->isLast(); it->next()) {
rrset->addRdata(it->getCurrent());
}
if (source->getRRsig()) {
@@ -623,10 +623,7 @@
}
DataSrc::Result
-TestDataSrc::findCoveringNSEC3(const Name& zonename UNUSED_PARAM,
- string& hash UNUSED_PARAM,
- RRsetList& target UNUSED_PARAM) const
-{
+TestDataSrc::findCoveringNSEC3(const Name&, string&, RRsetList&) const {
return (NOT_IMPLEMENTED);
}
Modified: branches/trac405/src/lib/dns/Makefile.am
==============================================================================
--- branches/trac405/src/lib/dns/Makefile.am (original)
+++ branches/trac405/src/lib/dns/Makefile.am Mon Dec 6 14:50:36 2010
@@ -13,6 +13,8 @@
# TODO: double-check that this is the only way
# NOTE: when an rdata file is added, please also add to this list:
+EXTRA_DIST += rdata/any_255/tsig_250.cc
+EXTRA_DIST += rdata/any_255/tsig_250.h
EXTRA_DIST += rdata/in_1/aaaa_28.cc
EXTRA_DIST += rdata/in_1/aaaa_28.h
EXTRA_DIST += rdata/in_1/a_1.cc
@@ -81,7 +83,7 @@
libdns___la_SOURCES += rrtype.cc
libdns___la_SOURCES += question.h question.cc
libdns___la_SOURCES += util/sha1.h util/sha1.cc
-libdns___la_SOURCES += tsig.h tsig.cc
+libdns___la_SOURCES += tsigkey.h tsigkey.cc
nodist_libdns___la_SOURCES = rdataclass.cc rrclass.h rrtype.h
nodist_libdns___la_SOURCES += rrparamregistry.cc
@@ -96,11 +98,13 @@
libdns___include_HEADERS = \
buffer.h \
dnssectime.h \
+ edns.h \
exceptions.h \
message.h \
messagerenderer.h \
name.h \
question.h \
+ rcode.h \
rdata.h \
rdataclass.h \
rrclass.h \
@@ -109,7 +113,7 @@
rrsetlist.h \
rrttl.h \
rrtype.h \
- tsig.h
+ tsigkey.h
# Purposely not installing these headers:
# util/*.h: used only internally, and not actually DNS specific
# rrclass-placeholder.h
Modified: branches/trac405/src/lib/dns/edns.cc
==============================================================================
--- branches/trac405/src/lib/dns/edns.cc (original)
+++ branches/trac405/src/lib/dns/edns.cc Mon Dec 6 14:50:36 2010
@@ -74,7 +74,7 @@
}
EDNS::EDNS(const Name& name, const RRClass& rrclass, const RRType& rrtype,
- const RRTTL& ttl, const Rdata& rdata UNUSED_PARAM) :
+ const RRTTL& ttl, const Rdata&) :
version_((ttl.getValue() & VERSION_MASK) >> VERSION_SHIFT)
{
if (rrtype != RRType::OPT()) {
@@ -152,7 +152,7 @@
EDNS*
createEDNSFromRR(const Name& name, const RRClass& rrclass,
const RRType& rrtype, const RRTTL& ttl,
- const Rdata& rdata UNUSED_PARAM,
+ const Rdata& rdata,
uint8_t& extended_rcode)
{
// Create a new EDNS object first for exception guarantee.
Modified: branches/trac405/src/lib/dns/python/Makefile.am
==============================================================================
--- branches/trac405/src/lib/dns/python/Makefile.am (original)
+++ branches/trac405/src/lib/dns/python/Makefile.am Mon Dec 6 14:50:36 2010
@@ -24,6 +24,7 @@
EXTRA_DIST += rrttl_python.cc
EXTRA_DIST += rdata_python.cc
EXTRA_DIST += rrtype_python.cc
+EXTRA_DIST += tsigkey_python.cc
# Python prefers .so, while some OSes (specifically MacOS) use a different
# suffix for dynamic objects. -module is necessary to work this around.
Modified: branches/trac405/src/lib/dns/python/name_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/name_python.cc (original)
+++ branches/trac405/src/lib/dns/python/name_python.cc Mon Dec 6 14:50:36 2010
@@ -50,7 +50,7 @@
isc::dns::NameComparisonResult* ncr;
};
-static int NameComparisonResult_init(s_NameComparisonResult* self UNUSED_PARAM, PyObject* args UNUSED_PARAM);
+static int NameComparisonResult_init(s_NameComparisonResult*, PyObject*);
static void NameComparisonResult_destroy(s_NameComparisonResult* self);
static PyObject* NameComparisonResult_getOrder(s_NameComparisonResult* self);
static PyObject* NameComparisonResult_getCommonLabels(s_NameComparisonResult* self);
@@ -123,9 +123,7 @@
};
static int
-NameComparisonResult_init(s_NameComparisonResult* self UNUSED_PARAM,
- PyObject* args UNUSED_PARAM)
-{
+NameComparisonResult_init(s_NameComparisonResult*, PyObject*) {
PyErr_SetString(PyExc_NotImplementedError,
"NameComparisonResult can't be built directly");
return (-1);
Modified: branches/trac405/src/lib/dns/python/opcode_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/opcode_python.cc (original)
+++ branches/trac405/src/lib/dns/python/opcode_python.cc Mon Dec 6 14:50:36 2010
@@ -220,82 +220,82 @@
}
PyObject*
-Opcode_QUERY(const s_Opcode* self UNUSED_PARAM) {
+Opcode_QUERY(const s_Opcode*) {
return (Opcode_createStatic(Opcode::QUERY()));
}
PyObject*
-Opcode_IQUERY(const s_Opcode* self UNUSED_PARAM) {
+Opcode_IQUERY(const s_Opcode*) {
return (Opcode_createStatic(Opcode::IQUERY()));
}
PyObject*
-Opcode_STATUS(const s_Opcode* self UNUSED_PARAM) {
+Opcode_STATUS(const s_Opcode*) {
return (Opcode_createStatic(Opcode::STATUS()));
}
PyObject*
-Opcode_RESERVED3(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED3(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED3()));
}
PyObject*
-Opcode_NOTIFY(const s_Opcode* self UNUSED_PARAM) {
+Opcode_NOTIFY(const s_Opcode*) {
return (Opcode_createStatic(Opcode::NOTIFY()));
}
PyObject*
-Opcode_UPDATE(const s_Opcode* self UNUSED_PARAM) {
+Opcode_UPDATE(const s_Opcode*) {
return (Opcode_createStatic(Opcode::UPDATE()));
}
PyObject*
-Opcode_RESERVED6(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED6(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED6()));
}
PyObject*
-Opcode_RESERVED7(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED7(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED7()));
}
PyObject*
-Opcode_RESERVED8(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED8(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED8()));
}
PyObject*
-Opcode_RESERVED9(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED9(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED9()));
}
PyObject*
-Opcode_RESERVED10(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED10(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED10()));
}
PyObject*
-Opcode_RESERVED11(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED11(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED11()));
}
PyObject*
-Opcode_RESERVED12(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED12(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED12()));
}
PyObject*
-Opcode_RESERVED13(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED13(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED13()));
}
PyObject*
-Opcode_RESERVED14(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED14(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED14()));
}
PyObject*
-Opcode_RESERVED15(const s_Opcode* self UNUSED_PARAM) {
+Opcode_RESERVED15(const s_Opcode*) {
return (Opcode_createStatic(Opcode::RESERVED15()));
}
Modified: branches/trac405/src/lib/dns/python/pydnspp.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/pydnspp.cc (original)
+++ branches/trac405/src/lib/dns/python/pydnspp.cc Mon Dec 6 14:50:36 2010
@@ -57,6 +57,7 @@
#include <dns/python/rrset_python.cc> // needs Rdata, RRTTL
#include <dns/python/question_python.cc> // needs RRClass, RRType, RRTTL,
// Name
+#include <dns/python/tsigkey_python.cc> // needs Name
#include <dns/python/opcode_python.cc>
#include <dns/python/rcode_python.cc>
#include <dns/python/edns_python.cc> // needs Messagerenderer, Rcode
@@ -146,6 +147,14 @@
return (NULL);
}
+ if (!initModulePart_TSIGKey(mod)) {
+ return (NULL);
+ }
+
+ if (!initModulePart_TSIGKeyRing(mod)) {
+ return (NULL);
+ }
+
return (mod);
}
Modified: branches/trac405/src/lib/dns/python/rcode_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/rcode_python.cc (original)
+++ branches/trac405/src/lib/dns/python/rcode_python.cc Mon Dec 6 14:50:36 2010
@@ -254,87 +254,87 @@
}
PyObject*
-Rcode_NOERROR(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NOERROR(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NOERROR()));
}
PyObject*
-Rcode_FORMERR(const s_Rcode* self UNUSED_PARAM) {
+Rcode_FORMERR(const s_Rcode*) {
return (Rcode_createStatic(Rcode::FORMERR()));
}
PyObject*
-Rcode_SERVFAIL(const s_Rcode* self UNUSED_PARAM) {
+Rcode_SERVFAIL(const s_Rcode*) {
return (Rcode_createStatic(Rcode::SERVFAIL()));
}
PyObject*
-Rcode_NXDOMAIN(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NXDOMAIN(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NXDOMAIN()));
}
PyObject*
-Rcode_NOTIMP(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NOTIMP(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NOTIMP()));
}
PyObject*
-Rcode_REFUSED(const s_Rcode* self UNUSED_PARAM) {
+Rcode_REFUSED(const s_Rcode*) {
return (Rcode_createStatic(Rcode::REFUSED()));
}
PyObject*
-Rcode_YXDOMAIN(const s_Rcode* self UNUSED_PARAM) {
+Rcode_YXDOMAIN(const s_Rcode*) {
return (Rcode_createStatic(Rcode::YXDOMAIN()));
}
PyObject*
-Rcode_YXRRSET(const s_Rcode* self UNUSED_PARAM) {
+Rcode_YXRRSET(const s_Rcode*) {
return (Rcode_createStatic(Rcode::YXRRSET()));
}
PyObject*
-Rcode_NXRRSET(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NXRRSET(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NXRRSET()));
}
PyObject*
-Rcode_NOTAUTH(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NOTAUTH(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NOTAUTH()));
}
PyObject*
-Rcode_NOTZONE(const s_Rcode* self UNUSED_PARAM) {
+Rcode_NOTZONE(const s_Rcode*) {
return (Rcode_createStatic(Rcode::NOTZONE()));
}
PyObject*
-Rcode_RESERVED11(const s_Rcode* self UNUSED_PARAM) {
+Rcode_RESERVED11(const s_Rcode*) {
return (Rcode_createStatic(Rcode::RESERVED11()));
}
PyObject*
-Rcode_RESERVED12(const s_Rcode* self UNUSED_PARAM) {
+Rcode_RESERVED12(const s_Rcode*) {
return (Rcode_createStatic(Rcode::RESERVED12()));
}
PyObject*
-Rcode_RESERVED13(const s_Rcode* self UNUSED_PARAM) {
+Rcode_RESERVED13(const s_Rcode*) {
return (Rcode_createStatic(Rcode::RESERVED13()));
}
PyObject*
-Rcode_RESERVED14(const s_Rcode* self UNUSED_PARAM) {
+Rcode_RESERVED14(const s_Rcode*) {
return (Rcode_createStatic(Rcode::RESERVED14()));
}
PyObject*
-Rcode_RESERVED15(const s_Rcode* self UNUSED_PARAM) {
+Rcode_RESERVED15(const s_Rcode*) {
return (Rcode_createStatic(Rcode::RESERVED15()));
}
PyObject*
-Rcode_BADVERS(const s_Rcode* self UNUSED_PARAM) {
+Rcode_BADVERS(const s_Rcode*) {
return (Rcode_createStatic(Rcode::BADVERS()));
}
Modified: branches/trac405/src/lib/dns/python/rrclass_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/rrclass_python.cc (original)
+++ branches/trac405/src/lib/dns/python/rrclass_python.cc Mon Dec 6 14:50:36 2010
@@ -306,23 +306,23 @@
return (ret);
}
-static PyObject* RRClass_IN(s_RRClass *self UNUSED_PARAM) {
+static PyObject* RRClass_IN(s_RRClass*) {
return (RRClass_createStatic(RRClass::IN()));
}
-static PyObject* RRClass_CH(s_RRClass *self UNUSED_PARAM) {
+static PyObject* RRClass_CH(s_RRClass*) {
return (RRClass_createStatic(RRClass::CH()));
}
-static PyObject* RRClass_HS(s_RRClass *self UNUSED_PARAM) {
+static PyObject* RRClass_HS(s_RRClass*) {
return (RRClass_createStatic(RRClass::HS()));
}
-static PyObject* RRClass_NONE(s_RRClass *self UNUSED_PARAM) {
+static PyObject* RRClass_NONE(s_RRClass*) {
return (RRClass_createStatic(RRClass::NONE()));
}
-static PyObject* RRClass_ANY(s_RRClass *self UNUSED_PARAM) {
+static PyObject* RRClass_ANY(s_RRClass*) {
return (RRClass_createStatic(RRClass::ANY()));
}
// end of RRClass
Modified: branches/trac405/src/lib/dns/python/rrset_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/rrset_python.cc (original)
+++ branches/trac405/src/lib/dns/python/rrset_python.cc Mon Dec 6 14:50:36 2010
@@ -158,7 +158,7 @@
};
static int
-RRset_init(s_RRset* self, PyObject* args UNUSED_PARAM) {
+RRset_init(s_RRset* self, PyObject* args) {
s_Name* name;
s_RRClass* rrclass;
s_RRType* rrtype;
@@ -355,7 +355,7 @@
RdataIteratorPtr it = self->rrset->getRdataIterator();
- for (it->first(); !it->isLast(); it->next()) {
+ for (; !it->isLast(); it->next()) {
s_Rdata *rds = static_cast<s_Rdata*>(rdata_type.tp_alloc(&rdata_type, 0));
if (rds != NULL) {
// hmz them iterators/shared_ptrs and private constructors
Modified: branches/trac405/src/lib/dns/python/rrtype_python.cc
==============================================================================
--- branches/trac405/src/lib/dns/python/rrtype_python.cc (original)
+++ branches/trac405/src/lib/dns/python/rrtype_python.cc Mon Dec 6 14:50:36 2010
@@ -344,97 +344,97 @@
}
static PyObject*
-RRType_NSEC3PARAM(s_RRType *self UNUSED_PARAM) {
+RRType_NSEC3PARAM(s_RRType*) {
return (RRType_createStatic(RRType::NSEC3PARAM()));
}
static PyObject*
-RRType_DNAME(s_RRType *self UNUSED_PARAM) {
+RRType_DNAME(s_RRType*) {
return (RRType_createStatic(RRType::DNAME()));
}
static PyObject*
-RRType_PTR(s_RRType *self UNUSED_PARAM) {
+RRType_PTR(s_RRType*) {
return (RRType_createStatic(RRType::PTR()));
}
static PyObject*
-RRType_MX(s_RRType *self UNUSED_PARAM) {
+RRType_MX(s_RRType*) {
return (RRType_createStatic(RRType::MX()));
}
static PyObject*
-RRType_DNSKEY(s_RRType *self UNUSED_PARAM) {
+RRType_DNSKEY(s_RRType*) {
return (RRType_createStatic(RRType::DNSKEY()));
}
static PyObject*
-RRType_TXT(s_RRType *self UNUSED_PARAM) {
+RRType_TXT(s_RRType*) {
return (RRType_createStatic(RRType::TXT()));
}
static PyObject*
-RRType_RRSIG(s_RRType *self UNUSED_PARAM) {
+RRType_RRSIG(s_RRType*) {
return (RRType_createStatic(RRType::RRSIG()));
}
static PyObject*
-RRType_NSEC(s_RRType *self UNUSED_PARAM) {
+RRType_NSEC(s_RRType*) {
return (RRType_createStatic(RRType::NSEC()));
}
static PyObject*
-RRType_AAAA(s_RRType *self UNUSED_PARAM) {
+RRType_AAAA(s_RRType*) {
return (RRType_createStatic(RRType::AAAA()));
}
static PyObject*
-RRType_DS(s_RRType *self UNUSED_PARAM) {
+RRType_DS(s_RRType*) {
return (RRType_createStatic(RRType::DS()));
}
static PyObject*
-RRType_OPT(s_RRType *self UNUSED_PARAM) {
+RRType_OPT(s_RRType*) {
return (RRType_createStatic(RRType::OPT()));
}
static PyObject*
-RRType_A(s_RRType *self UNUSED_PARAM) {
+RRType_A(s_RRType*) {
return (RRType_createStatic(RRType::A()));
}
static PyObject*
-RRType_NS(s_RRType *self UNUSED_PARAM) {
+RRType_NS(s_RRType*) {
return (RRType_createStatic(RRType::NS()));
}
static PyObject*
-RRType_CNAME(s_RRType *self UNUSED_PARAM) {
+RRType_CNAME(s_RRType*) {
return (RRType_createStatic(RRType::CNAME()));
}
static PyObject*
-RRType_SOA(s_RRType *self UNUSED_PARAM) {
+RRType_SOA(s_RRType*) {
return (RRType_createStatic(RRType::SOA()));
}
static PyObject*
-RRType_NSEC3(s_RRType *self UNUSED_PARAM) {
+RRType_NSEC3(s_RRType*) {
return (RRType_createStatic(RRType::NSEC3()));
}
static PyObject*
-RRType_IXFR(s_RRType *self UNUSED_PARAM) {
+RRType_IXFR(s_RRType*) {
return (RRType_createStatic(RRType::IXFR()));
}
static PyObject*
-RRType_AXFR(s_RRType *self UNUSED_PARAM) {
+RRType_AXFR(s_RRType*) {
return (RRType_createStatic(RRType::AXFR()));
}
static PyObject*
-RRType_ANY(s_RRType *self UNUSED_PARAM) {
+RRType_ANY(s_RRType*) {
return (RRType_createStatic(RRType::ANY()));
}
Modified: branches/trac405/src/lib/dns/python/tests/Makefile.am
==============================================================================
--- branches/trac405/src/lib/dns/python/tests/Makefile.am (original)
+++ branches/trac405/src/lib/dns/python/tests/Makefile.am Mon Dec 6 14:50:36 2010
@@ -10,6 +10,7 @@
PYTESTS += rrset_python_test.py
PYTESTS += rrttl_python_test.py
PYTESTS += rrtype_python_test.py
+PYTESTS += tsigkey_python_test.py
EXTRA_DIST = $(PYTESTS)
EXTRA_DIST += testutil.py
Modified: branches/trac405/src/lib/dns/rdata/ch_3/a_1.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/ch_3/a_1.cc (original)
+++ branches/trac405/src/lib/dns/rdata/ch_3/a_1.cc Mon Dec 6 14:50:36 2010
@@ -14,8 +14,6 @@
// $Id$
-#include <config.h> // for UNUSED_PARAM
-
#include <string>
#include <exceptions/exceptions.h>
@@ -30,25 +28,25 @@
// BEGIN_ISC_NAMESPACE
// BEGIN_RDATA_NAMESPACE
-A::A(const string& addrstr UNUSED_PARAM) {
+A::A(const string&) {
// TBD
}
-A::A(InputBuffer& buffer UNUSED_PARAM, size_t rdata_len UNUSED_PARAM) {
+A::A(InputBuffer&, size_t) {
// TBD
}
-A::A(const A& source UNUSED_PARAM) : Rdata() {
+A::A(const A&) : Rdata() {
// TBD
}
void
-A::toWire(OutputBuffer& buffer UNUSED_PARAM) const {
+A::toWire(OutputBuffer&) const {
// TBD
}
void
-A::toWire(MessageRenderer& renderer UNUSED_PARAM) const {
+A::toWire(MessageRenderer&) const {
// TBD
}
@@ -59,7 +57,7 @@
}
int
-A::compare(const Rdata& other UNUSED_PARAM) const {
+A::compare(const Rdata&) const {
return (0); // dummy. TBD
}
Modified: branches/trac405/src/lib/dns/rdata/generic/cname_5.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/cname_5.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/cname_5.cc Mon Dec 6 14:50:36 2010
@@ -33,7 +33,7 @@
cname_(namestr)
{}
-CNAME::CNAME(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+CNAME::CNAME(InputBuffer& buffer, size_t) :
Rdata(), cname_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/generic/dname_39.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/dname_39.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/dname_39.cc Mon Dec 6 14:50:36 2010
@@ -33,7 +33,7 @@
dname_(namestr)
{}
-DNAME::DNAME(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+DNAME::DNAME(InputBuffer& buffer, size_t) :
dname_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/generic/mx_15.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/mx_15.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/mx_15.cc Mon Dec 6 14:50:36 2010
@@ -34,7 +34,7 @@
// BEGIN_ISC_NAMESPACE
// BEGIN_RDATA_NAMESPACE
-MX::MX(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+MX::MX(InputBuffer& buffer, size_t) :
preference_(buffer.readUint16()), mxname_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/generic/ns_2.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/ns_2.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/ns_2.cc Mon Dec 6 14:50:36 2010
@@ -33,7 +33,7 @@
nsname_(namestr)
{}
-NS::NS(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+NS::NS(InputBuffer& buffer, size_t) :
nsname_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/generic/opt_41.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/opt_41.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/opt_41.cc Mon Dec 6 14:50:36 2010
@@ -28,7 +28,7 @@
// BEGIN_ISC_NAMESPACE
// BEGIN_RDATA_NAMESPACE
-OPT::OPT(const string& type_str UNUSED_PARAM) {
+OPT::OPT(const string&) {
isc_throw(InvalidRdataText, "OPT RR cannot be constructed from text");
}
@@ -43,7 +43,7 @@
buffer.setPosition(buffer.getPosition() + rdata_len);
}
-OPT::OPT(const OPT& source UNUSED_PARAM) : Rdata() {
+OPT::OPT(const OPT&) : Rdata() {
// there's nothing to copy in this simple implementation.
}
@@ -53,12 +53,12 @@
}
void
-OPT::toWire(OutputBuffer& buffer UNUSED_PARAM) const {
+OPT::toWire(OutputBuffer&) const {
// nothing to do, as this simple version doesn't support any options.
}
void
-OPT::toWire(MessageRenderer& renderer UNUSED_PARAM) const {
+OPT::toWire(MessageRenderer&) const {
// nothing to do, as this simple version doesn't support any options.
}
Modified: branches/trac405/src/lib/dns/rdata/generic/ptr_12.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/ptr_12.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/ptr_12.cc Mon Dec 6 14:50:36 2010
@@ -33,7 +33,7 @@
ptr_name_(type_str)
{}
-PTR::PTR(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+PTR::PTR(InputBuffer& buffer, size_t) :
ptr_name_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/generic/soa_6.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/generic/soa_6.cc (original)
+++ branches/trac405/src/lib/dns/rdata/generic/soa_6.cc Mon Dec 6 14:50:36 2010
@@ -34,7 +34,7 @@
// BEGIN_ISC_NAMESPACE
// BEGIN_RDATA_NAMESPACE
-SOA::SOA(InputBuffer& buffer, size_t rdata_len UNUSED_PARAM) :
+SOA::SOA(InputBuffer& buffer, size_t) :
mname_(buffer), rname_(buffer)
{
// we don't need rdata_len for parsing. if necessary, the caller will
Modified: branches/trac405/src/lib/dns/rdata/hs_4/a_1.cc
==============================================================================
--- branches/trac405/src/lib/dns/rdata/hs_4/a_1.cc (original)
+++ branches/trac405/src/lib/dns/rdata/hs_4/a_1.cc Mon Dec 6 14:50:36 2010
@@ -14,8 +14,6 @@
// $Id$
-#include <config.h> // for UNUSED_PARAM
-
#include <string>
#include <exceptions/exceptions.h>
@@ -30,25 +28,25 @@
// BEGIN_ISC_NAMESPACE
// BEGIN_RDATA_NAMESPACE
-A::A(const string& addrstr UNUSED_PARAM) {
+A::A(const string&) {
// TBD
}
-A::A(InputBuffer& buffer UNUSED_PARAM, size_t rdata_len UNUSED_PARAM) {
+A::A(InputBuffer&, size_t) {
// TBD
}
-A::A(const A& source UNUSED_PARAM) : Rdata() {
+A::A(const A&) : Rdata() {
// TBD
}
void
-A::toWire(OutputBuffer& buffer UNUSED_PARAM) const {
+A::toWire(OutputBuffer&) const {
// TBD
}
void
-A::toWire(MessageRenderer& renderer UNUSED_PARAM) const {
+A::toWire(MessageRenderer&) const {
// TBD
}
@@ -59,7 +57,7 @@
}
int
-A::compare(const Rdata& other UNUSED_PARAM) const {
+A::compare(const Rdata&) const {
return (0); // dummy. TBD
}
Modified: branches/trac405/src/lib/dns/rrclass-placeholder.h
==============================================================================
--- branches/trac405/src/lib/dns/rrclass-placeholder.h (original)
+++ branches/trac405/src/lib/dns/rrclass-placeholder.h Mon Dec 6 14:50:36 2010
@@ -244,14 +244,12 @@
// END_WELL_KNOWN_CLASS_DECLARATIONS
static const RRClass& NONE();
- static const RRClass& ANY();
private:
// \brief Meta-classes
enum {
RRCLASS_RESERVED0 = 0,
- RRCLASS_NONE = 254,
- RRCLASS_ANY = 255
+ RRCLASS_NONE = 254
};
uint16_t classcode_;
};
@@ -262,13 +260,6 @@
inline const RRClass&
RRClass::NONE() {
static RRClass rrclass(RRCLASS_NONE);
-
- return (rrclass);
-}
-
-inline const RRClass&
-RRClass::ANY() {
- static RRClass rrclass(RRCLASS_ANY);
return (rrclass);
}
Modified: branches/trac405/src/lib/dns/rrset.cc
==============================================================================
--- branches/trac405/src/lib/dns/rrset.cc (original)
+++ branches/trac405/src/lib/dns/rrset.cc Mon Dec 6 14:50:36 2010
@@ -44,7 +44,6 @@
string s;
RdataIteratorPtr it = getRdataIterator();
- it->first();
if (it->isLast()) {
isc_throw(EmptyRRset, "ToText() is attempted for an empty RRset");
}
@@ -66,7 +65,6 @@
unsigned int n = 0;
RdataIteratorPtr it = rrset.getRdataIterator();
- it->first();
if (it->isLast()) {
isc_throw(EmptyRRset, "ToWire() is attempted for an empty RRset");
}
@@ -224,7 +222,8 @@
BasicRdataIterator() {}
public:
BasicRdataIterator(const std::vector<rdata::ConstRdataPtr>& datavector) :
- datavector_(&datavector) {}
+ datavector_(&datavector), it_(datavector_->begin())
+ {}
~BasicRdataIterator() {}
virtual void first() { it_ = datavector_->begin(); }
virtual void next() { ++it_; }
Modified: branches/trac405/src/lib/dns/rrset.h
==============================================================================
--- branches/trac405/src/lib/dns/rrset.h (original)
+++ branches/trac405/src/lib/dns/rrset.h Mon Dec 6 14:50:36 2010
@@ -148,7 +148,7 @@
/// "sort" and "search(find)" method?
/// - what about comparing two RRsets of the same type? If we need this,
/// should it compare rdata's as a set or as a list (i.e. compare
-/// each %rdata one by one or as a whole)? c.f. NLnet Labs' ldns
+/// each rdata one by one or as a whole)? c.f. NLnet Labs' ldns
/// (http://www.nlnetlabs.nl/projects/ldns/doc/index.html)
/// has \c ldns_rr_list_compare(), which takes the latter approach
/// (seemingly assuming the caller sorts the lists beforehand).
@@ -357,7 +357,7 @@
/// \endcode
///
/// This method is more strictly typed than the pointer version:
- /// If \c %rdata does not refer to the appropriate derived
+ /// If \c rdata does not refer to the appropriate derived
/// \c Rdata class
/// for the \c RRType for this \c RRset, it throws an exception of class
/// \c std::bad_cast.
@@ -385,6 +385,10 @@
/// \brief Return an iterator to go through all RDATA stored in the
/// \c RRset.
///
+ /// The rdata cursor of the returned iterator will point to the first
+ /// RDATA, that is, it effectively calls \c RdataIterator::first()
+ /// internally.
+ ///
/// Using the design pattern terminology, \c getRdataIterator()
/// is an example of a <em>factory method</em>.
///
@@ -417,10 +421,10 @@
/// The RDATA objects stored in the \c RRset are considered to form
/// a unidirectional list from the \c RdataIterator point of view (while
/// the actual implementation in the derived \c RRset may not use a list).
-/// We call this unidirectional list the <em>%rdata list</em>.
+/// We call this unidirectional list the <em>rdata list</em>.
///
/// An \c RdataIterator object internally (and conceptually) holds a
-/// <em>%rdata cursor</em>, which points to a specific item of the %rdata list.
+/// <em>rdata cursor</em>, which points to a specific item of the rdata list.
///
/// Note about design choice: as is clear from the interface, \c RdataIterator
/// is not compatible with the standard iterator classes.
@@ -458,29 +462,29 @@
//@}
public:
- /// \brief Move the %rdata cursor to the first RDATA in the %rdata list
+ /// \brief Move the rdata cursor to the first RDATA in the rdata list
/// (if any).
///
/// This method can safely be called multiple times, even after moving
- /// the %rdata cursor forward by the \c next() method.
+ /// the rdata cursor forward by the \c next() method.
///
/// This method should never throw an exception.
virtual void first() = 0;
- /// \brief Move the %rdata cursor to the next RDATA in the %rdata list
+ /// \brief Move the rdata cursor to the next RDATA in the rdata list
/// (if any).
///
/// This method should never throw an exception.
virtual void next() = 0;
- /// \brief Return the current \c Rdata corresponding to the %rdata cursor.
+ /// \brief Return the current \c Rdata corresponding to the rdata cursor.
///
/// \return A reference to an \c rdata::::Rdata object corresponding
- /// to the %rdata cursor.
+ /// to the rdata cursor.
virtual const rdata::Rdata& getCurrent() const = 0;
- /// \brief Return true iff the %rdata cursor has reached the end of the
- /// %rdata list.
+ /// \brief Return true iff the rdata cursor has reached the end of the
+ /// rdata list.
///
/// Once this method returns \c true, the behavior of any subsequent
/// call to \c next() or \c getCurrent() is undefined.
@@ -489,8 +493,8 @@
///
/// This method should never throw an exception.
///
- /// \return \c true if the %rdata cursor has reached the end of the
- /// %rdata list; otherwise \c false.
+ /// \return \c true if the rdata cursor has reached the end of the
+ /// rdata list; otherwise \c false.
virtual bool isLast() const = 0;
};
Modified: branches/trac405/src/lib/dns/tests/Makefile.am
==============================================================================
--- branches/trac405/src/lib/dns/tests/Makefile.am (original)
+++ branches/trac405/src/lib/dns/tests/Makefile.am Mon Dec 6 14:50:36 2010
@@ -38,6 +38,7 @@
run_unittests_SOURCES += rdata_nsec3_unittest.cc
run_unittests_SOURCES += rdata_nsec3param_unittest.cc
run_unittests_SOURCES += rdata_rrsig_unittest.cc
+run_unittests_SOURCES += rdata_tsig_unittest.cc
run_unittests_SOURCES += rrset_unittest.cc rrsetlist_unittest.cc
run_unittests_SOURCES += question_unittest.cc
run_unittests_SOURCES += rrparamregistry_unittest.cc
@@ -46,7 +47,7 @@
run_unittests_SOURCES += base64_unittest.cc
run_unittests_SOURCES += hex_unittest.cc
run_unittests_SOURCES += sha1_unittest.cc
-run_unittests_SOURCES += tsig_unittest.cc
+run_unittests_SOURCES += tsigkey_unittest.cc
run_unittests_SOURCES += run_unittests.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
Modified: branches/trac405/src/lib/dns/tests/message_unittest.cc
==============================================================================
--- branches/trac405/src/lib/dns/tests/message_unittest.cc (original)
+++ branches/trac405/src/lib/dns/tests/message_unittest.cc Mon Dec 6 14:50:36 2010
@@ -293,7 +293,6 @@
// TTL should be 3600, even though that of the 2nd RR is 7200
EXPECT_EQ(RRTTL(3600), rrset->getTTL());
RdataIteratorPtr it = rrset->getRdataIterator();
- it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
Modified: branches/trac405/src/lib/dns/tests/rrset_unittest.cc
==============================================================================
--- branches/trac405/src/lib/dns/tests/rrset_unittest.cc (original)
+++ branches/trac405/src/lib/dns/tests/rrset_unittest.cc Mon Dec 6 14:50:36 2010
@@ -117,8 +117,7 @@
addRdataTestCommon(const RRset& rrset) {
EXPECT_EQ(2, rrset.getRdataCount());
- RdataIteratorPtr it = rrset.getRdataIterator();
- it->first();
+ RdataIteratorPtr it = rrset.getRdataIterator(); // cursor is set to the 1st
EXPECT_FALSE(it->isLast());
EXPECT_EQ(0, it->getCurrent().compare(in::A("192.0.2.1")));
it->next();
@@ -156,7 +155,6 @@
TEST_F(RRsetTest, iterator) {
// Iterator for an empty RRset.
RdataIteratorPtr it = rrset_a_empty.getRdataIterator();
- it->first();
EXPECT_TRUE(it->isLast());
// Normal case (already tested, but do it again just in case)
Modified: branches/trac405/src/lib/dns/tests/rrsetlist_unittest.cc
==============================================================================
--- branches/trac405/src/lib/dns/tests/rrsetlist_unittest.cc (original)
+++ branches/trac405/src/lib/dns/tests/rrsetlist_unittest.cc Mon Dec 6 14:50:36 2010
@@ -150,7 +150,6 @@
RdataIteratorPtr it =
list.findRRset(RRType::A(), RRClass::IN())->getRdataIterator();
- it->first();
EXPECT_FALSE(it->isLast());
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
}
Modified: branches/trac405/src/lib/dns/tests/testdata/Makefile.am
==============================================================================
--- branches/trac405/src/lib/dns/tests/testdata/Makefile.am (original)
+++ branches/trac405/src/lib/dns/tests/testdata/Makefile.am Mon Dec 6 14:50:36 2010
@@ -12,6 +12,14 @@
BUILT_SOURCES += rdata_soa_toWireUncompressed.wire
BUILT_SOURCES += rdata_txt_fromWire2.wire rdata_txt_fromWire3.wire
BUILT_SOURCES += rdata_txt_fromWire4.wire rdata_txt_fromWire5.wire
+BUILT_SOURCES += rdata_tsig_fromWire1.wire rdata_tsig_fromWire2.wire
+BUILT_SOURCES += rdata_tsig_fromWire3.wire rdata_tsig_fromWire4.wire
+BUILT_SOURCES += rdata_tsig_fromWire5.wire rdata_tsig_fromWire6.wire
+BUILT_SOURCES += rdata_tsig_fromWire7.wire rdata_tsig_fromWire8.wire
+BUILT_SOURCES += rdata_tsig_fromWire9.wire
+BUILT_SOURCES += rdata_tsig_toWire1.wire rdata_tsig_toWire2.wire
+BUILT_SOURCES += rdata_tsig_toWire3.wire rdata_tsig_toWire4.wire
+BUILT_SOURCES += rdata_tsig_toWire5.wire
# NOTE: keep this in sync with real file listing
# so is included in tarball
@@ -51,6 +59,14 @@
EXTRA_DIST += rrcode16_fromWire1 rrcode16_fromWire2
EXTRA_DIST += rrcode32_fromWire1 rrcode32_fromWire2
EXTRA_DIST += rrset_toWire1 rrset_toWire2
+EXTRA_DIST += rdata_tsig_fromWire1.spec rdata_tsig_fromWire2.spec
+EXTRA_DIST += rdata_tsig_fromWire3.spec rdata_tsig_fromWire4.spec
+EXTRA_DIST += rdata_tsig_fromWire5.spec rdata_tsig_fromWire6.spec
+EXTRA_DIST += rdata_tsig_fromWire7.spec rdata_tsig_fromWire8.spec
+EXTRA_DIST += rdata_tsig_fromWire9.spec
+EXTRA_DIST += rdata_tsig_toWire1.spec rdata_tsig_toWire2.spec
+EXTRA_DIST += rdata_tsig_toWire3.spec rdata_tsig_toWire4.spec
+EXTRA_DIST += rdata_tsig_toWire5.spec
.spec.wire:
./gen-wiredata.py -o $@ $<
Modified: branches/trac405/src/lib/dns/tests/testdata/gen-wiredata.py.in
==============================================================================
--- branches/trac405/src/lib/dns/tests/testdata/gen-wiredata.py.in (original)
+++ branches/trac405/src/lib/dns/tests/testdata/gen-wiredata.py.in Mon Dec 6 14:50:36 2010
@@ -19,8 +19,8 @@
from datetime import datetime
from optparse import OptionParser
-re_hex = re.compile(r'0x[0-9a-fA-F]+')
-re_decimal = re.compile(r'\d+$')
+re_hex = re.compile(r'^0x[0-9a-fA-F]+')
+re_decimal = re.compile(r'^\d+$')
re_string = re.compile(r"\'(.*)\'$")
dnssec_timefmt = '%Y%m%d%H%M%S'
@@ -48,9 +48,12 @@
'maila' : 254, 'any' : 255 }
rdict_rrtype = dict([(dict_rrtype[k], k.upper()) for k in dict_rrtype.keys()])
dict_rrclass = { 'in' : 1, 'ch' : 3, 'hs' : 4, 'any' : 255 }
-rdict_rrclass = dict([(dict_rrclass[k], k.upper()) for k in dict_rrclass.keys()])
-dict_algorithm = { 'rsamd5' : 1, 'dh' : 2, 'dsa' : 3, 'ecc' : 4, 'rsasha1' : 5 }
-rdict_algorithm = dict([(dict_algorithm[k], k.upper()) for k in dict_algorithm.keys()])
+rdict_rrclass = dict([(dict_rrclass[k], k.upper()) for k in \
+ dict_rrclass.keys()])
+dict_algorithm = { 'rsamd5' : 1, 'dh' : 2, 'dsa' : 3, 'ecc' : 4,
+ 'rsasha1' : 5 }
+rdict_algorithm = dict([(dict_algorithm[k], k.upper()) for k in \
+ dict_algorithm.keys()])
header_xtables = { 'qr' : dict_qr, 'opcode' : dict_opcode,
'rcode' : dict_rcode }
@@ -75,13 +78,17 @@
return dict[code] + '(' + str(code) + ')'
return str(code)
-def encode_name(name, absolute = True):
+def encode_name(name, absolute=True):
# make sure the name is dot-terminated. duplicate dots will be ignored
# below.
name += '.'
labels = name.split('.')
wire = ''
for l in labels:
+ if len(l) > 4 and l[0:4] == 'ptr=':
+ # special meta-syntax for compression pointer
+ wire += ' %04x' % (0xc000 | int(l[4:]))
+ break
if absolute or len(l) > 0:
wire += '%02x' % len(l)
wire += ''.join(['%02x' % ord(ch) for ch in l])
@@ -89,7 +96,9 @@
break
return wire
-def encode_string(name):
+def encode_string(name, len=None):
+ if type(name) is int and len is not None:
+ return '%0.*x' % (len * 2, name)
return ''.join(['%02x' % ord(ch) for ch in name])
def count_namelabels(name):
@@ -121,17 +130,19 @@
class Name:
name = 'example.com'
- pointer = -1 # no compression by default
- def dump(self, f):
- name_wire = encode_name(self.name,
- True if self.pointer == -1 else False)
+ pointer = None # no compression by default
+ def dump(self, f):
+ name = self.name
+ if self.pointer is not None:
+ if len(name) > 0 and name[-1] != '.':
+ name += '.'
+ name += 'ptr=%d' % self.pointer
+ name_wire = encode_name(name)
f.write('\n# DNS Name: %s' % self.name)
- if self.pointer >= 0:
+ if self.pointer is not None:
f.write(' + compression pointer: %d' % self.pointer)
f.write('\n')
f.write('%s' % name_wire)
- if self.pointer >= 0:
- f.write(' %04x' % (0xc000 | self.pointer))
f.write('\n')
class DNSHeader:
@@ -338,20 +349,73 @@
(code_totext(self.covered, rdict_rrtype),
code_totext(self.algorithm, rdict_algorithm), labels,
self.originalttl))
- f.write('%04x %02x %02x %08x\n' % (self.covered, self.algorithm, labels,
- self.originalttl))
+ f.write('%04x %02x %02x %08x\n' % (self.covered, self.algorithm,
+ labels, self.originalttl))
f.write('# Expiration=%s, Inception=%s\n' %
(str(self.expiration), str(self.inception)))
f.write('%08x %08x\n' % (self.expiration, self.inception))
f.write('# Tag=%d Signer=%s and Signature\n' % (self.tag, self.signer))
f.write('%04x %s %s\n' % (self.tag, name_wire, sig_wire))
+class TSIG:
+ rdlen = None # auto-calculate
+ algorithm = 'hmac-sha256'
+ time_signed = 1286978795 # arbitrarily chosen default
+ fudge = 300
+ mac_size = None # use a common value for the algorithm
+ mac = None # use 'x' * mac_size
+ original_id = 2845 # arbitrarily chosen default
+ error = 0
+ other_len = None # 6 if error is BADTIME; otherwise 0
+ other_data = None # use time_signed + fudge + 1 for BADTIME
+ dict_macsize = { 'hmac-md5' : 16, 'hmac-sha1' : 20, 'hmac-sha256' : 32 }
+ def dump(self, f):
+ if str(self.algorithm) == 'hmac-md5':
+ name_wire = encode_name('hmac-md5.sig-alg.reg.int')
+ else:
+ name_wire = encode_name(self.algorithm)
+ rdlen = self.rdlen
+ mac_size = self.mac_size
+ if mac_size is None:
+ if self.algorithm in self.dict_macsize.keys():
+ mac_size = self.dict_macsize[self.algorithm]
+ else:
+ raise RuntimeError('TSIG Mac Size cannot be determined')
+ mac = encode_string('x' * mac_size) if self.mac is None else \
+ encode_string(self.mac, mac_size)
+ other_len = self.other_len
+ if other_len is None:
+ # 18 = BADTIME
+ other_len = 6 if self.error == 18 else 0
+ other_data = self.other_data
+ if other_data is None:
+ other_data = '%012x' % (self.time_signed + self.fudge + 1) \
+ if self.error == 18 else ''
+ else:
+ other_data = encode_string(self.other_data, other_len)
+ if rdlen is None:
+ rdlen = int(len(name_wire) / 2 + 16 + len(mac) / 2 + \
+ len(other_data) / 2)
+ f.write('\n# TSIG RDATA (RDLEN=%d)\n' % rdlen)
+ f.write('%04x\n' % rdlen);
+ f.write('# Algorithm=%s Time-Signed=%d Fudge=%d\n' %
+ (self.algorithm, self.time_signed, self.fudge))
+ f.write('%s %012x %04x\n' % (name_wire, self.time_signed, self.fudge))
+ f.write('# MAC Size=%d MAC=(see hex)\n' % mac_size)
+ f.write('%04x%s\n' % (mac_size, ' ' + mac if len(mac) > 0 else ''))
+ f.write('# Original-ID=%d Error=%d\n' % (self.original_id, self.error))
+ f.write('%04x %04x\n' % (self.original_id, self.error))
+ f.write('# Other-Len=%d Other-Data=(see hex)\n' % other_len)
+ f.write('%04x%s\n' % (other_len,
+ ' ' + other_data if len(other_data) > 0 else ''))
+
def get_config_param(section):
config_param = {'name' : (Name, {}),
'header' : (DNSHeader, header_xtables),
'question' : (DNSQuestion, question_xtables),
'edns' : (EDNS, {}), 'soa' : (SOA, {}), 'txt' : (TXT, {}),
- 'rrsig' : (RRSIG, {}), 'nsec' : (NSEC, {})}
+ 'rrsig' : (RRSIG, {}), 'nsec' : (NSEC, {}),
+ 'tsig' : (TSIG, {}) }
s = section
m = re.match('^([^:]+)/\d+$', section)
if m:
Modified: branches/trac405/src/lib/dns/tests/unittest_util.cc
==============================================================================
--- branches/trac405/src/lib/dns/tests/unittest_util.cc (original)
+++ branches/trac405/src/lib/dns/tests/unittest_util.cc Mon Dec 6 14:50:36 2010
@@ -132,10 +132,7 @@
}
::testing::AssertionResult
-UnitTestUtil::matchWireData(const char* dataexp1 UNUSED_PARAM,
- const char* lenexp1 UNUSED_PARAM,
- const char* dataexp2 UNUSED_PARAM,
- const char* lenexp2 UNUSED_PARAM,
+UnitTestUtil::matchWireData(const char*, const char*, const char*, const char*,
const void* data1, size_t len1,
const void* data2, size_t len2)
{
@@ -162,8 +159,7 @@
}
::testing::AssertionResult
-UnitTestUtil::matchName(const char* nameexp1 UNUSED_PARAM,
- const char* nameexp2 UNUSED_PARAM,
+UnitTestUtil::matchName(const char*, const char*,
const isc::dns::Name& name1,
const isc::dns::Name& name2)
{
Modified: branches/trac405/src/lib/exceptions/exceptions.h
==============================================================================
--- branches/trac405/src/lib/exceptions/exceptions.h (original)
+++ branches/trac405/src/lib/exceptions/exceptions.h Mon Dec 6 14:50:36 2010
@@ -40,7 +40,7 @@
/// file line number.
///
/// @param file the file name where the exception was thrown.
- /// @param line the line in @ref file where the exception was thrown.
+ /// @param line the line in \a file where the exception was thrown.
/// @param what a description (type) of the exception.
Exception(const char* file, size_t line, const char* what) :
file_(file), line_(line), what_(what) {}
@@ -49,7 +49,7 @@
/// file line number.
///
/// @param file the file name where the exception was thrown.
- /// @param line the line in @ref file where the exception was thrown.
+ /// @param line the line in \a file where the exception was thrown.
/// @param what a description (type) of the exception.
Exception(const char* file, size_t line, const std::string& what) :
file_(file), line_(line), what_(what) {}
Modified: branches/trac405/src/lib/python/isc/cc/data.py
==============================================================================
--- branches/trac405/src/lib/python/isc/cc/data.py (original)
+++ branches/trac405/src/lib/python/isc/cc/data.py Mon Dec 6 14:50:36 2010
@@ -32,10 +32,8 @@
to_remove = []
if type(a) != dict or type(b) != dict:
raise DataTypeError("Not a dict in remove_identical()")
- for ka in a.keys():
- if ka in b and a[ka] == b[ka]:
- to_remove.append(ka)
- for id in to_remove:
+ duplicate_keys = [key for key in a.keys() if key in b and a[key] == b[key]]
+ for id in duplicate_keys:
del(a[id])
def merge(orig, new):
@@ -44,17 +42,8 @@
new it will be removed in orig."""
if type(orig) != dict or type(new) != dict:
raise DataTypeError("Not a dict in merge()")
- for kn in new.keys():
- if kn in orig:
- if new[kn]:
- if type(new[kn]) == dict:
- merge(orig[kn], new[kn])
- else:
- orig[kn] = new[kn]
- else:
- del orig[kn]
- else:
- orig[kn] = new[kn]
+ orig.update(new)
+ remove_null_items(orig)
def _concat_identifier(id_parts):
"""Concatenates the given identifier parts into a string,
@@ -148,6 +137,18 @@
raise DataNotFoundError("Element " + str(list_index) + " in " + str(result))
result = result[list_index]
return result
+
+def remove_null_items(d):
+ """Recursively removes all (key,value) pairs from d where the
+ value is None"""
+ null_keys = []
+ for key in d.keys():
+ if type(d[key]) == dict:
+ remove_null_items(d[key])
+ elif d[key] is None:
+ null_keys.append(key)
+ for k in null_keys:
+ del d[k]
def find(element, identifier):
"""Returns the subelement in the given data element, raises
Modified: branches/trac405/src/lib/python/isc/cc/session.py
==============================================================================
--- branches/trac405/src/lib/python/isc/cc/session.py (original)
+++ branches/trac405/src/lib/python/isc/cc/session.py Mon Dec 6 14:50:36 2010
@@ -78,6 +78,8 @@
raise SessionError("Session has been closed.")
if type(env) == dict:
env = isc.cc.message.to_wire(env)
+ if len(env) > 65535:
+ raise ProtocolError("Envelope too large")
if type(msg) == dict:
msg = isc.cc.message.to_wire(msg)
self._socket.setblocking(1)
@@ -113,9 +115,6 @@
if (seq == None and "reply" not in env) or (seq != None and "reply" in env and seq == env["reply"]):
return env, msg
else:
- tmp = None
- if "reply" in env:
- tmp = env["reply"]
self._queue.append((env,msg))
return self.recvmsg(nonblock, seq)
else:
Modified: branches/trac405/src/lib/python/isc/cc/tests/session_test.py
==============================================================================
--- branches/trac405/src/lib/python/isc/cc/tests/session_test.py (original)
+++ branches/trac405/src/lib/python/isc/cc/tests/session_test.py Mon Dec 6 14:50:36 2010
@@ -137,6 +137,11 @@
sess.close()
self.assertRaises(SessionError, sess.sendmsg, {}, {"hello": "a"})
+ def test_env_too_large(self):
+ sess = MySession()
+ largeenv = { "a": "b"*65535 }
+ self.assertRaises(ProtocolError, sess.sendmsg, largeenv, {"hello": "a"})
+
def test_session_sendmsg(self):
sess = MySession()
sess.sendmsg({}, {"hello": "a"})
Modified: branches/trac405/src/lib/python/isc/config/config_data.py
==============================================================================
--- branches/trac405/src/lib/python/isc/config/config_data.py (original)
+++ branches/trac405/src/lib/python/isc/config/config_data.py Mon Dec 6 14:50:36 2010
@@ -170,11 +170,9 @@
result.extend(spec_name_list(list_el['map_item_spec'], prefix + list_el['item_name'], recurse))
else:
name = list_el['item_name']
- if list_el['item_type'] in ["list", "map"]:
- name += "/"
result.append(prefix + name)
else:
- raise ConfigDataError("Bad specication")
+ raise ConfigDataError("Bad specification")
else:
raise ConfigDataError("Bad specication")
return result
Modified: branches/trac405/src/lib/python/isc/config/tests/config_data_test.py
==============================================================================
--- branches/trac405/src/lib/python/isc/config/tests/config_data_test.py (original)
+++ branches/trac405/src/lib/python/isc/config/tests/config_data_test.py Mon Dec 6 14:50:36 2010
@@ -189,9 +189,9 @@
def test_spec_name_list(self):
name_list = spec_name_list(self.cd.get_module_spec().get_config_spec())
- self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5/', 'item6/'], name_list)
+ self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], name_list)
name_list = spec_name_list(self.cd.get_module_spec().get_config_spec(), "", True)
- self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5/', 'item6/value1', 'item6/value2'], name_list)
+ self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6/value1', 'item6/value2'], name_list)
spec_part = find_spec_part(self.cd.get_module_spec().get_config_spec(), "item6")
name_list = spec_name_list(spec_part, "item6", True)
self.assertEqual(['item6/value1', 'item6/value2'], name_list)
@@ -207,7 +207,7 @@
name_list = spec_name_list({ "myModule": config_spec }, "", False)
self.assertEqual(['myModule/'], name_list)
name_list = spec_name_list({ "myModule": config_spec }, "", True)
- self.assertEqual(['myModule/', 'myModule/value1', 'myModule/value2', 'myModule/value3', 'myModule/value4', 'myModule/value5/', 'myModule/value6/v61', 'myModule/value6/v62', 'myModule/value7/', 'myModule/value8/', 'myModule/value9/v91', 'myModule/value9/v92/v92a', 'myModule/value9/v92/v92b'], name_list)
+ self.assertEqual(['myModule/', 'myModule/value1', 'myModule/value2', 'myModule/value3', 'myModule/value4', 'myModule/value5', 'myModule/value6/v61', 'myModule/value6/v62', 'myModule/value7', 'myModule/value8', 'myModule/value9/v91', 'myModule/value9/v92/v92a', 'myModule/value9/v92/v92b'], name_list)
self.assertRaises(ConfigDataError, spec_name_list, 1)
self.assertRaises(ConfigDataError, spec_name_list, [ 'a' ])
@@ -254,19 +254,19 @@
def test_get_item_list(self):
name_list = self.cd.get_item_list()
- self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5/', 'item6/'], name_list)
+ self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], name_list)
name_list = self.cd.get_item_list("", True)
- self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5/', 'item6/value1', 'item6/value2'], name_list)
+ self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6/value1', 'item6/value2'], name_list)
name_list = self.cd.get_item_list("item6", False)
self.assertEqual(['item6/value1', 'item6/value2'], name_list)
def test_get_full_config(self):
full_config = self.cd.get_full_config()
- self.assertEqual({ "item1": 1, "item2": 1.1, "item3": True, "item4": "test", "item5/": ['a', 'b'], "item6/value1": 'default', 'item6/value2': None}, full_config)
+ self.assertEqual({ "item1": 1, "item2": 1.1, "item3": True, "item4": "test", "item5": ['a', 'b'], "item6/value1": 'default', 'item6/value2': None}, full_config)
my_config = { "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5": [ "c", "d" ] }
self.cd.set_local_config(my_config)
full_config = self.cd.get_full_config()
- self.assertEqual({ "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5/": [ "c", "d" ], "item6/value1": 'default', 'item6/value2': None}, full_config)
+ self.assertEqual({ "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5": [ "c", "d" ], "item6/value1": 'default', 'item6/value2': None}, full_config)
class TestMultiConfigData(unittest.TestCase):
def setUp(self):
@@ -489,15 +489,15 @@
config_items = self.mcd.get_config_item_list(None, False)
self.assertEqual(['Spec2'], config_items)
config_items = self.mcd.get_config_item_list(None, True)
- self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5/', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
+ self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
config_items = self.mcd.get_config_item_list("Spec2", True)
- self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5/', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
+ self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
config_items = self.mcd.get_config_item_list("Spec2")
- self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5/', 'Spec2/item6/'], config_items)
+ self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6'], config_items)
config_items = self.mcd.get_config_item_list("/Spec2")
- self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5/', 'Spec2/item6/'], config_items)
+ self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6'], config_items)
config_items = self.mcd.get_config_item_list("Spec2", True)
- self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5/', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
+ self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
if __name__ == '__main__':
unittest.main()
Modified: branches/trac405/src/lib/python/isc/datasrc/Makefile.am
==============================================================================
--- branches/trac405/src/lib/python/isc/datasrc/Makefile.am (original)
+++ branches/trac405/src/lib/python/isc/datasrc/Makefile.am Mon Dec 6 14:50:36 2010
@@ -1,3 +1,5 @@
+SUBDIRS = . tests
+
python_PYTHON = __init__.py master.py sqlite3_ds.py
pythondir = $(pyexecdir)/isc/datasrc
Modified: branches/trac405/src/lib/python/isc/datasrc/master.py
==============================================================================
--- branches/trac405/src/lib/python/isc/datasrc/master.py (original)
+++ branches/trac405/src/lib/python/isc/datasrc/master.py Mon Dec 6 14:50:36 2010
@@ -103,7 +103,7 @@
# isttl: check whether a string is a valid TTL specifier.
# returns: boolean
#########################################################################
-ttl_regex = re.compile('([0-9]+[wdhms]?)+', re.I)
+ttl_regex = re.compile('([0-9]+[wdhms]?)+$', re.I)
def isttl(s):
global ttl_regex
if ttl_regex.match(s):
Modified: branches/trac405/src/lib/python/isc/notify/notify_out.py
==============================================================================
--- branches/trac405/src/lib/python/isc/notify/notify_out.py (original)
+++ branches/trac405/src/lib/python/isc/notify/notify_out.py Mon Dec 6 14:50:36 2010
@@ -367,6 +367,7 @@
zone_id = self._waiting_zones.pop(0)
self._notify_infos[zone_id].prepare_notify_out()
self.notify_num += 1
+ self._notifying_zones.append(zone_id)
def _send_notify_message_udp(self, zone_notify_info, addrinfo):
msg, qid = self._create_notify_message(zone_notify_info.zone_name,
Modified: branches/trac405/src/lib/python/isc/notify/tests/notify_out_test.py
==============================================================================
--- branches/trac405/src/lib/python/isc/notify/tests/notify_out_test.py (original)
+++ branches/trac405/src/lib/python/isc/notify/tests/notify_out_test.py Mon Dec 6 14:50:36 2010
@@ -156,7 +156,7 @@
com_info = self._notify._notify_infos[('com.', 'IN')]
self._notify._notify_next_target(com_info)
self.assertEqual(2, self._notify.notify_num)
- self.assertEqual(0, len(self._notify._notifying_zones))
+ self.assertEqual(2, len(self._notify._notifying_zones))
def test_handle_notify_reply(self):
self.assertEqual(notify_out._BAD_REPLY_PACKET, self._notify._handle_notify_reply(None, b'badmsg'))
Modified: branches/trac405/src/lib/xfr/fd_share.cc
==============================================================================
--- branches/trac405/src/lib/xfr/fd_share.cc (original)
+++ branches/trac405/src/lib/xfr/fd_share.cc Mon Dec 6 14:50:36 2010
@@ -93,7 +93,7 @@
if (recvmsg(sock, &msghdr, 0) < 0) {
free(msghdr.msg_control);
- return (-1);
+ return (XFR_FD_RECEIVE_FAIL);
}
const struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msghdr);
int fd = -1;
Modified: branches/trac405/src/lib/xfr/fd_share.h
==============================================================================
--- branches/trac405/src/lib/xfr/fd_share.h (original)
+++ branches/trac405/src/lib/xfr/fd_share.h Mon Dec 6 14:50:36 2010
@@ -20,12 +20,16 @@
namespace isc {
namespace xfr {
+/// Failed to receive xfr socket descriptor "fd" on unix domain socket 'sock'
+const int XFR_FD_RECEIVE_FAIL = -2;
+
// Receive socket descriptor on unix domain socket 'sock'.
// Returned value is the socket descriptor received.
+// Returned XFR_FD_RECEIVE_FAIL if failed to receive xfr socket descriptor
// Errors are indicated by a return value of -1.
int recv_fd(const int sock);
-// Send socket descriptor "fd" to server over unix domain socket 'sock',
+// Send socket descriptor "fd" to server over unix domain socket 'sock',
// the connection from socket 'sock' to unix domain server should be established first.
// Errors are indicated by a return value of -1.
int send_fd(const int sock, const int fd);
@@ -35,6 +39,6 @@
#endif
-// Local Variables:
+// Local Variables:
// mode: c++
-// End:
+// End:
Modified: branches/trac405/src/lib/xfr/fdshare_python.cc
==============================================================================
--- branches/trac405/src/lib/xfr/fdshare_python.cc (original)
+++ branches/trac405/src/lib/xfr/fdshare_python.cc Mon Dec 6 14:50:36 2010
@@ -22,8 +22,9 @@
#include <xfr/fd_share.h>
+
static PyObject*
-fdshare_recv_fd(PyObject *self UNUSED_PARAM, PyObject *args) {
+fdshare_recv_fd(PyObject*, PyObject* args) {
int sock, fd;
if (!PyArg_ParseTuple(args, "i", &sock)) {
return (NULL);
@@ -33,7 +34,7 @@
}
static PyObject*
-fdshare_send_fd(PyObject *self UNUSED_PARAM, PyObject *args) {
+fdshare_send_fd(PyObject*, PyObject* args) {
int sock, fd, result;
if (!PyArg_ParseTuple(args, "ii", &sock, &fd)) {
return (NULL);
@@ -63,8 +64,20 @@
PyMODINIT_FUNC
PyInit_libxfr_python(void) {
- PyObject *mod = PyModule_Create(&bind10_fdshare_python);
+ PyObject* mod = PyModule_Create(&bind10_fdshare_python);
if (mod == NULL) {
+ return (NULL);
+ }
+
+ PyObject* XFR_FD_RECEIVE_FAIL = Py_BuildValue("i", isc::xfr::XFR_FD_RECEIVE_FAIL);
+ if (XFR_FD_RECEIVE_FAIL == NULL) {
+ Py_XDECREF(mod);
+ return (NULL);
+ }
+ int ret = PyModule_AddObject(mod, "XFR_FD_RECEIVE_FAIL", XFR_FD_RECEIVE_FAIL);
+ if (-1 == ret) {
+ Py_XDECREF(XFR_FD_RECEIVE_FAIL);
+ Py_XDECREF(mod);
return (NULL);
}
Modified: branches/trac405/src/lib/xfr/xfrout_client.cc
==============================================================================
--- branches/trac405/src/lib/xfr/xfrout_client.cc (original)
+++ branches/trac405/src/lib/xfr/xfrout_client.cc Mon Dec 6 14:50:36 2010
@@ -69,7 +69,7 @@
}
}
-int
+int
XfroutClient::sendXfroutRequestInfo(const int tcp_sock,
const void* const msg_data,
const uint16_t msg_len)
@@ -93,12 +93,6 @@
isc_throw(XfroutError,
"failed to send XFR request data to xfrout module");
}
-
- int databuf = 0;
- if (recv(impl_->socket_.native(), &databuf, sizeof(int), 0) != 0) {
- isc_throw(XfroutError,
- "xfr query hasn't been processed properly by xfrout module");
- }
return (0);
}
More information about the bind10-changes
mailing list