pvl.hosts.zone: HostZoneError(HostError), move resolve() to pvl.dns.relative(), and expect HostError's in pvl.hosts-forward/pvl.hosts-reverse
--- a/bin/pvl.hosts-forward Thu Feb 26 15:23:00 2015 +0200
+++ b/bin/pvl.hosts-forward Thu Feb 26 15:25:09 2015 +0200
@@ -31,9 +31,13 @@
hosts = pvl.hosts.apply(options, args)
# process
- for rr in pvl.hosts.zone.apply_hosts_forward(options, hosts, options.forward_zone):
- print unicode(rr)
-
+ try:
+ for rr in pvl.hosts.zone.apply_hosts_forward(options, hosts, options.forward_zone):
+ print unicode(rr)
+ except pvl.hosts.HostError as error:
+ log.error("%s", error)
+ return 3
+
return 0
if __name__ == '__main__':
--- a/bin/pvl.hosts-reverse Thu Feb 26 15:23:00 2015 +0200
+++ b/bin/pvl.hosts-reverse Thu Feb 26 15:25:09 2015 +0200
@@ -33,8 +33,12 @@
# process
prefix = pvl.dns.parse_prefix(options.reverse_zone)
- for rr in pvl.hosts.zone.apply_hosts_reverse(options, hosts, prefix):
- print unicode(rr)
+ try:
+ for rr in pvl.hosts.zone.apply_hosts_reverse(options, hosts, prefix):
+ print unicode(rr)
+ except pvl.hosts.HostError as error:
+ log.error("%s", error)
+ return 3
return 0
--- a/pvl/hosts/tests.py Thu Feb 26 15:23:00 2015 +0200
+++ b/pvl/hosts/tests.py Thu Feb 26 15:25:09 2015 +0200
@@ -105,22 +105,6 @@
self.options = Options()
self.options.add_origin = False
- def testResolve(self):
- self.assertEquals(zone.resolve(None, None, 'host'), 'host.')
- self.assertEquals(zone.resolve(None, 'domain', 'host'), 'host.domain.')
-
- with self.assertRaises(zone.HostZoneError):
- zone.resolve('origin', 'domain', 'host')
-
- self.assertEquals(zone.resolve('domain', 'domain', 'host'), 'host')
- self.assertEquals(zone.resolve('origin', 'domain.origin', 'host'), 'host.domain')
-
- with self.assertRaises(zone.HostZoneError):
- zone.resolve('origin', 'domainorigin', 'host')
-
- with self.assertRaises(zone.HostZoneError):
- zone.resolve('origin', None, 'host.domain')
-
def testHostOutOfOrigin(self):
h = Host('host', 'domain', ip=ipaddr.IPAddress('10.0.0.1'))
--- a/pvl/hosts/zone.py Thu Feb 26 15:23:00 2015 +0200
+++ b/pvl/hosts/zone.py Thu Feb 26 15:25:09 2015 +0200
@@ -5,37 +5,10 @@
import ipaddr
import logging; log = logging.getLogger('pvl.hosts.zone')
import pvl.dns
-
-class HostZoneError(Exception):
- pass
-
-def resolve (origin, domain, name) :
- """
- Resolve relative CNAME for label@origin -> alias@domain
- """
+import pvl.hosts.host
- if origin:
- origin = pvl.dns.fqdn(origin)
-
- if domain:
- fqdn = pvl.dns.fqdn(name, domain)
- else:
- fqdn = pvl.dns.fqdn(name)
-
- if not origin:
- return fqdn
-
- elif domain == origin:
- return name
-
- elif fqdn.endswith('.' + origin):
- return pvl.dns.relative(origin, fqdn)
-
- elif domain:
- raise HostZoneError("{name}: domain {domain} out of zone {origin}".format(name=name, domain=domain, origin=origin))
-
- else:
- raise HostZoneError("{name}: fqdn {fqdn} out of zone {origin}".format(name=name, fqdn=fqdn, origin=origin))
+class HostZoneError(pvl.hosts.host.HostError):
+ pass
# TODO: generate location alias CNAMEs even if host itself is outside origin?
def host_forward (host, origin) :
@@ -44,8 +17,8 @@
"""
try:
- label = resolve(origin, host.domain, host.name)
- except HostZoneError as error:
+ label = pvl.dns.relative(origin, host.domain, host.name)
+ except ValueError as error:
log.info("%s: skip: %s", host, error)
return
@@ -75,22 +48,34 @@
if host.location:
location_alias, location_domain = host.location
- yield pvl.dns.ZoneRecord.CNAME(resolve(origin, location_domain, location_alias), label)
+ try:
+ yield pvl.dns.ZoneRecord.CNAME(pvl.dns.relative(origin, location_domain, location_alias), label)
+ except ValueError as error:
+ raise HostZoneError(host, error)
for alias in host.alias:
- yield pvl.dns.ZoneRecord.CNAME(resolve(origin, host.domain, alias), label)
+ try:
+ yield pvl.dns.ZoneRecord.CNAME(pvl.dns.relative(origin, host.domain, alias), label)
+ except ValueError as error:
+ raise HostZoneError(host, error)
for alias in host.alias4:
if not host.ip:
raise HostZoneError(host, "alias4={host.alias4} without ip=".format(host=host))
- yield pvl.dns.ZoneRecord.A(resolve(origin, host.domain, alias), host.ip)
+ try:
+ yield pvl.dns.ZoneRecord.A(pvl.dns.relative(origin, host.domain, alias), host.ip)
+ except ValueError as error:
+ raise HostZoneError(host, error)
for alias in host.alias6:
if not host.ip6:
raise HostZoneError(host, "alias6={host.alias6} without ip6=".format(host=host))
- yield pvl.dns.ZoneRecord.AAAA(resolve(origin, host.domain, alias), host.ip6)
+ try:
+ yield pvl.dns.ZoneRecord.AAAA(pvl.dns.relative(origin, host.domain, alias), host.ip6)
+ except ValueError as error:
+ raise HostZoneError(host, error)
def host_reverse (host, prefix) :
"""
@@ -161,11 +146,11 @@
for rr in host_forward(host, origin) :
if (rr.name, 'CNAME') in by_name_type:
- raise HostZoneError(host, "{host}: CNAME {cname} conflict: {rr}".format(host=host, cname=by_name_type[rr.name, 'CNAME'].name, rr=rr))
+ raise HostZoneError(host, "CNAME {cname} conflict: {rr}".format(cname=by_name_type[rr.name, 'CNAME'].name, rr=rr))
elif rr.type == 'CNAME' and rr.name in by_name:
- raise HostZoneError(host, "{host}: CNAME {cname} conflict: {rr}".format(host=host, cname=rr.name, rr=by_name[rr.name]))
+ raise HostZoneError(host, "CNAME {cname} conflict: {rr}".format(cname=rr.name, rr=by_name[rr.name]))
elif (rr.name, rr.type) in by_name_type:
- raise HostZoneError(host, "{host}: {type} {name} conflict: {rr}".format(host=host, type=rr.type, name=rr.name, rr=by_name_type[rr.name, rr.type]))
+ raise HostZoneError(host, "{type} {name} conflict: {rr}".format(type=rr.type, name=rr.name, rr=by_name_type[rr.name, rr.type]))
by_name[rr.name] = rr
by_name_type[rr.name, rr.type] = rr