68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
#!/usr/bin/env python2
|
|
|
|
""" Zones of domain name space
|
|
|
|
See section 6.1.2 of RFC 1035 and section 4.2 of RFC 1034.
|
|
Instead of tree structures we simply use dictionaries from domain names to
|
|
zones or record sets.
|
|
|
|
These classes are merely a suggestion, feel free to use something else.
|
|
"""
|
|
|
|
from resource import ResourceRecord, RecordData
|
|
|
|
from types import Type
|
|
from classes import Class
|
|
|
|
class Catalog(object):
|
|
""" A catalog of zones """
|
|
|
|
def __init__(self):
|
|
""" Initialize the catalog """
|
|
self.zones = {}
|
|
|
|
def add_zone(self, name, zone):
|
|
""" Add a new zone to the catalog
|
|
|
|
Args:
|
|
name (str): root domain name
|
|
zone (Zone): zone
|
|
"""
|
|
self.zones[name] = zone
|
|
|
|
from collections import defaultdict
|
|
|
|
class Zone(object):
|
|
""" A zone in the domain name space """
|
|
|
|
def __init__(self):
|
|
""" Initialize the Zone """
|
|
self.records = defaultdict(list)
|
|
|
|
def add_node(self, name, record_set):
|
|
""" Add a record set to the zone
|
|
|
|
Args:
|
|
name (str): domain name
|
|
record_set ([ResourceRecord]): resource records
|
|
"""
|
|
self.records[name].append(record_set)
|
|
|
|
def read_master_file(self, filename):
|
|
""" Read the zone from a master file
|
|
|
|
See section 5 of RFC 1035.
|
|
|
|
Args:
|
|
filename (str): the filename of the master file
|
|
"""
|
|
with open(filename) as f:
|
|
lines = f.readlines()
|
|
records = []
|
|
for line in lines:
|
|
line = line.strip()
|
|
if line.startswith(';'): continue
|
|
name, ttl, type_, data = line.split()
|
|
rdata = RecordData(data)
|
|
self.add_node(name, ResourceRecord(name, Type.by_string[type_], Class.IN, int(ttl), rdata))
|