Esempio n. 1
0
def tiny2txt(fqdn, s, ttl=3600):
    ttl = int(ttl)
    label, domain = get_label_domain_workaround(fqdn)
    s = s.replace(r'\072', ':').replace(r'\040', ' ').replace(r'\057', '/')
    txt, _ = TXT.objects.get_or_create(label=label, domain=domain,
                                       txt_data=s, ttl=ttl, ctnr=activectnr)
    return txt
Esempio n. 2
0
def tiny2ar(fqdn, ip):
    label, domain = get_label_domain_workaround(fqdn)
    if AddressRecord.objects.filter(label=label, domain=domain,
                                    ip_str=ip).exists():
        print "AddressRecord %s already exists." % domain.name
        return

    ar, _ = AddressRecord.objects.get_or_create(label=label, domain=domain,
                                                ip_str=ip, ctnr=activectnr)
    return ar
Esempio n. 3
0
def tiny2wut(fqdn, n, rdata, ttl=86400):
    n = int(n)
    if n == 33:
        digged = diglet('SRV', fqdn)
        if not digged:
            print "No SRV candidate for %s" % fqdn
            return

        priority, weight, port, target = digged.split(' ')
        target = target.rstrip('.')
        label, domain = get_label_domain_workaround(fqdn)
        try:
            srv, _ = SRV.objects.get_or_create(label=label, domain=domain,
                                               target=target, port=port,
                                               priority=priority, ttl=ttl,
                                               weight=weight, ctnr=activectnr)
            return srv
        except ValidationError, e:
            print "INVALID: %s for SRV %s" % (e, fqdn)
Esempio n. 4
0
def gen_CNAME():
    """Migrates CNAME objects.

    .. note::
        Run this only after migrating other DNS objects for every zone.

    .. note::
        Because MAINTAIN is totally messed up, some hostnames in the CNAME
        table have ``.``'s in them, so the fully qualified domain name is
        created first, then the label is stripped off of the front of that.

    .. note::
        If the fully qualified domain name of the label + domain name already
        exists as a domain object, that object becomes the alias and the label
        prefix is set to the empty string. Otherwise, the alias is the
        label + domain name.

    :uniqueness: label, domain, target
    """
    print "Creating CNAMEs."
    sql = ("SELECT zone_cname.id, zone_cname.server, zone_cname.name, "
           "zone_cname.enabled, zone.name, domain.name FROM zone_cname "
           "JOIN zone ON zone_cname.zone = zone.id "
           "JOIN domain ON zone_cname.domain = domain.id")
    cursor.execute(sql)

    for pk, server, name, enabled, zone, dname in cursor.fetchall():
        server, name = server.lower(), name.lower()
        dname = dname.lower()

        fqdn = ".".join([name, dname])
        name, dname = fqdn.split(".", 1)

        if Domain.objects.filter(name=fqdn).exists():
            domain = Domain.objects.get(name=fqdn)
            name = ""
        elif Domain.objects.filter(name=dname).exists():
            domain = Domain.objects.get(name=dname)
        else:
            _, domain = get_label_domain_workaround(fqdn)

        if server == ".".join([name, domain.name]):
            # In maintain, at least one CNAME is a loop: biosys.bioe.orst.edu
            print "Ignoring CNAME %s: Is a loop." % server
            continue

        if CNAME.objects.filter(label=name, domain=domain).exists():
            c = CNAME.objects.get(label=name, domain=domain)
            if c.target != server:
                print ("ALERT: Conflicting CNAME with fqdn %s already exists."
                       % fqdn)
            continue

        ctnr = Zone.ctnr_from_zone_name(zone, 'CNAME')
        if ctnr is None:
            continue

        if ctnr not in domain.ctnr_set.all():
            print "CNAME %s has mismatching container for its domain." % pk
            continue

        cn = CNAME(label=name, domain=domain, target=server, ctnr=ctnr)
        cn.set_fqdn()
        dup_ptrs = PTR.objects.filter(fqdn=cn.fqdn)
        if dup_ptrs:
            print "Removing duplicate PTR for %s" % cn.fqdn
            dup_ptrs.delete(update_range_usage=False)

        # CNAMEs need to be cleaned independently of saving (no get_or_create)
        try:
            cn.full_clean()
            cn.save()
            if enabled:
                cn.views.add(public)
                cn.views.add(private)
        except ValidationError, e:
            print "Error:", e
