|
@@ -143,7 +143,8 @@ class XfroutSession():
|
|
|
self._tsig_ctx = None
|
|
|
self._tsig_len = 0
|
|
|
self._remote = remote
|
|
|
- self._request_type = 'AXFR' # could be IXFR when we support it
|
|
|
+ self._request_type = None
|
|
|
+ self._request_typestr = None
|
|
|
self._acl = default_acl
|
|
|
self._zone_config = zone_config
|
|
|
self.ClientClass = client_class # parameterize this for testing
|
|
@@ -222,20 +223,32 @@ class XfroutSession():
|
|
|
# we check it by ourselves.
|
|
|
if msg.get_rr_count(Message.SECTION_QUESTION) != 1:
|
|
|
return Rcode.FORMERR(), msg
|
|
|
+ question = msg.get_question()[0]
|
|
|
+
|
|
|
+ # Identify the request type
|
|
|
+ self._request_type = question.get_type()
|
|
|
+ if self._request_type == RRType.AXFR():
|
|
|
+ self._request_typestr = 'AXFR'
|
|
|
+ elif self._request_type == RRType.IXFR():
|
|
|
+ self._request_typestr = 'IXFR'
|
|
|
+ else:
|
|
|
+ # Likewise, this should be impossible.
|
|
|
+ raise Runtimeerror('Unexpected XFR type: ' + \
|
|
|
+ str(self._request_type))
|
|
|
|
|
|
# ACL checks
|
|
|
- zone_name = msg.get_question()[0].get_name()
|
|
|
- zone_class = msg.get_question()[0].get_class()
|
|
|
+ zone_name = question.get_name()
|
|
|
+ zone_class = question.get_class()
|
|
|
acl = self._get_transfer_acl(zone_name, zone_class)
|
|
|
acl_result = acl.execute(
|
|
|
isc.acl.dns.RequestContext(self._remote[2], msg.get_tsig_record()))
|
|
|
if acl_result == DROP:
|
|
|
- logger.info(XFROUT_QUERY_DROPPED, self._request_type,
|
|
|
+ logger.info(XFROUT_QUERY_DROPPED, self._request_typestr,
|
|
|
format_addrinfo(self._remote),
|
|
|
format_zone_str(zone_name, zone_class))
|
|
|
return None, None
|
|
|
elif acl_result == REJECT:
|
|
|
- logger.info(XFROUT_QUERY_REJECTED, self._request_type,
|
|
|
+ logger.info(XFROUT_QUERY_REJECTED, self._request_typestr,
|
|
|
format_addrinfo(self._remote),
|
|
|
format_zone_str(zone_name, zone_class))
|
|
|
return Rcode.REFUSED(), msg
|
|
@@ -348,7 +361,7 @@ class XfroutSession():
|
|
|
return self._reply_query_with_error_rcode(msg, sock_fd,
|
|
|
Rcode.FORMERR())
|
|
|
elif not quota_ok:
|
|
|
- logger.warn(XFROUT_QUERY_QUOTA_EXCCEEDED, self._request_type,
|
|
|
+ logger.warn(XFROUT_QUERY_QUOTA_EXCCEEDED, self._request_typestr,
|
|
|
format_addrinfo(self._remote),
|
|
|
self._server._max_transfers_out)
|
|
|
return self._reply_query_with_error_rcode(msg, sock_fd,
|
|
@@ -363,23 +376,23 @@ class XfroutSession():
|
|
|
try:
|
|
|
rcode_ = self._check_xfrout_available(zone_name)
|
|
|
except Exception as ex:
|
|
|
- logger.error(XFROUT_XFR_TRANSFER_CHECK_ERROR, self._request_type,
|
|
|
+ logger.error(XFROUT_XFR_TRANSFER_CHECK_ERROR, self._request_typestr,
|
|
|
format_addrinfo(self._remote), zone_str, ex)
|
|
|
rcode_ = Rcode.SERVFAIL()
|
|
|
if rcode_ != Rcode.NOERROR():
|
|
|
- logger.info(XFROUT_AXFR_TRANSFER_FAILED, self._request_type,
|
|
|
+ logger.info(XFROUT_AXFR_TRANSFER_FAILED, self._request_typestr,
|
|
|
format_addrinfo(self._remote), zone_str, rcode_)
|
|
|
return self._reply_query_with_error_rcode(msg, sock_fd, rcode_)
|
|
|
|
|
|
try:
|
|
|
- logger.info(XFROUT_AXFR_TRANSFER_STARTED, self._request_type,
|
|
|
+ logger.info(XFROUT_AXFR_TRANSFER_STARTED, self._request_typestr,
|
|
|
format_addrinfo(self._remote), zone_str)
|
|
|
self._reply_xfrout_query(msg, sock_fd)
|
|
|
except Exception as err:
|
|
|
- logger.error(XFROUT_AXFR_TRANSFER_ERROR, self._request_type,
|
|
|
+ logger.error(XFROUT_AXFR_TRANSFER_ERROR, self._request_typestr,
|
|
|
format_addrinfo(self._remote), zone_str, err)
|
|
|
pass
|
|
|
- logger.info(XFROUT_AXFR_TRANSFER_DONE, self._request_type,
|
|
|
+ logger.info(XFROUT_AXFR_TRANSFER_DONE, self._request_typestr,
|
|
|
format_addrinfo(self._remote), zone_str)
|
|
|
|
|
|
def _clear_message(self, msg):
|