diff -r ddb77f32b35a -r 45bedeba92e5 pvl/hosts/zone.py --- a/pvl/hosts/zone.py Sat Mar 07 16:31:11 2015 +0200 +++ b/pvl/hosts/zone.py Mon Mar 09 18:00:18 2015 +0200 @@ -31,15 +31,21 @@ elif host.forward is None: # forward - if host.ip : - log.info("%s: ip: %s@%s A %s", host, label, origin, host.ip) + for sublabel, (ip4, ip6) in host.ip.iteritems(): + if sublabel: + sublabel = pvl.dns.join(sublabel, label) + else: + sublabel = label + + if ip4: + log.info("%s: ip: %s@%s A %s", host, sublabel, origin, ip4) - yield pvl.dns.ZoneRecord.A(label, host.ip) + yield pvl.dns.ZoneRecord.A(sublabel, ip4) - if host.ip6 : - log.info("%s: ip6: %s@%s AAAA %s", host, label, origin, host.ip6) + if ip6: + log.info("%s: ip6: %s@%s AAAA %s", host, label, origin, ip6) - yield pvl.dns.ZoneRecord.AAAA(label, host.ip6) + yield pvl.dns.ZoneRecord.AAAA(sublabel, ip6) else: log.info("%s: skip forward", host) @@ -57,10 +63,10 @@ yield pvl.dns.ZoneRecord.CNAME(pvl.dns.relative(origin, host.domain, alias), label) for alias in host.alias4: - if not host.ip: - raise HostZoneError(host, "alias4={host.alias4} without ip=".format(host=host)) + if not host.ip4: + raise HostZoneError(host, "alias4={host.alias4} without ip4=".format(host=host)) - yield pvl.dns.ZoneRecord.A(pvl.dns.relative(origin, host.domain, alias), host.ip) + yield pvl.dns.ZoneRecord.A(pvl.dns.relative(origin, host.domain, alias), host.ip4) for alias in host.alias6: if not host.ip6: @@ -72,50 +78,54 @@ """ Yield (ipaddr.IPAddress, ZoneRecord) tuples for host within given prefix's reverse-dns zone. """ - - if prefix.version == 4 : - ip = host.ip - - # reverse= is IPv4-only - reverse = host.reverse - - elif prefix.version == 6 : - ip = host.ip6 - - # if reverse= is set, always omit, for lack of reverse6= - reverse = None if host.reverse is None else False - - else : - raise ValueError("%s: unknown ip version: %s" % (prefix, prefix.version)) - - if not ip : - log.debug("%s: no ip%d", host, prefix.version) - return + + for sublabel, (ip4, ip6) in host.ip.iteritems(): + if prefix.version == 4: + ip = ip4 + + # reverse= is IPv4-only + reverse = host.reverse - if ip not in prefix : - log.debug("%s: %s out of prefix: %s", host, ip, prefix) - return - - # relative label - label = pvl.dns.reverse_label(prefix, ip) - - if reverse: - alias = pvl.dns.fqdn(reverse) - - log.info("%s %s[%s]: CNAME %s", host, prefix, ip, alias) + elif prefix.version == 6: + ip = ip6 + + # if reverse= is set, always omit, for lack of reverse6= + reverse = None if host.reverse is None else False - yield ip, pvl.dns.zone.ZoneRecord.CNAME(label, alias) - - elif reverse is None : - fqdn = host.fqdn() + else: + raise ValueError("%s: unknown ip version: %s" % (prefix, prefix.version)) - log.info("%s %s[%s]: PTR %s", host, prefix, ip, fqdn) + if not ip: + log.debug("%s: no ip%d", host, prefix.version) + continue - yield ip, pvl.dns.zone.ZoneRecord.PTR(label, fqdn) + if ip not in prefix: + log.debug("%s: %s out of prefix: %s", host, ip, prefix) + continue + + # relative label + label = pvl.dns.reverse_label(prefix, ip) + + if reverse: + alias = pvl.dns.fqdn(reverse) + + log.info("%s %s[%s]: CNAME %s", host, prefix, ip, alias) - else: - log.info("%s %s[%s]: omit", host, prefix, ip) - + yield ip, pvl.dns.zone.ZoneRecord.CNAME(label, alias) + + elif reverse is None: + fqdn = host.fqdn() + + if sublabel: + fqdn = pvl.dns.join(sublabel, fqdn) + + log.info("%s %s[%s]: PTR %s", host, prefix, ip, fqdn) + + yield ip, pvl.dns.zone.ZoneRecord.PTR(label, fqdn) + + else: + log.info("%s %s[%s]: omit", host, prefix, ip) + def apply_hosts_forward (hosts, origin, add_origin = False, check_conflicts = False,