Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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