diff --git a/src/hostinfo/named.py b/src/hostinfo/named.py index 1c8432ed048a3e7a6876b0a68dc09dc752bddc68..0d0a641358a331f6539d651ba7c20517aaf5608f 100755 --- a/src/hostinfo/named.py +++ b/src/hostinfo/named.py @@ -139,22 +139,24 @@ class DomainDict: self.host = {} pass - def add_host(self, name, kind, value): + def add_host(self, name, ttl, kind, value): if not re.match('^[0-9a-zA-Z.-]+$', name): raise Exception('Invalid host name "%s"' % name) if not name in self.host: self.host[name] = set() pass - self.host[name].add((kind, value)) + if not ttl: + ttl = '' + self.host[name].add((kind, value, ttl)) pass def value(self, cmp=None): result = util.StringArray() result += self.header for name in sorted(self.host, cmp): - for kind, value in sorted(self.host[name]): - result += ('%(name)-18s IN %(kind)-7s %(value)s' % - dict(name=name, kind=kind, value=value)) + for kind,value,ttl in sorted(self.host[name]): + result += ('%(name)-18s %(ttl)-8s IN %(kind)-7s %(value)s' % + dict(name=name, ttl=ttl, kind=kind, value=value)) pass pass return result @@ -185,8 +187,9 @@ def generate_forward(tree, hosts): for mx in [ m for m in tree._host_._interface_._mailhost_ if m.domain[0] == domain]: pri = int(mx.priority[0] or 0) - result += (' IN MX %d %s' % - (pri, util.fqn(tree, mx._parent))) + ttl = mx.ttl[0] or '' + result += (' %-8s IN MX %d %s' % + (ttl, pri, util.fqn(tree, mx._parent))) pass for txt in [ t for t in tree._subnet_._txt_ if t.domain[1] == domain]: result += (' IN TXT "%s"' % (txt.value[0])) @@ -200,31 +203,31 @@ def generate_forward(tree, hosts): # Add cname hosts for c in tree._subnet_._cname_: - result[c.domain[1]].add_host(c.alias[0], 'CNAME', c.name[0]) + result[c.domain[1]].add_host(c.alias[0], c.ttl[0], 'CNAME', c.name[0]) pass # Add numbered hosts - def add_host(domain, name, address): + def add_host(domain, name, ttl, address): if address.version == 4: - result[domain].add_host(name, 'A', str(address.exploded)) + result[domain].add_host(name, ttl, 'A', str(address.exploded)) pass elif address.version == 6: - result[domain].add_host(name, 'AAAA', str(address.exploded)) + result[domain].add_host(name, ttl, 'AAAA', str(address.exploded)) pass for domain,net in [ (s.domain[0],util.network(s)) for s in tree._subnet_ if s.domain[0] and util.network(s)]: - for name,address in hosts: + for name,address,ttl in hosts: try: if name.endswith('.'): d = '.'.join(name.split('.')[1:-1]) n = name.split('.')[0] - add_host(d, n, address) + add_host(d, n, ttl, address) continue except Exception,e: pass if address in net: - add_host(domain, name,address) + add_host(domain, name, ttl, address) pass pass pass @@ -247,14 +250,14 @@ def generate_reverse(tree, hosts): for net in net_to_origin: origin = net_to_origin[net] domain = origin_to_domain[origin] - for name,address in hosts: + for name,address,ttl in hosts: if address in net: reverse = reverse_addr(address).replace('.%s' % origin, '') fqn = name if fqn[-1] != '.': fqn += '.' + domain + '.' pass - result[origin].add_host(reverse, 'PTR', fqn) + result[origin].add_host(reverse, ttl, 'PTR', fqn) pass pass pass @@ -267,7 +270,7 @@ def generate_reverse(tree, hosts): def get_hosts(tree, with_alias=True): result = [] seen = {} - def add (name, address, check=None): + def add (name, address, ttl, check=None): if check and address in seen: old_name = seen[address][0] old_check = seen[address][1] @@ -277,14 +280,14 @@ def get_hosts(tree, with_alias=True): where=[old_check, check]) pass seen[address] = (name, check) - result.append((name,address)) + result.append((name,address,ttl)) pass # IPv4 static addresses for i in filter(util.address, tree._host_._interface_._ip_): - add(i.name[0:], util.address(i), check=i) + add(i.name[0:], util.address(i), i.ttl[0:2], check=i) if with_alias: for a in i._alias_: - add(a.name[0:], util.address(i)) + add(a.name[0:], util.address(i), a.ttl[0:3]) pass pass pass @@ -295,17 +298,17 @@ def get_hosts(tree, with_alias=True): a = util.address(d.first[0]) while a <= last: name = '-'.join([ 'dynamic' ] + a.exploded.split('.')) - add(name, a, check=d) + add(name, a, d.ttl[0], check=d) a = a + 1 pass pass # IPv6 static addresses for i in filter(util.address, tree._host_._interface_._ipv6_): - add(i.name[0:], util.address(i), check=i) + add(i.name[0:], util.address(i), i.ttl[0:2], check=i) if with_alias: for a in i._alias_: - add(a.name[0:], util.address(i)) + add(a.name[0:], util.address(i), a.ttl[0:3]) pass pass pass @@ -316,7 +319,7 @@ def get_hosts(tree, with_alias=True): a = util.address(d.first[0]) while a <= last: name = '-'.join([ 'dynamic' ] + a.exploded.split(':')) - add(name, a, check=d) + add(name, a, d.ttl[0], check=d) a = a + 1 pass pass