def process_axfr_response(origin, nameserver, owner, overwrite=False): """ origin: string domain name nameserver: IP of the DNS server """ origin = Name((origin.rstrip('.') + '.').split('.')) axfr_query = dns.query.xfr(nameserver, origin, timeout=5, relativize=False, lifetime=10) try: zone = dns.zone.from_xfr(axfr_query, relativize=False) if not str(zone.origin).rstrip('.'): raise UnknownOrigin process_and_import_zone_data(zone, owner, overwrite) except NoSOA: raise Exception('The zone has no SOA RR at its origin') except NoNS: raise Exception('The zone has no NS RRset at its origin') except UnknownOrigin: raise Exception('The zone\'s origin is unknown') except BadZone: raise Exception('The zone is malformed') except DNSException as e: if not str(e): raise Exception('Transfer Failed') raise Exception(str(e))
def process_zone_file(origin, zonetext, owner, overwrite=False): """Imports zone to the database. No checks for existence are performed in this file. For form processing, see the ``import_zone_view`` view. """ if origin: origin = Name((origin.rstrip('.') + '.').split('.')) else: origin = None zonetext = clean_zonefile(str(zonetext)) try: zone = dns.zone.from_text(zonetext, origin=origin, relativize=False) if not str(zone.origin).rstrip('.'): raise UnknownOrigin process_and_import_zone_data(zone, owner, overwrite) except NoSOA: raise Exception('The zone has no SOA RR at its origin') except NoNS: raise Exception('The zone has no NS RRset at its origin') except UnknownOrigin: raise Exception('The zone\'s origin is unknown') except BadZone: raise Exception('The zone is malformed') except DNSException as e: #raise Exception(str(e)) raise Exception('The zone is malformed')
def process_axfr_response(origin, nameserver, owner, overwrite=False): """ origin: string domain name nameserver: IP of the DNS server """ origin = Name((origin.rstrip('.') + '.').split('.')) axfr_query = dns.query.xfr(nameserver, origin, timeout=5, relativize=False, lifetime=10) try: zone = dns.zone.from_xfr(axfr_query, relativize=False) if not str(zone.origin).rstrip('.'): raise UnknownOrigin process_and_import_zone_data(zone, owner, overwrite) except NoSOA: raise Exception('The zone has no SOA RR at its origin') except NoNS: raise Exception('The zone has no NS RRset at its origin') except UnknownOrigin: raise Exception('The zone\'s origin is unknown') except BadZone: raise Exception('The zone is malformed') except DNSException, e: if not str(e): raise Exception('Transfer Failed') raise Exception(str(e))
def process_zone_file(origin, zonetext, owner, overwrite=False): """Imports zone to the database. No checks for existence are performed in this file. For form processing, see the ``import_zone_view`` view. """ if origin: origin = Name((origin.rstrip('.') + '.').split('.')) else: origin = None zonetext = clean_zonefile(str(zonetext)) try: zone = dns.zone.from_text(zonetext, origin=origin, relativize=False) if not str(zone.origin).rstrip('.'): raise UnknownOrigin process_and_import_zone_data(zone, owner, overwrite) except NoSOA: raise Exception('The zone has no SOA RR at its origin') except NoNS: raise Exception('The zone has no NS RRset at its origin') except UnknownOrigin: raise Exception('The zone\'s origin is unknown') except BadZone: raise Exception('The zone is malformed') except DNSException, e: #raise Exception(str(e)) raise Exception('The zone is malformed')
def generate_zone_file(origin): """Generates a zone file. Accepts the zone origin as string (no trailing dot). Returns the contents of a zone file that contains all the resource records associated with the domain with the provided origin. """ Domain = get_model('powerdns_manager', 'Domain') Record = get_model('powerdns_manager', 'Record') the_domain = Domain.objects.get(name__exact=origin) the_rrs = Record.objects.filter(domain=the_domain).order_by('-type') # Generate the zone file origin = Name((origin.rstrip('.') + '.').split('.')) # Create an empty dns.zone object. # We set check_origin=False because the zone contains no records. zone = dns.zone.from_text('', origin=origin, relativize=False, check_origin=False) rdclass = dns.rdataclass._by_text.get('IN') for rr in the_rrs: # Add trailing dot to rr.name record_name = rr.name.rstrip('.') + '.' if rr.type == 'SOA': # Add SOA Resource Record # SOA content: primary hostmaster serial refresh retry expire default_ttl bits = rr.content.split() # Primary nameserver of SOA record primary = bits[0].rstrip('.') + '.' mname = Name(primary.split('.')) # Responsible hostmaster from SOA record hostmaster = bits[1].rstrip('.') + '.' rname = Name(hostmaster.split('.')) rdtype = dns.rdatatype._by_text.get('SOA') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.SOA.SOA(rdclass, rdtype, mname = mname, rname = rname, serial = int(bits[2]), refresh = int(bits[3]), retry = int(bits[4]), expire = int(bits[5]), minimum = int(bits[6]) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'NS': # Add NS Resource Record rdtype = dns.rdatatype._by_text.get('NS') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.NS.NS(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'MX': # Add MX Resource Record rdtype = dns.rdatatype._by_text.get('MX') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.MX.MX(rdclass, rdtype, preference = int(rr.prio), exchange = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'TXT': # Add TXT Resource Record rdtype = dns.rdatatype._by_text.get('TXT') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.TXT.TXT(rdclass, rdtype, strings = [rr.content.strip('"')] ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'CNAME': # Add CNAME Resource Record rdtype = dns.rdatatype._by_text.get('CNAME') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.CNAME.CNAME(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'A': # Add A Resource Record rdtype = dns.rdatatype._by_text.get('A') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.A.A(rdclass, rdtype, address = rr.content ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'AAAA': # Add AAAA Resource Record rdtype = dns.rdatatype._by_text.get('AAAA') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.AAAA.AAAA(rdclass, rdtype, address = rr.content ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'SPF': # Add SPF Resource Record rdtype = dns.rdatatype._by_text.get('SPF') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.SPF.SPF(rdclass, rdtype, strings = [rr.content.strip('"')] ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'PTR': # Add PTR Resource Record rdtype = dns.rdatatype._by_text.get('PTR') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.PTR.PTR(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'SRV': # Add SRV Resource Record # weight port target weight, port, target = rr.content.split() rdtype = dns.rdatatype._by_text.get('SRV') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.SRV.SRV(rdclass, rdtype, priority = int(rr.prio), weight = int(weight), port = int(port), target = Name((target.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) # Export text (from the source code of http://www.dnspython.org/docs/1.10.0/html/dns.zone.Zone-class.html#to_file) EOL = '\n' f = StringIO.StringIO() f.write('$ORIGIN %s%s' % (origin, EOL)) zone.to_file(f, sorted=True, relativize=False, nl=EOL) data = f.getvalue() f.close() return data
def generate_zone_file(origin): """Generates a zone file. Accepts the zone origin as string (no trailing dot). Returns the contents of a zone file that contains all the resource records associated with the domain with the provided origin. """ Domain = cache.get_model('powerdns_manager', 'Domain') Record = cache.get_model('powerdns_manager', 'Record') the_domain = Domain.objects.get(name__exact=origin) the_rrs = Record.objects.filter(domain=the_domain).order_by('-type') # Generate the zone file origin = Name((origin.rstrip('.') + '.').split('.')) # Create an empty dns.zone object. # We set check_origin=False because the zone contains no records. zone = dns.zone.from_text('', origin=origin, relativize=False, check_origin=False) rdclass = dns.rdataclass._by_text.get('IN') for rr in the_rrs: # Add trailing dot to rr.name record_name = rr.name.rstrip('.') + '.' if rr.type == 'SOA': # Add SOA Resource Record # SOA content: primary hostmaster serial refresh retry expire default_ttl bits = rr.content.split() # Primary nameserver of SOA record primary = bits[0].rstrip('.') + '.' mname = Name(primary.split('.')) # Responsible hostmaster from SOA record hostmaster = bits[1].rstrip('.') + '.' rname = Name(hostmaster.split('.')) rdtype = dns.rdatatype._by_text.get('SOA') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.SOA.SOA(rdclass, rdtype, mname = mname, rname = rname, serial = int(bits[2]), refresh = int(bits[3]), retry = int(bits[4]), expire = int(bits[5]), minimum = int(bits[6]) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'NS': # Add NS Resource Record rdtype = dns.rdatatype._by_text.get('NS') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.NS.NS(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'MX': # Add MX Resource Record rdtype = dns.rdatatype._by_text.get('MX') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.MX.MX(rdclass, rdtype, preference = int(rr.prio), exchange = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'TXT': # Add TXT Resource Record rdtype = dns.rdatatype._by_text.get('TXT') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.TXT.TXT(rdclass, rdtype, strings = rr.content.split(';') ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'CNAME': # Add CNAME Resource Record rdtype = dns.rdatatype._by_text.get('CNAME') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.CNAME.CNAME(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'A': # Add A Resource Record rdtype = dns.rdatatype._by_text.get('A') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.A.A(rdclass, rdtype, address = rr.content ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'AAAA': # Add AAAA Resource Record rdtype = dns.rdatatype._by_text.get('AAAA') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.AAAA.AAAA(rdclass, rdtype, address = rr.content ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'SPF': # Add SPF Resource Record rdtype = dns.rdatatype._by_text.get('SPF') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.SPF.SPF(rdclass, rdtype, strings = rr.content.split(';') ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'PTR': # Add PTR Resource Record rdtype = dns.rdatatype._by_text.get('PTR') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.ANY.PTR.PTR(rdclass, rdtype, target = Name((rr.content.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) elif rr.type == 'SRV': # Add SRV Resource Record # weight port target weight, port, target = rr.content.split() rdtype = dns.rdatatype._by_text.get('SRV') rdataset = zone.find_rdataset(record_name, rdtype=rdtype, create=True) rdata = dns.rdtypes.IN.SRV.SRV(rdclass, rdtype, priority = int(rr.prio), weight = int(weight), port = int(port), target = Name((target.rstrip('.') + '.').split('.')) ) rdataset.add(rdata, ttl=int(rr.ttl)) # Export text (from the source code of http://www.dnspython.org/docs/1.10.0/html/dns.zone.Zone-class.html#to_file) EOL = '\r\n' f = StringIO.StringIO() f.write('$ORIGIN %s%s' % (origin, EOL)) zone.to_file(f, sorted=True, relativize=False, nl=EOL) data = f.getvalue() f.close() return data