Browse Source

[trac764] review comments

Jelte Jansen 14 years ago
parent
commit
9ff2f7bc88

+ 5 - 4
src/lib/log/compiler/message.cc

@@ -56,12 +56,13 @@ static const char* VERSION = "1.0-0";
 /// \b Invocation<BR>
 /// \b Invocation<BR>
 /// The program is invoked with the command:
 /// The program is invoked with the command:
 ///
 ///
-/// <tt>message [-v | -h | -p | -d <dir> | \<message-file\>]</tt>
+/// <tt>message [-v | -h | -p | -d <dir> | <message-file>]</tt>
 ///
 ///
-/// It reads the message file and writes out two files of the same name in the
-/// default directory but with extensions of .h and .cc.
+/// It reads the message file and writes out two files of the same
+/// name in the current working directory (unless -d is used) but
+/// with extensions of .h and .cc.
 ///
 ///
-/// \-v causes it to print the version number and exit. \-h prints a help
+/// -v causes it to print the version number and exit. -h prints a help
 /// message (and exits). -p sets the output to python. -d <dir> will make
 /// message (and exits). -p sets the output to python. -d <dir> will make
 /// it write the output file(s) to dir instead of current working
 /// it write the output file(s) to dir instead of current working
 /// directory
 /// directory

+ 5 - 2
src/lib/python/isc/config/Makefile.am

@@ -7,10 +7,13 @@ pythondir = $(pyexecdir)/isc/config
 
 
 # Define rule to build logging source files from message file
 # Define rule to build logging source files from message file
 cfgmgr_messages.py: cfgmgr_messages.mes
 cfgmgr_messages.py: cfgmgr_messages.mes
-	$(top_builddir)/src/lib/log/compiler/message -p $(top_srcdir)/src/lib/python/isc/config/cfgmgr_messages.mes
+	$(top_builddir)/src/lib/log/compiler/message \
+	-p $(top_srcdir)/src/lib/python/isc/config/cfgmgr_messages.mes
 
 
 $(top_builddir)/src/lib/python/config_messages.py: config_messages.mes
 $(top_builddir)/src/lib/python/config_messages.py: config_messages.mes
-	$(top_builddir)/src/lib/log/compiler/message -p -d $(top_builddir)/src/lib/python $(top_srcdir)/src/lib/python/isc/config/config_messages.mes
+	$(top_builddir)/src/lib/log/compiler/message \
+		-p -d $(top_builddir)/src/lib/python \
+		$(top_srcdir)/src/lib/python/isc/config/config_messages.mes
 
 
 CLEANFILES =  cfgmgr_messages.py cfgmgr_messages.pyc
 CLEANFILES =  cfgmgr_messages.py cfgmgr_messages.pyc
 CLEANFILES += $(top_builddir)/src/lib/python/config_messages.py
 CLEANFILES += $(top_builddir)/src/lib/python/config_messages.py

+ 3 - 1
src/lib/python/isc/notify/Makefile.am

@@ -6,7 +6,9 @@ pyexec_DATA = $(top_builddir)/src/lib/python/notify_out_messages.py
 pythondir = $(pyexecdir)/isc/notify
 pythondir = $(pyexecdir)/isc/notify
 
 
 $(top_builddir)/src/lib/python/notify_out_messages.py: notify_out_messages.mes
 $(top_builddir)/src/lib/python/notify_out_messages.py: notify_out_messages.mes
-	$(top_builddir)/src/lib/log/compiler/message -p -d $(top_builddir)/src/lib/python $(top_srcdir)/src/lib/python/isc/notify/notify_out_messages.mes
+	$(top_builddir)/src/lib/log/compiler/message \
+		-p -d $(top_builddir)/src/lib/python \
+		$(top_srcdir)/src/lib/python/isc/notify/notify_out_messages.mes
 
 
 EXTRA_DIST = notify_out_messages.mes
 EXTRA_DIST = notify_out_messages.mes
 
 

+ 16 - 17
src/lib/python/isc/notify/notify_out.py