Esempio n. 5
0
def gen_CNAME():
    """Migrates CNAME objects.

    .. note::
        Run this only after migrating other DNS objects for every zone.

    .. note::
        Because MAINTAIN is totally messed up, some hostnames in the CNAME
        table have ``.``'s in them, so the fully qualified domain name is
        created first, then the label is stripped off of the front of that.

    .. note::
        If the fully qualified domain name of the label + domain name already
        exists as a domain object, that object becomes the alias and the label
        prefix is set to the empty string. Otherwise, the alias is the
        label + domain name.

    :uniqueness: label, domain, target
    """
    print "Creating CNAMEs."
    sql = ("SELECT zone_cname.id, zone_cname.server, zone_cname.name, "
           "zone_cname.enabled, zone.name, domain.name FROM zone_cname "
           "JOIN zone ON zone_cname.zone = zone.id "
           "JOIN domain ON zone_cname.domain = domain.id")
    cursor.execute(sql)

    for pk, server, name, enabled, zone, dname in cursor.fetchall():
        server, name = server.lower(), name.lower()
        dname = dname.lower()

        fqdn = ".".join([name, dname])
        name, dname = fqdn.split(".", 1)

        if Domain.objects.filter(name=fqdn).exists():
            domain = Domain.objects.get(name=fqdn)
            name = ""
        elif Domain.objects.filter(name=dname).exists():
            domain = Domain.objects.get(name=dname)
        else:
            _, domain = get_label_domain_workaround(fqdn)

        if server == ".".join([name, domain.name]):
            # In maintain, at least one CNAME is a loop: biosys.bioe.orst.edu
            print "Ignoring CNAME %s: Is a loop." % server
            continue

        if CNAME.objects.filter(label=name, domain=domain).exists():
            c = CNAME.objects.get(label=name, domain=domain)
            if c.target != server:
                print("ALERT: Conflicting CNAME with fqdn %s already exists." %
                      fqdn)
            continue

        ctnr = Zone.ctnr_from_zone_name(zone, 'CNAME')
        if ctnr is None:
            continue

        if ctnr not in domain.ctnr_set.all():
            print "CNAME %s has mismatching container for its domain." % pk
            continue

        cn = CNAME(label=name, domain=domain, target=server, ctnr=ctnr)
        cn.set_fqdn()
        dup_ptrs = PTR.objects.filter(fqdn=cn.fqdn)
        if dup_ptrs:
            print "Removing duplicate PTR for %s" % cn.fqdn
            dup_ptrs.delete(update_range_usage=False)

        # CNAMEs need to be cleaned independently of saving (no get_or_create)
        try:
            cn.full_clean()
            cn.save()
            if enabled:
                cn.views.add(public)
                cn.views.add(private)
        except ValidationError, e:
            print "Error:", e
Esempio n. 6
0
def tiny2cname(fqdn, p):
    label, domain = get_label_domain_workaround(fqdn)
    cname, _ = CNAME.objects.get_or_create(label=label, domain=domain,
                                           target=p, ctnr=activectnr)
    return cname
Esempio n. 7
0
            return

        priority, weight, port, target = digged.split(' ')
        target = target.rstrip('.')
        label, domain = get_label_domain_workaround(fqdn)
        try:
            srv, _ = SRV.objects.get_or_create(label=label, domain=domain,
                                               target=target, port=port,
                                               priority=priority, ttl=ttl,
                                               weight=weight, ctnr=activectnr)
            return srv
        except ValidationError, e:
            print "INVALID: %s for SRV %s" % (e, fqdn)
    elif n == 28:
        digged = diglet('AAAA', fqdn)
        label, domain = get_label_domain_workaround(fqdn)
        if AddressRecord.objects.filter(label=label, domain=domain,
                                        ip_str=digged).exists():
            print "AddressRecord %s already exists." % domain.name
            return

        ar, _ = AddressRecord.objects.get_or_create(
            label=label, domain=domain, ip_str=digged, ttl=ttl,
            ip_type='6', ctnr=activectnr)
        return ar
    else:
        raise Exception("Unknown rdtype %s for %s" % (n, fqdn))


def tiny2mx(fqdn, ip, x, dist=5, ttl=600):
    dist = int(dist)