def migrate_SRV(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('SRV'): target = rdata.target.to_text().strip('.') port = rdata.port weight = rdata.weight prio = rdata.priority name = name.to_text().strip('.') print str(name) + " SRV " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) if not SRV.objects.filter(label = label, domain = domain, target=target, port=port, weight=weight, priority=prio).exists(): srv = SRV(label = label, domain = domain, target=target, port=port, weight=weight, priority=prio) srv.full_clean() srv.save() for view in views: srv.views.add(view) srv.save()
def migrate_TXT(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('TXT'): name = name.to_text().strip('.') print str(name) + " TXT " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) data = rdata.to_text().strip('"') if TXT.objects.filter(label=label, domain=domain, txt_data=data).exists(): txt = TXT.objects.get(label=label, domain=domain, txt_data=data) else: txt = TXT(label=label, domain=domain, txt_data=data, description=rdata.comment, ttl=ttl) txt.full_clean() txt.save() for view in views: txt.views.add(view) txt.save()
def migrate_AAAA(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('AAAA'): name = name.to_text().strip('.') print str(name) + " AAAA " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] if label.startswith('unused'): continue domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) ip_upper, ip_lower = ipv6_to_longs(rdata.to_text()) if AddressRecord.objects.filter(label=label, domain=domain, ip_upper=ip_upper, ip_lower=ip_lower, ip_type='6').exists(): a = AddressRecord.objects.get( label=label, domain=domain, ip_type='6', ip_upper=ip_upper, ip_lower=ip_lower ) else: a = AddressRecord( label=label, domain=domain, ip_str=rdata.to_text(), ip_type='6', description=rdata.comment, ttl=ttl ) a.clean() a.save() for view in views: a.views.add(view) a.save()
def migrate_MX(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('MX'): name = name.to_text().strip('.') print str(name) + " MX " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) priority = rdata.preference server = rdata.exchange.to_text().strip('.') if MX.objects.filter(label=label, domain=domain, server=server, priority=priority): mx = MX.objects.get( label=label, domain=domain, server=server, priority=priority, ) else: mx = MX.objects.create(label=label, domain=domain, server=server, priority=priority, ttl=ttl, description=rdata.comment) for view in views: mx.views.add(view) mx.save()
def migrate_CNAME(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('CNAME'): name = name.to_text().strip('.') print str(name) + " CNAME " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) data = rdata.target.to_text().strip('.') if CNAME.objects.filter(label=label, domain=domain, target=data).exists(): cn = CNAME.objects.get(label=label, domain=domain, target=data) else: cn = CNAME(label=label, domain=domain, target=data, description=rdata.comment, ttl=ttl) cn.full_clean() cn.save() for view in views: cn.views.add(view) cn.save()
def migrate_MX(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('MX'): name = name.to_text().strip('.') print str(name) + " MX " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) priority = rdata.preference server = rdata.exchange.to_text().strip('.') if MX.objects.filter(label=label, domain=domain, server=server, priority=priority): mx = MX.objects.get( label=label, domain=domain, server=server, priority=priority, ) else: mx = MX.objects.create( label=label, domain=domain, server=server, priority=priority, ttl=ttl, description=rdata.comment ) for view in views: mx.views.add(view) mx.save()
def migrate_CNAME(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('CNAME'): name = name.to_text().strip('.') print str(name) + " CNAME " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) data = rdata.target.to_text().strip('.') if CNAME.objects.filter(label=label, domain=domain, target=data).exists(): cn = CNAME.objects.get( label=label, domain=domain, target=data ) else: cn = CNAME( label=label, domain=domain, target=data, description=rdata.comment, ttl=ttl ) cn.full_clean() cn.save() for view in views: cn.views.add(view) cn.save()
def migrate_TXT(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('TXT'): name = name.to_text().strip('.') print str(name) + " TXT " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) data = rdata.to_text().strip('"') if TXT.objects.filter(label=label, domain=domain, txt_data=data).exists(): txt = TXT.objects.get( label=label, domain=domain, txt_data=data ) else: txt = TXT( label=label, domain=domain, txt_data=data, description=rdata.comment, ttl=ttl ) txt.full_clean() txt.save() for view in views: txt.views.add(view) txt.save()
def migrate_A(zone, root_domain, soa, views): names = [] for (name, ttl, rdata) in zone.iterate_rdatas('A'): names.append((name.to_text().strip('.'), rdata)) sorted_names = list(sorted(names, cmp=lambda n1, n2: -1 if len(n1[0].split('.'))> len(n2[0].split('.')) else 1)) for name, rdata in sorted_names: print str(name) + " A " + str(rdata) if name.startswith("unusedspace"): print "Skipping {0} A {1}".format(name, rdata) continue exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) a, _ = AddressRecord.objects.get_or_create(label=label, domain=domain, ip_str=rdata.to_text(), ip_type='4') for view in views: a.views.add(view) a.save()
def migrate_NS(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('NS'): name = name.to_text().strip('.') print str(name) + " NS " + str(rdata) domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(name, force=True) ns, _ = Nameserver.objects.get_or_create(domain=domain, server=rdata.target.to_text().strip('.')) for view in views: ns.views.add(view) ns.save()
def populate_forward_dns(zone, root_domain_name, views): soa = migrate_soa(zone, root_domain_name) root_domain = ensure_domain(root_domain_name, force=True) migrate_A(zone, root_domain, soa, views) migrate_AAAA(zone, root_domain, soa, views) migrate_CNAME(zone, root_domain, soa, views) migrate_NS(zone, root_domain, soa, views) migrate_MX(zone, root_domain, soa, views) migrate_TXT(zone, root_domain, soa, views) migrate_SRV(zone, root_domain, soa, views) if root_domain.soa == soa: clobber_soa = None else: clobber_soa = root_domain.soa null_zone_tree(root_domain, clobber_soa) color_zone_tree(root_domain, clobber_soa, soa)
def populate_reverse_dns(zone, root_domain_name, views): ensure_domain("arpa", force=True) ensure_domain("in-addr.arpa", force=True) ensure_domain("ip6.arpa", force=True) soa = migrate_soa(zone, root_domain_name) root_domain = ensure_domain(root_domain_name, force=True) migrate_NS(zone, root_domain, soa, views) migrate_MX(zone, root_domain, soa, views) migrate_PTR(zone, root_domain, soa, views) if root_domain.soa == soa: clobber_soa = None else: clobber_soa = root_domain.soa null_zone_tree(root_domain, clobber_soa) color_zone_tree(root_domain, root_domain.soa, soa)
def migrate_A(zone, root_domain, soa, views): names = [] for (name, ttl, rdata) in zone.iterate_rdatas('A'): names.append((name.to_text().strip('.'), rdata, ttl)) sorted_names = list( sorted(names, cmp=lambda n1, n2: -1 if len(n1[0].split('.')) > len(n2[0].split('.')) else 1)) for name, rdata, ttl in sorted_names: if not ttl: ttl = 3600 print str(name) + " A " + str(rdata) if name.startswith("unusedspace"): print "Skipping {0} A {1}".format(name, rdata) continue exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) if AddressRecord.objects.filter(label=label, domain=domain, ip_str=rdata.to_text(), ip_type='4').exists(): a = AddressRecord.objects.get(label=label, domain=domain, ip_str=rdata.to_text(), ip_type='4') else: a = AddressRecord.objects.create(label=label, domain=domain, ip_str=rdata.to_text(), ip_type='4', description=rdata.comment, ttl=ttl) for view in views: a.views.add(view) a.save()
def migrate_SRV(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('SRV'): target = rdata.target.to_text().strip('.') port = rdata.port weight = rdata.weight prio = rdata.priority name = name.to_text().strip('.') print str(name) + " SRV " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] domain_name = name.split('.')[1:] domain = ensure_domain('.'.join(domain_name), force=True) if SRV.objects.filter(label=label, domain=domain, target=target, port=port, weight=weight, priority=prio).exists(): srv = SRV.objects.get(label=label, domain=domain, target=target, port=port, weight=weight, priority=prio) else: srv = SRV(label=label, domain=domain, target=target, port=port, weight=weight, priority=prio, description=rdata.comment, ttl=ttl) srv.full_clean() srv.save() for view in views: srv.views.add(view) srv.save()
def migrate_NS(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('NS'): name = name.to_text().strip('.') print str(name) + " NS " + str(rdata) domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(name, force=True) if Nameserver.objects.filter(domain=domain, server=rdata.target.to_text().strip('.')): ns = Nameserver.objects.get( domain=domain, server=rdata.target.to_text().strip('.'), ) else: ns = Nameserver.objects.create( domain=domain, server=rdata.target.to_text().strip('.'), description=rdata.comment, ttl=ttl ) for view in views: ns.views.add(view) ns.save()
def _create_ipv4_intr_from_range(label, domain_name, system, mac, range_start, range_end): errors = {} if range_start >= range_end - 1: errors['ip'] = ErrorList(["The start ip must be less than end ip."]) return None, errors ip = find_free_ip(range_start, range_end, ip_type='4') errors = ErrorDict() if not ip: errors['ip'] = ErrorList(["Could not find free ip in range {0} - " "{1}".format(range_start, range_end)]) return None, errors domain = ensure_domain(domain_name, inherit_soa=True) try: intr = StaticInterface(label=label, domain=domain, ip_str=str(ip), ip_type='4', system=system, mac=mac) intr.clean() except ValidationError, e: errors['interface'] = ErrorList(e.messages)
def migrate_NS(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('NS'): name = name.to_text().strip('.') print str(name) + " NS " + str(rdata) domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(name, force=True) if Nameserver.objects.filter(domain=domain, server=rdata.target.to_text().strip('.')): ns = Nameserver.objects.get( domain=domain, server=rdata.target.to_text().strip('.'), ) else: ns = Nameserver.objects.create( domain=domain, server=rdata.target.to_text().strip('.'), description=rdata.comment, ttl=ttl) for view in views: ns.views.add(view) ns.save()
def migrate_AAAA(zone, root_domain, soa, views): for (name, ttl, rdata) in zone.iterate_rdatas('AAAA'): name = name.to_text().strip('.') print str(name) + " AAAA " + str(rdata) exists_domain = Domain.objects.filter(name=name) if exists_domain: label = '' domain = exists_domain[0] else: label = name.split('.')[0] if label.startswith('unused'): continue domain_name = '.'.join(name.split('.')[1:]) domain = ensure_domain(domain_name, force=True) ip_upper, ip_lower = ipv6_to_longs(rdata.to_text()) if AddressRecord.objects.filter(label=label, domain=domain, ip_upper=ip_upper, ip_lower=ip_lower, ip_type='6').exists(): a = AddressRecord.objects.get(label=label, domain=domain, ip_type='6', ip_upper=ip_upper, ip_lower=ip_lower) else: a = AddressRecord(label=label, domain=domain, ip_str=rdata.to_text(), ip_type='6', description=rdata.comment, ttl=ttl) a.clean() a.save() for view in views: a.views.add(view) a.save()
try: soa = SOA.objects.create( primary=primary, contact=contact, description="SOA for {0}".format(root_domain) ) except ValidationError, e: # Make how the error is being stored a little more friendly. raise ValidationError(e.messages[0]) # We want all domains created up to this point to inherit their # master_domain's soa so we will say inherit_soa=False and then override # the return domain's SOA. # Everything under this domain can be purgeable becase we will set this # domain to non-purgeable. This will also allow us to call prune tree. domain = ensure_domain( root_domain, purgeable=False, inherit_soa=False, force=True ) _save_nss(nss, domain) domain.soa = soa # ensure_domain doesn't ensure it created the domain with purgeable equal # to True. domain.purgeable = False domain.save() return domain def _save_nss(nss, domain): # Helper function for saving the nameserver bits in the create_zone form private_view, _ = View.objects.get_or_create(name='private') public_view, _ = View.objects.get_or_create(name='public')
try: soa = SOA.objects.create(primary=primary, contact=contact, description="SOA for {0}".format(root_domain)) except ValidationError, e: # Make how the error is being stored a little more friendly. raise ValidationError(e.messages[0]) # We want all domains created up to this point to inherit their # master_domain's soa so we will say inherit_soa=False and then override # the return domain's SOA. # Everything under this domain can be purgeable becase we will set this # domain to non-purgeable. This will also allow us to call prune tree. domain = ensure_domain(root_domain, purgeable=False, inherit_soa=False, force=True) _save_nss(nss, domain) domain.soa = soa # ensure_domain doesn't ensure it created the domain with purgeable equal # to True. domain.purgeable = False domain.save() return domain def _save_nss(nss, domain): # Helper function for saving the nameserver bits in the create_zone form private_view, _ = View.objects.get_or_create(name='private') public_view, _ = View.objects.get_or_create(name='public')
def create_zone_ajax(request): """This view tries to create a new zone and returns an JSON with either 'success' = True or 'success' = False and some errors. Throughout this function note that objects that are created are recorded, and if an error is caught, the previously created objects are deleted. This backing-out *may* be better handling by a transaction. Django has this sort of thing (middleware and decorators), but I'm in a time crunch so this manual deletetion will have to do. """ qd = request.POST.copy() # See if the domain exists. # Fail if it already exists or if it's under a delegated domain. root_domain = qd.get('root_domain', None) if not root_domain: error = "Please specify a root_domain" return HttpResponse(json.dumps({'success': False, 'error': error})) if Domain.objects.filter(name=root_domain).exists(): error = gt("<b>{0}</b> is already a domain. To make it a new zone, " "assign it a newly created SOA.".format(root_domain)) return HttpResponse(json.dumps({'success': False, 'error': error})) primary = qd.get('soa_primary', None) if not primary: error = "Please specify a primary nameserver for the SOA record." return HttpResponse(json.dumps({'success': False, 'error': error})) contact = qd.get('soa_contact', None) if not contact: error = "Please specify a contact address for the SOA record." return HttpResponse(json.dumps({'success': False, 'error': error})) contact.replace('@', '.') # Find all the NS entries nss = [] number_re = re.compile('nameserver_(\d+)') private_view, _ = View.objects.get_or_create(name='private') public_view, _ = View.objects.get_or_create(name='public') for k, server in request.POST.iteritems(): if k.startswith('nameserver_'): n = number_re.search(k) if not n: continue ns_number = n.groups()[0] views = [] if qd.get('private_view_{0}'.format(ns_number), 'off') == 'on': views.append(private_view) if qd.get('public_view_{0}'.format(ns_number), 'off') == 'on': views.append(public_view) ttl = qd.get('ttl_{0}'.format(ns_number)) if ttl and ttl.isdigit(): ttl = int(ttl) else: ttl = None nss.append( (Nameserver(server=server, ttl=ttl), views) ) if not nss: # They must create at least one nameserver error = gt("You must choose an authoritative nameserver to serve this " "zone") return HttpResponse(json.dumps({'success': False, 'error': error})) # We want all domains created up to this point to inherit their # master_domain's soa. We will override the return domain's SOA. # Everything under this domain can be purgeable becase we will set this # domain to non-purgeable. This will also allow us to call prune tree. domain = ensure_domain( root_domain, purgeable=True, inherit_soa=False, force=True) soa = SOA( primary=primary, contact=contact, description="SOA for {0}".format(root_domain) ) try: soa.save() except ValidationError, e: _clean_domain_tree(domain) return HttpResponse(json.dumps({'success': False, 'error': e.messages[0]}))