diff --git a/src/hostinfo/named.py b/src/hostinfo/named.py index 3515773afaac866ba29b7d9e7c7e7598db70ee28..353c8470684304367fdee75333172d901eda980b 100755 --- a/src/hostinfo/named.py +++ b/src/hostinfo/named.py @@ -1,6 +1,6 @@ import copy import hostinfo.parser -from hostinfo.util import ntoa, aton, fqn +from hostinfo.util import ntoa, aton, fqn, by_ip def generate(tree, host): # @@ -121,6 +121,12 @@ def forward(tree, domain): for s in tree._subnet_: if s.network[0] and s.domain[0] == domain.domain[0]: net.append((aton(s.network[0]), aton(s.netmask[0]))) + pass + pass + net_ipv6 = [] + for s in tree._subnet_ipv6_: + if s.prefix[0] and s.domain[0] == domain.domain[0]: + net_ipv6.append(s.prefix[0]) for m in tree._host_._interface_._mailhost_: if m.domain[0] == domain.domain[0]: @@ -129,34 +135,54 @@ def forward(tree, domain): result += ";\n" host = {} + def add_entry(name, kind, value): + if not name in host: + host[name] = [] + pass + host[name].append((kind, value)) + pass for i in tree._host_._interface_._ip_: # Find all hosts that belong to this network for (n, m) in net: if i.address[0] and aton(i.address[0]) & m == n: - host[i.name[1:]] = "A %s" % i.address[0] + add_entry(i.name[1:], 'A', '%s' % i.address[0]) for a in i._alias_: - host[a.name[0]] = "CNAME %s" % i.name[1:] + add_entry(a.name[0], 'CNAME', '%s' % i.name[1:]) + pass for s in i._srv_: port = int(s.port[0] or 0) priority = int(s.priority[0] or 0) weight = int(s.weight[0] or 0) - host[s.name[0]] = "SRV %d %d %d %s" % ( - priority, weight, port, s.name[1:]) + add_entry(s.name[0], 'SRV', '%d %d %d %s' % ( + priority, weight, port, s.name[1:])) + pass + pass + pass + pass + for i in tree._host_._interface_._ipv6_: + for p in net_ipv6: + if i.address[0] and i.address[0].startswith(p): + add_entry(i.name[1:], 'AAAA', '%s' % i.address[0]) + pass + pass + for c in domain._cname_: # Emit cnames defined in subnet - host[c.alias[0]] = "CNAME %s" % c.name[0] + add_entry(c.alias[0], 'CNAME', '%s' % c.name[0]) + pass # Add a localhost entry result += "localhost IN A 127.0.0.1\n" result += ";\n" # Add hosts - hk = host.keys() - hk.sort() - for h in hk: - result += "%-18s IN %s\n" % (h, host[h]) - + for h1 in sorted(host): + for k,v in sorted(host[h1]): + result += "%-18s IN %-7s %s\n" % (h1, k, v) + pass + pass + return result def reverse(tree, net): diff --git a/src/hostinfo/util.py b/src/hostinfo/util.py index 458a075e77dc4a43d48ba5a858b9441cf92f90a0..f76cdf1f49f3f52ba208ba8cd7e5074c30b2ff39 100755 --- a/src/hostinfo/util.py +++ b/src/hostinfo/util.py @@ -31,3 +31,23 @@ def fqn(tree, host): else: raise Exception("'%s' not FQN, but has no ip" % host.name[0:]) pass + +def by_ip(a, b): + aa = a.split('.') + ba = b.split('.') + for i in range(0, len(aa)): + if int(aa[i]) < int(ba[i]): + return -1 + elif int(aa[i]) > int(ba[i]): + return 1 + return 0 + +def by_mac(a, b): + aa = a.split(':') + ba = b.split(':') + for i in range(0, len(aa)): + if int(aa[i],16) < int(ba[i],16): + return -1 + elif int(aa[i],16) > int(ba[i],16): + return 1 + return 0 diff --git a/src/hostinfo/yp.py b/src/hostinfo/yp.py index 39c0d39d3ef331542d3316deee7b6b051c60dd10..f0b410598a128ba1149dc0ccc8d51e7684e2c570 100755 --- a/src/hostinfo/yp.py +++ b/src/hostinfo/yp.py @@ -1,4 +1,4 @@ -from hostinfo.util import fqn, aton, ntoa +from hostinfo.util import fqn, aton, ntoa, by_ip, by_mac def generate(tree, auto_domain): result = [] @@ -158,22 +158,3 @@ def auto_map(tree, map_name, auto_domain): return result -def by_ip(a, b): - aa = a.split('.') - ba = b.split('.') - for i in range(0, len(aa)): - if int(aa[i]) < int(ba[i]): - return -1 - elif int(aa[i]) > int(ba[i]): - return 1 - return 0 - -def by_mac(a, b): - aa = a.split(':') - ba = b.split(':') - for i in range(0, len(aa)): - if int(aa[i],16) < int(ba[i],16): - return -1 - elif int(aa[i],16) > int(ba[i],16): - return 1 - return 0