@@ -30,7 +30,7 @@ logger = isc.log.Logger("notify_out")
 try:
 try:
     from pydnspp import *
     from pydnspp import *
 except ImportError as e:
 except ImportError as e:
-    logger.error(NOTIFY_OUT_IMPORT_DNS, str(e))
+    logger.error(NOTIFY_OUT_IMPORT_ERROR, str(e))
 
 
 ZONE_NEW_DATA_READY_CMD = 'zone_new_data_ready'
 ZONE_NEW_DATA_READY_CMD = 'zone_new_data_ready'
 _MAX_NOTIFY_NUM = 30
 _MAX_NOTIFY_NUM = 30
@@ -361,18 +361,19 @@ class NotifyOut:
         tgt = zone_notify_info.get_current_notify_target()
         tgt = zone_notify_info.get_current_notify_target()
         if event_type == _EVENT_READ:
         if event_type == _EVENT_READ:
             reply = self._get_notify_reply(zone_notify_info.get_socket(), tgt)
             reply = self._get_notify_reply(zone_notify_info.get_socket(), tgt)
-            if reply:
-                if self._handle_notify_reply(zone_notify_info, reply):
+            if reply is not None:
+                if self._handle_notify_reply(zone_notify_info, reply, tgt):
                     self._notify_next_target(zone_notify_info)
                     self._notify_next_target(zone_notify_info)
 
 
         elif event_type == _EVENT_TIMEOUT and zone_notify_info.notify_try_num > 0:
         elif event_type == _EVENT_TIMEOUT and zone_notify_info.notify_try_num > 0:
-            logger.info(NOTIFY_OUT_TIMEOUT_RETRY, tgt[0], tgt[1])
+            logger.info(NOTIFY_OUT_TIMEOUT, tgt[0], tgt[1])
 
 
         tgt = zone_notify_info.get_current_notify_target()
         tgt = zone_notify_info.get_current_notify_target()
         if tgt:
         if tgt:
             zone_notify_info.notify_try_num += 1
             zone_notify_info.notify_try_num += 1
             if zone_notify_info.notify_try_num > _MAX_NOTIFY_TRY_NUM:
             if zone_notify_info.notify_try_num > _MAX_NOTIFY_TRY_NUM:
-                logger.info(NOTIFY_OUT_RETRY_EXCEEDED, tgt[0], tgt[1])
+                logger.error(NOTIFY_OUT_RETRY_EXCEEDED, tgt[0], tgt[1],
+                             _MAX_NOTIFY_TRY_NUM)
                 self._notify_next_target(zone_notify_info)
                 self._notify_next_target(zone_notify_info)
             else:
             else:
                 # set exponential backoff according rfc1996 section 3.6
                 # set exponential backoff according rfc1996 section 3.6
@@ -452,34 +453,32 @@ class NotifyOut:
 
 
     def _handle_notify_reply(self, zone_notify_info, msg_data, from_addr):
     def _handle_notify_reply(self, zone_notify_info, msg_data, from_addr):
         '''Parse the notify reply message.
         '''Parse the notify reply message.
-        TODO, the error message should be refined properly.
         rcode will not checked here, If we get the response
         rcode will not checked here, If we get the response
         from the slave, it means the slaves has got the notify.'''
         from the slave, it means the slaves has got the notify.'''
         msg = Message(Message.PARSE)
         msg = Message(Message.PARSE)
         try:
         try:
-            #errstr = 'notify reply error: '
             msg.from_wire(msg_data)
             msg.from_wire(msg_data)
             if not msg.get_header_flag(Message.HEADERFLAG_QR):
             if not msg.get_header_flag(Message.HEADERFLAG_QR):
-                logger.error(NOTIFY_OUT_REPLY_QR_NOT_SET, from_addr[0],
-                             from_addr[1])
+                logger.warn(NOTIFY_OUT_REPLY_QR_NOT_SET, from_addr[0],
+                            from_addr[1])
                 return _BAD_QR
                 return _BAD_QR
 
 
             if msg.get_qid() != zone_notify_info.notify_msg_id:
             if msg.get_qid() != zone_notify_info.notify_msg_id:
