def do_axfr(zone_name, servers, timeout=None, source=None): """ Requests an AXFR for a given zone name and process the response :returns: Zone instance from dnspython """ random.shuffle(servers) timeout = timeout or cfg.CONF["service:mdns"].xfr_timeout xfr = None for srv in servers: to = eventlet.Timeout(timeout) log_info = {'name': zone_name, 'host': srv} try: LOG.info("Doing AXFR for %(name)s from %(host)s", log_info) xfr = dns.query.xfr(srv['host'], zone_name, relativize=False, timeout=1, port=srv['port'], source=source) raw_zone = dns.zone.from_xfr(xfr, relativize=False) break except eventlet.Timeout as t: if t == to: LOG.error("AXFR timed out for %(name)s from %(host)s", log_info) continue except dns.exception.FormError: LOG.error( "Zone %(name)s is not present on %(host)s." "Trying next server.", log_info) except socket.error: LOG.error( "Connection error when doing AXFR for %(name)s from " "%(host)s", log_info) except Exception: LOG.exception( "Problem doing AXFR %(name)s from %(host)s. " "Trying next server.", log_info) finally: to.cancel() continue else: raise exceptions.XFRFailure( "XFR failed for %(name)s. No servers in %(servers)s was reached." % { "name": zone_name, "servers": servers }) LOG.debug("AXFR Successful for %s", raw_zone.origin.to_text()) return raw_zone
def do_axfr(zone_name, servers, timeout=None, source=None): """ Performs an AXFR for a given zone name """ random.shuffle(servers) timeout = timeout or 10 xfr = None for srv in servers: timeout = eventlet.Timeout(timeout) log_info = {'name': zone_name, 'host': srv} try: LOG.info(_LI("Doing AXFR for %(name)s from %(host)s") % log_info) xfr = dns.query.xfr(srv['ip'], zone_name, relativize=False, timeout=1, port=srv['port'], source=source) raw_zone = dns.zone.from_xfr(xfr, relativize=False) break except eventlet.Timeout as t: if t == timeout: msg = _LE("AXFR timed out for %(name)s from %(host)s") LOG.error(msg % log_info) continue except dns.exception.FormError: msg = _LE("Domain %(name)s is not present on %(host)s." "Trying next server.") LOG.error(msg % log_info) except socket.error: msg = _LE("Connection error when doing AXFR for %(name)s from " "%(host)s") LOG.error(msg % log_info) except Exception: msg = _LE("Problem doing AXFR %(name)s from %(host)s. " "Trying next server.") LOG.exception(msg % log_info) finally: timeout.cancel() continue else: msg = _LE("XFR failed for %(name)s. No servers in %(servers)s was " "reached.") raise exceptions.XFRFailure(msg % { "name": zone_name, "servers": servers }) LOG.debug("AXFR Successful for %s" % raw_zone.origin.to_text()) return raw_zone