|
@@ -122,6 +122,32 @@ def _check_zone_class(zone_class_str):
|
|
|
except InvalidRRClass as irce:
|
|
|
raise XfrinZoneInfoException("bad zone class: " + zone_class_str + " (" + str(irce) + ")")
|
|
|
|
|
|
+def format_zone_str(zone_name, zone_class):
|
|
|
+ """Helper function to format a zone name and class as a string of
|
|
|
+ the form '<name>/<class>'.
|
|
|
+ Parameters:
|
|
|
+ zone_name (isc.dns.Name) name to format
|
|
|
+ zone_class (isc.dns.RRClass) class to format
|
|
|
+ """
|
|
|
+ return zone_name.to_text() + '/' + str(zone_class)
|
|
|
+
|
|
|
+def format_addrinfo(addrinfo):
|
|
|
+ """Helper function to format the addrinfo as a string of the form
|
|
|
+ <addr>:<port> (for IPv4) or [<addr>]:port (for IPv6). For unix domain
|
|
|
+ sockets, and unknown address families, it returns a basic string
|
|
|
+ conversion of the third element of the passed tuple.
|
|
|
+ Parameters:
|
|
|
+ addrinfo: an 3-tuple consisting of address family, socket type, and,
|
|
|
+ depending on the family, either a 2-tuple with the address
|
|
|
+ and port, or a filename
|
|
|
+ """
|
|
|
+ if addrinfo[0] == socket.AF_INET:
|
|
|
+ return str(addrinfo[2][0]) + ":" + str(addrinfo[2][1])
|
|
|
+ elif addrinfo[0] == socket.AF_INET6:
|
|
|
+ return "[" + str(addrinfo[2][0]) + "]:" + str(addrinfo[2][1])
|
|
|
+ else:
|
|
|
+ return str(addrinfo[2])
|
|
|
+
|
|
|
def get_soa_serial(soa_rdata):
|
|
|
'''Extract the serial field of an SOA RDATA and returns it as an intger.
|
|
|
|
|
@@ -491,8 +517,8 @@ class XfrinConnection(asyncore.dispatcher):
|
|
|
return self.__state
|
|
|
|
|
|
def zone_str(self):
|
|
|
- '''A convenient function for logging to include zone name and class'''
|
|
|
- return self._zone_name.to_text() + '/' + str(self._rrclass)
|
|
|
+ '''A convenience function for logging to include zone name and class'''
|
|
|
+ return format_zone_str(self._zone_name, self._rrclass)
|
|
|
|
|
|
def connect_to_master(self):
|
|
|
'''Connect to master in TCP.'''
|
|
@@ -1060,13 +1086,14 @@ class Xfrin:
|
|
|
# a security hole. Once we add the ability to have multiple master addresses,
|
|
|
# we should check if it matches one of them, and then use it.)
|
|
|
(zone_name, rrclass) = self._parse_zone_name_and_class(args)
|
|
|
+ zone_str = format_zone_str(zone_name, rrclass)
|
|
|
zone_info = self._get_zone_info(zone_name, rrclass)
|
|
|
notify_addr = self._parse_master_and_port(args, zone_name,
|
|
|
rrclass)
|
|
|
if zone_info is None:
|
|
|
# TODO what to do? no info known about zone. defaults?
|
|
|
- errmsg = "Got notification to retransfer unknown zone " + zone_name.to_text()
|
|
|
- logger.error(XFRIN_RETRANSFER_UNKNOWN_ZONE, zone_name.to_text())
|
|
|
+ errmsg = "Got notification to retransfer unknown zone " + zone_str
|
|
|
+ logger.error(XFRIN_RETRANSFER_UNKNOWN_ZONE, zone_str)
|
|
|
answer = create_answer(1, errmsg)
|
|
|
else:
|
|
|
master_addr = zone_info.get_master_addr_info()
|
|
@@ -1080,11 +1107,12 @@ class Xfrin:
|
|
|
True)
|
|
|
answer = create_answer(ret[0], ret[1])
|
|
|
else:
|
|
|
- errmsg = "Got notification for " + zone_name.to_text()\
|
|
|
- + "from unknown address: " + notify_addr[2][0];
|
|
|
- logger.error(XFRIN_NOTIFY_UNKNOWN_MASTER,
|
|
|
- zone_name.to_text(), notify_addr[2][0],
|
|
|
- master_addr[2][0])
|
|
|
+ notify_addr_str = format_addrinfo(notify_addr)
|
|
|
+ master_addr_str = format_addrinfo(master_addr)
|
|
|
+ errmsg = "Got notification for " + zone_str\
|
|
|
+ + "from unknown address: " + notify_addr_str;
|
|
|
+ logger.INFO(XFRIN_NOTIFY_UNKNOWN_MASTER, zone_str,
|
|
|
+ notify_addr_str, master_addr_str)
|
|
|
answer = create_answer(1, errmsg)
|
|
|
|
|
|
elif command == 'retransfer' or command == 'refresh':
|