-                logger.error(NOTIFY_OUT_REPLY_BAD_QID, from_addr[0],
-                             from_addr[1], msg.get_qid(),
-                             zone_notify_info.notify_msg_id)
+                logger.warn(NOTIFY_OUT_REPLY_BAD_QID, from_addr[0],
+                            from_addr[1], msg.get_qid(),
+                            zone_notify_info.notify_msg_id)
                 return _BAD_QUERY_ID
                 return _BAD_QUERY_ID
 
 
             question = msg.get_question()[0]
             question = msg.get_question()[0]
             if question.get_name() != Name(zone_notify_info.zone_name):
             if question.get_name() != Name(zone_notify_info.zone_name):
-                logger.error(NOTIFY_OUT_REPLY_BAD_QUERY_NAME, from_addr[0],
-                             from_addr[1], question.get_name().to_text(),
-                             Name(zone_notify_info.zone_name).to_text())
+                logger.warn(NOTIFY_OUT_REPLY_BAD_QUERY_NAME, from_addr[0],
+                            from_addr[1], question.get_name().to_text(),
+                            Name(zone_notify_info.zone_name).to_text())
                 return _BAD_QUERY_NAME
                 return _BAD_QUERY_NAME
 
 
             if msg.get_opcode() != Opcode.NOTIFY():
             if msg.get_opcode() != Opcode.NOTIFY():
-                logger.error(NOTIFY_OUT_REPLY_BAD_OPCODE, from_addr[0],
-                             from_addr[1], msg.get_opcode().to_text())
+                logger.warn(NOTIFY_OUT_REPLY_BAD_OPCODE, from_addr[0],
+                            from_addr[1], msg.get_opcode().to_text())
                 return _BAD_OPCODE
                 return _BAD_OPCODE
         except Exception as err:
         except Exception as err:
             # We don't care what exception, just report it?
             # We don't care what exception, just report it?

+ 31 - 22
src/lib/python/isc/notify/notify_out_messages.mes

@@ -15,7 +15,7 @@
 # No namespace declaration - these constants go in the global namespace
 # No namespace declaration - these constants go in the global namespace
 # of the notify_out_messages python module.
 # of the notify_out_messages python module.
 
 
-% NOTIFY_OUT_IMPORT error importing python module: %1
+% NOTIFY_OUT_IMPORT_ERROR error importing python module: %1
 There was an error importing a python module. One of the modules
 There was an error importing a python module. One of the modules
 needed by notify_out could not be found. This suggests that either
 needed by notify_out could not be found. This suggests that either
 some libraries are missing on the system, or the PYTHONPATH variable
 some libraries are missing on the system, or the PYTHONPATH variable
@@ -25,28 +25,35 @@ depends on your system and your specific installation.
 % NOTIFY_OUT_INVALID_ADDRESS invalid address %1#%2: %3
 % NOTIFY_OUT_INVALID_ADDRESS invalid address %1#%2: %3
 The notify_out library tried to send a notify packet to the given
 The notify_out library tried to send a notify packet to the given
 address, but it appears to be an invalid address. The configuration
 address, but it appears to be an invalid address. The configuration
-for secondary nameservers might contain a typographic error.
+for secondary nameservers might contain a typographic error, or a
+different BIND 10 module has forgotten to validate its data before
+sending this module a notify command. As such, this should normally
+not happen, and points to an oversight in a different module.
 
 
 % NOTIFY_OUT_REPLY_BAD_OPCODE bad opcode in notify reply from %1#%2: %3
 % NOTIFY_OUT_REPLY_BAD_OPCODE bad opcode in notify reply from %1#%2: %3
-The notify_out library sent a notify packet to the nameserver at the
-given address, but the response did not have the opcode set to NOTIFY.
-The opcode in the response is printed.
+The notify_out library sent a notify message to the nameserver at
+the given address, but the response did not have the opcode set to
+NOTIFY. The opcode in the response is printed. Since there was a
+response, no more notifies will be sent to this server for this
+notification event.
 
 
 % NOTIFY_OUT_REPLY_BAD_QID bad QID in notify reply from %1#%2: got %3, should be %4
 % NOTIFY_OUT_REPLY_BAD_QID bad QID in notify reply from %1#%2: got %3, should be %4
