--- 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