-The notify_out library sent a notify packet to the nameserver at the
-given address, but the query id in the response does not match the one
-we sent.
+The notify_out library sent a notify message to the nameserver at
+the given address, but the query id in the response does not match
+the one we sent. Since there was a response, no more notifies will
+be sent to this server for this notification event.
 
 
 % NOTIFY_OUT_REPLY_BAD_QUERY_NAME bad query name in notify reply from %1#%2: got %3, should be %4
 % NOTIFY_OUT_REPLY_BAD_QUERY_NAME bad query name in notify reply from %1#%2: got %3, should be %4
-The notify_out library sent a notify packet to the nameserver at the
-given address, but the query name in the response does not match the one
-we sent.
+The notify_out library sent a notify message to the nameserver at
+the given address, but the query name in the response does not match
+the one we sent. Since there was a response, no more notifies will
+be sent to this server for this notification event.
 
 
 % NOTIFY_OUT_REPLY_QR_NOT_SET QR flags set to 0 in reply to notify from %1#%2
 % NOTIFY_OUT_REPLY_QR_NOT_SET QR flags set to 0 in reply to notify from %1#%2
 The notify_out library sent a notify packet to the namesever at the
 The notify_out library sent a notify packet to the namesever at the
 given address, but the reply did not have the QR bit set to one.
 given address, but the reply did not have the QR bit set to one.
 
 
-% NOTIFY_OUT_RETRY_EXCEEDED notify to %1#%2: number of retries exceeded
+% NOTIFY_OUT_RETRY_EXCEEDED notify to %1#%2: number of retries (%3) exceeded
 The maximum number of retries for the notify target has been exceeded.
 The maximum number of retries for the notify target has been exceeded.
 Either the address of the secondary nameserver is wrong, or it is not
 Either the address of the secondary nameserver is wrong, or it is not
 responding.
 responding.
@@ -56,22 +63,24 @@ A notify message is sent to the secondary nameserver at the given
 address.
 address.
 
 
 % NOTIFY_OUT_SOCKET_ERROR socket error sending notify to %1#%2: %3
 % NOTIFY_OUT_SOCKET_ERROR socket error sending notify to %1#%2: %3
-There was a network connection error while trying to send a notify
-packet to the given address. The socket error is printed and should
-provide more information.
+There was a network error while trying to send a notify packet to
+the given address. The address might be unreachable. The socket
+error is printed and should provide more information.
 
 
 % NOTIFY_OUT_SOCKET_RECV_ERROR socket error reading notify reply from %1#%2: %3
 % NOTIFY_OUT_SOCKET_RECV_ERROR socket error reading notify reply from %1#%2: %3
-There was a network connection error while trying to read a notify reply
+There was a network error while trying to read a notify reply
 packet from the given address. The socket error is printed and should
 packet from the given address. The socket error is printed and should
 provide more information.
 provide more information.
 
 
-% NOTIFY_OUT_TIMEOUT_RETRY retry notify to %1#%2
+% NOTIFY_OUT_TIMEOUT retry notify to %1#%2
 The notify message to the given address (noted as address#port) has
 The notify message to the given address (noted as address#port) has
-timed out, and the message is sent again.
+timed out, and the message will be resent until the max retry limit
+is reached.
 
 
 % NOTIFY_OUT_REPLY_UNCAUGHT_EXCEPTION uncaught exception: %1
 % NOTIFY_OUT_REPLY_UNCAUGHT_EXCEPTION uncaught exception: %1
 There was an uncaught exception in the handling of a notify reply
 There was an uncaught exception in the handling of a notify reply
-packet. The error is printed, and notify_out will treat the response
-as a bad packet, but this does point to a programming error, since
-all exceptions should have been caught explicitely. Please file
-a bug report.
+packet, either in the packet parser, or while trying to extract data
+from the parsed packet. The error is printed, and notify_out will
+treat the response as a bad packet, but this does point to a
+programming error, since all exceptions should have been caught
+explicitely. Please file a bug report.

+ 9 - 0
src/lib/python/isc/notify/tests/notify_out_test.py

@@ -301,6 +301,15 @@ class TestNotifyOut(unittest.TestCase):
         self._notify._zone_notify_handler(example_net_info, notify_out._EVENT_NONE)
         self._notify._zone_notify_handler(example_net_info, notify_out._EVENT_NONE)
         self.assertNotEqual(cur_tgt, example_net_info._notify_current)
         self.assertNotEqual(cur_tgt, example_net_info._notify_current)
 
 
+        cur_tgt = example_net_info._notify_current
+        example_net_info.create_socket('127.0.0.1')
+        # dns message, will result in bad_qid, but what we are testing
+        # here is whether handle_notify_reply is called correctly
+        example_net_info._sock.remote_end().send(b'\x2f\x18\xa0\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\03com\x00\x00\x06\x00\x01')
+        self._notify._zone_notify_handler(example_net_info, notify_out._EVENT_READ)
+        self.assertNotEqual(cur_tgt, example_net_info._notify_current)
+
+
     def _example_net_data_reader(self):
     def _example_net_data_reader(self):
         zone_data = [
         zone_data = [
         ('example.net.',         '1000',  'IN',  'SOA', 'a.dns.example.net. mail.example.net. 1 1 1 1 1'),
         ('example.net.',         '1000',  'IN',  'SOA', 'a.dns.example.net. mail.example.net. 1 1 1 1 1'),

+ 12 - 6
src/lib/util/filename.cc

@@ -134,14 +134,20 @@ Filename::useAsDefault(const string& name) const {
 
 
 void
 void
 Filename::setDirectory(const std::string& new_directory) {
 Filename::setDirectory(const std::string& new_directory) {
-    directory_ = new_directory;
-    // append '/' if necessary
-    size_t sep = directory_.rfind('/');
-    if (sep == std::string::npos || sep < directory_.size() - 1) {
-        directory_ += "/";
+    std::string directory(new_directory);
+
+    if (directory.length() > 0) {
+        // append '/' if necessary
+        size_t sep = directory.rfind('/');
+        if (sep == std::string::npos || sep < directory.size() - 1) {
+            directory += "/";
+        }
     }
     }
     // and regenerate the full name
     // and regenerate the full name
-    full_name_ = directory_ + name_ + extension_;
+    std::string full_name = directory + name_ + extension_;
+
+    directory_.swap(directory);
+    full_name_.swap(full_name);
 }
 }
 
 
 
 

+ 5 - 1
src/lib/util/filename.h

@@ -86,7 +86,11 @@ public:
         return (directory_);
         return (directory_);
     }
     }
 
 
-    /// \return Set directory for the file
+    /// \brief Set directory for the file
+    ///
+    /// \param new_directory The directory to set. If this is an empty
+    ///        string, the directory this filename object currently
+    ///        has will be removed.
     void setDirectory(const std::string& new_directory);
     void setDirectory(const std::string& new_directory);
 
 
     /// \return Name of Given File Name
     /// \return Name of Given File Name

+ 3 - 3
src/lib/util/tests/filename_unittest.cc

@@ -200,9 +200,9 @@ TEST_F(FilenameTest, setDirectory) {
     EXPECT_EQ("/a.b", fname.expandWithDefault(""));
     EXPECT_EQ("/a.b", fname.expandWithDefault(""));
 
 
     fname.setDirectory("");
     fname.setDirectory("");
-    EXPECT_EQ("/", fname.directory());
-    EXPECT_EQ("/a.b", fname.fullName());
-    EXPECT_EQ("/a.b", fname.expandWithDefault(""));
+    EXPECT_EQ("", fname.directory());
+    EXPECT_EQ("a.b", fname.fullName());
+    EXPECT_EQ("a.b", fname.expandWithDefault(""));
 
 
     fname = Filename("/first/a.b");
     fname = Filename("/first/a.b");
     EXPECT_EQ("/first/", fname.directory());
     EXPECT_EQ("/first/", fname.directory());